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:
-rw-r--r--.gitattributes1
-rw-r--r--.github/workflows/buildtrackerjs.yml82
-rw-r--r--.github/workflows/translations.yml143
-rw-r--r--.gitignore5
-rw-r--r--.gitmodules10
-rw-r--r--.travis.yml18
-rw-r--r--CHANGELOG.md37
-rw-r--r--LegacyAutoloader.php26
-rw-r--r--bower.json1
-rw-r--r--composer.json76
-rw-r--r--composer.lock1326
-rw-r--r--config/environment/dev.php2
-rw-r--r--config/environment/test.php2
-rwxr-xr-xconfig/global.ini.php22
-rw-r--r--config/global.php11
-rw-r--r--core/API/DataTableManipulator/Flattener.php1
-rw-r--r--core/API/DataTableManipulator/ReportTotalsCalculator.php1
-rw-r--r--core/API/Proxy.php1
-rw-r--r--core/API/Request.php1
-rw-r--r--core/Application/Kernel/EnvironmentValidator.php4
-rw-r--r--core/Application/Kernel/PluginList.php1
-rw-r--r--core/Archive.php2
-rw-r--r--core/Archive/ArchiveInvalidator.php1
-rw-r--r--core/Archive/ArchivePurger.php2
-rw-r--r--core/Archive/Chunk.php2
-rw-r--r--core/Archive/DataTableFactory.php6
-rw-r--r--core/AssetManager.php2
-rw-r--r--core/AssetManager/UIAssetMerger/JScriptUIAssetMerger.php1
-rw-r--r--core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php12
-rw-r--r--core/Cache.php17
-rw-r--r--core/CacheId.php3
-rw-r--r--core/Category/CategoryList.php1
-rw-r--r--core/CliMulti/CliPhp.php14
-rw-r--r--core/CliMulti/RequestCommand.php3
-rw-r--r--core/Columns/ComputedMetricFactory.php2
-rw-r--r--core/Columns/DimensionMetricFactory.php1
-rw-r--r--core/Columns/Discriminator.php3
-rw-r--r--core/Columns/Updater.php3
-rw-r--r--core/Common.php137
-rw-r--r--core/Composer/ScriptHandler.php15
-rw-r--r--core/Concurrency/LockBackend/MySqlLockBackend.php1
-rw-r--r--core/Config.php2
-rw-r--r--core/Config/Cache.php3
-rw-r--r--core/Config/IniFileChain.php6
-rw-r--r--core/Console.php15
-rw-r--r--core/CronArchive.php24
-rw-r--r--core/CronArchive/Performance/Logger.php1
-rw-r--r--core/CronArchive/SegmentArchivingRequestUrlProvider.php4
-rw-r--r--core/DataAccess/ArchiveTableDao.php1
-rw-r--r--core/DataAccess/LogAggregator.php4
-rw-r--r--core/DataAccess/LogTableTemporary.php3
-rw-r--r--core/DataAccess/RawLogDao.php8
-rw-r--r--core/DataTable/Filter/AddSegmentValue.php2
-rw-r--r--core/DataTable/Filter/Sort.php2
-rw-r--r--core/DataTable/Renderer.php1
-rw-r--r--core/Date.php5
-rw-r--r--core/Db.php2
-rw-r--r--core/Db/BatchInsert.php3
-rw-r--r--core/Db/Schema/Mysql.php3
-rw-r--r--core/DeviceDetector/DeviceDetectorFactory.php1
-rw-r--r--core/DeviceDetectorFactory.php27
-rw-r--r--core/EventDispatcher.php2
-rw-r--r--core/FileIntegrity.php8
-rw-r--r--core/Filesystem.php2
-rw-r--r--core/FrontController.php2
-rw-r--r--core/Http/ControllerResolver.php2
-rw-r--r--core/Http/Router.php2
-rw-r--r--core/IP.php10
-rw-r--r--core/Mail.php1
-rw-r--r--core/Menu/MenuAbstract.php27
-rw-r--r--core/Menu/MenuAdmin.php3
-rw-r--r--core/Menu/MenuTop.php4
-rw-r--r--core/Metrics.php3
-rw-r--r--core/Metrics/Sorter.php1
-rw-r--r--core/MetricsFormatter.php9
-rw-r--r--core/NumberFormatter.php2
-rw-r--r--core/Period/Range.php20
-rw-r--r--core/Piwik.php34
-rw-r--r--core/Plugin.php13
-rw-r--r--core/Plugin/ArchivedMetric.php1
-rw-r--r--core/Plugin/Controller.php2
-rw-r--r--core/Plugin/Manager.php4
-rw-r--r--core/Plugin/WidgetsProvider.php1
-rw-r--r--core/Registry.php63
-rw-r--r--core/Session.php21
-rw-r--r--core/Session/SaveHandler/DbTable.php15
-rw-r--r--core/Settings/Measurable/MeasurableProperty.php1
-rw-r--r--core/Settings/Measurable/MeasurableSetting.php1
-rw-r--r--core/Settings/Measurable/MeasurableSettings.php2
-rw-r--r--core/Settings/Plugin/SystemConfigSetting.php2
-rw-r--r--core/Settings/Plugin/SystemSetting.php1
-rw-r--r--core/Settings/Plugin/SystemSettings.php2
-rw-r--r--core/Settings/Plugin/UserSetting.php2
-rw-r--r--core/Settings/Plugin/UserSettings.php2
-rw-r--r--core/Settings/Storage/Backend/Cache.php1
-rw-r--r--core/Settings/Storage/Backend/MeasurableSettingsTable.php3
-rw-r--r--core/Settings/Storage/Backend/NullBackend.php2
-rw-r--r--core/Settings/Storage/Backend/PluginSettingsTable.php3
-rw-r--r--core/SettingsPiwik.php15
-rw-r--r--core/Site.php20
-rw-r--r--core/TaskScheduler.php120
-rw-r--r--core/Tracker.php2
-rw-r--r--core/Tracker/Action.php2
-rw-r--r--core/Tracker/Cache.php5
-rw-r--r--core/Tracker/Db.php3
-rw-r--r--core/Tracker/GoalManager.php8
-rw-r--r--core/Tracker/Handler.php12
-rw-r--r--core/Tracker/Model.php10
-rw-r--r--core/Tracker/Request.php4
-rw-r--r--core/Tracker/RequestSet.php49
-rw-r--r--core/Tracker/Settings.php1
-rw-r--r--core/Tracker/TableLogAction.php1
-rw-r--r--core/Tracker/TableLogAction/Cache.php4
-rw-r--r--core/Tracker/TrackerCodeGenerator.php1
-rw-r--r--core/Tracker/TrackerConfig.php1
-rw-r--r--core/Tracker/Visit.php7
-rw-r--r--core/Tracker/VisitExcluded.php2
-rw-r--r--core/Tracker/Visitor.php2
-rw-r--r--core/Translate.php20
-rw-r--r--core/Translation/Loader/LoaderCache.php6
-rw-r--r--core/Translation/Translator.php12
-rw-r--r--core/Twig.php2
-rw-r--r--core/Unzip.php10
-rw-r--r--core/Updater.php15
-rw-r--r--core/Updater/Migration.php1
-rw-r--r--core/Updater/Migration/Db/DropIndex.php2
-rw-r--r--core/Updater/Migration/Db/DropTable.php2
-rw-r--r--core/Updater/Migration/Db/Insert.php1
-rw-r--r--core/Updater/Migration/Db/Sql.php1
-rw-r--r--core/Updater/Migration/Factory.php2
-rw-r--r--core/Updater/Migration/Plugin/Factory.php15
-rw-r--r--core/Updater/Migration/Plugin/Uninstall.php53
-rw-r--r--core/Updates.php37
-rw-r--r--core/Updates/1.5-b1.php1
-rw-r--r--core/Updates/2.10.0-b5.php1
-rw-r--r--core/Updates/2.14.0-b2.php1
-rw-r--r--core/Updates/2.14.2.php1
-rw-r--r--core/Updates/2.15.0-b12.php1
-rw-r--r--core/Updates/2.15.0-b17.php2
-rw-r--r--core/Updates/2.15.0-b20.php2
-rw-r--r--core/Updates/2.16.3-b2.php2
-rw-r--r--core/Updates/2.16.3-rc2.php4
-rw-r--r--core/Updates/3.0.0-b3.php1
-rw-r--r--core/Updates/3.10.0-b2.php1
-rw-r--r--core/Updates/3.11.0-b1.php1
-rw-r--r--core/Updates/3.12.0-b1.php1
-rw-r--r--core/Updates/3.5.1-b1.php1
-rw-r--r--core/Updates/3.6.0-b3.php1
-rw-r--r--core/Updates/3.6.1-b2.php1
-rw-r--r--core/Updates/3.8.0-b3.php1
-rw-r--r--core/Updates/4.0.0-b1.php58
-rw-r--r--core/Url.php6
-rw-r--r--core/Validators/IdSite.php2
-rw-r--r--core/Validators/IpRanges.php2
-rw-r--r--core/Version.php3
-rw-r--r--core/View.php38
-rw-r--r--core/ViewDataTable/Request.php2
-rw-r--r--core/Visualization/Sparkline.php14
-rw-r--r--core/Widget/WidgetsList.php1
-rw-r--r--core/testMinimumPhpVersion.php2
-rw-r--r--js/piwik.js1126
-rw-r--r--js/piwik.min.js115
-rw-r--r--lang/cs.json1
-rw-r--r--lang/pt.json1
-rw-r--r--lang/ru.json3
-rw-r--r--lang/sl.json11
-rw-r--r--lang/zh-cn.json1
-rw-r--r--libs/MaxMindGeoIP/geoip.inc1953
-rw-r--r--libs/MaxMindGeoIP/geoipcity.inc241
-rw-r--r--libs/PiwikTracker/PiwikTracker.php2
-rw-r--r--libs/README.md2
-rw-r--r--libs/Zend/Mail.php2
-rw-r--r--libs/bower_components/jquery-placeholder/.bower.json33
-rw-r--r--libs/bower_components/jquery-placeholder/bower.json21
-rw-r--r--libs/bower_components/jquery-placeholder/jquery.placeholder.js192
-rw-r--r--matomo.js115
-rwxr-xr-xmisc/composer/build-xhprof.sh2
-rw-r--r--misc/others/ExampleMatomoTracker.php17
-rw-r--r--misc/others/ExamplePiwikTracker.php17
-rw-r--r--misc/others/tracker_simpleImageTracker.php8
-rw-r--r--piwik.js115
-rw-r--r--piwik.php1
-rw-r--r--plugins/API/API.php2
-rw-r--r--plugins/API/Renderer/Console.php2
-rw-r--r--plugins/API/Renderer/Csv.php8
-rw-r--r--plugins/API/Renderer/Html.php2
-rw-r--r--plugins/API/Renderer/Json.php1
-rw-r--r--plugins/API/tests/Integration/APITest.php4
-rw-r--r--plugins/API/tests/Integration/RowEvolutionTest.php15
-rw-r--r--plugins/API/tests/Integration/RssRendererTest.php54
-rw-r--r--plugins/API/tests/System/AutoSuggestAPITest.php6
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest__Live.getLastVisitsDetails_range.xml132
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_countryName__API.getSuggestedValuesForSegment.xml6
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName4__API.getSuggestedValuesForSegment.xml4
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName__API.getSuggestedValuesForSegment.xml1
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue4__API.getSuggestedValuesForSegment.xml4
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__API.getSuggestedValuesForSegment.xml1
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__VisitsSummary.get_range.xml18
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_eventValue__VisitsSummary.get_range.xml14
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCategory__API.getSuggestedValuesForSegment.xml (renamed from tests/PHPUnit/System/expected/test_SiteSearch_NotLastNPeriods__CustomVariables.getCustomVariables_day.xml)4
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCategory__VisitsSummary.get_range.xml12
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCount__API.getSuggestedValuesForSegment.xml7
-rw-r--r--plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCount__VisitsSummary.get_range.xml12
-rw-r--r--plugins/API/tests/Unit/ConsoleRendererTest.php11
-rw-r--r--plugins/API/tests/Unit/CsvRendererTest.php25
-rw-r--r--plugins/API/tests/Unit/DataTable/MergeDataTablesTest.php4
-rw-r--r--plugins/API/tests/Unit/HtmlRendererTest.php25
-rw-r--r--plugins/API/tests/Unit/JsonRendererTest.php4
-rw-r--r--plugins/API/tests/Unit/OriginalRendererTest.php11
-rw-r--r--plugins/API/tests/Unit/PhpRendererTest.php4
-rw-r--r--plugins/API/tests/Unit/WidgetMetadataTest.php4
-rw-r--r--plugins/API/tests/Unit/XmlRendererTest.php6
-rw-r--r--plugins/Actions/API.php39
-rw-r--r--plugins/Actions/Actions.php11
-rw-r--r--plugins/Actions/Actions/ActionSiteSearch.php34
-rw-r--r--plugins/Actions/Archiver.php27
-rw-r--r--plugins/Actions/ArchivingHelper.php2
-rw-r--r--plugins/Actions/Columns/InteractionPosition.php2
-rw-r--r--plugins/Actions/Columns/SearchCategory.php30
-rw-r--r--plugins/Actions/Columns/SearchCount.php34
-rw-r--r--plugins/Actions/Columns/VisitTotalInteractions.php2
-rw-r--r--plugins/Actions/Reports/GetSiteSearchCategories.php3
-rw-r--r--plugins/Actions/VisitorDetails.php18
-rw-r--r--plugins/Actions/javascripts/rowactions.js3
-rw-r--r--plugins/Actions/lang/cs.json2
-rw-r--r--plugins/Actions/lang/el.json2
-rw-r--r--plugins/Actions/lang/en.json2
-rw-r--r--plugins/Actions/lang/sq.json2
-rw-r--r--plugins/Actions/lang/zh-cn.json4
-rw-r--r--plugins/Actions/lang/zh-tw.json2
-rw-r--r--plugins/Actions/tests/Integration/ActionSiteSearchTest.php2
-rw-r--r--plugins/Actions/tests/UI/expected-screenshots/ActionsDataTable_segmented_visitor_log.png4
-rw-r--r--plugins/Actions/tests/Unit/ArchiverTest.php12
-rw-r--r--plugins/Annotations/Annotations.php2
-rw-r--r--plugins/Annotations/lang/de.json2
m---------plugins/AnonymousPiwikUsageMeasurement0
m---------plugins/Bandwidth0
-rw-r--r--plugins/BulkTracking/BulkTracking.php2
-rw-r--r--plugins/BulkTracking/tests/Fixtures/SimpleFixtureTrackFewVisits.php4
-rw-r--r--plugins/BulkTracking/tests/Framework/TestCase/BulkTrackingTestCase.php4
-rw-r--r--plugins/BulkTracking/tests/Integration/BulkTrackingTest.php7
-rw-r--r--plugins/BulkTracking/tests/Integration/HandlerTest.php2
-rw-r--r--plugins/BulkTracking/tests/Integration/RequestsTest.php25
-rw-r--r--plugins/BulkTracking/tests/Integration/TrackerTest.php2
-rw-r--r--plugins/BulkTracking/tests/System/TrackerTest.php4
-rw-r--r--plugins/BulkTracking/tests/Unit/RequestsTest.php4
-rw-r--r--plugins/BulkTracking/tests/Unit/ResponseTest.php2
-rw-r--r--plugins/Contents/VisitorDetails.php2
-rw-r--r--plugins/Contents/tests/Fixtures/TwoVisitsWithContents.php10
-rw-r--r--plugins/Contents/tests/System/ContentsTest.php12
-rw-r--r--plugins/CoreAdminHome/CustomLogo.php2
-rw-r--r--plugins/CoreAdminHome/lang/cs.json1
-rw-r--r--plugins/CoreAdminHome/lang/da.json1
-rw-r--r--plugins/CoreAdminHome/lang/fr.json3
-rw-r--r--plugins/CoreAdminHome/lang/nl.json2
-rw-r--r--plugins/CoreAdminHome/lang/pt.json3
-rw-r--r--plugins/CoreAdminHome/lang/zh-cn.json3
-rw-r--r--plugins/CoreAdminHome/stylesheets/generalSettings.less6
-rw-r--r--plugins/CoreAdminHome/tests/Fixture/DuplicateActions.php2
-rw-r--r--plugins/CoreAdminHome/tests/Fixture/TrackingFailures.php2
-rw-r--r--plugins/CoreAdminHome/tests/Fixtures/SimpleFixtureTrackFewVisits.php4
-rw-r--r--plugins/CoreAdminHome/tests/Integration/APITest.php30
-rw-r--r--plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php8
-rw-r--r--plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php38
-rw-r--r--plugins/CoreAdminHome/tests/Integration/Commands/OptimizeArchiveTablesTest.php2
-rw-r--r--plugins/CoreAdminHome/tests/Integration/Commands/PurgeOldArchiveDataTest.php10
-rw-r--r--plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php6
-rw-r--r--plugins/CoreAdminHome/tests/Integration/Model/DuplicateActionRemoverTest.php2
-rw-r--r--plugins/CoreAdminHome/tests/Integration/SetConfigTest.php16
-rw-r--r--plugins/CoreAdminHome/tests/Integration/TasksTest.php4
-rw-r--r--plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php23
-rw-r--r--plugins/CoreConsole/Commands/DevelopmentSyncProcessedSystemTests.php2
-rw-r--r--plugins/CoreConsole/Commands/GenerateReport.php5
-rw-r--r--plugins/CoreConsole/Commands/GenerateWidget.php8
-rw-r--r--plugins/CoreConsole/tests/System/ArchiveCronTest.php2
-rw-r--r--plugins/CoreHome/Columns/VisitIp.php4
-rw-r--r--plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php2
-rw-r--r--plugins/CoreHome/DataTableRowAction/RowEvolution.php6
-rw-r--r--plugins/CoreHome/LoginWhitelist.php2
-rw-r--r--plugins/CoreHome/angularjs/common/services/periods.js2
-rw-r--r--plugins/CoreHome/angularjs/multipairfield/multipairfield.controller.js45
-rw-r--r--plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.html30
-rw-r--r--plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.js4
-rw-r--r--plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.less57
-rw-r--r--plugins/CoreHome/angularjs/period-selector/period-selector.controller.js11
-rw-r--r--plugins/CoreHome/javascripts/popover.js9
-rw-r--r--plugins/CoreHome/lang/cs.json1
-rw-r--r--plugins/CoreHome/lang/fr.json2
-rw-r--r--plugins/CoreHome/lang/zh-cn.json1
-rw-r--r--plugins/CoreHome/lang/zh-tw.json2
-rw-r--r--plugins/CoreHome/templates/_headerMessage.twig15
-rw-r--r--plugins/CoreHome/tests/Integration/Column/UserIdTest.php6
-rw-r--r--plugins/CoreHome/tests/Integration/LoginWhitelistTest.php4
-rw-r--r--plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php5
-rw-r--r--plugins/CoreHome/tests/Unit/CoreHomeTest.php4
-rw-r--r--plugins/CorePluginsAdmin/Commands/DeactivatePlugin.php2
-rw-r--r--plugins/CorePluginsAdmin/Commands/UninstallPlugin.php46
-rw-r--r--plugins/CorePluginsAdmin/Controller.php3
-rw-r--r--plugins/CorePluginsAdmin/angularjs/form-field/field-multituple.html4
-rw-r--r--plugins/CorePluginsAdmin/lang/tr.json2
-rw-r--r--plugins/CorePluginsAdmin/lang/zh-cn.json7
-rw-r--r--plugins/CorePluginsAdmin/tests/Integration/TagManagerTeaserTest.php2
-rw-r--r--plugins/CorePluginsAdmin/tests/UI/expected-screenshots/TagManagerTeaser_admin_page_disable.png4
-rw-r--r--plugins/CoreUpdater/CoreUpdater.php4
-rw-r--r--plugins/CoreUpdater/ReleaseChannel/LatestCurrentBeta.php (renamed from plugins/CoreUpdater/ReleaseChannel/Latest3XBeta.php)7
-rw-r--r--plugins/CoreUpdater/ReleaseChannel/LatestCurrentStable.php (renamed from plugins/CoreUpdater/ReleaseChannel/Latest3XStable.php)7
-rw-r--r--plugins/CoreUpdater/SystemSettings.php2
-rw-r--r--plugins/CoreUpdater/lang/pt.json2
-rw-r--r--plugins/CoreUpdater/lang/zh-cn.json19
-rw-r--r--plugins/CoreUpdater/lang/zh-tw.json2
-rw-r--r--plugins/CoreUpdater/templates/updateSuccess.twig7
-rw-r--r--plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php12
-rw-r--r--plugins/CoreUpdater/tests/Integration/ReleaseChannelTest.php2
-rw-r--r--plugins/CoreUpdater/tests/Integration/UpdateCommunicationTest.php2
-rw-r--r--plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main.png4
-rw-r--r--plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main_instance.png4
-rw-r--r--plugins/CoreUpdater/tests/Unit/ModelTest.php20
-rw-r--r--plugins/CoreVisualizations/Visualizations/Sparklines.php2
-rw-r--r--plugins/CoreVisualizations/Visualizations/Sparklines/Config.php2
-rw-r--r--plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php16
-rw-r--r--plugins/CoreVisualizations/tests/Unit/GraphTest.php10
-rw-r--r--plugins/CoreVisualizations/tests/Unit/SparklinesConfigTest.php4
m---------plugins/CustomAlerts0
m---------plugins/CustomDimensions0
-rw-r--r--plugins/CustomJsTracker/.gitignore (renamed from plugins/CustomPiwikJs/.gitignore)0
-rw-r--r--plugins/CustomJsTracker/API.php (renamed from plugins/CustomPiwikJs/API.php)10
-rw-r--r--plugins/CustomJsTracker/Commands/UpdateTracker.php (renamed from plugins/CustomPiwikJs/Commands/UpdateTracker.php)10
-rw-r--r--plugins/CustomJsTracker/CustomJsTracker.php (renamed from plugins/CustomPiwikJs/CustomPiwikJs.php)10
-rw-r--r--plugins/CustomJsTracker/Diagnostic/TrackerJsCheck.php (renamed from plugins/CustomPiwikJs/Diagnostic/PiwikJsCheck.php)12
-rw-r--r--plugins/CustomJsTracker/Exception/AccessDeniedException.php (renamed from plugins/CustomPiwikJs/Exception/AccessDeniedException.php)2
-rw-r--r--plugins/CustomJsTracker/File.php (renamed from plugins/CustomPiwikJs/File.php)4
-rw-r--r--plugins/CustomJsTracker/Tasks.php (renamed from plugins/CustomPiwikJs/Tasks.php)4
-rw-r--r--plugins/CustomJsTracker/TrackerUpdater.php (renamed from plugins/CustomPiwikJs/TrackerUpdater.php)14
-rw-r--r--plugins/CustomJsTracker/TrackingCode/JsTestPluginTrackerFiles.php (renamed from plugins/CustomPiwikJs/TrackingCode/JsTestPluginTrackerFiles.php)2
-rw-r--r--plugins/CustomJsTracker/TrackingCode/PiwikJsManipulator.php (renamed from plugins/CustomPiwikJs/TrackingCode/PiwikJsManipulator.php)2
-rw-r--r--plugins/CustomJsTracker/TrackingCode/PluginTrackerFiles.php (renamed from plugins/CustomPiwikJs/TrackingCode/PluginTrackerFiles.php)6
-rw-r--r--plugins/CustomJsTracker/config/config.php (renamed from plugins/CustomPiwikJs/config/config.php)2
-rw-r--r--plugins/CustomJsTracker/config/tracker.php (renamed from plugins/CustomPiwikJs/config/tracker.php)0
-rw-r--r--plugins/CustomJsTracker/lang/cs.json (renamed from plugins/CustomPiwikJs/lang/cs.json)2
-rw-r--r--plugins/CustomJsTracker/lang/da.json (renamed from plugins/CustomPiwikJs/lang/da.json)2
-rw-r--r--plugins/CustomJsTracker/lang/de.json (renamed from plugins/CustomPiwikJs/lang/de.json)2
-rw-r--r--plugins/CustomJsTracker/lang/el.json (renamed from plugins/CustomPiwikJs/lang/el.json)6
-rw-r--r--plugins/CustomJsTracker/lang/en.json (renamed from plugins/CustomPiwikJs/lang/en.json)2
-rw-r--r--plugins/CustomJsTracker/lang/eo.json (renamed from plugins/CustomPiwikJs/lang/eo.json)2
-rw-r--r--plugins/CustomJsTracker/lang/es-ar.json (renamed from plugins/CustomPiwikJs/lang/es-ar.json)2
-rw-r--r--plugins/CustomJsTracker/lang/es.json (renamed from plugins/CustomPiwikJs/lang/es.json)2
-rw-r--r--plugins/CustomJsTracker/lang/fi.json (renamed from plugins/CustomPiwikJs/lang/fi.json)2
-rw-r--r--plugins/CustomJsTracker/lang/fr.json (renamed from plugins/CustomPiwikJs/lang/fr.json)2
-rw-r--r--plugins/CustomJsTracker/lang/id.json (renamed from plugins/CustomPiwikJs/lang/id.json)2
-rw-r--r--plugins/CustomJsTracker/lang/it.json (renamed from plugins/CustomPiwikJs/lang/it.json)2
-rw-r--r--plugins/CustomJsTracker/lang/ja.json (renamed from plugins/CustomPiwikJs/lang/ja.json)2
-rw-r--r--plugins/CustomJsTracker/lang/nb.json (renamed from plugins/CustomPiwikJs/lang/nb.json)2
-rw-r--r--plugins/CustomJsTracker/lang/nl.json (renamed from plugins/CustomPiwikJs/lang/nl.json)2
-rw-r--r--plugins/CustomJsTracker/lang/pl.json (renamed from plugins/CustomPiwikJs/lang/pl.json)2
-rw-r--r--plugins/CustomJsTracker/lang/pt-br.json (renamed from plugins/CustomPiwikJs/lang/pt-br.json)4
-rw-r--r--plugins/CustomJsTracker/lang/pt.json (renamed from plugins/CustomPiwikJs/lang/pt.json)2
-rw-r--r--plugins/CustomJsTracker/lang/ru.json (renamed from plugins/CustomPiwikJs/lang/ru.json)2
-rw-r--r--plugins/CustomJsTracker/lang/sq.json (renamed from plugins/CustomPiwikJs/lang/sq.json)2
-rw-r--r--plugins/CustomJsTracker/lang/sr.json (renamed from plugins/CustomPiwikJs/lang/sr.json)2
-rw-r--r--plugins/CustomJsTracker/lang/sv.json (renamed from plugins/CustomPiwikJs/lang/sv.json)2
-rw-r--r--plugins/CustomJsTracker/lang/tr.json (renamed from plugins/CustomPiwikJs/lang/tr.json)2
-rw-r--r--plugins/CustomJsTracker/lang/uk.json (renamed from plugins/CustomPiwikJs/lang/uk.json)2
-rw-r--r--plugins/CustomJsTracker/lang/zh-cn.json (renamed from plugins/CustomPiwikJs/lang/zh-cn.json)2
-rw-r--r--plugins/CustomJsTracker/lang/zh-tw.json (renamed from plugins/CustomPiwikJs/lang/zh-tw.json)2
-rw-r--r--plugins/CustomJsTracker/tests/Framework/Mock/PluginTrackerFilesMock.php (renamed from plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php)6
-rw-r--r--plugins/CustomJsTracker/tests/Integration/ApiTest.php (renamed from plugins/CustomPiwikJs/tests/Integration/ApiTest.php)22
-rw-r--r--plugins/CustomJsTracker/tests/Integration/FileTest.php (renamed from plugins/CustomPiwikJs/tests/Integration/FileTest.php)26
-rw-r--r--plugins/CustomJsTracker/tests/Integration/PiwikJsManipulatorTest.php (renamed from plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php)12
-rw-r--r--plugins/CustomJsTracker/tests/Integration/PluginTrackerFilesTest.php (renamed from plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php)20
-rw-r--r--plugins/CustomJsTracker/tests/Integration/TrackerUpdaterTest.php (renamed from plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php)37
-rw-r--r--plugins/CustomJsTracker/tests/System/PiwikJsContentTest.php (renamed from plugins/CustomPiwikJs/tests/System/PiwikJsContentTest.php)10
-rw-r--r--plugins/CustomJsTracker/tests/resources/MyTestTarget2.js (renamed from plugins/CustomPiwikJs/tests/resources/MyTestTarget2.js)0
-rw-r--r--plugins/CustomJsTracker/tests/resources/test.js (renamed from plugins/CustomPiwikJs/tests/resources/test.js)0
-rw-r--r--plugins/CustomJsTracker/tests/resources/testpiwik.js (renamed from plugins/CustomPiwikJs/tests/resources/testpiwik.js)0
-rw-r--r--plugins/CustomJsTracker/tests/resources/tracker.js (renamed from plugins/CustomPiwikJs/tests/resources/tracker.js)0
-rw-r--r--plugins/CustomJsTracker/tests/resources/tracker.min.js (renamed from plugins/CustomPiwikJs/tests/resources/tracker.min.js)0
-rw-r--r--plugins/CustomVariables/API.php3
-rw-r--r--plugins/CustomVariables/Archiver.php6
-rw-r--r--plugins/CustomVariables/Columns/SearchCategory.php26
-rw-r--r--plugins/CustomVariables/VisitorDetails.php19
-rw-r--r--plugins/CustomVariables/tests/Commands/InfoTest.php4
-rw-r--r--plugins/CustomVariables/tests/Commands/SetNumberOfCustomVariablesTest.php51
-rw-r--r--plugins/CustomVariables/tests/Fixtures/VisitWithManyCustomVariables.php4
-rw-r--r--plugins/CustomVariables/tests/Integration/ModelTest.php14
-rw-r--r--plugins/DBStats/DBStats.php2
-rw-r--r--plugins/Dashboard/Dashboard.php9
-rw-r--r--plugins/Dashboard/tests/Integration/APITest.php23
-rw-r--r--plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_create_new.png4
-rw-r--r--plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_removed.png4
-rw-r--r--plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_loaded_token_auth.png4
-rw-r--r--plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_removed.png4
-rw-r--r--plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_reset.png4
m---------plugins/DeviceDetectorCache0
-rw-r--r--plugins/DevicePlugins/Archiver.php2
-rw-r--r--plugins/DevicePlugins/lang/pt-br.json12
-rw-r--r--plugins/DevicePlugins/lang/tr.json12
-rw-r--r--plugins/DevicesDetection/Archiver.php2
-rw-r--r--plugins/DevicesDetection/Columns/BrowserName.php5
-rw-r--r--plugins/DevicesDetection/Reports/GetBrowsers.php1
-rw-r--r--plugins/DevicesDetection/lang/zh-cn.json1
-rw-r--r--plugins/DevicesDetection/tests/Fixtures/MultiDeviceGoalConversions.php4
-rw-r--r--plugins/Diagnostics/ConfigReader.php2
-rw-r--r--plugins/Diagnostics/Diagnostic/CronArchivingLastRunCheck.php2
-rw-r--r--plugins/Diagnostics/Diagnostic/DatabaseAbilitiesCheck.php150
-rw-r--r--plugins/Diagnostics/Diagnostic/DbMaxPacket.php2
-rw-r--r--plugins/Diagnostics/Diagnostic/LoadDataInfileCheck.php87
-rw-r--r--plugins/Diagnostics/Diagnostic/PhpSettingsCheck.php17
-rw-r--r--plugins/Diagnostics/Diagnostics.php2
-rw-r--r--plugins/Diagnostics/config/config.php2
-rw-r--r--plugins/Diagnostics/lang/el.json2
-rw-r--r--plugins/Diagnostics/lang/en.json2
-rw-r--r--plugins/Diagnostics/lang/es-ar.json2
-rw-r--r--plugins/Diagnostics/lang/lt.json6
-rw-r--r--plugins/Diagnostics/lang/pt-br.json2
-rw-r--r--plugins/Diagnostics/lang/pt.json2
-rw-r--r--plugins/Diagnostics/lang/tr.json2
-rw-r--r--plugins/Diagnostics/lang/zh-cn.json2
-rw-r--r--plugins/Diagnostics/tests/Integration/Commands/AnalyzeArchiveTableTest.php8
-rw-r--r--plugins/Diagnostics/tests/Integration/ConfigReaderTest.php4
-rw-r--r--plugins/Diagnostics/tests/UI/Diagnostics_spec.js21
-rw-r--r--plugins/Diagnostics/tests/UI/expected-screenshots/Diagnostics_page.png3
-rw-r--r--plugins/Diagnostics/tests/Unit/Diagnostic/DiagnosticResultTest.php2
-rw-r--r--plugins/Diagnostics/tests/Unit/DiagnosticReportTest.php2
-rw-r--r--plugins/Diagnostics/tests/Unit/DiagnosticServiceTest.php2
-rw-r--r--plugins/Ecommerce/Reports/Base.php2
-rw-r--r--plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_week.original.html2
-rw-r--r--plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_week.original.html2
-rw-r--r--plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_week.original.html2
-rw-r--r--plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_and_graph__ScheduledReports.generateReport_week.original.html116
-rw-r--r--plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_only__ScheduledReports.generateReport_week.original.html4
-rw-r--r--plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_csv__ScheduledReports.generateReport_week.original.csv4
-rw-r--r--plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_week.original.pdfbin583409 -> 583425 bytes
-rw-r--r--plugins/Events/Events.php2
-rw-r--r--plugins/Events/VisitorDetails.php3
-rw-r--r--plugins/ExampleLogTables/plugin.json2
-rw-r--r--plugins/ExampleLogTables/tests/Fixtures/VisitsWithUserIdAndCustomData.php2
-rw-r--r--plugins/ExamplePlugin/plugin.json2
-rw-r--r--plugins/ExamplePlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php4
-rw-r--r--plugins/ExamplePlugin/tests/Integration/SimpleTest.php4
-rw-r--r--plugins/ExamplePlugin/tests/Unit/SimpleTest.php6
-rw-r--r--plugins/ExampleTheme/ExampleTheme.php2
-rw-r--r--plugins/ExampleTheme/plugin.json2
-rw-r--r--plugins/ExampleUI/Reports/GetPlanetRatios.php5
-rw-r--r--plugins/ExampleUI/Reports/GetTemperatures.php4
-rw-r--r--plugins/Feedback/API.php8
-rw-r--r--plugins/Feedback/Feedback.php2
-rw-r--r--plugins/Feedback/lang/zh-cn.json36
-rw-r--r--plugins/Feedback/lang/zh-tw.json15
-rw-r--r--plugins/Feedback/tests/Fixtures/FeedbackPopupFixture.php4
-rw-r--r--plugins/Feedback/tests/Integration/ControllerTest.php8
-rw-r--r--plugins/Feedback/tests/Integration/FeedbackTest.php6
-rw-r--r--plugins/Feedback/tests/UI/FeedbackPopup_spec.js6
-rw-r--r--plugins/Feedback/tests/UI/expected-screenshots/FeedbackPopup_dashboard_no_popup.png3
-rw-r--r--plugins/GeoIp2/Columns/Region.php20
-rw-r--r--plugins/GeoIp2/Controller.php200
-rw-r--r--plugins/GeoIp2/GeoIP2AutoUpdater.php27
-rw-r--r--plugins/GeoIp2/GeoIp2.php23
-rw-r--r--plugins/GeoIp2/LocationProvider/GeoIp2.php2
-rw-r--r--plugins/GeoIp2/LocationProvider/GeoIp2/Php.php73
-rw-r--r--plugins/GeoIp2/LocationProvider/GeoIp2/ServerModule.php18
-rw-r--r--plugins/GeoIp2/angularjs/geoip2-updater/geoip2-updater.controller.js (renamed from plugins/UserCountry/angularjs/location-provider-updater/location-provider-updater.controller.js)16
-rw-r--r--plugins/GeoIp2/angularjs/geoip2-updater/geoip2-updater.directive.js (renamed from plugins/UserCountry/angularjs/location-provider-updater/location-provider-updater.directive.js)10
-rw-r--r--plugins/GeoIp2/lang/ar.json12
-rw-r--r--plugins/GeoIp2/lang/bg.json28
-rw-r--r--plugins/GeoIp2/lang/ca.json24
-rw-r--r--plugins/GeoIp2/lang/cs.json30
-rw-r--r--plugins/GeoIp2/lang/da.json31
-rw-r--r--plugins/GeoIp2/lang/de.json47
-rw-r--r--plugins/GeoIp2/lang/el.json48
-rw-r--r--plugins/GeoIp2/lang/en.json48
-rw-r--r--plugins/GeoIp2/lang/es-ar.json47
-rw-r--r--plugins/GeoIp2/lang/es.json31
-rw-r--r--plugins/GeoIp2/lang/et.json10
-rw-r--r--plugins/GeoIp2/lang/fa.json17
-rw-r--r--plugins/GeoIp2/lang/fi.json27
-rw-r--r--plugins/GeoIp2/lang/fr.json31
-rw-r--r--plugins/GeoIp2/lang/gl.json11
-rw-r--r--plugins/GeoIp2/lang/he.json5
-rw-r--r--plugins/GeoIp2/lang/hi.json28
-rw-r--r--plugins/GeoIp2/lang/id.json26
-rw-r--r--plugins/GeoIp2/lang/it.json31
-rw-r--r--plugins/GeoIp2/lang/ja.json31
-rw-r--r--plugins/GeoIp2/lang/ko.json30
-rw-r--r--plugins/GeoIp2/lang/lt.json10
-rw-r--r--plugins/GeoIp2/lang/nb.json16
-rw-r--r--plugins/GeoIp2/lang/nl.json26
-rw-r--r--plugins/GeoIp2/lang/pl.json29
-rw-r--r--plugins/GeoIp2/lang/pt-br.json48
-rw-r--r--plugins/GeoIp2/lang/pt.json32
-rw-r--r--plugins/GeoIp2/lang/ro.json30
-rw-r--r--plugins/GeoIp2/lang/ru.json24
-rw-r--r--plugins/GeoIp2/lang/sk.json5
-rw-r--r--plugins/GeoIp2/lang/sq.json48
-rw-r--r--plugins/GeoIp2/lang/sr.json30
-rw-r--r--plugins/GeoIp2/lang/sv.json29
-rw-r--r--plugins/GeoIp2/lang/th.json7
-rw-r--r--plugins/GeoIp2/lang/tl.json30
-rw-r--r--plugins/GeoIp2/lang/tr.json48
-rw-r--r--plugins/GeoIp2/lang/uk.json30
-rw-r--r--plugins/GeoIp2/lang/vi.json24
-rw-r--r--plugins/GeoIp2/lang/zh-cn.json51
-rw-r--r--plugins/GeoIp2/lang/zh-tw.json29
-rw-r--r--plugins/GeoIp2/templates/_updaterManage.twig (renamed from plugins/UserCountry/templates/_updaterManage.twig)29
-rw-r--r--plugins/GeoIp2/templates/_updaterNextRunTime.twig9
-rw-r--r--plugins/GeoIp2/templates/configuration.twig48
-rw-r--r--plugins/GeoIp2/templates/setupguide.twig9
-rw-r--r--plugins/GeoIp2/tests/Integration/LocationProviderTest.php2
-rw-r--r--plugins/GeoIp2/tests/Integration/UpdateTest.php2
-rw-r--r--plugins/GeoIp2/tests/System/ConvertRegionCodesToIsoTest.php9
-rw-r--r--plugins/GeoIp2/tests/Unit/GeoIp2Test.php135
-rw-r--r--plugins/Goals/Goals.php2
-rw-r--r--plugins/Goals/lang/zh-cn.json20
-rw-r--r--plugins/Goals/tests/Integration/APITest.php61
-rw-r--r--plugins/Goals/tests/Unit/AppendNameToColumnNamesTest.php4
-rw-r--r--plugins/ImageGraph/API.php4
-rw-r--r--plugins/ImageGraph/ImageGraph.php4
-rw-r--r--plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_evolution_graph.png4
-rw-r--r--plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_pie.png4
-rw-r--r--plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_vertical_bar.png4
-rw-r--r--plugins/Insights/Insights.php2
-rw-r--r--plugins/Insights/lang/zh-cn.json18
-rw-r--r--plugins/Insights/tests/Fixtures/SomeVisitsDifferentPathsOnTwoDays.php4
-rw-r--r--plugins/Insights/tests/Integration/ApiTest.php15
-rw-r--r--plugins/Insights/tests/Integration/ModelTest.php18
-rw-r--r--plugins/Insights/tests/UI/expected-screenshots/Insights_initial.png4
-rw-r--r--plugins/Insights/tests/Unit/BaseUnitTest.php2
-rw-r--r--plugins/Insights/tests/Unit/FilterExcludeLowValueTest.php2
-rw-r--r--plugins/Insights/tests/Unit/FilterInsightTest.php2
-rw-r--r--plugins/Insights/tests/Unit/FilterLimitTest.php2
-rw-r--r--plugins/Insights/tests/Unit/FilterMinGrowthTest.php2
-rw-r--r--plugins/Insights/tests/Unit/FilterOrderByTest.php8
-rw-r--r--plugins/Insights/tests/Unit/InsightReportTest.php13
-rw-r--r--plugins/Installation/Controller.php2
-rw-r--r--plugins/Installation/Installation.php4
-rw-r--r--plugins/Installation/tests/System/APITest.php6
-rw-r--r--plugins/Installation/tests/UI/expected-screenshots/Installation_system_check.png4
-rw-r--r--plugins/Intl/Commands/GenerateIntl.php9
-rw-r--r--plugins/Intl/Intl.php2
-rw-r--r--plugins/Intl/lang/am.json5
-rw-r--r--plugins/Intl/lang/ar.json11
-rw-r--r--plugins/Intl/lang/be.json61
-rw-r--r--plugins/Intl/lang/bg.json25
-rw-r--r--plugins/Intl/lang/bn.json5
-rw-r--r--plugins/Intl/lang/bs.json13
-rw-r--r--plugins/Intl/lang/ca.json21
-rw-r--r--plugins/Intl/lang/cs.json3
-rw-r--r--plugins/Intl/lang/cy.json19
-rw-r--r--plugins/Intl/lang/da.json13
-rw-r--r--plugins/Intl/lang/de.json7
-rw-r--r--plugins/Intl/lang/el.json11
-rw-r--r--plugins/Intl/lang/en.json7
-rw-r--r--plugins/Intl/lang/eo.json2
-rw-r--r--plugins/Intl/lang/es-ar.json25
-rw-r--r--plugins/Intl/lang/es.json21
-rw-r--r--plugins/Intl/lang/et.json7
-rw-r--r--plugins/Intl/lang/eu.json301
-rw-r--r--plugins/Intl/lang/fa.json19
-rw-r--r--plugins/Intl/lang/fi.json3
-rw-r--r--plugins/Intl/lang/fr.json7
-rw-r--r--plugins/Intl/lang/gl.json93
-rw-r--r--plugins/Intl/lang/he.json13
-rw-r--r--plugins/Intl/lang/hi.json9
-rw-r--r--plugins/Intl/lang/hr.json27
-rw-r--r--plugins/Intl/lang/hu.json15
-rw-r--r--plugins/Intl/lang/id.json27
-rw-r--r--plugins/Intl/lang/is.json7
-rw-r--r--plugins/Intl/lang/it.json3
-rw-r--r--plugins/Intl/lang/ja.json5
-rw-r--r--plugins/Intl/lang/ka.json3
-rw-r--r--plugins/Intl/lang/ko.json5
-rw-r--r--plugins/Intl/lang/lt.json3
-rw-r--r--plugins/Intl/lang/lv.json13
-rw-r--r--plugins/Intl/lang/nb.json5
-rw-r--r--plugins/Intl/lang/nl.json7
-rw-r--r--plugins/Intl/lang/nn.json3
-rw-r--r--plugins/Intl/lang/pl.json23
-rw-r--r--plugins/Intl/lang/pt-br.json133
-rw-r--r--plugins/Intl/lang/pt.json129
-rw-r--r--plugins/Intl/lang/ro.json9
-rw-r--r--plugins/Intl/lang/ru.json7
-rw-r--r--plugins/Intl/lang/sk.json5
-rw-r--r--plugins/Intl/lang/sl.json7
-rw-r--r--plugins/Intl/lang/sq.json7
-rw-r--r--plugins/Intl/lang/sr.json9
-rw-r--r--plugins/Intl/lang/sv.json7
-rw-r--r--plugins/Intl/lang/ta.json15
-rw-r--r--plugins/Intl/lang/te.json13
-rw-r--r--plugins/Intl/lang/th.json9
-rw-r--r--plugins/Intl/lang/tl.json3
-rw-r--r--plugins/Intl/lang/tr.json33
-rw-r--r--plugins/Intl/lang/uk.json5
-rw-r--r--plugins/Intl/lang/vi.json15
-rw-r--r--plugins/Intl/lang/zh-cn.json9
-rw-r--r--plugins/Intl/lang/zh-tw.json5
-rw-r--r--plugins/IntranetMeasurable/tests/Fixtures/IntranetSitesWithVisits.php6
-rw-r--r--plugins/LanguagesManager/Commands/CreatePull.php2
-rw-r--r--plugins/LanguagesManager/Commands/FetchTranslations.php28
-rw-r--r--plugins/LanguagesManager/Commands/LanguageInfo.php34
-rw-r--r--plugins/LanguagesManager/LanguagesManager.php6
-rw-r--r--plugins/LanguagesManager/Menu.php2
-rw-r--r--plugins/LanguagesManager/TranslationWriter/Filter/EncodedEntities.php6
-rw-r--r--plugins/LanguagesManager/tests/Integration/LanguagesManagerTest.php17
-rw-r--r--plugins/LanguagesManager/tests/Integration/ModelTest.php6
-rw-r--r--plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByBaseTranslationsTest.php2
-rw-r--r--plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByParameterCountTest.php2
-rw-r--r--plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EmptyTranslationsTest.php2
-rw-r--r--plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EncodedEntitiesTest.php2
-rw-r--r--plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/UnnecassaryWhitespacesTest.php2
-rw-r--r--plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/CoreTranslationsTest.php2
-rw-r--r--plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/NoScriptsTest.php2
-rw-r--r--plugins/LanguagesManager/tests/Unit/TranslationWriter/WriterTest.php17
-rw-r--r--plugins/Live/Visitor.php33
-rw-r--r--plugins/Live/VisitorDetails.php6
-rw-r--r--plugins/Live/VisitorFactory.php2
-rw-r--r--plugins/Live/Visualizations/VisitorLog.php41
-rw-r--r--plugins/Live/lang/zh-cn.json24
-rw-r--r--plugins/Live/templates/_actionTooltip.twig8
-rw-r--r--plugins/Live/tests/Fixtures/ManyVisitsOfSameVisitor.php7
-rw-r--r--plugins/Live/tests/Fixtures/VisitsWithAllActionsAndDevices.php12
-rw-r--r--plugins/Live/tests/Integration/ModelTest.php20
-rw-r--r--plugins/Live/tests/System/ApiCounterTest.php11
-rw-r--r--plugins/Live/tests/System/expected/test_actionSegment__Live.getLastVisitsDetails_day.xml264
-rw-r--r--plugins/Live/tests/System/expected/test_allSites__Live.getLastVisitsDetails_day.xml488
-rw-r--r--plugins/Live/tests/System/expected/test_multiSites__Live.getLastVisitsDetails_day.xml488
-rw-r--r--plugins/Live/tests/UI/expected-screenshots/Live_visitor_log.png4
-rw-r--r--plugins/Live/tests/UI/expected-screenshots/Live_visitor_log_expand_pageview_actions.png4
-rw-r--r--plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile.png4
-rw-r--r--plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_action_details.png4
-rw-r--r--plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_actions_hidden.png2
-rw-r--r--plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_limited.png4
-rw-r--r--plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_visit_details.png4
m---------plugins/LogViewer0
-rw-r--r--plugins/Login/Controller.php2
-rw-r--r--plugins/Login/SystemSettings.php2
-rw-r--r--plugins/Login/config/test.php4
-rw-r--r--plugins/Login/templates/loginLayout.twig2
-rw-r--r--plugins/Login/tests/Integration/APITest.php9
-rw-r--r--plugins/Login/tests/Integration/LoginTest.php2
-rw-r--r--plugins/Login/tests/Integration/PasswordResetterTest.php23
-rw-r--r--plugins/Login/tests/Integration/PasswordVerifierTest.php2
-rw-r--r--plugins/Login/tests/Integration/Security/BruteForceDetectionTest.php2
-rw-r--r--plugins/Login/tests/Integration/SessionInitializerTest.php4
-rw-r--r--plugins/Login/tests/Integration/SystemSettingsTest.php16
m---------plugins/LoginHttpAuth0
m---------plugins/LoginLdap0
m---------plugins/MarketingCampaignsReporting0
-rw-r--r--plugins/Marketplace/Api/Client.php6
-rw-r--r--plugins/Marketplace/Plugins/InvalidLicenses.php6
-rw-r--r--plugins/Marketplace/lang/zh-cn.json45
-rw-r--r--plugins/Marketplace/tests/Fixtures/SimpleFixtureTrackFewVisits.php4
-rw-r--r--plugins/Marketplace/tests/Framework/Mock/Client.php4
-rw-r--r--plugins/Marketplace/tests/Integration/ApiTest.php44
-rw-r--r--plugins/Marketplace/tests/Integration/ClientTest.php9
-rw-r--r--plugins/Marketplace/tests/Integration/EnvironmentTest.php2
-rw-r--r--plugins/Marketplace/tests/Integration/Input/PluginNameTest.php9
-rw-r--r--plugins/Marketplace/tests/Integration/LicenseKeyTest.php2
-rw-r--r--plugins/Marketplace/tests/Integration/Plugins/InvalidLicensesTest.php14
-rw-r--r--plugins/Marketplace/tests/Integration/PluginsTest.php19
-rw-r--r--plugins/Marketplace/tests/Integration/ServiceTest.php20
-rw-r--r--plugins/Marketplace/tests/Integration/UpdateCommunicationTest.php2
-rw-r--r--plugins/Marketplace/tests/System/Api/ClientTest.php30
-rw-r--r--plugins/Marketplace/tests/System/Api/ServiceTest.php22
-rw-r--r--plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin.png4
-rw-r--r--plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin_with_multiserver_enabled.png4
-rw-r--r--plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_invalid_license_key_entered.png4
-rw-r--r--plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_remove_license_key_confirmed.png4
-rw-r--r--plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_valid_license_key_entered.png4
-rw-r--r--plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_multiUserEnvironment.png4
-rw-r--r--plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_superuser.png4
-rw-r--r--plugins/Marketplace/tests/Unit/ConsumerTest.php4
-rw-r--r--plugins/Marketplace/tests/resources/v2.0_plugins.json457
-rw-r--r--plugins/MobileMessaging/MobileMessaging.php2
-rw-r--r--plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php2
-rw-r--r--plugins/Monolog/Processor/ClassNameProcessor.php6
-rw-r--r--plugins/Monolog/tests/Integration/LogTest.php4
-rw-r--r--plugins/Monolog/tests/System/TrackerLoggingTest.php8
-rw-r--r--plugins/Monolog/tests/Unit/Formatter/LineMessageFormatterTest.php2
-rw-r--r--plugins/Monolog/tests/Unit/Processor/ClassNameProcessorTest.php2
-rw-r--r--plugins/Monolog/tests/Unit/Processor/ExceptionToTextProcessorTest.php2
-rw-r--r--plugins/Monolog/tests/Unit/Processor/RequestIdProcessorTest.php10
-rw-r--r--plugins/Monolog/tests/Unit/Processor/SprintfProcessorTest.php2
-rw-r--r--plugins/Monolog/tests/Unit/Processor/TokenProcessorTest.php2
-rw-r--r--plugins/Morpheus/fonts/README.md1
-rw-r--r--plugins/Morpheus/fonts/piwik.svg142
-rw-r--r--plugins/Morpheus/fonts/piwik.ttfbin26300 -> 0 bytes
-rw-r--r--plugins/Morpheus/fonts/piwik.woffbin26376 -> 0 bytes
-rw-r--r--plugins/Morpheus/fonts/piwik.woff2bin10936 -> 0 bytes
-rw-r--r--plugins/Morpheus/javascripts/ajaxHelper.js18
-rw-r--r--plugins/Morpheus/stylesheets/base/icons.css14
-rw-r--r--plugins/Morpheus/templates/demo.twig48
-rw-r--r--plugins/Morpheus/templates/layout.twig2
-rw-r--r--plugins/Morpheus/tests/UI/expected-screenshots/Morpheus_load.png4
-rw-r--r--plugins/MultiSites/API.php2
-rw-r--r--plugins/MultiSites/MultiSites.php2
-rw-r--r--plugins/MultiSites/lang/de.json2
-rw-r--r--plugins/MultiSites/tests/Fixtures/ManySitesWithVisits.php4
-rw-r--r--plugins/MultiSites/tests/Integration/DashboardTest.php5
-rw-r--r--plugins/MultiSites/tests/Integration/MultiSitesTest.php8
-rw-r--r--plugins/Overlay/Overlay.php2
-rw-r--r--plugins/PrivacyManager/API.php17
-rw-r--r--plugins/PrivacyManager/Controller.php17
-rw-r--r--plugins/PrivacyManager/Dao/LogDataAnonymizer.php2
-rw-r--r--plugins/PrivacyManager/IPAnonymizer.php2
-rw-r--r--plugins/PrivacyManager/PrivacyManager.php57
-rw-r--r--plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html42
-rw-r--r--plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html65
-rw-r--r--plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html14
-rw-r--r--plugins/PrivacyManager/lang/da.json1
-rw-r--r--plugins/PrivacyManager/lang/de.json12
-rw-r--r--plugins/PrivacyManager/lang/el.json110
-rw-r--r--plugins/PrivacyManager/lang/en.json112
-rw-r--r--plugins/PrivacyManager/lang/es-ar.json1
-rw-r--r--plugins/PrivacyManager/lang/es.json1
-rw-r--r--plugins/PrivacyManager/lang/fi.json1
-rw-r--r--plugins/PrivacyManager/lang/fr.json1
-rw-r--r--plugins/PrivacyManager/lang/it.json40
-rw-r--r--plugins/PrivacyManager/lang/ja.json1
-rw-r--r--plugins/PrivacyManager/lang/lt.json1
-rw-r--r--plugins/PrivacyManager/lang/nl.json1
-rw-r--r--plugins/PrivacyManager/lang/pl.json1
-rw-r--r--plugins/PrivacyManager/lang/pt-br.json1
-rw-r--r--plugins/PrivacyManager/lang/pt.json47
-rw-r--r--plugins/PrivacyManager/lang/ru.json1
-rw-r--r--plugins/PrivacyManager/lang/sq.json44
-rw-r--r--plugins/PrivacyManager/lang/sv.json1
-rw-r--r--plugins/PrivacyManager/lang/tr.json42
-rw-r--r--plugins/PrivacyManager/lang/zh-tw.json1
-rw-r--r--plugins/PrivacyManager/templates/askingForConsent.twig72
-rw-r--r--plugins/PrivacyManager/templates/gdprOverview.twig70
-rw-r--r--plugins/PrivacyManager/templates/usersOptOut.twig2
-rw-r--r--plugins/PrivacyManager/tests/Fixtures/FewVisitsAnonymizedFixture.php4
-rw-r--r--plugins/PrivacyManager/tests/Fixtures/MultipleSitesMultipleVisitsFixture.php6
-rw-r--r--plugins/PrivacyManager/tests/Integration/Dao/LogDataAnonymizerTest.php43
-rw-r--r--plugins/PrivacyManager/tests/Integration/DataPurgingTest.php5
-rw-r--r--plugins/PrivacyManager/tests/Integration/Model/DataSubjectsTest.php4
-rw-r--r--plugins/PrivacyManager/tests/Integration/Model/LogDataAnonymizationsTest.php51
-rw-r--r--plugins/PrivacyManager/tests/Integration/PrivacyManagerConfigTest.php2
-rw-r--r--plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php5
-rw-r--r--plugins/PrivacyManager/tests/Integration/Tracker/RequestProcessorTest.php2
-rw-r--r--plugins/PrivacyManager/tests/System/APITest.php16
-rw-r--r--plugins/PrivacyManager/tests/System/AnonymizationTest.php2
-rw-r--r--plugins/PrivacyManager/tests/System/PurgeDataTest.php6
-rwxr-xr-xplugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_allSitesAllDates.json94
-rwxr-xr-xplugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_anonymizeUserId.json32
-rwxr-xr-xplugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictDate.json94
-rwxr-xr-xplugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictSites.json94
-rwxr-xr-xplugins/PrivacyManager/tests/System/expected/exportDataSubject_allVisits.json216
-rwxr-xr-xplugins/PrivacyManager/tests/System/expected/exportDataSubject_oneVisitGiven.json7
-rw-r--r--plugins/PrivacyManager/tests/System/expected/test___PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml8
-rw-r--r--plugins/PrivacyManager/tests/System/expected/test_allSites__Live.getLastVisitsDetails_year.xml546
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png4
-rw-r--r--plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png4
-rw-r--r--plugins/PrivacyManager/tests/Unit/AnonymizeIPTest.php4
-rw-r--r--plugins/PrivacyManager/tests/Unit/DoNotTrackHeaderCheckerTest.php6
m---------plugins/Provider0
-rw-r--r--plugins/Provider/API.php45
-rw-r--r--plugins/Provider/Archiver.php39
-rw-r--r--plugins/Provider/Columns/Provider.php96
-rw-r--r--plugins/Provider/Controller.php17
-rw-r--r--plugins/Provider/Provider.php111
-rw-r--r--plugins/Provider/Reports/GetProvider.php52
-rw-r--r--plugins/Provider/Updates/3.0.0-b1.php43
-rw-r--r--plugins/Provider/VisitorDetails.php57
-rw-r--r--plugins/Provider/config/config.php2
-rw-r--r--plugins/Provider/config/tracker.php2
-rw-r--r--plugins/Provider/functions.php73
-rw-r--r--plugins/Provider/lang/am.json6
-rw-r--r--plugins/Provider/lang/ar.json9
-rw-r--r--plugins/Provider/lang/be.json7
-rw-r--r--plugins/Provider/lang/bg.json7
-rw-r--r--plugins/Provider/lang/ca.json7
-rw-r--r--plugins/Provider/lang/cs.json9
-rw-r--r--plugins/Provider/lang/da.json9
-rw-r--r--plugins/Provider/lang/de.json9
-rw-r--r--plugins/Provider/lang/el.json9
-rw-r--r--plugins/Provider/lang/en.json9
-rw-r--r--plugins/Provider/lang/es-ar.json9
-rw-r--r--plugins/Provider/lang/es.json9
-rw-r--r--plugins/Provider/lang/et.json6
-rw-r--r--plugins/Provider/lang/eu.json6
-rw-r--r--plugins/Provider/lang/fa.json6
-rw-r--r--plugins/Provider/lang/fi.json9
-rw-r--r--plugins/Provider/lang/fr.json9
-rw-r--r--plugins/Provider/lang/gl.json5
-rw-r--r--plugins/Provider/lang/hi.json9
-rw-r--r--plugins/Provider/lang/hu.json6
-rw-r--r--plugins/Provider/lang/id.json7
-rw-r--r--plugins/Provider/lang/is.json6
-rw-r--r--plugins/Provider/lang/it.json9
-rw-r--r--plugins/Provider/lang/ja.json9
-rw-r--r--plugins/Provider/lang/ka.json6
-rw-r--r--plugins/Provider/lang/ko.json9
-rw-r--r--plugins/Provider/lang/lt.json6
-rw-r--r--plugins/Provider/lang/lv.json6
-rw-r--r--plugins/Provider/lang/nb.json9
-rw-r--r--plugins/Provider/lang/nl.json9
-rw-r--r--plugins/Provider/lang/pl.json9
-rw-r--r--plugins/Provider/lang/pt-br.json9
-rw-r--r--plugins/Provider/lang/pt.json9
-rw-r--r--plugins/Provider/lang/ro.json7
-rw-r--r--plugins/Provider/lang/ru.json9
-rw-r--r--plugins/Provider/lang/sk.json6
-rw-r--r--plugins/Provider/lang/sl.json9
-rw-r--r--plugins/Provider/lang/sq.json9
-rw-r--r--plugins/Provider/lang/sr.json9
-rw-r--r--plugins/Provider/lang/sv.json9
-rw-r--r--plugins/Provider/lang/ta.json6
-rw-r--r--plugins/Provider/lang/th.json6
-rw-r--r--plugins/Provider/lang/tl.json8
-rw-r--r--plugins/Provider/lang/tr.json9
-rw-r--r--plugins/Provider/lang/uk.json9
-rw-r--r--plugins/Provider/lang/vi.json7
-rw-r--r--plugins/Provider/lang/zh-cn.json9
-rw-r--r--plugins/Provider/lang/zh-tw.json9
-rw-r--r--plugins/Provider/templates/_visitorDetails.twig9
-rw-r--r--plugins/Proxy/tests/Unit/ProxyTest.php2
m---------plugins/QueuedTracking0
-rw-r--r--plugins/Referrers/Columns/Base.php2
-rw-r--r--plugins/Referrers/Columns/ReferrerName.php2
-rw-r--r--plugins/Referrers/Columns/ReferrerUrl.php2
-rw-r--r--plugins/Referrers/VisitorDetails.php1
-rw-r--r--plugins/Referrers/lang/zh-tw.json28
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php2
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php9
-rw-r--r--plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php4
-rw-r--r--plugins/Referrers/tests/System/ApiTest.php4
-rw-r--r--plugins/Referrers/tests/Unit/DataTable/Filter/UrlsFromWebsiteIdTest.php2
-rw-r--r--plugins/Referrers/tests/Unit/GroupDifferentSocialWritingsTest.php2
-rw-r--r--plugins/Referrers/tests/Unit/ReferrersTest.php2
-rw-r--r--plugins/Referrers/tests/Unit/SearchEngineTest.php6
-rw-r--r--plugins/Referrers/tests/Unit/SocialTest.php6
-rw-r--r--plugins/Resolution/Archiver.php2
-rw-r--r--plugins/RssWidget/RssRenderer.php4
-rw-r--r--plugins/SEO/Metric/ProviderCache.php3
-rw-r--r--plugins/SEO/tests/Integration/SEOTest.php2
-rw-r--r--plugins/ScheduledReports/API.php10
-rw-r--r--plugins/ScheduledReports/tests/Fixtures/ReportSubscription.php2
-rw-r--r--plugins/ScheduledReports/tests/Integration/ApiTest.php57
-rw-r--r--plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php14
-rw-r--r--plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php2
-rw-r--r--plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php2
-rw-r--r--plugins/ScheduledReports/tests/Integration/ScheduledReportsTest.php4
m---------plugins/SecurityInfo0
-rw-r--r--plugins/SegmentEditor/SegmentEditor.php2
-rw-r--r--plugins/SegmentEditor/Services/StoredSegmentService.php2
-rw-r--r--plugins/SegmentEditor/angularjs/segment-generator/segmentgenerator.controller.js8
-rw-r--r--plugins/SegmentEditor/templates/_segmentSelector.twig4
-rw-r--r--plugins/SegmentEditor/tests/Integration/ApiTest.php2
-rw-r--r--plugins/SegmentEditor/tests/Integration/ModelTest.php4
-rw-r--r--plugins/SegmentEditor/tests/Integration/SegmentEditorTest.php2
-rw-r--r--plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php24
-rw-r--r--plugins/SegmentEditor/tests/Integration/SegmentListTest.php11
-rw-r--r--plugins/SegmentEditor/tests/Integration/SegmentQueryDecoratorTest.php2
-rw-r--r--plugins/SegmentEditor/tests/System/UnprocessedSegmentsTest.php18
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_6_segment_editor_different.png4
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_8_segment_editor_create.png4
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_and_condition.png4
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_or_condition.png4
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_dimension_drag_drop.png4
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_and_condition.png4
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_or_condition.png4
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_saved_details.png4
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_suggested_values.png4
-rw-r--r--plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_updated_details.png4
-rw-r--r--plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php11
-rw-r--r--plugins/SitesManager/API.php14
-rw-r--r--plugins/SitesManager/Controller.php2
-rw-r--r--plugins/SitesManager/lang/de.json1
-rw-r--r--plugins/SitesManager/lang/pt.json4
-rw-r--r--plugins/SitesManager/tests/Fixtures/ManySites.php2
-rw-r--r--plugins/SitesManager/tests/Integration/ApiTest.php77
-rw-r--r--plugins/SitesManager/tests/Integration/ModelTest.php2
-rw-r--r--plugins/SitesManager/tests/Integration/SiteUrlsTest.php2
-rw-r--r--plugins/SitesManager/tests/Integration/SitesManagerTest.php2
-rw-r--r--plugins/SitesManager/tests/Unit/APITest.php12
m---------plugins/TagManager0
m---------plugins/TasksTimetable0
-rw-r--r--plugins/TestRunner/Aws/config.ini.php1
-rw-r--r--plugins/TestRunner/Commands/TestsRun.php3
-rw-r--r--plugins/TestRunner/Commands/TestsRunUI.php3
-rw-r--r--plugins/TestRunner/Commands/TestsSetupFixture.php2
-rw-r--r--plugins/Tour/lang/zh-cn.json1
-rw-r--r--plugins/Tour/tests/Fixtures/SimpleFixtureTrackFewVisits.php4
-rw-r--r--plugins/Tour/tests/Integration/ChallengeTest.php4
-rw-r--r--plugins/Tour/tests/System/APITest.php14
-rw-r--r--plugins/Tour/tests/System/DataFinderTest.php2
-rw-r--r--plugins/Tour/tests/System/TourTest.php2
m---------plugins/TreemapVisualization0
-rw-r--r--plugins/TwoFactorAuth/TwoFactorAuth.php2
-rw-r--r--plugins/TwoFactorAuth/Validator.php4
-rw-r--r--plugins/TwoFactorAuth/config/test.php6
-rw-r--r--plugins/TwoFactorAuth/tests/Fixtures/SimpleFixtureTrackFewVisits.php4
-rw-r--r--plugins/TwoFactorAuth/tests/Fixtures/TwoFactorFixture.php4
-rw-r--r--plugins/TwoFactorAuth/tests/Integration/APITest.php9
-rw-r--r--plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeDaoTest.php2
-rw-r--r--plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeRandomGeneratorTest.php2
-rw-r--r--plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeStaticGeneratorTest.php2
-rw-r--r--plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretRandomGeneratorTest.php2
-rw-r--r--plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretStaticGeneratorTest.php2
-rw-r--r--plugins/TwoFactorAuth/tests/Integration/SystemSettingsTest.php2
-rw-r--r--plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthTest.php18
-rw-r--r--plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthenticationTest.php16
-rw-r--r--plugins/TwoFactorAuth/tests/System/TwoFactorAuthTest.php2
-rw-r--r--plugins/TwoFactorAuth/tests/UI/TwoFactorAuth_spec.js7
-rw-r--r--plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_logme_verified.png4
-rw-r--r--plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_twofa_forced_step4.png4
-rw-r--r--plugins/UserCountry/Archiver.php2
-rw-r--r--plugins/UserCountry/Columns/Base.php2
-rw-r--r--plugins/UserCountry/Columns/Country.php2
-rw-r--r--plugins/UserCountry/Columns/Region.php1
-rw-r--r--plugins/UserCountry/Controller.php390
-rw-r--r--plugins/UserCountry/Diagnostic/GeolocationDiagnostic.php5
-rw-r--r--plugins/UserCountry/GeoIPAutoUpdater.php731
-rw-r--r--plugins/UserCountry/LocationProvider.php24
-rw-r--r--plugins/UserCountry/LocationProvider/GeoIp.php254
-rw-r--r--plugins/UserCountry/LocationProvider/GeoIp/Pecl.php328
-rw-r--r--plugins/UserCountry/LocationProvider/GeoIp/Php.php388
-rw-r--r--plugins/UserCountry/LocationProvider/GeoIp/ServerBased.php291
-rw-r--r--plugins/UserCountry/Reports/Base.php2
-rw-r--r--plugins/UserCountry/Reports/GetContinent.php1
-rw-r--r--plugins/UserCountry/Tasks.php21
-rw-r--r--plugins/UserCountry/UserCountry.php26
-rw-r--r--plugins/UserCountry/VisitorGeolocator.php6
-rw-r--r--plugins/UserCountry/functions.php58
-rw-r--r--plugins/UserCountry/lang/ar.json11
-rw-r--r--plugins/UserCountry/lang/bg.json33
-rw-r--r--plugins/UserCountry/lang/ca.json31
-rw-r--r--plugins/UserCountry/lang/cs.json37
-rw-r--r--plugins/UserCountry/lang/da.json38
-rw-r--r--plugins/UserCountry/lang/de.json59
-rw-r--r--plugins/UserCountry/lang/el.json63
-rw-r--r--plugins/UserCountry/lang/en.json63
-rw-r--r--plugins/UserCountry/lang/es-ar.json62
-rw-r--r--plugins/UserCountry/lang/es.json38
-rw-r--r--plugins/UserCountry/lang/et.json8
-rw-r--r--plugins/UserCountry/lang/fa.json18
-rw-r--r--plugins/UserCountry/lang/fi.json38
-rw-r--r--plugins/UserCountry/lang/fr.json38
-rw-r--r--plugins/UserCountry/lang/gl.json9
-rw-r--r--plugins/UserCountry/lang/he.json1
-rw-r--r--plugins/UserCountry/lang/hi.json35
-rw-r--r--plugins/UserCountry/lang/id.json33
-rw-r--r--plugins/UserCountry/lang/it.json38
-rw-r--r--plugins/UserCountry/lang/ja.json38
-rw-r--r--plugins/UserCountry/lang/ko.json37
-rw-r--r--plugins/UserCountry/lang/lt.json10
-rw-r--r--plugins/UserCountry/lang/nb.json16
-rw-r--r--plugins/UserCountry/lang/nl.json33
-rw-r--r--plugins/UserCountry/lang/pl.json38
-rw-r--r--plugins/UserCountry/lang/pt-br.json63
-rw-r--r--plugins/UserCountry/lang/pt.json42
-rw-r--r--plugins/UserCountry/lang/ro.json37
-rw-r--r--plugins/UserCountry/lang/ru.json33
-rw-r--r--plugins/UserCountry/lang/sk.json3
-rw-r--r--plugins/UserCountry/lang/sq.json63
-rw-r--r--plugins/UserCountry/lang/sr.json37
-rw-r--r--plugins/UserCountry/lang/sv.json38
-rw-r--r--plugins/UserCountry/lang/th.json5
-rw-r--r--plugins/UserCountry/lang/tl.json36
-rw-r--r--plugins/UserCountry/lang/tr.json63
-rw-r--r--plugins/UserCountry/lang/uk.json37
-rw-r--r--plugins/UserCountry/lang/vi.json33
-rw-r--r--plugins/UserCountry/lang/zh-cn.json38
-rw-r--r--plugins/UserCountry/lang/zh-tw.json38
-rw-r--r--plugins/UserCountry/templates/_updaterNextRunTime.twig9
-rw-r--r--plugins/UserCountry/templates/adminIndex.twig108
-rw-r--r--plugins/UserCountry/tests/Integration/APITest.php21
-rw-r--r--plugins/UserCountry/tests/Integration/VisitorGeolocatorTest.php13
-rw-r--r--plugins/UserCountry/tests/System/AttributeHistoricalDataWithLocationsTest.php23
-rw-r--r--plugins/UserCountry/tests/System/expected/test___UserCountry.getCountryCodeMapping.xml6
-rw-r--r--plugins/UserCountry/tests/UI/UserCountry_spec.js35
-rw-r--r--plugins/UserCountry/tests/UI/expected-screenshots/UserCountry_admin_geoip2.png3
-rw-r--r--plugins/UserCountry/tests/UI/expected-screenshots/UserCountry_admin_no_providers.png3
-rw-r--r--plugins/UserCountry/tests/Unit/UserCountryTest.php128
-rw-r--r--plugins/UserCountryMap/javascripts/visitor-map.js10
-rw-r--r--plugins/UserCountryMap/stylesheets/visitor-map.less1
-rw-r--r--plugins/UserCountryMap/templates/visitorMap.twig5
-rw-r--r--plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_cities.png4
-rw-r--r--plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_regions.png4
-rw-r--r--plugins/UserId/tests/Fixtures/TrackFewVisitsAndCreateUsers.php2
-rw-r--r--plugins/UserLanguage/tests/Fixtures/LanguageFixture.php4
-rw-r--r--plugins/UsersManager/Controller.php6
-rw-r--r--plugins/UsersManager/tests/Fixtures/ManyUsers.php4
-rw-r--r--plugins/UsersManager/tests/Integration/APITest.php121
-rw-r--r--plugins/UsersManager/tests/Integration/ModelTest.php2
-rw-r--r--plugins/UsersManager/tests/Integration/UserAccessFilterTest.php2
-rw-r--r--plugins/UsersManager/tests/Integration/UserPreferencesTest.php2
-rw-r--r--plugins/UsersManager/tests/Integration/UsersManagerTest.php243
-rw-r--r--plugins/UsersManager/tests/UI/UsersManager_spec.js1
-rw-r--r--plugins/VisitFrequency/VisitFrequency.php2
-rw-r--r--plugins/VisitFrequency/lang/pt.json12
-rw-r--r--plugins/VisitFrequency/lang/zh-cn.json12
-rw-r--r--plugins/VisitFrequency/tests/Integration/APITest.php2
-rw-r--r--plugins/VisitTime/tests/Unit/AddSegmentByLabelInUTCTest.php4
m---------plugins/VisitorGenerator0
-rw-r--r--plugins/VisitsSummary/VisitsSummary.php2
-rw-r--r--plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php6
-rw-r--r--plugins/VisitsSummary/tests/Unit/Reports/GetTest.php4
-rw-r--r--plugins/WebsiteMeasurable/MeasurableSettings.php2
-rw-r--r--plugins/Widgetize/Widgetize.php2
-rw-r--r--plugins/Widgetize/tests/Fixtures/WidgetizeFixture.php4
-rw-r--r--plugins/Widgetize/tests/System/WidgetTest.php4
-rw-r--r--tests/LocalTracker.php4
-rw-r--r--tests/PHPUnit/Benchmarks/ArchiveQueryBenchmark.php2
-rw-r--r--tests/PHPUnit/Benchmarks/ArchivingProcessBenchmark.php2
-rw-r--r--tests/PHPUnit/Benchmarks/Fixtures/ManyThousandSitesOneVisitEach.php2
-rw-r--r--tests/PHPUnit/Benchmarks/Fixtures/OneSiteThousandsOfDistinctUrlsOverMonth.php2
-rw-r--r--tests/PHPUnit/Benchmarks/Fixtures/OneSiteTwelveThousandVisitsOneYear.php2
-rw-r--r--tests/PHPUnit/Benchmarks/Fixtures/ThousandSitesTwelveVisitsEachOneDay.php2
-rw-r--r--tests/PHPUnit/Benchmarks/MultiSitesBenchmark.php2
-rw-r--r--tests/PHPUnit/Benchmarks/TrackerBenchmark.php2
-rw-r--r--tests/PHPUnit/Fixtures/FewVisitsWithSetVisitorId.php13
-rw-r--r--tests/PHPUnit/Fixtures/InvalidVisits.php4
-rw-r--r--tests/PHPUnit/Fixtures/JSTrackingUIFixture.php2
-rw-r--r--tests/PHPUnit/Fixtures/LatestStableInstall.php2
-rw-r--r--tests/PHPUnit/Fixtures/ManySitesImportedLogs.php12
-rw-r--r--tests/PHPUnit/Fixtures/ManySitesImportedLogsWithXssAttempts.php2
-rw-r--r--tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php10
-rw-r--r--tests/PHPUnit/Fixtures/ManyVisitsWithGeoIPAndEcommerce.php4
-rw-r--r--tests/PHPUnit/Fixtures/ManyVisitsWithMockLocationProvider.php8
-rw-r--r--tests/PHPUnit/Fixtures/ManyVisitsWithSubDirReferrersAndCustomVars.php4
-rw-r--r--tests/PHPUnit/Fixtures/OmniFixture.php4
-rw-r--r--tests/PHPUnit/Fixtures/OneVisitSeveralPageViews.php4
-rw-r--r--tests/PHPUnit/Fixtures/OneVisitWithAbnormalPageviewUrls.php4
-rw-r--r--tests/PHPUnit/Fixtures/OneVisitWithSiteSearch.php4
-rw-r--r--tests/PHPUnit/Fixtures/OneVisitorTwoVisits.php6
-rw-r--r--tests/PHPUnit/Fixtures/RawArchiveDataWithTempAndInvalidated.php2
-rw-r--r--tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php4
-rw-r--r--tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php12
-rw-r--r--tests/PHPUnit/Fixtures/SomeVisitsManyPageviewsWithTransitions.php8
-rw-r--r--tests/PHPUnit/Fixtures/SomeVisitsWithLongUrls.php4
-rw-r--r--tests/PHPUnit/Fixtures/SomeVisitsWithNonUnicodePageTitles.php4
-rw-r--r--tests/PHPUnit/Fixtures/SqlDump.php2
-rw-r--r--tests/PHPUnit/Fixtures/ThreeGoalsOnePageview.php4
-rw-r--r--tests/PHPUnit/Fixtures/ThreeSitesWithManyVisitsWithSiteSearch.php4
-rw-r--r--tests/PHPUnit/Fixtures/ThreeSitesWithSharedVisitors.php6
-rw-r--r--tests/PHPUnit/Fixtures/ThreeVisitsWithCustomEvents.php20
-rw-r--r--tests/PHPUnit/Fixtures/TwoSitesEcommerceOrderWithItems.php4
-rw-r--r--tests/PHPUnit/Fixtures/TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers.php4
-rw-r--r--tests/PHPUnit/Fixtures/TwoSitesTwoVisitorsDifferentDays.php6
-rw-r--r--tests/PHPUnit/Fixtures/TwoSitesVisitsInPast.php4
-rw-r--r--tests/PHPUnit/Fixtures/TwoSitesWithAnnotations.php4
-rw-r--r--tests/PHPUnit/Fixtures/TwoVisitsNoKeywordWithBot.php4
-rw-r--r--tests/PHPUnit/Fixtures/TwoVisitsWithCustomVariables.php4
-rw-r--r--tests/PHPUnit/Fixtures/UITestFixture.php2
-rw-r--r--tests/PHPUnit/Fixtures/Utf8mb4.php4
-rw-r--r--tests/PHPUnit/Fixtures/VisitOverSeveralDaysImportedLogs.php4
-rw-r--r--tests/PHPUnit/Fixtures/VisitsInDifferentTimezones.php4
-rw-r--r--tests/PHPUnit/Fixtures/VisitsOverSeveralDays.php4
-rw-r--r--tests/PHPUnit/Fixtures/VisitsTwoWebsitesWithAdditionalVisits.php4
-rw-r--r--tests/PHPUnit/Framework/Constraint/HttpResponseText.php11
-rw-r--r--tests/PHPUnit/Framework/Constraint/ResponseCode.php11
-rw-r--r--tests/PHPUnit/Framework/Fixture.php54
-rw-r--r--tests/PHPUnit/Framework/Mock/TestConfig.php4
-rw-r--r--tests/PHPUnit/Framework/TestCase/BenchmarkTestCase.php8
-rw-r--r--tests/PHPUnit/Framework/TestCase/ConsoleCommandTestCase.php2
-rw-r--r--tests/PHPUnit/Framework/TestCase/IntegrationTestCase.php13
-rw-r--r--tests/PHPUnit/Framework/TestCase/SystemTestCase.php20
-rw-r--r--tests/PHPUnit/Framework/TestCase/UnitTestCase.php6
-rw-r--r--tests/PHPUnit/Framework/TestDataHelper/LogHelper.php2
-rw-r--r--tests/PHPUnit/Framework/TestRequest/Response.php2
-rw-r--r--tests/PHPUnit/Framework/TestingEnvironmentManipulator.php6
-rw-r--r--tests/PHPUnit/Framework/TestingEnvironmentVariables.php4
-rw-r--r--tests/PHPUnit/Framework/XssTesting.php2
-rw-r--r--tests/PHPUnit/Integration/API/RequestTest.php4
-rw-r--r--tests/PHPUnit/Integration/AccessTest.php76
-rw-r--r--tests/PHPUnit/Integration/Application/Kernel/PluginListTest.php4
-rw-r--r--tests/PHPUnit/Integration/Archive/ArchivePurgerTest.php2
-rw-r--r--tests/PHPUnit/Integration/Archive/ChunksTest.php2
-rw-r--r--tests/PHPUnit/Integration/Archive/DataTableFactoryTest.php9
-rw-r--r--tests/PHPUnit/Integration/ArchiveProcessingTest.php4
-rw-r--r--tests/PHPUnit/Integration/ArchiveProcessor/ArchivingStatusTest.php2
-rw-r--r--tests/PHPUnit/Integration/ArchiveProcessor/ParametersTest.php2
-rw-r--r--tests/PHPUnit/Integration/ArchiveProcessor/PluginsArchiverTest.php11
-rw-r--r--tests/PHPUnit/Integration/ArchiveWithNoVisitsTest.php2
-rw-r--r--tests/PHPUnit/Integration/AssetManager/UIAssetMinifierTest.php4
-rw-r--r--tests/PHPUnit/Integration/AssetManagerTest.php4
-rw-r--r--tests/PHPUnit/Integration/CacheIdTest.php10
-rw-r--r--tests/PHPUnit/Integration/CacheTest.php2
-rw-r--r--tests/PHPUnit/Integration/CliMulti/OutputTest.php13
-rw-r--r--tests/PHPUnit/Integration/CliMulti/ProcessTest.php13
-rw-r--r--tests/PHPUnit/Integration/Columns/ComputedMetricFactoryTest.php10
-rw-r--r--tests/PHPUnit/Integration/Columns/DimensionMetricFactoryTest.php12
-rw-r--r--tests/PHPUnit/Integration/Columns/DimensionTest.php9
-rw-r--r--tests/PHPUnit/Integration/Columns/UpdaterTest.php41
-rw-r--r--tests/PHPUnit/Integration/Concurrency/DistributedListTest.php2
-rw-r--r--tests/PHPUnit/Integration/Concurrency/LockBackend/MysqlLockBackendTest.php4
-rw-r--r--tests/PHPUnit/Integration/Concurrency/LockTest.php4
-rw-r--r--tests/PHPUnit/Integration/Config/CacheTest.php10
-rw-r--r--tests/PHPUnit/Integration/CronArchive/SharedSiteIdsTest.php4
-rw-r--r--tests/PHPUnit/Integration/CronArchiveTest.php8
-rw-r--r--tests/PHPUnit/Integration/DataAccess/ActionsTest.php2
-rw-r--r--tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php4
-rw-r--r--tests/PHPUnit/Integration/DataAccess/ArchiveTableDaoTest.php2
-rw-r--r--tests/PHPUnit/Integration/DataAccess/ArchiveWriterTest.php2
-rw-r--r--tests/PHPUnit/Integration/DataAccess/LogAggregatorTest.php2
-rw-r--r--tests/PHPUnit/Integration/DataAccess/ModelTest.php2
-rw-r--r--tests/PHPUnit/Integration/DataAccess/TableMetadataTest.php2
-rw-r--r--tests/PHPUnit/Integration/DataTable/Filter/PivotByDimensionTest.php50
-rw-r--r--tests/PHPUnit/Integration/Db/TransactionLevelTest.php2
-rw-r--r--tests/PHPUnit/Integration/DbHelperTest.php6
-rw-r--r--tests/PHPUnit/Integration/DbTest.php11
-rw-r--r--tests/PHPUnit/Integration/DependencyTest.php2
-rw-r--r--tests/PHPUnit/Integration/DocumentationGeneratorTest.php6
-rw-r--r--tests/PHPUnit/Integration/EmailValidatorTest.php2
-rw-r--r--tests/PHPUnit/Integration/FilesystemTest.php2
-rw-r--r--tests/PHPUnit/Integration/FrontControllerTest.php8
-rw-r--r--tests/PHPUnit/Integration/HttpTest.php14
-rw-r--r--tests/PHPUnit/Integration/JsProxyTest.php2
-rw-r--r--tests/PHPUnit/Integration/LogDeleterTest.php2
-rw-r--r--tests/PHPUnit/Integration/MailTest.php2
-rw-r--r--tests/PHPUnit/Integration/Measurable/MeasurableSettingTest.php16
-rw-r--r--tests/PHPUnit/Integration/Measurable/MeasurableSettingsTest.php9
-rw-r--r--tests/PHPUnit/Integration/NumberFormatterTest.php10
-rw-r--r--tests/PHPUnit/Integration/Period/FactoryTest.php14
-rw-r--r--tests/PHPUnit/Integration/PiwikTest.php11
-rw-r--r--tests/PHPUnit/Integration/Plugin/ArchivedMetricTest.php11
-rw-r--r--tests/PHPUnit/Integration/Plugin/CategoriesTest.php4
-rw-r--r--tests/PHPUnit/Integration/Plugin/ComputedMetricTest.php9
-rw-r--r--tests/PHPUnit/Integration/Plugin/Dimension/ActionDimensionTest.php2
-rw-r--r--tests/PHPUnit/Integration/Plugin/Dimension/ConversionDimensionTest.php2
-rw-r--r--tests/PHPUnit/Integration/Plugin/Dimension/DimensionMetadataProviderTest.php2
-rw-r--r--tests/PHPUnit/Integration/Plugin/Dimension/VisitDimensionTest.php9
-rw-r--r--tests/PHPUnit/Integration/Plugin/ManagerTest.php4
-rw-r--r--tests/PHPUnit/Integration/Plugin/ReleaseChannelsTest.php6
-rw-r--r--tests/PHPUnit/Integration/Plugin/SettingsProviderTest.php4
-rw-r--r--tests/PHPUnit/Integration/Plugin/WidgetsProviderTest.php4
-rw-r--r--tests/PHPUnit/Integration/ProfessionalSupport/AdvertisingTest.php4
-rw-r--r--tests/PHPUnit/Integration/ReleaseCheckListTest.php12
-rw-r--r--tests/PHPUnit/Integration/Report/ReportsTest.php2
-rw-r--r--tests/PHPUnit/Integration/ReportRenderingTest.php2
-rw-r--r--tests/PHPUnit/Integration/ReportTest.php20
-rw-r--r--tests/PHPUnit/Integration/SegmentTest.php14
-rw-r--r--tests/PHPUnit/Integration/SequenceTest.php14
-rw-r--r--tests/PHPUnit/Integration/ServeStaticFileTest.php6
-rw-r--r--tests/PHPUnit/Integration/Session/SessionAuthTest.php2
-rw-r--r--tests/PHPUnit/Integration/SessionTest.php2
-rw-r--r--tests/PHPUnit/Integration/Settings/BaseSettingsTestCase.php14
-rw-r--r--tests/PHPUnit/Integration/Settings/IntegrationTestCase.php8
-rw-r--r--tests/PHPUnit/Integration/Settings/Measurable/MeasurablePropertyTest.php9
-rw-r--r--tests/PHPUnit/Integration/Settings/Measurable/MeasurableSettingTest.php2
-rw-r--r--tests/PHPUnit/Integration/Settings/Plugin/SystemConfigSettingTest.php16
-rw-r--r--tests/PHPUnit/Integration/Settings/Plugin/SystemSettingTest.php23
-rw-r--r--tests/PHPUnit/Integration/Settings/Plugin/UserSettingTest.php14
-rw-r--r--tests/PHPUnit/Integration/Settings/SettingTest.php46
-rw-r--r--tests/PHPUnit/Integration/Settings/Storage/Backend/CacheTest.php2
-rw-r--r--tests/PHPUnit/Integration/Settings/Storage/Backend/ConfigTest.php9
-rw-r--r--tests/PHPUnit/Integration/Settings/Storage/Backend/MeasurableSettingsTableTest.php16
-rw-r--r--tests/PHPUnit/Integration/Settings/Storage/Backend/NullTest.php4
-rw-r--r--tests/PHPUnit/Integration/Settings/Storage/Backend/PluginSettingsTableTest.php30
-rw-r--r--tests/PHPUnit/Integration/Settings/Storage/Backend/SitesTableTest.php14
-rw-r--r--tests/PHPUnit/Integration/Settings/Storage/FactoryTest.php2
-rw-r--r--tests/PHPUnit/Integration/Settings/Storage/StorageTest.php2
-rw-r--r--tests/PHPUnit/Integration/SiteTest.php9
-rw-r--r--tests/PHPUnit/Integration/SqlTest.php4
-rw-r--r--tests/PHPUnit/Integration/Tracker/ActionTest.php10
-rw-r--r--tests/PHPUnit/Integration/Tracker/DbTest.php16
-rw-r--r--tests/PHPUnit/Integration/Tracker/FailuresTest.php2
-rw-r--r--tests/PHPUnit/Integration/Tracker/Handler/FactoryTest.php7
-rw-r--r--tests/PHPUnit/Integration/Tracker/HandlerTest.php69
-rw-r--r--tests/PHPUnit/Integration/Tracker/ModelTest.php27
-rw-r--r--tests/PHPUnit/Integration/Tracker/PingRequestTest.php4
-rw-r--r--tests/PHPUnit/Integration/Tracker/RequestSetTest.php56
-rw-r--r--tests/PHPUnit/Integration/Tracker/RequestTest.php32
-rw-r--r--tests/PHPUnit/Integration/Tracker/SettingsTest.php2
-rw-r--r--tests/PHPUnit/Integration/Tracker/Visit/FactoryTest.php7
-rw-r--r--tests/PHPUnit/Integration/Tracker/Visit/ReferrerSpamFilterTest.php4
-rw-r--r--tests/PHPUnit/Integration/Tracker/Visit2Test.php2
-rw-r--r--tests/PHPUnit/Integration/Tracker/VisitTest.php4
-rw-r--r--tests/PHPUnit/Integration/TrackerTest.php4
-rw-r--r--tests/PHPUnit/Integration/TravisEnvironmentTest.php1
-rw-r--r--tests/PHPUnit/Integration/Updater/Migration/Db/FactoryTest.php2
-rw-r--r--tests/PHPUnit/Integration/Updater/Migration/Db/MigrationsTest.php7
-rw-r--r--tests/PHPUnit/Integration/Updater/Migration/FactoryTest.php2
-rw-r--r--tests/PHPUnit/Integration/Updater/Migration/Plugin/FactoryTest.php2
-rw-r--r--tests/PHPUnit/Integration/Validator/IdSiteTest.php17
-rw-r--r--tests/PHPUnit/Integration/ViewDataTable/ManagerTest.php21
-rw-r--r--tests/PHPUnit/Integration/WidgetsListTest.php5
-rw-r--r--tests/PHPUnit/System/AllWebsitesTest.php75
-rw-r--r--tests/PHPUnit/System/ApiGetReportMetadataTest.php4
-rw-r--r--tests/PHPUnit/System/BackwardsCompatibility1XTest.php6
-rw-r--r--tests/PHPUnit/System/BlobReportLimitingTest.php2
-rw-r--r--tests/PHPUnit/System/CliMultiTest.php13
-rw-r--r--tests/PHPUnit/System/ConsoleTest.php3
-rw-r--r--tests/PHPUnit/System/CookieTest.php8
-rw-r--r--tests/PHPUnit/System/CustomEventsTest.php2
-rw-r--r--tests/PHPUnit/System/DuplicateActionsTest.php2
-rw-r--r--tests/PHPUnit/System/EnvironmentValidationTest.php6
-rw-r--r--tests/PHPUnit/System/FrontControllerTest.php4
-rw-r--r--tests/PHPUnit/System/ImportLogsTest.php12
-rw-r--r--tests/PHPUnit/System/MultipleSitesArchivingTest.php2
-rw-r--r--tests/PHPUnit/System/OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTest.php4
-rw-r--r--tests/PHPUnit/System/OneVisitorTwoVisitsTest.php4
-rw-r--r--tests/PHPUnit/System/PeriodIsRangeDateIsLastNMetadataAndNormalAPITest.php2
-rw-r--r--tests/PHPUnit/System/PivotByQueryParamTest.php2
-rw-r--r--tests/PHPUnit/System/RawLogDaoTest.php9
-rw-r--r--tests/PHPUnit/System/SiteSearchTest.php1
-rw-r--r--tests/PHPUnit/System/TimezonesTest.php2
-rw-r--r--tests/PHPUnit/System/TrackerResponseTest.php13
-rw-r--r--tests/PHPUnit/System/TrackerTest.php16
-rw-r--r--tests/PHPUnit/System/UserIdAndVisitorIdTest.php4
-rw-r--r--tests/PHPUnit/System/expected/test_AllWebsitesTest_superuser__VisitsSummary.get_.csvbin0 -> 493 bytes
-rw-r--r--tests/PHPUnit/System/expected/test_AllWebsitesTest_user__VisitsSummary.get_.csvbin0 -> 439 bytes
-rw-r--r--tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserEngines_day.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserFamilies_day.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserVersions_day.xml15
-rw-r--r--tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowsers_day.xml15
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml94
-rw-r--r--tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml94
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml72
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml72
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_ImportLogs__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_1__Live.getLastVisitsDetails_month.xml18
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_2__Live.getLastVisitsDetails_month.xml16
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisit__Live.getLastVisitsDetails_month.xml34
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortDesc__Live.getLastVisitsDetails_month.xml34
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__Live.getLastVisitsDetails_month.xml48
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCity_month.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCountry_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getRegion_month.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_continent__UserCountry.getCountry_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CustomVariables.getReservedCustomVariableKeys.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowserFamilies_day.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowsers_day.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowserFamilies_day.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowsers_day.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_RowEvolution_processedRowLabel__API.getRowEvolution_day.xml1
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_day.xml10
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_month.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_day.xml54
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_month.xml57
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_AllSites__CustomVariables.getCustomVariables_day.xml197
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_AllSites__CustomVariables.getCustomVariables_month.xml172
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_day.xml178
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_month.xml124
-rw-r--r--tests/PHPUnit/System/expected/test_SiteSearch_NotLastNPeriods__CustomVariables.getCustomVariables_month.xml2
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_month.original.html2
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_month.original.html2
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_month.original.html2
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_and_graph__ScheduledReports.generateReport_month.original.html92
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_only__ScheduledReports.generateReport_month.original.html8
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_csv__ScheduledReports.generateReport_month.original.csv8
-rw-r--r--tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_month.original.pdfbin560999 -> 561005 bytes
-rw-r--r--tests/PHPUnit/System/expected/test_UserId_VisitorId__Live.getLastVisitsDetails_month.xml19
-rw-r--r--tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_day.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_month.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_week.xml14
-rw-r--r--tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_year.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__Goals.get_day.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__VisitsSummary.get_day.xml16
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml146
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml12
-rw-r--r--tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml30
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_day.xml7
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_week.xml7
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__CorePluginsAdmin.getSystemSettings.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml4
-rw-r--r--tests/PHPUnit/System/expected/test_noVisit__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getAll_range.xml8
-rw-r--r--tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getOne_range.xml4
-rw-r--r--tests/PHPUnit/Unit/API/ApiRendererTest.php11
-rw-r--r--tests/PHPUnit/Unit/API/DataTableGenericFilterTest.php2
-rw-r--r--tests/PHPUnit/Unit/API/ResponseBuilderTest.php4
-rw-r--r--tests/PHPUnit/Unit/Archive/ChunkTest.php4
-rw-r--r--tests/PHPUnit/Unit/Archive/DataCollectionTest.php2
-rw-r--r--tests/PHPUnit/Unit/Archiver/RequestTest.php4
-rw-r--r--tests/PHPUnit/Unit/AssetManager/UIAssetCacheBusterTest.php6
-rw-r--r--tests/PHPUnit/Unit/AssetManager/UIAssetCatalogSorterTest.php4
-rw-r--r--tests/PHPUnit/Unit/AssetManagerTest.php2
-rw-r--r--tests/PHPUnit/Unit/CacheTest.php8
-rw-r--r--tests/PHPUnit/Unit/Category/CategoryListTest.php11
-rw-r--r--tests/PHPUnit/Unit/Category/CategoryTest.php11
-rw-r--r--tests/PHPUnit/Unit/Category/SubcategoryTest.php4
-rw-r--r--tests/PHPUnit/Unit/CommonTest.php46
-rw-r--r--tests/PHPUnit/Unit/Config/IniFileChainCacheTest.php4
-rw-r--r--tests/PHPUnit/Unit/Config/IniFileChainTest.php4
-rw-r--r--tests/PHPUnit/Unit/ConfigTest.php5
-rw-r--r--tests/PHPUnit/Unit/ConsoleTest.php2
-rw-r--r--tests/PHPUnit/Unit/Container/IniConfigDefinitionSourceTest.php9
-rw-r--r--tests/PHPUnit/Unit/ContextTest.php2
-rw-r--r--tests/PHPUnit/Unit/CookieTest.php4
-rw-r--r--tests/PHPUnit/Unit/CronArchive/FixedSiteIdsTest.php4
-rw-r--r--tests/PHPUnit/Unit/CronArchive/SegmentArchivingRequestUrlProviderTest.php6
-rw-r--r--tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php6
-rw-r--r--tests/PHPUnit/Unit/DataAccess/ArchiveWriterTest.php12
-rw-r--r--tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php17
-rw-r--r--tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php18
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterByLabelMappingTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterBySegmentValueTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/AddSegmentValueTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/AddSummaryRowTest.php2
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/ColumnCallbackDeleteMetadataTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/ColumnDeleteTest.php2
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/ExcludeLowPopulationTest.php2
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/LimitTest.php2
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/PatternRecursiveTest.php2
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/PatternTest.php2
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/PrependSegmentFilterTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/PrependValueToMetadataTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/RangeCheckTest.php2
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/SortTest.php2
-rw-r--r--tests/PHPUnit/Unit/DataTable/Filter/TruncateTest.php6
-rw-r--r--tests/PHPUnit/Unit/DataTable/ManagerTest.php11
-rw-r--r--tests/PHPUnit/Unit/DataTable/MapTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Renderer/CSVTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Renderer/ConsoleTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Renderer/JSONTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Renderer/PHPTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/Renderer/XMLTest.php4
-rw-r--r--tests/PHPUnit/Unit/DataTable/RowTest.php11
-rw-r--r--tests/PHPUnit/Unit/DataTable/SimpleTest.php2
-rw-r--r--tests/PHPUnit/Unit/DataTableTest.php19
-rw-r--r--tests/PHPUnit/Unit/DateTest.php34
-rw-r--r--tests/PHPUnit/Unit/DbHelperTest.php2
-rw-r--r--tests/PHPUnit/Unit/DeprecatedMethodsTest.php6
-rw-r--r--tests/PHPUnit/Unit/FactoryTest.php9
-rw-r--r--tests/PHPUnit/Unit/FilesystemTest.php20
-rw-r--r--tests/PHPUnit/Unit/Http/RouterTest.php2
-rw-r--r--tests/PHPUnit/Unit/IPTest.php2
-rw-r--r--tests/PHPUnit/Unit/LegacyAutoLoaderTest.php55
-rw-r--r--tests/PHPUnit/Unit/Mail/EmailStylesTest.php2
-rw-r--r--tests/PHPUnit/Unit/Metrics/Formatter/HtmlTest.php15
-rw-r--r--tests/PHPUnit/Unit/Metrics/FormatterTest.php14
-rw-r--r--tests/PHPUnit/Unit/Metrics/SorterTest.php2
-rw-r--r--tests/PHPUnit/Unit/NonceTest.php2
-rw-r--r--tests/PHPUnit/Unit/Period/BasePeriodTest.php12
-rw-r--r--tests/PHPUnit/Unit/Period/DayTest.php21
-rw-r--r--tests/PHPUnit/Unit/Period/RangeTest.php57
-rw-r--r--tests/PHPUnit/Unit/PeriodTest.php22
-rw-r--r--tests/PHPUnit/Unit/Plugin/ComponentFactoryTest.php7
-rw-r--r--tests/PHPUnit/Unit/RankingQueryTest.php2
-rw-r--r--tests/PHPUnit/Unit/Report/ReportWidgetConfigTest.php11
-rw-r--r--tests/PHPUnit/Unit/Report/ReportWidgetFactoryTest.php4
-rw-r--r--tests/PHPUnit/Unit/Scheduler/Schedule/DailyTest.php40
-rw-r--r--tests/PHPUnit/Unit/Scheduler/Schedule/HourlyTest.php30
-rw-r--r--tests/PHPUnit/Unit/Scheduler/Schedule/MonthlyTest.php21
-rw-r--r--tests/PHPUnit/Unit/Scheduler/Schedule/WeeklyTest.php50
-rw-r--r--tests/PHPUnit/Unit/Scheduler/SchedulerTest.php10
-rw-r--r--tests/PHPUnit/Unit/Scheduler/TaskTest.php2
-rw-r--r--tests/PHPUnit/Unit/Scheduler/TimetableTest.php4
-rw-r--r--tests/PHPUnit/Unit/Segment/SegmentExpressionTest.php15
-rw-r--r--tests/PHPUnit/Unit/Session/SessionFingerprintTest.php6
-rw-r--r--tests/PHPUnit/Unit/Session/SessionInitializerTest.php29
-rw-r--r--tests/PHPUnit/Unit/Tracker/RequestSetTest.php53
-rw-r--r--tests/PHPUnit/Unit/Tracker/RequestTest.php13
-rw-r--r--tests/PHPUnit/Unit/Tracker/ResponseTest.php10
-rw-r--r--tests/PHPUnit/Unit/TrackerTest.php11
-rw-r--r--tests/PHPUnit/Unit/TranslateTest.php6
-rw-r--r--tests/PHPUnit/Unit/Translation/FilesTest.php2
-rw-r--r--tests/PHPUnit/Unit/Translation/Loader/DevelopmentLoaderTest.php2
-rw-r--r--tests/PHPUnit/Unit/Translation/Loader/JsonFileLoaderTest.php2
-rw-r--r--tests/PHPUnit/Unit/Translation/Loader/LoaderCacheTest.php10
-rw-r--r--tests/PHPUnit/Unit/Translation/TranslatorTest.php2
-rw-r--r--tests/PHPUnit/Unit/TwigTest.php2
-rw-r--r--tests/PHPUnit/Unit/UrlHelperTest.php4
-rw-r--r--tests/PHPUnit/Unit/UrlTest.php2
-rw-r--r--tests/PHPUnit/Unit/Validator/CharacterLengthTest.php22
-rw-r--r--tests/PHPUnit/Unit/Validator/DateTimeTest.php16
-rw-r--r--tests/PHPUnit/Unit/Validator/EmailTest.php7
-rw-r--r--tests/PHPUnit/Unit/Validator/IpRangesTest.php10
-rw-r--r--tests/PHPUnit/Unit/Validator/NotEmptyTest.php7
-rw-r--r--tests/PHPUnit/Unit/Validator/NumberRangeTest.php34
-rw-r--r--tests/PHPUnit/Unit/Validator/UrlLikeTest.php7
-rw-r--r--tests/PHPUnit/Unit/Validator/WhiteListedValueTest.php16
-rw-r--r--tests/PHPUnit/Unit/VersionTest.php4
-rw-r--r--tests/PHPUnit/Unit/Widget/WidgetConfigTest.php11
-rw-r--r--tests/PHPUnit/Unit/Widget/WidgetContainerConfigTest.php11
-rw-r--r--tests/PHPUnit/Unit/Widget/WidgetsListTest.php4
-rw-r--r--tests/PHPUnit/bootstrap.php4
-rw-r--r--tests/PHPUnit/phpunit.xml.dist3
-rw-r--r--tests/UI/expected-screenshots/Comparison_segmented_visitorlog.png4
-rw-r--r--tests/UI/expected-screenshots/EmptySite_emptySiteDashboard_ignored.png4
-rw-r--r--tests/UI/expected-screenshots/OneClickUpdate_update_success.png4
-rw-r--r--tests/UI/expected-screenshots/ReportExporting_VisitsSummary.get_exported.php.txt2
-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_diagnostics_configfile.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_admin_home.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins_no_internet.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_admin_settings_general.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_api_error.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_dashboard4.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log_segmented.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_sales.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_exampleui_sparklines.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_fatal_error_safemode.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal_updated.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_goals_overview.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_referrers_overview.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_segmented_visitorlog.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_not_segmented.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_popup.png4
-rw-r--r--tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png4
-rw-r--r--tests/UI/specs/EmptySite_spec.js4
-rw-r--r--tests/UI/specs/OneClickUpdate_spec.js3
-rw-r--r--tests/javascript/index.php229
-rw-r--r--tests/lib/screenshot-testing/support/app.js13
-rw-r--r--tests/lib/screenshot-testing/support/test-environment.js8
-rw-r--r--tests/resources/MatomoDummyClass.php7
-rw-r--r--tests/resources/custompluginsdir/CustomDirPlugin/plugin.json2
-rw-r--r--tests/resources/custompluginsdir/CustomDirPlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php4
-rw-r--r--tests/resources/custompluginsdir/CustomDirPlugin/tests/Integration/SystemSettingsTest.php2
-rw-r--r--tests/resources/custompluginsdir/CustomDirPlugin/tests/Unit/CustomClassTest.php6
1424 files changed, 11028 insertions, 17619 deletions
diff --git a/.gitattributes b/.gitattributes
index b55eb771a2..55afc129f1 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -48,6 +48,7 @@ plugins/*/tests/UI/expected-screenshots/*.png filter=lfs diff=lfs merge=lfs
# Files excluded from git packages
tests/ export-ignore
+.github/ export-ignore
.coveralls.yml export-ignore
.gitignore export-ignore
.gitattributes export-ignore
diff --git a/.github/workflows/buildtrackerjs.yml b/.github/workflows/buildtrackerjs.yml
new file mode 100644
index 0000000000..22ac74fd97
--- /dev/null
+++ b/.github/workflows/buildtrackerjs.yml
@@ -0,0 +1,82 @@
+name: Build Tracker JS files
+
+on:
+ issue_comment:
+ types: [created]
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Detect branch for PR
+ id: vars
+ run: |
+ PR=$( echo "${{ github.event.comment.issue_url }}" | grep -oE 'issues/([0-9]+)$' | cut -d'/' -f 2 )
+
+ PR_INFO=$( curl \
+ --request GET \
+ --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \
+ --header 'content-type: application/json' \
+ --url https://api.github.com/repos/$GITHUB_REPOSITORY/pulls/$PR )
+ REF=$(echo "${PR_INFO}" | jq -r .head.ref)
+ BASE=$(echo "${PR_INFO}" | jq -r .head.repo.full_name)
+ STATE=$(echo "${PR_INFO}" | jq -r .state)
+
+ if [[ $STATE == "closed" ]]
+ then
+ echo "Pull Request already closed."
+ exit 0;
+ fi
+
+ if [[ $BASE != $GITHUB_REPOSITORY ]]
+ then
+ echo "It's only possible to update local branches"
+ exit 0;
+ fi
+
+ echo ::set-output name=branch::$REF
+ - uses: actions/setup-java@v1
+ with:
+ java-version: 9
+ if: steps.vars.outputs.branch != ''
+ - uses: actions/checkout@v2
+ with:
+ ref: ${{ steps.vars.outputs.branch }}
+ lfs: false
+ if: steps.vars.outputs.branch != ''
+ - name: Prepare git config
+ run: |
+ cat <<- EOF > $HOME/.netrc
+ machine github.com
+ login $GITHUB_ACTOR
+ password $GITHUB_TOKEN
+ machine api.github.com
+ login $GITHUB_ACTOR
+ password $GITHUB_TOKEN
+ EOF
+ chmod 600 $HOME/.netrc
+ git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com"
+ git config --global user.name "$GITHUB_ACTOR"
+ if: steps.vars.outputs.branch != ''
+ - name: Fetch YUICompressor
+ run: |
+ cd $GITHUB_WORKSPACE/js
+ wget https://github.com/yui/yuicompressor/releases/download/v2.4.8/yuicompressor-2.4.8.zip
+ unzip yuicompressor-2.4.8.zip
+ if: steps.vars.outputs.branch != ''
+ - name: Build JS files
+ run: |
+ cd $GITHUB_WORKSPACE/js
+ sed '/<DEBUG>/,/<\/DEBUG>/d' < piwik.js | sed 's/eval/replacedEvilString/' | java -jar yuicompressor-2.4.8.jar --type js --line-break 1000 | sed 's/replacedEvilString/eval/' | sed 's/^[/][*]/\/*!/' > piwik.min.js && cp piwik.min.js ../piwik.js && cp piwik.min.js ../matomo.js
+ if: steps.vars.outputs.branch != ''
+ - name: Push changes
+ run: |
+ if [[ $( git diff --numstat ) ]]
+ then
+ cd $GITHUB_WORKSPACE
+ git add piwik.js matomo.js js/piwik.min.js
+ git commit -m "rebuilt piwik.js"
+ git push
+ fi
+ if: steps.vars.outputs.branch != ''
diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml
new file mode 100644
index 0000000000..2148d2b2d4
--- /dev/null
+++ b/.github/workflows/translations.yml
@@ -0,0 +1,143 @@
+name: Translation Updates
+
+on:
+ schedule:
+ - cron: "0 2 * * 6"
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+
+ services:
+ mysql:
+ image: mysql:5.7
+ env:
+ MYSQL_ALLOW_EMPTY_PASSWORD: true
+ MYSQL_ROOT_PASSWORD: ""
+ MYSQL_DATABASE: piwik_tests
+ ports:
+ - 3306/tcp
+
+
+ steps:
+ - uses: shivammathur/setup-php@v1
+ with:
+ php-version: '7.3'
+ - uses: actions/checkout@v2
+ with:
+ ref: '4.x-dev'
+ lfs: false
+ - name: Prepare branches
+ run: |
+ cat <<- EOF > $HOME/.netrc
+ machine github.com
+ login $GITHUB_ACTOR
+ password $GITHUB_TOKEN
+ machine api.github.com
+ login $GITHUB_ACTOR
+ password $GITHUB_TOKEN
+ EOF
+ chmod 600 $HOME/.netrc
+
+ git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com"
+ git config --global user.name "$GITHUB_ACTOR"
+
+ git remote add upstream https://github.com/matomo-org/matomo.git
+
+ git push origin --delete translationupdates || true
+ git branch -D translationupdates || true
+ git fetch upstream 4.x-dev
+ git checkout -f upstream/4.x-dev
+ git branch translationupdates
+ git checkout -f translationupdates
+ - name: Checkout submodules
+ run: git submodule update --init --force
+ - name: Install Dependencies
+ run: composer install --prefer-dist
+ - name: Initialize Matomo
+ run: |
+ cp ./tests/travis/config.ini.travis.php ./config/config.ini.php
+ ./console development:enable
+ - name: Sync translations
+ run: ./console translations:update --username ${{ secrets.TransifexUsername }} --password ${{ secrets.TransifexPassword }} --force --no-interaction
+ - name: Check for changes
+ id: changes
+ run: |
+ IFS=$'\n'
+ changes=( $(git diff --numstat | grep -E '([0-9]+)\s+([0-9]+)\s+[a-zA-Z\/]*lang\/([a-z]{2,3}(?:-[a-z]{2,3})?)\.json' ) )
+ unset IFS
+
+ # abort here if no change available
+ if [[ ${#changes[@]} -eq 0 ]]
+ then
+ exit 0
+ fi
+
+ git add lang/
+ git add "*.json"
+
+ declare -i totaladditions=0
+ declare -A additionsByLang
+
+ for (( i=0; i < ${#changes[@]}; i++ )); do
+ line=( ${changes[$i]} )
+ additions=${line[0]}
+
+ if [[ ${line[0]} = "0" ]]
+ then
+ continue;
+ fi
+
+ file=${line[2]}
+ lang=$( echo ${line[2]} | grep -oE '([a-z]{2,3}(?:-[a-z]{2,3})?)\.json' | cut -d'.' -f 1 )
+
+ totaladditions=$(( totaladditions + additions ))
+ additionsByLang[$lang]=$(( additionsByLang[$lang] + additions ))
+ done
+
+ title="Updated $totaladditions strings in ${#additionsByLang[@]} languages (${!additionsByLang[@]})"
+
+ languageInfo=( $( ./console translations:languageinfo ) )
+
+ for i in ${!additionsByLang[@]}; do
+ for j in ${languageInfo[@]}; do
+ if [[ "$j" == "$i|"* ]];
+ then
+ IFS=$'\n'
+ info=( $( echo "$j" | tr "|" "\n" ) )
+ unset IFS
+ break
+ fi
+ done
+
+ message="$message- Updated ${info[1]} (${additionsByLang[$i]} changes / ${info[2]} translated)\n"
+ done
+
+ message="$message\n\nHelp us translate Matomo in your language!\nSignup at https://www.transifex.com/matomo/matomo/\nIf you have any questions, get in touch with us at translations@matomo.org"
+
+ echo $title
+ echo $message
+
+ echo ::set-output name=title::$title
+ echo ::set-output name=message::$message
+ shell: bash
+ - name: Push changes
+ run: |
+ git commit -m "language update"
+ git push --set-upstream origin translationupdates
+ - name: Create PR
+ run: |
+ curl \
+ --request POST \
+ --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \
+ --header 'content-type: application/json' \
+ --data '{
+ "title":"[automatic translation update] ${{ steps.changes.outputs.title }}",
+ "body":"${{ steps.changes.outputs.message }}",
+ "head":"translationupdates",
+ "base":"4.x-dev"
+ }' \
+ --url https://api.github.com/repos/${GITHUB_REPOSITORY}/pulls
+ shell: bash
+ if: steps.changes.outputs.title
diff --git a/.gitignore b/.gitignore
index 3a31bed692..1288168680 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,6 +60,7 @@ php_errors.log
/misc/cron/.htaccess
/plugins/.htaccess
/tests/resources/overlay-test-site-real/
+/tests/PHPUnit/.phpunit.result.cache
/tests/PHPUnit/proxy/libs
/tests/PHPUnit/proxy/piwik.js
/tests/PHPUnit/proxy/matomo.js
@@ -73,4 +74,6 @@ php_errors.log
/misc/vagrant
/.vagrant
/plugins/.gitignore
-/js/container*.js \ No newline at end of file
+/js/container*.js
+/.docker
+docker-compose.yml \ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index 6c9c8b56a8..fefdf57df8 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -18,10 +18,6 @@
path = plugins/TasksTimetable
url = https://github.com/matomo-org/plugin-TasksTimetable.git
branch = master
-[submodule "plugins/LoginHttpAuth"]
- path = plugins/LoginHttpAuth
- url = https://github.com/matomo-org/plugin-LoginHttpAuth.git
- branch = master
[submodule "plugins/QueuedTracking"]
path = plugins/QueuedTracking
url = https://github.com/matomo-org/plugin-QueuedTracking.git
@@ -61,7 +57,9 @@
[submodule "plugins/DeviceDetectorCache"]
path = plugins/DeviceDetectorCache
url = https://github.com/matomo-org/plugin-DeviceDetectorCache.git
-
+[submodule "plugins/Provider"]
+ path = plugins/Provider
+ url = https://github.com/matomo-org/plugin-Provider.git
# Add new Plugin submodule above this line ^^
#
@@ -76,4 +74,4 @@
path = plugins/Morpheus/icons
url = https://github.com/matomo-org/matomo-icons.git
-# Note: do not add new plugin submodules here, but a few lines above \ No newline at end of file
+# Note: do not add new plugin submodules here, but a few lines above
diff --git a/.travis.yml b/.travis.yml
index b1f04cbe84..0303f518ec 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -36,24 +36,24 @@ matrix:
fast_finish: true
include:
# PDO Mysql
- - php: 5.6
+ - php: 7.2
env: TEST_SUITE=SystemTestsCore MYSQL_ADAPTER=PDO_MYSQL
sudo: required
- - php: 5.6
+ - php: 7.2
env: TEST_SUITE=SystemTestsPlugins MYSQL_ADAPTER=PDO_MYSQL
sudo: required
- - php: 5.6
+ - php: 7.2
env: TEST_SUITE=IntegrationTestsCore MYSQL_ADAPTER=PDO_MYSQL
sudo: required
- - php: 5.6
+ - php: 7.2
env: TEST_SUITE=IntegrationTestsPlugins MYSQL_ADAPTER=PDO_MYSQL
sudo: required
- - php: 5.6
+ - php: 7.2
env: TEST_SUITE=UnitTests MYSQL_ADAPTER=PDO_MYSQL
sudo: false
addons: false
# Javascript tests
- - php: 5.6
+ - php: 7.2
env: TEST_SUITE=JavascriptTests MYSQL_ADAPTER=PDO_MYSQL
sudo: false
addons:
@@ -61,7 +61,7 @@ matrix:
packages:
- nginx
- realpath
- - php: 5.6
+ - php: 7.2
env: TEST_SUITE=AngularJSTests MYSQL_ADAPTER=PDO_MYSQL SKIP_COMPOSER_INSTALL=1
sudo: false
addons: false
@@ -73,10 +73,10 @@ matrix:
env: TEST_SUITE=AllTests MYSQL_ADAPTER=MYSQLI ALLTEST_EXTRA_OPTIONS="--run-second-half-only"
sudo: required
# UITests use a specific version because the default 5.5 (== 5.5.38) is missing FreeType support
- - php: 5.5.33
+ - php: 7.2
env: TEST_SUITE=UITests MYSQL_ADAPTER=PDO_MYSQL UITEST_EXTRA_OPTIONS="--run-first-half-only"
sudo: false
- - php: 5.5.33
+ - php: 7.2
env: TEST_SUITE=UITests MYSQL_ADAPTER=PDO_MYSQL UITEST_EXTRA_OPTIONS="--run-second-half-only"
sudo: false
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2a34126692..a3741a87be 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,43 @@ This is the Developer Changelog for Matomo platform developers. All changes in o
The Product Changelog at **[matomo.org/changelog](https://matomo.org/changelog)** lets you see more details about any Matomo release, such as the list of new guides and FAQs, security fixes, and links to all closed issues.
+## Matomo 4.0.0
+
+### Breaking Changes
+
+* Deprecated `piwik` font was removed. Use `matomo` font instead
+* The JavaScript AjaxHelper does not longer support synchronous requests. All requests will be sent async instead.
+* The deprecated Platform API method `\Piwik\Plugin::getListHooksRegistered()` has been removed. Use `\Piwik\Plugin::registerEvents()` instead
+* The deprecated Platform API method `\Piwik\Piwik::doAsSuperUser()` has been removed. Use `\Piwik\Access::doAsSuperUser()` instead
+* The deprecated Platform API method `\Piwik\SettingsPiwik::isPiwikInstalled()` has been removed. Use `\Piwik\SettingsPiwik::isMatomoInstalled()` instead
+* The deprecated Platform API method `\Piwik\Updates::getSql()` has been removed. Use `\Piwik\Updates::getMigrations()` instead
+* The deprecated Platform API method `\Piwik\Updates::getMigrationQueries()` has been removed. Use `\Piwik\Updates::getMigrations()` instead
+* The deprecated Platform API method `\Piwik\Updates::executeMigrationQueries()` has been removed. Use `\Piwik\Updates::executeMigrations()` instead
+* The deprecated Platform API method `\Piwik\Updates::update()` has been removed. Use `\Piwik\Updates::doUpdate()` instead
+* Matomo no longer polyfills the `JSON` object in the JavaScript tracker. This means IE7 and older, Firefox 3 and older will be no longer suppported in the tracker.
+* The deprecated Platform API method `\Piwik\Common::json_encode()` has been removed. Use `json_encode()` instead
+* The deprecated Platform API method `\Piwik\Common::json_decode()` has been removed. Use `json_decode()` instead
+* The deprecated Platform API method `\Piwik\Common::getContinentsList()` has been removed. Use `\Piwik\Intl\Data\Provider\RegionDataProvider::getContinentList()` instead
+* The deprecated Platform API method `\Piwik\Common::getCountriesList()` has been removed. Use `\Piwik\Intl\Data\Provider\RegionDataProvider::getCountriesList()` instead
+* The deprecated Platform API method `\Piwik\Common::getLanguagesList()` has been removed. Use `\Piwik\Intl\Data\Provider\LanguageDataProvider::getLanguagesList()` instead
+* The deprecated Platform API method `\Piwik\Common::getLanguageToCountryList()` has been removed. Use `\Piwik\Intl\Data\Provider\LanguageDataProvider::getLanguageToCountryList()` instead
+* The deprecated Platform API method `\Piwik\MetricsFormatter::getCurrencyList()` has been removed. Use `\Piwik\Intl\Data\Provider\CurrencyDataProvider::getCurrencyList()` instead
+* The deprecated Platform API method `\Piwik\Site::getCurrencyList()` has been removed. Use `\Piwik\Intl\Data\Provider\CurrencyDataProvider::getCurrencyList()` instead
+* The deprecated Platform API method `\Piwik\Piwik::setUserHasSuperUserAccess()` has been removed. Use `\Piwik\Access::doAsSuperUser()` instead
+* The deprecated Platform API class `\Piwik\Registry` has been removed. Use `\Piwik\Container\StaticContainer` instead
+* The deprecated Platform API class `\Piwik\TaskScheduler` has been removed. Use `\Piwik\Scheduler\Scheduler` instead
+* The deprecated Platform API class `\Piwik\DeviceDetectorFactory` has been removed. Use `\Piwik\DeviceDetector\DeviceDetectorFactory` instead
+* The deprecated Platform API class `\Piwik\Translate` has been removed. Use `\Piwik\Translation\Translator` instead.
+* The JavaScript tracker now uses `sendBeacon` by default if supported by the browser. You can disable this by calling the tracker method `disableAlwaysUseSendBeacon`. As a result, callback parameters won't work anymore and a tracking request might not appear in the developer tools.
+* The console option `--piwik-domain` has been removed. Use `--matomo-domain` instead
+* The core plugin `CustomPiwikJs` has been renamed to `CustomJsTracker`
+ * The event `CustomPiwikJs.piwikJsChanged` has been renamed to `CustomJsTracker.trackerJsChanged`
+ * The event `CustomPiwikJs.shouldAddTrackerFile` has been renamed to `CustomJsTracker.shouldAddTrackerFile`
+ * Public API class `Piwik\Plugins\CustomPiwikJs\TrackerUpdater` has been renamed to `Piwik\Plugins\CustomJsTracker\TrackerUpdater`
+ * API method `CustomPiwikJs.doesIncludePluginTrackersAutomatically` has been renamed to `CustomJsTracker.doesIncludePluginTrackersAutomatically`
+* GeoIP Legacy support has been fully removed. Users of GeoIP Legacy need to set up a new location provider like GeoIP2, otherwise the default location provider will be used.
+* Site search category and count are no longer stored as custom variables. That also means they will now have an extra field in action details and no longer appear in custom variables.
+
## Matomo 3.13.1
### Deprecations
diff --git a/LegacyAutoloader.php b/LegacyAutoloader.php
new file mode 100644
index 0000000000..511cf8ce29
--- /dev/null
+++ b/LegacyAutoloader.php
@@ -0,0 +1,26 @@
+<?php
+
+class LegacyAutoloader
+{
+ public function __construct()
+ {
+ spl_autoload_register(array($this, 'load_class'));
+ }
+
+ public static function register()
+ {
+ new LegacyAutoloader();
+ }
+
+ public function load_class($className)
+ {
+ if (strpos($className, 'Piwik\\') === 0) {
+ $newName = 'Matomo' . substr($className, 5);
+ if (class_exists($newName)) {
+ class_alias($newName, $className);
+ }
+ }
+ }
+}
+
+LegacyAutoloader::register(); \ No newline at end of file
diff --git a/bower.json b/bower.json
index 8fc57f58ed..142caf6dcf 100644
--- a/bower.json
+++ b/bower.json
@@ -26,7 +26,6 @@
"sprintf": "~1.0.0",
"jScrollPane": "~2.0.0",
"jquery-mousewheel": "~3.1.12",
- "jquery-placeholder": "~2.0.8",
"jQuery.dotdotdot": "~1.7.2",
"jquery.scrollTo": "~1.4.13",
"chroma-js": "~0.6.0",
diff --git a/composer.json b/composer.json
index 8abdfa457c..318fe0c767 100644
--- a/composer.json
+++ b/composer.json
@@ -20,42 +20,43 @@
},
"config":{
"platform": {
- "php": "5.5.9"
+ "php": "7.2.0"
},
- "prepend-autoloader": false
+ "prepend-autoloader": false,
+ "sort-packages": true
},
"require": {
- "php": ">=5.5.9",
- "twig/twig": "~1.0",
+ "php": ">=7.2.0",
+ "composer/semver": "~1.3.0",
+ "davaxi/sparkline": "~1.2",
+ "geoip2/geoip2": "^2.8",
"leafo/lessphp": "dev-php74-compat",
- "symfony/console": "~2.6.0",
+ "matomo-org/jshrink": "1.3.1",
+ "matomo/cache": "~2.0",
+ "matomo/decompress": "~2.0",
+ "matomo/ini": "~2.0",
+ "matomo/matomo-php-tracker": "~2.0",
+ "matomo/network": "~2.0",
+ "matomo/referrer-spam-blacklist": "~3.0",
+ "matomo/searchengine-and-social-list": "~3.0",
+ "monolog/monolog": "~1.11",
"mustangostang/spyc": "~0.6.0",
- "piwik/device-detector": "~3.0",
- "piwik/decompress": "~1.0",
- "piwik/network": "~0",
- "piwik/cache": "~1.0.0",
- "piwik/ini": "^1.0.8",
+ "pear/pear_exception": "~1.0.0",
"php-di/php-di": "^5.0.0",
+ "piwik/device-detector": "~3.0",
"psr/log": "~1.0",
- "monolog/monolog": "~1.11",
- "symfony/monolog-bridge": "~2.6.0",
+ "symfony/console": "~2.6.0",
"symfony/event-dispatcher": "~2.6.0",
- "pear/pear_exception": "~1.0.0",
- "matomo/referrer-spam-blacklist": "~1.0",
- "matomo/searchengine-and-social-list": "~3.0",
- "tecnickcom/tcpdf": "~6.0",
- "piwik/piwik-php-tracker": "^1.0.0",
- "composer/semver": "~1.3.0",
+ "symfony/monolog-bridge": "~2.6.0",
"szymach/c-pchart": "^2.0",
- "geoip2/geoip2": "^2.8",
- "davaxi/sparkline": "~1.2",
- "matomo-org/jshrink": "1.3.1"
+ "tecnickcom/tcpdf": "~6.0",
+ "twig/twig": "~1.0"
},
"require-dev": {
"aws/aws-sdk-php": "2.7.1",
- "phpunit/phpunit": "~4.8",
- "facebook/xhprof": "dev-master",
+ "lox/xhprof": "dev-master",
"phpseclib/phpseclib": "~0.3.8",
+ "phpunit/phpunit": "~8.5",
"symfony/var-dumper": "~2.6.0",
"symfony/yaml": "~2.6.0"
},
@@ -63,32 +64,6 @@
{
"type": "package",
"package": {
- "name": "facebook/xhprof",
- "type": "library",
- "description": "XHProf: A Hierarchical Profiler for PHP",
- "keywords": ["profiling", "performance"],
- "homepage": "http://pecl.php.net/package/xhprof",
- "license": "Apache-2.0",
- "version": "master",
- "require": {
- "php": ">=5.2.0"
- },
- "autoload": {
- "files": [
- "xhprof_lib/utils/xhprof_lib.php",
- "xhprof_lib/utils/xhprof_runs.php"
- ]
- },
- "source": {
- "type": "git",
- "url": "https://github.com/phacility/xhprof",
- "reference": "master"
- }
- }
- },
- {
- "type": "package",
- "package": {
"name": "matomo-org/jshrink",
"description": "Javascript Minifier built in PHP",
"keywords": ["minifier","javascript"],
@@ -144,7 +119,8 @@
"HTML_": "libs/",
"PEAR_": "libs/",
"Archive_": "libs/"
- }
+ },
+ "files": ["LegacyAutoloader.php"]
},
"autoload-dev": {
"psr-4": {
diff --git a/composer.lock b/composer.lock
index af333e6cf4..707fbc585f 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "ef319f0bec0c7988dd83727e05ac2b39",
+ "content-hash": "e0cf7a238ff49c3657c22fbd22937f08",
"packages": [
{
"name": "composer/ca-bundle",
@@ -404,6 +404,202 @@
]
},
{
+ "name": "matomo/cache",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/matomo-org/component-cache.git",
+ "reference": "01e82b9dc0f2f8b0ee070212b0e9e91045f60926"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/matomo-org/component-cache/zipball/01e82b9dc0f2f8b0ee070212b0e9e91045f60926",
+ "reference": "01e82b9dc0f2f8b0ee070212b0e9e91045f60926",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/cache": "~1.4",
+ "php": ">=5.5.9"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Matomo\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0"
+ ],
+ "authors": [
+ {
+ "name": "The Matomo Team",
+ "email": "hello@matomo.org",
+ "homepage": "https://matomo.org/the-matomo-team/"
+ }
+ ],
+ "description": "PHP caching library based on Doctrine cache",
+ "keywords": [
+ "array",
+ "cache",
+ "file",
+ "redis"
+ ],
+ "time": "2019-07-14T20:55:17+00:00"
+ },
+ {
+ "name": "matomo/decompress",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/matomo-org/component-decompress.git",
+ "reference": "1220757676c8d5cc8faa9d1cb0a48bf0b1fedc9c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/matomo-org/component-decompress/zipball/1220757676c8d5cc8faa9d1cb0a48bf0b1fedc9c",
+ "reference": "1220757676c8d5cc8faa9d1cb0a48bf0b1fedc9c",
+ "shasum": ""
+ },
+ "require": {
+ "pear/archive_tar": "~1.3,>=1.3.15",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Matomo\\Decompress\\": "src/"
+ },
+ "classmap": [
+ "libs/PclZip"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0"
+ ],
+ "time": "2018-02-09T12:19:44+00:00"
+ },
+ {
+ "name": "matomo/ini",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/matomo-org/component-ini.git",
+ "reference": "4cf2d9d73f884a1ce0d9a8c8a119d56f44771c80"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/matomo-org/component-ini/zipball/4cf2d9d73f884a1ce0d9a8c8a119d56f44771c80",
+ "reference": "4cf2d9d73f884a1ce0d9a8c8a119d56f44771c80",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "athletic/athletic": "0.1.*",
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Matomo\\Ini\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0"
+ ],
+ "time": "2019-07-03T07:42:01+00:00"
+ },
+ {
+ "name": "matomo/matomo-php-tracker",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/matomo-org/matomo-php-tracker.git",
+ "reference": "d8a30200b0bd144f38282df9a8cb5da194da9296"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/matomo-org/matomo-php-tracker/zipball/d8a30200b0bd144f38282df9a8cb5da194da9296",
+ "reference": "d8a30200b0bd144f38282df9a8cb5da194da9296",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": ">=5.3"
+ },
+ "suggest": {
+ "ext-curl": "Using this extension to issue the HTTPS request to Matomo"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "."
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "The Matomo Team",
+ "email": "hello@matomo.org",
+ "homepage": "https://matomo.org/team/"
+ }
+ ],
+ "description": "PHP Client for Matomo Analytics Tracking API",
+ "homepage": "https://matomo.org",
+ "keywords": [
+ "analytics",
+ "matomo",
+ "piwik",
+ "tracker"
+ ],
+ "time": "2020-01-14T19:33:53+00:00"
+ },
+ {
+ "name": "matomo/network",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/matomo-org/component-network.git",
+ "reference": "010e49629115e7227bec08c39639e0efeb048905"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/matomo-org/component-network/zipball/010e49629115e7227bec08c39639e0efeb048905",
+ "reference": "010e49629115e7227bec08c39639e0efeb048905",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Matomo\\Network\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0"
+ ],
+ "time": "2020-01-01T12:57:48+00:00"
+ },
+ {
"name": "matomo/referrer-spam-blacklist",
"version": "1.1.2",
"source": {
@@ -1039,91 +1235,6 @@
"time": "2019-09-26T11:24:58+00:00"
},
{
- "name": "piwik/cache",
- "version": "1.0.4",
- "source": {
- "type": "git",
- "url": "https://github.com/matomo-org/component-cache.git",
- "reference": "09274cb024c506ba5b182c0e72a71ff3b933b4c3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/matomo-org/component-cache/zipball/09274cb024c506ba5b182c0e72a71ff3b933b4c3",
- "reference": "09274cb024c506ba5b182c0e72a71ff3b933b4c3",
- "shasum": ""
- },
- "require": {
- "doctrine/cache": "~1.4",
- "php": ">=5.5.9"
- },
- "require-dev": {
- "phpunit/phpunit": "~4.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Piwik\\Cache\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-3.0"
- ],
- "authors": [
- {
- "name": "The Piwik Team",
- "email": "hello@piwik.org",
- "homepage": "http://piwik.org/the-piwik-team/"
- }
- ],
- "description": "PHP caching library based on Doctrine cache",
- "keywords": [
- "array",
- "cache",
- "file",
- "redis"
- ],
- "abandoned": "matomo/cache",
- "time": "2020-02-09T20:54:22+00:00"
- },
- {
- "name": "piwik/decompress",
- "version": "1.2.2",
- "source": {
- "type": "git",
- "url": "https://github.com/matomo-org/component-decompress.git",
- "reference": "15088059c38378939db8a3490b67b569797a6a3a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/matomo-org/component-decompress/zipball/15088059c38378939db8a3490b67b569797a6a3a",
- "reference": "15088059c38378939db8a3490b67b569797a6a3a",
- "shasum": ""
- },
- "require": {
- "pear/archive_tar": "~1.3,>=1.3.15",
- "php": ">=5.3.2"
- },
- "require-dev": {
- "phpunit/phpunit": "4.4"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Piwik\\Decompress\\": "src/"
- },
- "classmap": [
- "libs/PclZip"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-3.0"
- ],
- "abandoned": "matomo/decompress",
- "time": "2017-07-14T10:45:10+00:00"
- },
- {
"name": "piwik/device-detector",
"version": "3.12.3",
"source": {
@@ -1179,114 +1290,6 @@
"time": "2020-01-13T16:15:20+00:00"
},
{
- "name": "piwik/ini",
- "version": "1.0.8",
- "source": {
- "type": "git",
- "url": "https://github.com/matomo-org/component-ini.git",
- "reference": "663d4fdedd8f344407fd1599e623f41912fe2ebd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/matomo-org/component-ini/zipball/663d4fdedd8f344407fd1599e623f41912fe2ebd",
- "reference": "663d4fdedd8f344407fd1599e623f41912fe2ebd",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "require-dev": {
- "athletic/athletic": "0.1.*",
- "phpunit/phpunit": "~4.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Piwik\\Ini\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-3.0"
- ],
- "abandoned": "matomo/ini",
- "time": "2019-12-21T20:06:47+00:00"
- },
- {
- "name": "piwik/network",
- "version": "0.2.1",
- "source": {
- "type": "git",
- "url": "https://github.com/matomo-org/component-network.git",
- "reference": "fb847317b79fe41d52f5eb5fd92f197df4538b7d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/matomo-org/component-network/zipball/fb847317b79fe41d52f5eb5fd92f197df4538b7d",
- "reference": "fb847317b79fe41d52f5eb5fd92f197df4538b7d",
- "shasum": ""
- },
- "require": {
- "php": ">=5.4"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.36"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Piwik\\Network\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-3.0"
- ],
- "abandoned": "matomo/network",
- "time": "2019-11-06T19:13:42+00:00"
- },
- {
- "name": "piwik/piwik-php-tracker",
- "version": "1.5.2",
- "source": {
- "type": "git",
- "url": "https://github.com/matomo-org/matomo-php-tracker.git",
- "reference": "314e6d00039cb9d99837c81cdf4cbcd19f5683e0"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/matomo-org/matomo-php-tracker/zipball/314e6d00039cb9d99837c81cdf4cbcd19f5683e0",
- "reference": "314e6d00039cb9d99837c81cdf4cbcd19f5683e0",
- "shasum": ""
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "."
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-2-Clause"
- ],
- "authors": [
- {
- "name": "The Piwik Team",
- "email": "hello@piwik.org",
- "homepage": "http://piwik.org/the-piwik-team/"
- }
- ],
- "description": "PHP Client for Piwik Analytics Tracking API",
- "homepage": "http://piwik.org",
- "keywords": [
- "analytics",
- "piwik",
- "tracker"
- ],
- "abandoned": "matomo/matomo-php-tracker",
- "time": "2019-12-23T21:48:04+00:00"
- },
- {
"name": "psr/container",
"version": "1.0.0",
"source": {
@@ -1560,16 +1563,16 @@
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.12.0",
+ "version": "v1.13.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "550ebaac289296ce228a706d0867afc34687e3f4"
+ "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4",
- "reference": "550ebaac289296ce228a706d0867afc34687e3f4",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
+ "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
"shasum": ""
},
"require": {
@@ -1581,7 +1584,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.12-dev"
+ "dev-master": "1.13-dev"
}
},
"autoload": {
@@ -1614,7 +1617,7 @@
"polyfill",
"portable"
],
- "time": "2019-08-06T08:03:45+00:00"
+ "time": "2019-11-27T13:56:44+00:00"
},
{
"name": "szymach/c-pchart",
@@ -1879,32 +1882,34 @@
},
{
"name": "doctrine/instantiator",
- "version": "1.0.5",
+ "version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
- "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ "reference": "ae466f726242e637cebdd526a7d991b9433bacf1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
- "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1",
+ "reference": "ae466f726242e637cebdd526a7d991b9433bacf1",
"shasum": ""
},
"require": {
- "php": ">=5.3,<8.0-DEV"
+ "php": "^7.1"
},
"require-dev": {
- "athletic/athletic": "~0.1.8",
+ "doctrine/coding-standard": "^6.0",
"ext-pdo": "*",
"ext-phar": "*",
- "phpunit/phpunit": "~4.0",
- "squizlabs/php_codesniffer": "~2.0"
+ "phpbench/phpbench": "^0.13",
+ "phpstan/phpstan-phpunit": "^0.11",
+ "phpstan/phpstan-shim": "^0.11",
+ "phpunit/phpunit": "^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.2.x-dev"
}
},
"autoload": {
@@ -1924,41 +1929,12 @@
}
],
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
- "homepage": "https://github.com/doctrine/instantiator",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
"keywords": [
"constructor",
"instantiate"
],
- "time": "2015-06-14T21:17:01+00:00"
- },
- {
- "name": "facebook/xhprof",
- "version": "master",
- "source": {
- "type": "git",
- "url": "https://github.com/phacility/xhprof",
- "reference": "master"
- },
- "require": {
- "php": ">=5.2.0"
- },
- "type": "library",
- "autoload": {
- "files": [
- "xhprof_lib/utils/xhprof_lib.php",
- "xhprof_lib/utils/xhprof_runs.php"
- ]
- },
- "license": [
- "Apache-2.0"
- ],
- "description": "XHProf: A Hierarchical Profiler for PHP",
- "homepage": "http://pecl.php.net/package/xhprof",
- "keywords": [
- "performance",
- "profiling"
- ],
- "time": "2015-02-26T14:37:51+00:00"
+ "time": "2019-10-21T16:45:58+00:00"
},
{
"name": "guzzle/guzzle",
@@ -2057,36 +2033,223 @@
"time": "2015-03-18T18:23:50+00:00"
},
{
+ "name": "lox/xhprof",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/lox/xhprof.git",
+ "reference": "c64571f892bda1298bad9c5e94ede0bc3f0e4627"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/lox/xhprof/zipball/c64571f892bda1298bad9c5e94ede0bc3f0e4627",
+ "reference": "c64571f892bda1298bad9c5e94ede0bc3f0e4627",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.0"
+ },
+ "bin": [
+ "bin/xhprofile"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "xhprof_lib/utils/xhprof_lib.php",
+ "xhprof_lib/utils/xhprof_runs.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "XHProf: A Hierarchical Profiler for PHP",
+ "homepage": "http://pecl.php.net/package/xhprof",
+ "keywords": [
+ "performance",
+ "profiling"
+ ],
+ "time": "2015-08-31T22:07:48+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.9.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef",
+ "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "replace": {
+ "myclabs/deep-copy": "self.version"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ },
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "time": "2020-01-17T21:11:47+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "phar-io/version": "^2.0",
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "time": "2018-07-08T19:23:20+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "time": "2018-07-08T19:19:57+00:00"
+ },
+ {
"name": "phpdocumentor/reflection-common",
- "version": "1.0.1",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
+ "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
- "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a",
+ "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a",
"shasum": ""
},
"require": {
- "php": ">=5.5"
+ "php": ">=7.1"
},
"require-dev": {
- "phpunit/phpunit": "^4.6"
+ "phpunit/phpunit": "~6"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "2.x-dev"
}
},
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": [
- "src"
- ]
+ "phpDocumentor\\Reflection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2108,38 +2271,42 @@
"reflection",
"static analysis"
],
- "time": "2017-09-11T18:02:19+00:00"
+ "time": "2018-08-07T13:53:10+00:00"
},
{
"name": "phpdocumentor/reflection-docblock",
- "version": "3.2.2",
+ "version": "5.0.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157"
+ "reference": "a48807183a4b819072f26e347bbd0b5199a9d15f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/4aada1f93c72c35e22fb1383b47fee43b8f1d157",
- "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/a48807183a4b819072f26e347bbd0b5199a9d15f",
+ "reference": "a48807183a4b819072f26e347bbd0b5199a9d15f",
"shasum": ""
},
"require": {
- "php": ">=5.5",
- "phpdocumentor/reflection-common": "^1.0@dev",
- "phpdocumentor/type-resolver": "^0.3.0",
- "webmozart/assert": "^1.0"
+ "ext-filter": "^7.1",
+ "php": "^7.2",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpdocumentor/type-resolver": "^1.0",
+ "webmozart/assert": "^1"
},
"require-dev": {
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^4.4"
+ "doctrine/instantiator": "^1",
+ "mockery/mockery": "^1"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": [
- "src/"
- ]
+ "phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2150,44 +2317,47 @@
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
- "time": "2017-08-08T06:39:58+00:00"
+ "time": "2020-02-09T09:16:15+00:00"
},
{
"name": "phpdocumentor/type-resolver",
- "version": "0.3.0",
+ "version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773"
+ "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fb3933512008d8162b3cdf9e18dba9309b7c3773",
- "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
+ "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
"shasum": ""
},
"require": {
- "php": "^5.5 || ^7.0",
- "phpdocumentor/reflection-common": "^1.0"
+ "php": "^7.1",
+ "phpdocumentor/reflection-common": "^2.0"
},
"require-dev": {
- "mockery/mockery": "^0.9.4",
- "phpunit/phpunit": "^5.2||^4.8.24"
+ "ext-tokenizer": "^7.1",
+ "mockery/mockery": "~1",
+ "phpunit/phpunit": "^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": [
- "src/"
- ]
+ "phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2200,7 +2370,8 @@
"email": "me@mikevanriel.com"
}
],
- "time": "2017-06-03T08:32:36+00:00"
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "time": "2019-08-22T18:11:29+00:00"
},
{
"name": "phpseclib/phpseclib",
@@ -2302,33 +2473,33 @@
},
{
"name": "phpspec/prophecy",
- "version": "1.9.0",
+ "version": "v1.10.2",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203"
+ "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203",
- "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b4400efc9d206e83138e2bb97ed7f5b14b831cd9",
+ "reference": "b4400efc9d206e83138e2bb97ed7f5b14b831cd9",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.0.2",
"php": "^5.3|^7.0",
"phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
- "sebastian/comparator": "^1.1|^2.0|^3.0",
- "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
},
"require-dev": {
- "phpspec/phpspec": "^2.5|^3.2",
+ "phpspec/phpspec": "^2.5 || ^3.2",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.8.x-dev"
+ "dev-master": "1.10.x-dev"
}
},
"autoload": {
@@ -2361,43 +2532,44 @@
"spy",
"stub"
],
- "time": "2019-10-03T11:07:50+00:00"
+ "time": "2020-01-20T15:57:02+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "2.2.4",
+ "version": "7.0.10",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
+ "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
- "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf",
+ "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "phpunit/php-file-iterator": "~1.3",
- "phpunit/php-text-template": "~1.2",
- "phpunit/php-token-stream": "~1.3",
- "sebastian/environment": "^1.3.2",
- "sebastian/version": "~1.0"
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2",
+ "phpunit/php-file-iterator": "^2.0.2",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-token-stream": "^3.1.1",
+ "sebastian/code-unit-reverse-lookup": "^1.0.1",
+ "sebastian/environment": "^4.2.2",
+ "sebastian/version": "^2.0.1",
+ "theseer/tokenizer": "^1.1.3"
},
"require-dev": {
- "ext-xdebug": ">=2.1.4",
- "phpunit/phpunit": "~4"
+ "phpunit/phpunit": "^8.2.2"
},
"suggest": {
- "ext-dom": "*",
- "ext-xdebug": ">=2.2.1",
- "ext-xmlwriter": "*"
+ "ext-xdebug": "^2.7.2"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.2.x-dev"
+ "dev-master": "7.0-dev"
}
},
"autoload": {
@@ -2412,7 +2584,7 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -2423,29 +2595,32 @@
"testing",
"xunit"
],
- "time": "2015-10-06T15:47:00+00:00"
+ "time": "2019-11-20T13:55:58+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "1.4.5",
+ "version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+ "reference": "050bedf145a257b1ff02746c31894800e5122946"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
- "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946",
+ "reference": "050bedf145a257b1ff02746c31894800e5122946",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4.x-dev"
+ "dev-master": "2.0.x-dev"
}
},
"autoload": {
@@ -2460,7 +2635,7 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -2470,7 +2645,7 @@
"filesystem",
"iterator"
],
- "time": "2017-11-27T13:52:08+00:00"
+ "time": "2018-09-13T20:33:42+00:00"
},
{
"name": "phpunit/php-text-template",
@@ -2515,28 +2690,28 @@
},
{
"name": "phpunit/php-timer",
- "version": "1.0.9",
+ "version": "2.1.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+ "reference": "1038454804406b0b5f5f520358e78c1c2f71501e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e",
+ "reference": "1038454804406b0b5f5f520358e78c1c2f71501e",
"shasum": ""
},
"require": {
- "php": "^5.3.3 || ^7.0"
+ "php": "^7.1"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ "phpunit/phpunit": "^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "2.1-dev"
}
},
"autoload": {
@@ -2551,7 +2726,7 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -2560,33 +2735,33 @@
"keywords": [
"timer"
],
- "time": "2017-02-26T11:10:40+00:00"
+ "time": "2019-06-07T04:22:29+00:00"
},
{
"name": "phpunit/php-token-stream",
- "version": "1.4.12",
+ "version": "3.1.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-token-stream.git",
- "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16"
+ "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16",
- "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff",
+ "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
- "php": ">=5.3.3"
+ "php": "^7.1"
},
"require-dev": {
- "phpunit/phpunit": "~4.2"
+ "phpunit/phpunit": "^7.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "3.1-dev"
}
},
"autoload": {
@@ -2609,45 +2784,56 @@
"keywords": [
"tokenizer"
],
- "time": "2017-12-04T08:55:13+00:00"
+ "time": "2019-09-17T06:23:10+00:00"
},
{
"name": "phpunit/phpunit",
- "version": "4.8.36",
+ "version": "8.5.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "46023de9a91eec7dfb06cc56cb4e260017298517"
+ "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517",
- "reference": "46023de9a91eec7dfb06cc56cb4e260017298517",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/018b6ac3c8ab20916db85fa91bf6465acb64d1e0",
+ "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0",
"shasum": ""
},
"require": {
+ "doctrine/instantiator": "^1.2.0",
"ext-dom": "*",
"ext-json": "*",
- "ext-pcre": "*",
- "ext-reflection": "*",
- "ext-spl": "*",
- "php": ">=5.3.3",
- "phpspec/prophecy": "^1.3.1",
- "phpunit/php-code-coverage": "~2.1",
- "phpunit/php-file-iterator": "~1.4",
- "phpunit/php-text-template": "~1.2",
- "phpunit/php-timer": "^1.0.6",
- "phpunit/phpunit-mock-objects": "~2.3",
- "sebastian/comparator": "~1.2.2",
- "sebastian/diff": "~1.2",
- "sebastian/environment": "~1.3",
- "sebastian/exporter": "~1.2",
- "sebastian/global-state": "~1.0",
- "sebastian/version": "~1.0",
- "symfony/yaml": "~2.1|~3.0"
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.9.1",
+ "phar-io/manifest": "^1.0.3",
+ "phar-io/version": "^2.0.1",
+ "php": "^7.2",
+ "phpspec/prophecy": "^1.8.1",
+ "phpunit/php-code-coverage": "^7.0.7",
+ "phpunit/php-file-iterator": "^2.0.2",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-timer": "^2.1.2",
+ "sebastian/comparator": "^3.0.2",
+ "sebastian/diff": "^3.0.2",
+ "sebastian/environment": "^4.2.2",
+ "sebastian/exporter": "^3.1.1",
+ "sebastian/global-state": "^3.0.0",
+ "sebastian/object-enumerator": "^3.0.3",
+ "sebastian/resource-operations": "^2.0.1",
+ "sebastian/type": "^1.1.3",
+ "sebastian/version": "^2.0.1"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
},
"suggest": {
- "phpunit/php-invoker": "~1.1"
+ "ext-soap": "*",
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "^2.0.0"
},
"bin": [
"phpunit"
@@ -2655,7 +2841,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.8.x-dev"
+ "dev-master": "8.5-dev"
}
},
"autoload": {
@@ -2681,38 +2867,32 @@
"testing",
"xunit"
],
- "time": "2017-06-21T08:07:12+00:00"
+ "time": "2020-01-08T08:49:49+00:00"
},
{
- "name": "phpunit/phpunit-mock-objects",
- "version": "2.3.8",
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
- "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
- "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.0.2",
- "php": ">=5.3.3",
- "phpunit/php-text-template": "~1.2",
- "sebastian/exporter": "~1.2"
+ "php": "^5.6 || ^7.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
- },
- "suggest": {
- "ext-soap": "*"
+ "phpunit/phpunit": "^5.7 || ^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.3.x-dev"
+ "dev-master": "1.0.x-dev"
}
},
"autoload": {
@@ -2727,45 +2907,39 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
+ "email": "sebastian@phpunit.de"
}
],
- "description": "Mock Object library for PHPUnit",
- "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
- "keywords": [
- "mock",
- "xunit"
- ],
- "abandoned": true,
- "time": "2015-10-02T06:51:40+00:00"
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "time": "2017-03-04T06:30:41+00:00"
},
{
"name": "sebastian/comparator",
- "version": "1.2.4",
+ "version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+ "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
- "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
+ "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "sebastian/diff": "~1.2",
- "sebastian/exporter": "~1.2 || ~2.0"
+ "php": "^7.1",
+ "sebastian/diff": "^3.0",
+ "sebastian/exporter": "^3.1"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "^7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -2796,38 +2970,39 @@
}
],
"description": "Provides the functionality to compare PHP values for equality",
- "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
"keywords": [
"comparator",
"compare",
"equality"
],
- "time": "2017-01-29T09:50:25+00:00"
+ "time": "2018-07-12T15:12:46+00:00"
},
{
"name": "sebastian/diff",
- "version": "1.4.3",
+ "version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
+ "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
- "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
+ "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
"shasum": ""
},
"require": {
- "php": "^5.3.3 || ^7.0"
+ "php": "^7.1"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ "phpunit/phpunit": "^7.5 || ^8.0",
+ "symfony/process": "^2 || ^3.3 || ^4"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -2852,34 +3027,40 @@
"description": "Diff implementation",
"homepage": "https://github.com/sebastianbergmann/diff",
"keywords": [
- "diff"
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
],
- "time": "2017-05-22T07:24:03+00:00"
+ "time": "2019-02-04T06:01:07+00:00"
},
{
"name": "sebastian/environment",
- "version": "1.3.8",
+ "version": "4.2.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea"
+ "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/be2c607e43ce4c89ecd60e75c6a85c126e754aea",
- "reference": "be2c607e43ce4c89ecd60e75c6a85c126e754aea",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
+ "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
"shasum": ""
},
"require": {
- "php": "^5.3.3 || ^7.0"
+ "php": "^7.1"
},
"require-dev": {
- "phpunit/phpunit": "^4.8 || ^5.0"
+ "phpunit/phpunit": "^7.5"
+ },
+ "suggest": {
+ "ext-posix": "*"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3.x-dev"
+ "dev-master": "4.2-dev"
}
},
"autoload": {
@@ -2904,34 +3085,34 @@
"environment",
"hhvm"
],
- "time": "2016-08-18T05:49:44+00:00"
+ "time": "2019-11-20T08:46:58+00:00"
},
{
"name": "sebastian/exporter",
- "version": "1.2.2",
+ "version": "3.1.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4"
+ "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4",
- "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e",
+ "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "sebastian/recursion-context": "~1.0"
+ "php": "^7.0",
+ "sebastian/recursion-context": "^3.0"
},
"require-dev": {
"ext-mbstring": "*",
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3.x-dev"
+ "dev-master": "3.1.x-dev"
}
},
"autoload": {
@@ -2945,6 +3126,10 @@
],
"authors": [
{
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
@@ -2953,16 +3138,12 @@
"email": "github@wallbash.com"
},
{
- "name": "Bernhard Schussek",
- "email": "bschussek@2bepublished.at"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
"name": "Adam Harvey",
"email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
}
],
"description": "Provides the functionality to export PHP variables for visualization",
@@ -2971,27 +3152,30 @@
"export",
"exporter"
],
- "time": "2016-06-17T09:04:28+00:00"
+ "time": "2019-09-14T09:02:43+00:00"
},
{
"name": "sebastian/global-state",
- "version": "1.1.1",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
+ "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": "^7.2",
+ "sebastian/object-reflector": "^1.1.1",
+ "sebastian/recursion-context": "^3.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.2"
+ "ext-dom": "*",
+ "phpunit/phpunit": "^8.0"
},
"suggest": {
"ext-uopz": "*"
@@ -2999,7 +3183,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -3022,32 +3206,124 @@
"keywords": [
"global state"
],
- "time": "2015-10-12T03:26:01+00:00"
+ "time": "2019-02-01T05:30:01+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+ "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/object-reflector": "^1.1.1",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "time": "2017-08-03T12:35:26+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "time": "2017-03-29T09:07:27+00:00"
},
{
"name": "sebastian/recursion-context",
- "version": "1.0.5",
+ "version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7"
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7",
- "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": "^7.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "^6.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "3.0.x-dev"
}
},
"autoload": {
@@ -3075,23 +3351,119 @@
],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
- "time": "2016-10-03T07:41:43+00:00"
+ "time": "2017-03-03T06:23:57+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
+ "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "time": "2018-10-04T04:07:39+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3",
+ "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "time": "2019-07-02T08:10:15+00:00"
},
{
"name": "sebastian/version",
- "version": "1.0.6",
+ "version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
- "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
- "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
"shasum": ""
},
+ "require": {
+ "php": ">=5.6"
+ },
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
"autoload": {
"classmap": [
"src/"
@@ -3110,7 +3482,7 @@
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
- "time": "2015-06-21T13:59:46+00:00"
+ "time": "2016-10-03T07:35:21+00:00"
},
{
"name": "symfony/var-dumper",
@@ -3223,32 +3595,70 @@
"time": "2015-07-26T08:59:42+00:00"
},
{
+ "name": "theseer/tokenizer",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
+ "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "time": "2019-06-13T22:48:21+00:00"
+ },
+ {
"name": "webmozart/assert",
- "version": "1.5.0",
+ "version": "1.6.0",
"source": {
"type": "git",
"url": "https://github.com/webmozart/assert.git",
- "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4"
+ "reference": "573381c0a64f155a0d9a23f4b0c797194805b925"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4",
- "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/573381c0a64f155a0d9a23f4b0c797194805b925",
+ "reference": "573381c0a64f155a0d9a23f4b0c797194805b925",
"shasum": ""
},
"require": {
"php": "^5.3.3 || ^7.0",
"symfony/polyfill-ctype": "^1.8"
},
+ "conflict": {
+ "vimeo/psalm": "<3.6.0"
+ },
"require-dev": {
"phpunit/phpunit": "^4.8.36 || ^7.5.13"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.3-dev"
- }
- },
"autoload": {
"psr-4": {
"Webmozart\\Assert\\": "src/"
@@ -3270,22 +3680,22 @@
"check",
"validate"
],
- "time": "2019-08-24T08:43:50+00:00"
+ "time": "2019-11-24T13:36:37+00:00"
}
],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {
"leafo/lessphp": 20,
- "facebook/xhprof": 20
+ "lox/xhprof": 20
},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
- "php": ">=5.5.9"
+ "php": ">=7.2.0"
},
"platform-dev": [],
"platform-overrides": {
- "php": "5.5.9"
+ "php": "7.2.0"
}
}
diff --git a/config/environment/dev.php b/config/environment/dev.php
index a8bedecca9..f0d1514d17 100644
--- a/config/environment/dev.php
+++ b/config/environment/dev.php
@@ -2,7 +2,7 @@
return array(
- 'Piwik\Cache\Backend' => DI\object('Piwik\Cache\Backend\ArrayCache'),
+ 'Matomo\Cache\Backend' => DI\object('Matomo\Cache\Backend\ArrayCache'),
'Piwik\Translation\Loader\LoaderInterface' => DI\object('Piwik\Translation\Loader\LoaderCache')
->constructor(DI\get('Piwik\Translation\Loader\DevelopmentLoader')),
diff --git a/config/environment/test.php b/config/environment/test.php
index 7cb8defba0..bfd8e54460 100644
--- a/config/environment/test.php
+++ b/config/environment/test.php
@@ -29,7 +29,7 @@ return array(
];
}),
- 'Piwik\Cache\Backend' => function () {
+ 'Matomo\Cache\Backend' => function () {
return \Piwik\Cache::buildBackend('file');
},
'cache.eager.cache_id' => 'eagercache-test-',
diff --git a/config/global.ini.php b/config/global.ini.php
index 475d1e70ec..aaed647f99 100755
--- a/config/global.ini.php
+++ b/config/global.ini.php
@@ -200,7 +200,7 @@ enable_processing_unique_visitors_range = 0
; controls whether Unique Visitors will be processed for groups of websites. these metrics describe the number
; of unique visitors across the entire set of websites, so if a visitor visited two websites in the group, she
; would still only be counted as one. only relevant when using plugins that group sites together
-enable_processing_unique_visitors_multiple_sites = 0
+enable_processing_unique_visitors_multiple_sites = 1
; The list of periods that are available in the Matomo calendar
; Example use case: custom date range requests are processed in real time,
@@ -227,7 +227,7 @@ segments_subquery_cache_ttl = 3600
maintenance_mode = 0
; Defines the release channel that shall be used. Currently available values are:
-; "latest_stable", "latest_beta", "latest_3x_stable", "latest_3x_beta"
+; "latest_stable", "latest_beta", "latest_4x_stable", "latest_4x_beta"
release_channel = "latest_stable"
; character used to automatically create categories in the Actions > Pages, Outlinks and Downloads reports
@@ -400,10 +400,6 @@ disable_checks_usernames_attributes = 0
; For legacy data, fallback or non-security scenarios, we use md5.
hash_algorithm = whirlpool
-; Matomo uses PHP's dbtable for session.
-; If you prefer configuring sessions through the php.ini directly, you may unset this value to an empty string
-session_save_handler = dbtable
-
; If set to 1, Matomo will automatically redirect all http:// requests to https://
; If SSL / https is not correctly configured on the server, this will break Matomo
; If you set this to 1, and your SSL configuration breaks later on, you can always edit this back to 0
@@ -668,6 +664,11 @@ absolute_chroot_path =
; Defaults to ./tmp (the tmp/ folder inside the Matomo directory)
tmp_path = "/tmp"
+; The absolute path to a PHP binary file in case Matomo cannot detect your PHP binary. If async CLI archiving cannot be
+; used on your server this may make it work. Ensure the configured PHP binary is of type CLI and not for example cgi or
+; litespeed. To find out the type of interface for a PHP binary execute this command: php -r "echo php_sapi_name();"
+php_binary_path = ""
+
; In some rare cases it may be useful to explicitely tell Matomo not to use LOAD DATA INFILE
; This may for example be useful when doing Mysql AWS replication
enable_load_data_infile = 1
@@ -910,12 +911,17 @@ enable_sql_profiler = 0
[Deletelogs]
; delete_logs_enable - enable (1) or disable (0) delete log feature. Make sure that all archives for the given period have been processed (setup a cronjob!),
; otherwise you may lose tracking data.
-; delete_logs_schedule_lowest_interval - lowest possible interval between two table deletes (in days, 1|7|30). Default: 7.
+; delete_logs_schedule_lowest_interval - lowest possible interval between two table deletes, for tables named log_* (in days, 1|7|30). Default: 7.
; delete_logs_older_than - delete data older than XX (days). Default: 180
+; delete_logs_unused_actions_schedule_lowest_interval - lowest possible interval between two table deletes, for table log_action (in days, 1|7|30). Default: 30.
+; delete_logs_max_rows_per_query and delete_logs_unused_actions_max_rows_per_query can be increased for large sites to speed up delete processes
+;
+; The higher value one assign to *_schedule_lowest_interval, the longer the data pruning/deletion will take. This is caused by the fact there is more data to evaluate and process every month, than every week.
delete_logs_enable = 0
delete_logs_schedule_lowest_interval = 7
delete_logs_older_than = 180
delete_logs_max_rows_per_query = 100000
+delete_logs_unused_actions_max_rows_per_query = 100000
enable_auto_database_size_estimate = 1
enable_database_size_estimate = 1
delete_logs_unused_actions_schedule_lowest_interval = 30
@@ -1011,7 +1017,7 @@ Plugins[] = Intl
Plugins[] = Marketplace
Plugins[] = ProfessionalServices
Plugins[] = UserId
-Plugins[] = CustomPiwikJs
+Plugins[] = CustomJsTracker
Plugins[] = Tour
[PluginsInstalled]
diff --git a/config/global.php b/config/global.php
index 5499b0920a..e6c489fe56 100644
--- a/config/global.php
+++ b/config/global.php
@@ -2,7 +2,7 @@
use Interop\Container\ContainerInterface;
use Interop\Container\Exception\NotFoundException;
-use Piwik\Cache\Eager;
+use Matomo\Cache\Eager;
use Piwik\SettingsServer;
use Piwik\Config;
@@ -33,8 +33,8 @@ return array(
'path.cache' => DI\string('{path.tmp}/cache/tracker/'),
- 'Piwik\Cache\Eager' => function (ContainerInterface $c) {
- $backend = $c->get('Piwik\Cache\Backend');
+ 'Matomo\Cache\Eager' => function (ContainerInterface $c) {
+ $backend = $c->get('Matomo\Cache\Backend');
$cacheId = $c->get('cache.eager.cache_id');
if (SettingsServer::isTrackerApiRequest()) {
@@ -52,11 +52,11 @@ return array(
return $cache;
},
- 'Piwik\Cache\Backend' => function (ContainerInterface $c) {
+ 'Matomo\Cache\Backend' => function (ContainerInterface $c) {
// If Piwik is not installed yet, it's possible the tmp/ folder is not writable
// we prevent failing with an unclear message eg. coming from doctrine-cache
// by forcing to use a cache backend which always works ie. array
- if(!\Piwik\SettingsPiwik::isPiwikInstalled()) {
+ if(!\Piwik\SettingsPiwik::isMatomoInstalled()) {
$backend = 'array';
} else {
try {
@@ -131,6 +131,7 @@ return array(
// common files on shared hosters
'php.ini',
'.user.ini',
+ 'error_log',
// Files below are not expected but they used to be present in older Piwik versions and may be still here
// As they are not going to cause any trouble we won't report them as 'File to delete'
'*.coveralls.yml',
diff --git a/core/API/DataTableManipulator/Flattener.php b/core/API/DataTableManipulator/Flattener.php
index 2db6017ecc..b17b3eeafd 100644
--- a/core/API/DataTableManipulator/Flattener.php
+++ b/core/API/DataTableManipulator/Flattener.php
@@ -9,7 +9,6 @@
namespace Piwik\API\DataTableManipulator;
use Piwik\API\DataTableManipulator;
-use Piwik\Common;
use Piwik\DataTable;
use Piwik\DataTable\Row;
use Piwik\Plugin\ReportsProvider;
diff --git a/core/API/DataTableManipulator/ReportTotalsCalculator.php b/core/API/DataTableManipulator/ReportTotalsCalculator.php
index a6d4fcc538..ffa3d343a7 100644
--- a/core/API/DataTableManipulator/ReportTotalsCalculator.php
+++ b/core/API/DataTableManipulator/ReportTotalsCalculator.php
@@ -12,7 +12,6 @@ use Piwik\API\DataTableManipulator;
use Piwik\API\DataTablePostProcessor;
use Piwik\Common;
use Piwik\DataTable;
-use Piwik\Metrics;
use Piwik\Period;
use Piwik\Piwik;
use Piwik\Plugin\Report;
diff --git a/core/API/Proxy.php b/core/API/Proxy.php
index 3247bab24d..2d782bcfec 100644
--- a/core/API/Proxy.php
+++ b/core/API/Proxy.php
@@ -15,7 +15,6 @@ use Piwik\Container\StaticContainer;
use Piwik\Context;
use Piwik\Piwik;
use Piwik\Plugin\Manager;
-use Piwik\Singleton;
use ReflectionClass;
use ReflectionMethod;
diff --git a/core/API/Request.php b/core/API/Request.php
index ef443e048c..fd9a7327bc 100644
--- a/core/API/Request.php
+++ b/core/API/Request.php
@@ -17,7 +17,6 @@ use Piwik\Context;
use Piwik\DataTable;
use Piwik\Exception\PluginDeactivatedException;
use Piwik\IP;
-use Piwik\Log;
use Piwik\Piwik;
use Piwik\Plugin\Manager as PluginManager;
use Piwik\Plugins\CoreHome\LoginWhitelist;
diff --git a/core/Application/Kernel/EnvironmentValidator.php b/core/Application/Kernel/EnvironmentValidator.php
index 3a526a8c5c..a16c2baf21 100644
--- a/core/Application/Kernel/EnvironmentValidator.php
+++ b/core/Application/Kernel/EnvironmentValidator.php
@@ -9,8 +9,6 @@
namespace Piwik\Application\Kernel;
use Piwik\Common;
-use Piwik\Config;
-use Piwik\Exception\InvalidRequestParameterException;
use Piwik\Exception\NotYetInstalledException;
use Piwik\Filechecks;
use Piwik\Piwik;
@@ -44,7 +42,7 @@ class EnvironmentValidator
{
$this->checkConfigFileExists($this->settingsProvider->getPathGlobal());
- if(SettingsPiwik::isPiwikInstalled()) {
+ if(SettingsPiwik::isMatomoInstalled()) {
$this->checkConfigFileExists($this->settingsProvider->getPathLocal(), $startInstaller = false);
return;
}
diff --git a/core/Application/Kernel/PluginList.php b/core/Application/Kernel/PluginList.php
index e3275c2c84..df6add5ff4 100644
--- a/core/Application/Kernel/PluginList.php
+++ b/core/Application/Kernel/PluginList.php
@@ -44,7 +44,6 @@ class PluginList
'ExampleReport',
'ExampleAPI',
'MobileAppMeasurable',
- 'Provider',
'TagManager'
);
diff --git a/core/Archive.php b/core/Archive.php
index 141d477af4..863b9e62e2 100644
--- a/core/Archive.php
+++ b/core/Archive.php
@@ -162,7 +162,7 @@ class Archive implements ArchiveQuery
private $params;
/**
- * @var \Piwik\Cache\Cache
+ * @var \Matomo\Cache\Cache
*/
private static $cache;
diff --git a/core/Archive/ArchiveInvalidator.php b/core/Archive/ArchiveInvalidator.php
index ad449921f2..d63c06180f 100644
--- a/core/Archive/ArchiveInvalidator.php
+++ b/core/Archive/ArchiveInvalidator.php
@@ -15,7 +15,6 @@ use Piwik\CronArchive\SitesToReprocessDistributedList;
use Piwik\DataAccess\ArchiveTableCreator;
use Piwik\DataAccess\Model;
use Piwik\Date;
-use Piwik\CliMulti\Process;
use Piwik\Db;
use Piwik\Option;
use Piwik\Common;
diff --git a/core/Archive/ArchivePurger.php b/core/Archive/ArchivePurger.php
index cd330ea37c..29ed4ce88f 100644
--- a/core/Archive/ArchivePurger.php
+++ b/core/Archive/ArchivePurger.php
@@ -9,13 +9,11 @@
namespace Piwik\Archive;
use Piwik\ArchiveProcessor\Rules;
-use Piwik\Common;
use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\DataAccess\ArchiveTableCreator;
use Piwik\DataAccess\Model;
use Piwik\Date;
-use Piwik\Db;
use Piwik\Piwik;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
diff --git a/core/Archive/Chunk.php b/core/Archive/Chunk.php
index 392e49f695..4bde7c26c1 100644
--- a/core/Archive/Chunk.php
+++ b/core/Archive/Chunk.php
@@ -9,8 +9,6 @@
namespace Piwik\Archive;
-use Piwik\DataTable;
-
/**
* This class is used to split blobs of DataTables into chunks. Each blob used to be stored under one blob in the
* archive table. For better efficiency we do now combine multiple DataTable into one blob entry.
diff --git a/core/Archive/DataTableFactory.php b/core/Archive/DataTableFactory.php
index fdc69a5f54..45941befbf 100644
--- a/core/Archive/DataTableFactory.php
+++ b/core/Archive/DataTableFactory.php
@@ -9,14 +9,8 @@
namespace Piwik\Archive;
-use Piwik\API\Request;
-use Piwik\Cache;
-use Piwik\Cache\Transient;
-use Piwik\CacheId;
use Piwik\DataTable;
use Piwik\DataTable\Row;
-use Piwik\Period\Week;
-use Piwik\Piwik;
use Piwik\Segment;
use Piwik\Site;
diff --git a/core/AssetManager.php b/core/AssetManager.php
index 3581822a41..4e4628db39 100644
--- a/core/AssetManager.php
+++ b/core/AssetManager.php
@@ -139,7 +139,7 @@ class AssetManager extends Singleton
*/
public function getJsInclusionDirective()
{
- $result = "<script type=\"text/javascript\">\n" . Translate::getJavascriptTranslations() . "\n</script>";
+ $result = "<script type=\"text/javascript\">\n" . StaticContainer::get('Piwik\Translation\Translator')->getJavascriptTranslations() . "\n</script>";
if ($this->isMergedAssetsDisabled()) {
$this->getMergedCoreJSAsset()->delete();
diff --git a/core/AssetManager/UIAssetMerger/JScriptUIAssetMerger.php b/core/AssetManager/UIAssetMerger/JScriptUIAssetMerger.php
index e702bec26a..b57ed86cdf 100644
--- a/core/AssetManager/UIAssetMerger/JScriptUIAssetMerger.php
+++ b/core/AssetManager/UIAssetMerger/JScriptUIAssetMerger.php
@@ -12,7 +12,6 @@ use Piwik\AssetManager\UIAsset;
use Piwik\AssetManager\UIAssetCacheBuster;
use Piwik\AssetManager\UIAssetFetcher\JScriptUIAssetFetcher;
use Piwik\AssetManager\UIAssetMerger;
-use Piwik\AssetManager;
use Piwik\AssetManager\UIAssetMinifier;
use Piwik\Piwik;
diff --git a/core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php b/core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php
index 7b1f165e7a..d63ad0acfa 100644
--- a/core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php
+++ b/core/AssetManager/UIAssetMerger/StylesheetUIAssetMerger.php
@@ -13,6 +13,7 @@ use lessc;
use Piwik\AssetManager\UIAsset;
use Piwik\AssetManager\UIAssetMerger;
use Piwik\Common;
+use Piwik\Container\StaticContainer;
use Piwik\Exception\StylesheetLessCompileException;
use Piwik\Piwik;
use Piwik\Plugin\Manager;
@@ -46,6 +47,9 @@ class StylesheetUIAssetMerger extends UIAssetMerger
try {
$compiled = $this->lessCompiler->compile($concatenatedAssets);
} catch(\Exception $e) {
+ // save the concated less files so we can debug the issue
+ $this->saveConcatenatedAssets($concatenatedAssets);
+
throw new StylesheetLessCompileException($e->getMessage());
}
@@ -257,4 +261,12 @@ class StylesheetUIAssetMerger extends UIAssetMerger
$rootDirectoryLen = strlen($rootDirectory);
return $rootDirectoryLen;
}
+
+ private function saveConcatenatedAssets($concatenatedAssets)
+ {
+ $file = StaticContainer::get('path.tmp') . '/assets/uimergedassets.concat.less';
+ if (is_writable(dirname($file))) {
+ file_put_contents($file, $concatenatedAssets);
+ }
+ }
}
diff --git a/core/Cache.php b/core/Cache.php
index 55a2362750..2ced0cb23e 100644
--- a/core/Cache.php
+++ b/core/Cache.php
@@ -8,7 +8,6 @@
*/
namespace Piwik;
-use Piwik\Cache\Backend;
use Piwik\Container\StaticContainer;
class Cache
@@ -20,22 +19,22 @@ class Cache
* an entry from the cache it will fetch the entry. Cache entries might be persisted but not necessarily. It
* depends on the configured backend.
*
- * @return Cache\Lazy
+ * @return \Matomo\Cache\Lazy
*/
public static function getLazyCache()
{
- return StaticContainer::get('Piwik\Cache\Lazy');
+ return StaticContainer::get('Matomo\Cache\Lazy');
}
/**
* This class is used to cache any data during one request. It won't be persisted between requests and it can
* cache all kind of data, even objects or resources. This cache is very fast.
*
- * @return Cache\Transient
+ * @return \Matomo\Cache\Transient
*/
public static function getTransientCache()
{
- return StaticContainer::get('Piwik\Cache\Transient');
+ return StaticContainer::get('Matomo\Cache\Transient');
}
/**
@@ -49,11 +48,11 @@ class Cache
* All cache entries it contains have the same life time. For fast performance it won't validate any cache ids.
* It is not possible to cache any objects using this cache.
*
- * @return Cache\Eager
+ * @return \Matomo\Cache\Eager
*/
public static function getEagerCache()
{
- return StaticContainer::get('Piwik\Cache\Eager');
+ return StaticContainer::get('Matomo\Cache\Eager');
}
public static function flushAll()
@@ -65,11 +64,11 @@ class Cache
/**
* @param $type
- * @return Cache\Backend
+ * @return \Matomo\Cache\Backend
*/
public static function buildBackend($type)
{
- $factory = new Cache\Backend\Factory();
+ $factory = new \Matomo\Cache\Backend\Factory();
$options = self::getOptions($type);
$backend = $factory->buildBackend($type, $options);
diff --git a/core/CacheId.php b/core/CacheId.php
index efc3857b1f..0119c458c6 100644
--- a/core/CacheId.php
+++ b/core/CacheId.php
@@ -8,13 +8,14 @@
*/
namespace Piwik;
+use Piwik\Container\StaticContainer;
use Piwik\Plugin\Manager;
class CacheId
{
public static function languageAware($cacheId)
{
- return $cacheId . '-' . Translate::getLanguageLoaded();
+ return $cacheId . '-' . StaticContainer::get('Piwik\Translation\Translator')->getCurrentLanguage();
}
public static function pluginAware($cacheId)
diff --git a/core/Category/CategoryList.php b/core/Category/CategoryList.php
index 4489528573..88b72b733f 100644
--- a/core/Category/CategoryList.php
+++ b/core/Category/CategoryList.php
@@ -8,7 +8,6 @@
namespace Piwik\Category;
use Piwik\Container\StaticContainer;
-use Piwik\Plugin;
/**
* Base type for category. lets you change the name for a categoryId and specifiy a different order
diff --git a/core/CliMulti/CliPhp.php b/core/CliMulti/CliPhp.php
index 3b1661510e..25c9206ebc 100644
--- a/core/CliMulti/CliPhp.php
+++ b/core/CliMulti/CliPhp.php
@@ -8,12 +8,18 @@
namespace Piwik\CliMulti;
use Piwik\Common;
+use Piwik\Config;
class CliPhp
{
public function findPhpBinary()
{
+ $general = Config::getInstance()->General;
+ if (!empty($general['php_binary_path']) && file_exists($general['php_binary_path'])) {
+ return $general['php_binary_path'];
+ }
+
if (defined('PHP_BINARY')) {
if ($this->isHhvmBinary(PHP_BINARY)) {
return PHP_BINARY . ' --php';
@@ -77,8 +83,12 @@ class CliPhp
private function isValidPhpType($path)
{
- return !empty($path)
- && false === strpos($path, 'fpm')
+ if (empty($path)) {
+ return false;
+ }
+ $path = basename($path);
+
+ return false === strpos($path, 'fpm')
&& false === strpos($path, 'cgi')
&& false === strpos($path, 'phpunit')
&& false === strpos($path, 'lsphp');
diff --git a/core/CliMulti/RequestCommand.php b/core/CliMulti/RequestCommand.php
index e6cf6eba62..5385042054 100644
--- a/core/CliMulti/RequestCommand.php
+++ b/core/CliMulti/RequestCommand.php
@@ -95,8 +95,7 @@ class RequestCommand extends ConsoleCommand
{
$_GET = array();
- // @todo remove piwik-domain fallback in Matomo 4
- $hostname = $input->getOption('matomo-domain') ?: $input->getOption('piwik-domain');
+ $hostname = $input->getOption('matomo-domain');
Url::setHost($hostname);
$query = $input->getArgument('url-query');
diff --git a/core/Columns/ComputedMetricFactory.php b/core/Columns/ComputedMetricFactory.php
index 90a8d5d73e..7bc12598cf 100644
--- a/core/Columns/ComputedMetricFactory.php
+++ b/core/Columns/ComputedMetricFactory.php
@@ -8,10 +8,8 @@
*/
namespace Piwik\Columns;
-use Piwik\Piwik;
use Piwik\Plugin\ArchivedMetric;
use Piwik\Plugin\ComputedMetric;
-use Piwik\Plugin\Report;
/**
* A factory to create computed metrics.
diff --git a/core/Columns/DimensionMetricFactory.php b/core/Columns/DimensionMetricFactory.php
index 9707aa5ae0..08f5bde847 100644
--- a/core/Columns/DimensionMetricFactory.php
+++ b/core/Columns/DimensionMetricFactory.php
@@ -11,7 +11,6 @@ namespace Piwik\Columns;
use Piwik\Piwik;
use Piwik\Plugin\ArchivedMetric;
use Piwik\Plugin\ComputedMetric;
-use Piwik\Plugin\Report;
/**
diff --git a/core/Columns/Discriminator.php b/core/Columns/Discriminator.php
index 3cf1348b5b..8483217c1b 100644
--- a/core/Columns/Discriminator.php
+++ b/core/Columns/Discriminator.php
@@ -45,8 +45,7 @@ class Discriminator
public function isValid()
{
- return isset($this->discriminatorColumn)
- && (is_numeric($this->discriminatorValue) || $this->discriminatorValue == ActionSiteSearch::CVAR_KEY_SEARCH_CATEGORY);
+ return isset($this->discriminatorColumn) && is_numeric($this->discriminatorValue);
}
/**
diff --git a/core/Columns/Updater.php b/core/Columns/Updater.php
index 597c189320..85daa9fd5f 100644
--- a/core/Columns/Updater.php
+++ b/core/Columns/Updater.php
@@ -13,7 +13,6 @@ use Piwik\DbHelper;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Dimension\ConversionDimension;
-use Piwik\Db;
use Piwik\Plugin\Manager;
use Piwik\Updater as PiwikUpdater;
use Piwik\Filesystem;
@@ -82,7 +81,7 @@ class Updater extends \Piwik\Updates
public function doUpdate(PiwikUpdater $updater)
{
- $updater->executeMigrationQueries(__FILE__, $this->getMigrationQueries($updater));
+ $updater->executeMigrations(__FILE__, $this->getMigrationQueries($updater));
}
private function getVisitDimensions()
diff --git a/core/Common.php b/core/Common.php
index 67ce1106da..11602fe11c 100644
--- a/core/Common.php
+++ b/core/Common.php
@@ -292,25 +292,21 @@ class Common
*/
public static function safe_unserialize($string, $allowedClasses = [], $rethrow = false)
{
- if (PHP_MAJOR_VERSION >= 7) {
- try {
- return unserialize($string, ['allowed_classes' => empty($allowedClasses) ? false : $allowedClasses]);
- } catch (\Throwable $e) {
- if ($rethrow) {
- throw $e;
- }
-
- $logger = StaticContainer::get('Psr\Log\LoggerInterface');
- $logger->debug('Unable to unserialize a string: {message} (string = {string})', [
- 'message' => $e->getMessage(),
- 'backtrace' => $e->getTraceAsString(),
- 'string' => $string,
- ]);
- return false;
+ try {
+ return unserialize($string, ['allowed_classes' => empty($allowedClasses) ? false : $allowedClasses]);
+ } catch (\Throwable $e) {
+ if ($rethrow) {
+ throw $e;
}
- }
- return @unserialize($string);
+ $logger = StaticContainer::get('Psr\Log\LoggerInterface');
+ $logger->debug('Unable to unserialize a string: {message} (string = {string})', [
+ 'message' => $e->getMessage(),
+ 'backtrace' => $e->getTraceAsString(),
+ 'string' => $string,
+ ]);
+ return false;
+ }
}
/*
@@ -629,9 +625,7 @@ class Common
*/
public static function generateUniqId()
{
- $rand = self::getRandomInt();
-
- return md5(uniqid($rand, true));
+ return bin2hex(random_bytes(16));
}
/**
@@ -729,40 +723,12 @@ class Common
*/
public static function convertUserIdToVisitorIdBin($userId)
{
- require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php';
- $userIdHashed = \PiwikTracker::getUserIdHashed($userId);
+ $userIdHashed = \MatomoTracker::getUserIdHashed($userId);
return self::convertVisitorIdToBin($userIdHashed);
}
/**
- * JSON encode wrapper
- * - missing or broken in some php 5.x versions
- *
- * @param mixed $value
- * @return string
- * @deprecated
- */
- public static function json_encode($value)
- {
- return @json_encode($value);
- }
-
- /**
- * JSON decode wrapper
- * - missing or broken in some php 5.x versions
- *
- * @param string $json
- * @param bool $assoc
- * @return mixed
- * @deprecated
- */
- public static function json_decode($json, $assoc = false)
- {
- return json_decode($json, $assoc);
- }
-
- /**
* Detects whether an error occurred during the last json encode/decode.
* @return bool
*/
@@ -826,79 +792,6 @@ class Common
*/
/**
- * Returns list of continent codes
- *
- * @see core/DataFiles/Countries.php
- *
- * @return array Array of 3 letter continent codes
- *
- * @deprecated Use Piwik\Intl\Data\Provider\RegionDataProvider instead.
- * @see \Piwik\Intl\Data\Provider\RegionDataProvider::getContinentList()
- */
- public static function getContinentsList()
- {
- /** @var RegionDataProvider $dataProvider */
- $dataProvider = StaticContainer::get('Piwik\Intl\Data\Provider\RegionDataProvider');
- return $dataProvider->getContinentList();
- }
-
- /**
- * Returns list of valid country codes
- *
- * @see core/DataFiles/Countries.php
- *
- * @param bool $includeInternalCodes
- * @return array Array of (2 letter ISO codes => 3 letter continent code)
- *
- * @deprecated Use Piwik\Intl\Data\Provider\RegionDataProvider instead.
- * @see \Piwik\Intl\Data\Provider\RegionDataProvider::getCountryList()
- */
- public static function getCountriesList($includeInternalCodes = false)
- {
- /** @var RegionDataProvider $dataProvider */
- $dataProvider = StaticContainer::get('Piwik\Intl\Data\Provider\RegionDataProvider');
- return $dataProvider->getCountryList($includeInternalCodes);
- }
-
- /**
- * Returns the list of valid language codes.
- *
- * See [core/DataFiles/Languages.php](https://github.com/piwik/piwik/blob/master/core/DataFiles/Languages.php).
- *
- * @return array Array of two letter ISO codes mapped with their associated language names (in English). E.g.
- * `array('en' => 'English', 'ja' => 'Japanese')`.
- * @api
- *
- * @deprecated Use Piwik\Intl\Data\Provider\LanguageDataProvider instead.
- * @see \Piwik\Intl\Data\Provider\LanguageDataProvider::getLanguageList()
- */
- public static function getLanguagesList()
- {
- /** @var LanguageDataProvider $dataProvider */
- $dataProvider = StaticContainer::get('Piwik\Intl\Data\Provider\LanguageDataProvider');
- return $dataProvider->getLanguageList();
- }
-
- /**
- * Returns a list of language to country mappings.
- *
- * See [core/DataFiles/LanguageToCountry.php](https://github.com/piwik/piwik/blob/master/core/DataFiles/LanguageToCountry.php).
- *
- * @return array Array of two letter ISO language codes mapped with two letter ISO country codes:
- * `array('fr' => 'fr') // French => France`
- * @api
- *
- * @deprecated Use Piwik\Intl\Data\Provider\LanguageDataProvider instead.
- * @see \Piwik\Intl\Data\Provider\LanguageDataProvider::getLanguageToCountryList()
- */
- public static function getLanguageToCountryList()
- {
- /** @var LanguageDataProvider $dataProvider */
- $dataProvider = StaticContainer::get('Piwik\Intl\Data\Provider\LanguageDataProvider');
- return $dataProvider->getLanguageToCountryList();
- }
-
- /**
* Returns list of provider names
*
* @see core/DataFiles/Providers.php
diff --git a/core/Composer/ScriptHandler.php b/core/Composer/ScriptHandler.php
index d457030a14..085a4aa6fc 100644
--- a/core/Composer/ScriptHandler.php
+++ b/core/Composer/ScriptHandler.php
@@ -16,21 +16,13 @@ namespace Piwik\Composer;
*/
class ScriptHandler
{
- private static function isPhp7orLater()
- {
- return version_compare('7.0.0-dev', PHP_VERSION) < 1;
- }
-
public static function cleanXhprof()
{
if (! is_dir('vendor/facebook/xhprof/extension')) {
return;
}
- if (!self::isPhp7orLater()) {
- // doesn't work with PHP 7 at the moment
- passthru('misc/composer/clean-xhprof.sh');
- }
+ passthru('misc/composer/clean-xhprof.sh');
}
public static function buildXhprof()
@@ -39,9 +31,6 @@ class ScriptHandler
return;
}
-
- if (!self::isPhp7orLater()) {
- passthru('misc/composer/clean-xhprof.sh');
- }
+ passthru('misc/composer/clean-xhprof.sh');
}
}
diff --git a/core/Concurrency/LockBackend/MySqlLockBackend.php b/core/Concurrency/LockBackend/MySqlLockBackend.php
index 561c681ff1..5da2691e5f 100644
--- a/core/Concurrency/LockBackend/MySqlLockBackend.php
+++ b/core/Concurrency/LockBackend/MySqlLockBackend.php
@@ -13,7 +13,6 @@ namespace Piwik\Concurrency\LockBackend;
use Piwik\Common;
use Piwik\Concurrency\LockBackend;
use Piwik\Db;
-use Piwik\DbHelper;
class MySqlLockBackend implements LockBackend
{
diff --git a/core/Config.php b/core/Config.php
index f434a51fdd..713395cc88 100644
--- a/core/Config.php
+++ b/core/Config.php
@@ -11,8 +11,6 @@ namespace Piwik;
use Exception;
use Piwik\Application\Kernel\GlobalSettingsProvider;
-use Piwik\Config\Cache;
-use Piwik\Config\IniFileChain;
use Piwik\Container\StaticContainer;
use Piwik\Exception\MissingFilePermissionException;
use Piwik\ProfessionalServices\Advertising;
diff --git a/core/Config/Cache.php b/core/Config/Cache.php
index aa0bf80e9e..c61d50c567 100644
--- a/core/Config/Cache.php
+++ b/core/Config/Cache.php
@@ -8,9 +8,8 @@
namespace Piwik\Config;
-use Piwik\Cache\Backend\File;
+use Matomo\Cache\Backend\File;
use Piwik\Common;
-use Piwik\Filesystem;
use Piwik\Piwik;
use Piwik\Url;
diff --git a/core/Config/IniFileChain.php b/core/Config/IniFileChain.php
index 17c7419b4f..ff9798762d 100644
--- a/core/Config/IniFileChain.php
+++ b/core/Config/IniFileChain.php
@@ -8,9 +8,9 @@
namespace Piwik\Config;
use Piwik\Common;
-use Piwik\Ini\IniReader;
-use Piwik\Ini\IniReadingException;
-use Piwik\Ini\IniWriter;
+use Matomo\Ini\IniReader;
+use Matomo\Ini\IniReadingException;
+use Matomo\Ini\IniWriter;
use Piwik\Piwik;
/**
diff --git a/core/Console.php b/core/Console.php
index 6f112e7f8f..1bf61c0fd2 100644
--- a/core/Console.php
+++ b/core/Console.php
@@ -13,10 +13,8 @@ use Monolog\Handler\FingersCrossedHandler;
use Piwik\Application\Environment;
use Piwik\Config\ConfigNotFoundException;
use Piwik\Container\StaticContainer;
-use Piwik\Exception\AuthenticationFailedException;
use Piwik\Plugin\Manager as PluginManager;
use Piwik\Plugins\Monolog\Handler\FailureLogMessageDetector;
-use Piwik\Version;
use Psr\Log\LoggerInterface;
use Symfony\Bridge\Monolog\Handler\ConsoleHandler;
use Symfony\Component\Console\Application;
@@ -48,15 +46,6 @@ class Console extends Application
$this->getDefinition()->addOption($option);
- // @todo Remove this alias in Matomo 4.0
- $option = new InputOption('piwik-domain',
- null,
- InputOption::VALUE_OPTIONAL,
- '[DEPRECATED] Matomo URL (protocol and domain) eg. "http://matomo.example.org"'
- );
-
- $this->getDefinition()->addOption($option);
-
$option = new InputOption('xhprof',
null,
InputOption::VALUE_NONE,
@@ -231,10 +220,6 @@ class Console extends Application
$matomoHostname = $input->getParameterOption('--matomo-domain');
if (empty($matomoHostname)) {
- $matomoHostname = $input->getParameterOption('--piwik-domain');
- }
-
- if (empty($matomoHostname)) {
$matomoHostname = $input->getParameterOption('--url');
}
diff --git a/core/CronArchive.php b/core/CronArchive.php
index 9d8801fcbd..bb1337dbb0 100644
--- a/core/CronArchive.php
+++ b/core/CronArchive.php
@@ -9,7 +9,6 @@
namespace Piwik;
use Exception;
-use Piwik\ArchiveProcessor\Parameters;
use Piwik\ArchiveProcessor\PluginsArchiver;
use Piwik\ArchiveProcessor\Rules;
use Piwik\Archiver\Request;
@@ -274,6 +273,8 @@ class CronArchive
*/
private $isArchiveProfilingEnabled = false;
+ private $lastDbReset = false;
+
/**
* Returns the option name of the option that stores the time core:archive was last executed.
*
@@ -305,6 +306,7 @@ class CronArchive
$this->invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
$this->isArchiveProfilingEnabled = Config::getInstance()->Debug['archiving_profile'] == 1;
+ $this->lastDbReset = time();
}
private function isMaintenanceModeEnabled()
@@ -411,10 +413,7 @@ class CronArchive
(!$instanceId
|| strpos($process, '--matomo-domain=' . $instanceId) !== false
|| strpos($process, '--matomo-domain="' . $instanceId . '"') !== false
- || strpos($process, '--matomo-domain=\'' . $instanceId . "'") !== false
- || strpos($process, '--piwik-domain=' . $instanceId) !== false
- || strpos($process, '--piwik-domain="' . $instanceId . '"') !== false
- || strpos($process, '--piwik-domain=\'' . $instanceId . "'") !== false)) {
+ || strpos($process, '--matomo-domain=\'' . $instanceId . "'") !== false)) {
$numRunning++;
}
}
@@ -977,6 +976,8 @@ class CronArchive
// public for tests
public function isThereAValidArchiveForPeriod($idSite, $period, $date, $segment = '')
{
+ $this->disconnectDb();
+
if (Range::isMultiplePeriod($date, $period)) {
$rangePeriod = Factory::build($period, $date, Site::getTimezoneFor($idSite));
$periodsToCheck = $rangePeriod->getSubperiods();
@@ -1274,12 +1275,25 @@ class CronArchive
} catch (Exception $e) {
return $this->logNetworkError($url, $e->getMessage());
}
+ $this->disconnectDb();
if ($this->checkResponse($response, $url)) {
return $response;
}
return false;
}
+ private function disconnectDb()
+ {
+ $twoHoursInSeconds = 60 * 60 * 2;
+
+ if (time() > ($this->lastDbReset + $twoHoursInSeconds)) {
+ // we aim to through DB connections away only after 2 hours
+ $this->lastDbReset = time();
+ Db::destroyDatabaseObject();
+ Tracker::disconnectCachedDbConnection();
+ }
+ }
+
private function checkResponse($response, $url)
{
if (empty($response)
diff --git a/core/CronArchive/Performance/Logger.php b/core/CronArchive/Performance/Logger.php
index fe38900ffe..302968b99f 100644
--- a/core/CronArchive/Performance/Logger.php
+++ b/core/CronArchive/Performance/Logger.php
@@ -11,7 +11,6 @@ namespace Piwik\CronArchive\Performance;
use Piwik\ArchiveProcessor;
use Piwik\Common;
use Piwik\Config;
-use Piwik\Option;
use Piwik\Timer;
use Piwik\Url;
use Psr\Log\LoggerInterface;
diff --git a/core/CronArchive/SegmentArchivingRequestUrlProvider.php b/core/CronArchive/SegmentArchivingRequestUrlProvider.php
index d7863db58e..307f0c8547 100644
--- a/core/CronArchive/SegmentArchivingRequestUrlProvider.php
+++ b/core/CronArchive/SegmentArchivingRequestUrlProvider.php
@@ -7,8 +7,8 @@
*/
namespace Piwik\CronArchive;
-use Piwik\Cache\Cache;
-use Piwik\Cache\Transient;
+use Matomo\Cache\Cache;
+use Matomo\Cache\Transient;
use Piwik\Container\StaticContainer;
use Piwik\Date;
use Piwik\Period\Factory as PeriodFactory;
diff --git a/core/DataAccess/ArchiveTableDao.php b/core/DataAccess/ArchiveTableDao.php
index 72a8ce0229..fa3680a8d7 100644
--- a/core/DataAccess/ArchiveTableDao.php
+++ b/core/DataAccess/ArchiveTableDao.php
@@ -9,7 +9,6 @@
namespace Piwik\DataAccess;
use Piwik\Common;
-use Piwik\Config;
use Piwik\Db;
/**
diff --git a/core/DataAccess/LogAggregator.php b/core/DataAccess/LogAggregator.php
index a544b33ac4..08111237a1 100644
--- a/core/DataAccess/LogAggregator.php
+++ b/core/DataAccess/LogAggregator.php
@@ -11,7 +11,6 @@ namespace Piwik\DataAccess;
use Piwik\ArchiveProcessor\ArchivingStatus;
use Piwik\ArchiveProcessor\Parameters;
use Piwik\Common;
-use Piwik\Concurrency\Lock;
use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\DataArray;
@@ -19,11 +18,8 @@ use Piwik\Date;
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\Metrics;
-use Piwik\Period;
-use Piwik\Piwik;
use Piwik\Plugin\LogTablesProvider;
use Piwik\Segment;
-use Piwik\Segment\SegmentExpression;
use Piwik\Tracker\GoalManager;
use Psr\Log\LoggerInterface;
diff --git a/core/DataAccess/LogTableTemporary.php b/core/DataAccess/LogTableTemporary.php
index 8be027c114..388b49a0d6 100644
--- a/core/DataAccess/LogTableTemporary.php
+++ b/core/DataAccess/LogTableTemporary.php
@@ -8,9 +8,6 @@
namespace Piwik\DataAccess;
-use Piwik\Common;
-use Piwik\Config;
-use Piwik\Db;
use Piwik\Tracker\LogTable;
class LogTableTemporary extends LogTable
diff --git a/core/DataAccess/RawLogDao.php b/core/DataAccess/RawLogDao.php
index a3d7f0ab5a..fe7d128f88 100644
--- a/core/DataAccess/RawLogDao.php
+++ b/core/DataAccess/RawLogDao.php
@@ -9,6 +9,7 @@
namespace Piwik\DataAccess;
use Piwik\Common;
+use Piwik\Config as PiwikConfig;
use Piwik\Container\StaticContainer;
use Piwik\Db;
use Piwik\Plugin\Dimension\DimensionMetadataProvider;
@@ -191,14 +192,17 @@ class RawLogDao
// get current max ID in log tables w/ idaction references.
$maxIds = $this->getMaxIdsInLogTables();
+ // get max rows to analyze
+ $max_rows_per_query = PiwikConfig::getInstance()->Deletelogs['delete_logs_unused_actions_max_rows_per_query'];
+
$this->createTempTableForStoringUsedActions();
// do large insert (inserting everything before maxIds) w/o locking tables...
- $this->insertActionsToKeep($maxIds, $deleteOlderThanMax = true);
+ $this->insertActionsToKeep($maxIds, $deleteOlderThanMax = true, $max_rows_per_query);
// ... then do small insert w/ locked tables to minimize the amount of time tables are locked.
$this->lockLogTables();
- $this->insertActionsToKeep($maxIds, $deleteOlderThanMax = false);
+ $this->insertActionsToKeep($maxIds, $deleteOlderThanMax = false, $max_rows_per_query);
// delete before unlocking tables so there's no chance a new log row that references an
// unused action will be inserted.
diff --git a/core/DataTable/Filter/AddSegmentValue.php b/core/DataTable/Filter/AddSegmentValue.php
index d01e5869d1..c71d5f8bc0 100644
--- a/core/DataTable/Filter/AddSegmentValue.php
+++ b/core/DataTable/Filter/AddSegmentValue.php
@@ -8,8 +8,6 @@
*/
namespace Piwik\DataTable\Filter;
-use Piwik\DataTable;
-
/**
* Executes a filter for each row of a {@link DataTable} and generates a segment filter for each row.
*
diff --git a/core/DataTable/Filter/Sort.php b/core/DataTable/Filter/Sort.php
index ba2a379813..392cfbb236 100644
--- a/core/DataTable/Filter/Sort.php
+++ b/core/DataTable/Filter/Sort.php
@@ -9,10 +9,8 @@
namespace Piwik\DataTable\Filter;
use Piwik\DataTable\BaseFilter;
-use Piwik\DataTable\Row;
use Piwik\DataTable\Simple;
use Piwik\DataTable;
-use Piwik\Metrics;
use Piwik\Metrics\Sorter;
/**
diff --git a/core/DataTable/Renderer.php b/core/DataTable/Renderer.php
index d1940d041d..02ae434f0d 100644
--- a/core/DataTable/Renderer.php
+++ b/core/DataTable/Renderer.php
@@ -11,7 +11,6 @@ namespace Piwik\DataTable;
use Exception;
use Piwik\Columns\Dimension;
use Piwik\Common;
-use Piwik\DataTable;
use Piwik\Metrics;
use Piwik\Piwik;
use Piwik\BaseFactory;
diff --git a/core/Date.php b/core/Date.php
index 01b503d6be..cc45fb98db 100644
--- a/core/Date.php
+++ b/core/Date.php
@@ -10,7 +10,6 @@
namespace Piwik;
use Exception;
-use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\Intl\Data\Provider\DateTimeFormatProvider;
@@ -443,9 +442,9 @@ class Date
*/
public function isLeapYear()
{
- $currentYear = date('Y', $this->getTimestamp());
+ $isLeap = (bool)(date('L', $this->getTimestamp()));
- return ($currentYear % 400) == 0 || (($currentYear % 4) == 0 && ($currentYear % 100) != 0);
+ return $isLeap;
}
/**
diff --git a/core/Db.php b/core/Db.php
index af2563869e..8518e9fb04 100644
--- a/core/Db.php
+++ b/core/Db.php
@@ -786,7 +786,7 @@ class Db
{
if (is_null(self::$lockPrivilegeGranted)) {
try {
- Db::lockTables(Common::prefixTable('log_visit'));
+ Db::lockTables(Common::prefixTable('site_url'));
Db::unlockAllTables();
self::$lockPrivilegeGranted = true;
diff --git a/core/Db/BatchInsert.php b/core/Db/BatchInsert.php
index f2b146e4ea..73dfab5940 100644
--- a/core/Db/BatchInsert.php
+++ b/core/Db/BatchInsert.php
@@ -221,10 +221,9 @@ class BatchInsert
* @see http://bugs.php.net/bug.php?id=54158
*/
$openBaseDir = ini_get('open_basedir');
- $isUsingNonBuggyMysqlnd = function_exists('mysqli_get_client_stats') && version_compare(PHP_VERSION, '5.6.17', '>=');
$safeMode = ini_get('safe_mode');
- if (($isUsingNonBuggyMysqlnd || empty($openBaseDir)) && empty($safeMode)) {
+ if ((function_exists('mysqli_get_client_stats') || empty($openBaseDir)) && empty($safeMode)) {
// php 5.x - LOAD DATA LOCAL INFILE only used if open_basedir is not set (or we're using a non-buggy version of mysqlnd)
// and if safe mode is not enabled
$keywords[] = 'LOCAL ';
diff --git a/core/Db/Schema/Mysql.php b/core/Db/Schema/Mysql.php
index a82931b64d..ffe4aa5b65 100644
--- a/core/Db/Schema/Mysql.php
+++ b/core/Db/Schema/Mysql.php
@@ -16,7 +16,6 @@ use Piwik\Db\SchemaInterface;
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\Option;
-use Piwik\Plugins\Installation\Installation;
use Piwik\Version;
/**
@@ -225,7 +224,7 @@ class Mysql implements SchemaInterface
idvisit BIGINT(10) UNSIGNED NOT NULL,
idaction_url_ref INTEGER(10) UNSIGNED NULL DEFAULT 0,
idaction_name_ref INTEGER(10) UNSIGNED NULL,
- custom_float FLOAT NULL DEFAULT NULL,
+ custom_float DOUBLE NULL DEFAULT NULL,
PRIMARY KEY(idlink_va),
INDEX index_idvisit(idvisit)
) ENGINE=$engine DEFAULT CHARSET=utf8
diff --git a/core/DeviceDetector/DeviceDetectorFactory.php b/core/DeviceDetector/DeviceDetectorFactory.php
index ce8b98bbd7..a498c371d8 100644
--- a/core/DeviceDetector/DeviceDetectorFactory.php
+++ b/core/DeviceDetector/DeviceDetectorFactory.php
@@ -10,7 +10,6 @@ namespace Piwik\DeviceDetector;
use DeviceDetector\DeviceDetector;
use Piwik\Common;
-use Piwik\Container\StaticContainer;
class DeviceDetectorFactory
{
diff --git a/core/DeviceDetectorFactory.php b/core/DeviceDetectorFactory.php
deleted file mode 100644
index 1d392cf955..0000000000
--- a/core/DeviceDetectorFactory.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik;
-
-use DeviceDetector\DeviceDetector;
-use Piwik\Container\StaticContainer;
-
-class DeviceDetectorFactory
-{
- /**
- * Returns a Singleton instance of DeviceDetector for the given user agent.
- * @param string $userAgent
- * @return DeviceDetector
- * @deprecated Should get a factory via StaticContainer and call makeInstance() on it instead
- */
- public static function getInstance($userAgent)
- {
- $factory = StaticContainer::get(\Piwik\DeviceDetector\DeviceDetectorFactory::class);
- return $factory->makeInstance($userAgent);
- }
-} \ No newline at end of file
diff --git a/core/EventDispatcher.php b/core/EventDispatcher.php
index 260942baf5..e80c9aff5d 100644
--- a/core/EventDispatcher.php
+++ b/core/EventDispatcher.php
@@ -107,7 +107,7 @@ class EventDispatcher
if (!isset($this->pluginHooks[$pluginName])) {
$plugin = $manager->getLoadedPlugin($pluginName);
- $this->pluginHooks[$pluginName] = $plugin->getListHooksRegistered();
+ $this->pluginHooks[$pluginName] = $plugin->registerEvents();
}
$hooks = $this->pluginHooks[$pluginName];
diff --git a/core/FileIntegrity.php b/core/FileIntegrity.php
index 49762eb60e..5505e7fbfb 100644
--- a/core/FileIntegrity.php
+++ b/core/FileIntegrity.php
@@ -10,8 +10,8 @@
namespace Piwik;
use Piwik\Container\StaticContainer;
-use Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException;
-use Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
+use Piwik\Plugins\CustomJsTracker\Exception\AccessDeniedException;
+use Piwik\Plugins\CustomJsTracker\TrackerUpdater;
class FileIntegrity
{
@@ -372,7 +372,7 @@ class FileIntegrity
// 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')) {
+ if (Plugin\Manager::getInstance()->isPluginActivated('CustomJsTracker')) {
$trackerUpdater = new TrackerUpdater();
if ($trackerUpdater->getCurrentTrackerFileContent() === $trackerUpdater->getUpdatedTrackerFileContent()) {
@@ -383,7 +383,7 @@ class FileIntegrity
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.
+ // one of the events CustomJsTracker 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();
diff --git a/core/Filesystem.php b/core/Filesystem.php
index e5b43086fd..e658f000f6 100644
--- a/core/Filesystem.php
+++ b/core/Filesystem.php
@@ -10,8 +10,6 @@ namespace Piwik;
use Piwik\Container\StaticContainer;
use Piwik\Exception\FailedCopyException;
-use Piwik\Exception\MissingFilePermissionException;
-use Piwik\Plugins\Installation\ServerFilesGenerator;
use Piwik\Tracker\Cache as TrackerCache;
use Piwik\Cache as PiwikCache;
use Piwik\Exception\Exception;
diff --git a/core/FrontController.php b/core/FrontController.php
index c7aae14c5a..0ecd562fad 100644
--- a/core/FrontController.php
+++ b/core/FrontController.php
@@ -659,7 +659,7 @@ class FrontController extends Singleton
// the session must be started before using the session authenticator,
// so we do it here, if this is not an API request.
- if (SettingsPiwik::isPiwikInstalled()
+ if (SettingsPiwik::isMatomoInstalled()
&& ($module !== 'API' || ($action && $action !== 'index'))
) {
/**
diff --git a/core/Http/ControllerResolver.php b/core/Http/ControllerResolver.php
index 20f1e14240..39f6ce953a 100644
--- a/core/Http/ControllerResolver.php
+++ b/core/Http/ControllerResolver.php
@@ -10,10 +10,8 @@ namespace Piwik\Http;
use DI\FactoryInterface;
use Exception;
-use Piwik\Plugin;
use Piwik\Plugin\Controller;
use Piwik\Plugin\ReportsProvider;
-use Piwik\Session;
use Piwik\Plugin\WidgetsProvider;
/**
diff --git a/core/Http/Router.php b/core/Http/Router.php
index ae8f8f13a2..df8b0843c2 100644
--- a/core/Http/Router.php
+++ b/core/Http/Router.php
@@ -8,8 +8,6 @@
namespace Piwik\Http;
-use Piwik\Url;
-
/**
* Router
*/
diff --git a/core/IP.php b/core/IP.php
index 6e6abfc693..2a86a9c3b0 100644
--- a/core/IP.php
+++ b/core/IP.php
@@ -9,7 +9,7 @@
namespace Piwik;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
/**
* Contains IP address helper functions (for both IPv4 and IPv6).
@@ -17,9 +17,9 @@ use Piwik\Network\IPUtils;
* As of Piwik 2.9, most methods in this class are deprecated. You are
* encouraged to use classes from the Piwik "Network" component:
*
- * @see \Piwik\Network\IP
- * @see \Piwik\Network\IPUtils
- * @link https://github.com/piwik/component-network
+ * @see \Matomo\Network\IP
+ * @see \Matomo\Network\IPUtils
+ * @link https://github.com/matomo-org/component-network
*
* As of Piwik 1.3, IP addresses are stored in the DB has VARBINARY(16),
* and passed around in network address format which has the advantage of
@@ -113,7 +113,7 @@ class IP
if(empty($element)) {
continue;
}
- $ip = \Piwik\Network\IP::fromStringIP(IPUtils::sanitizeIp($element));
+ $ip = \Matomo\Network\IP::fromStringIP(IPUtils::sanitizeIp($element));
if (empty($excludedIps) || (!in_array($element, $excludedIps) && !$ip->isInRanges($excludedIps))) {
return $element;
}
diff --git a/core/Mail.php b/core/Mail.php
index ddc2299445..9255b7c919 100644
--- a/core/Mail.php
+++ b/core/Mail.php
@@ -12,7 +12,6 @@ use Piwik\Container\StaticContainer;
use Piwik\Email\ContentGenerator;
use Piwik\Plugins\CoreAdminHome\CustomLogo;
use Piwik\Translation\Translator;
-use Piwik\View\HtmlReportEmailHeaderView;
use Zend_Mail;
/**
diff --git a/core/Menu/MenuAbstract.php b/core/Menu/MenuAbstract.php
index f5f8062d97..46d5b27987 100644
--- a/core/Menu/MenuAbstract.php
+++ b/core/Menu/MenuAbstract.php
@@ -8,6 +8,7 @@
*/
namespace Piwik\Menu;
+use Piwik\Cache;
use Piwik\Container\StaticContainer;
use Piwik\Plugins\SitesManager\API;
use Piwik\Singleton;
@@ -32,13 +33,12 @@ abstract class MenuAbstract extends Singleton
protected $renames = array();
protected $orderingApplied = false;
protected $menuIcons = array();
- protected static $menus = array();
/**
* Builds the menu, applies edits, renames
* and orders the entries.
*
- * @return Array
+ * @return array
*/
public function getMenu()
{
@@ -68,28 +68,23 @@ abstract class MenuAbstract extends Singleton
*/
protected function getAllMenus()
{
- if (!empty(self::$menus)) {
- return self::$menus;
+ $cacheId = 'Menus.all';
+ $cache = Cache::getTransientCache();
+
+ if ($cache->contains($cacheId)) {
+ return $cache->fetch($cacheId);
}
$components = PluginManager::getInstance()->findComponents('Menu', 'Piwik\\Plugin\\Menu');
- self::$menus = array();
+ $menus = array();
foreach ($components as $component) {
- self::$menus[] = StaticContainer::get($component);
+ $menus[] = StaticContainer::get($component);
}
- return self::$menus;
- }
+ $cache->save($cacheId, $menus);
- /**
- * To use only for tests.
- *
- * @deprecated The whole $menus cache should be replaced by a real transient cache
- */
- public static function clearMenus()
- {
- self::$menus = array();
+ return $menus;
}
/**
diff --git a/core/Menu/MenuAdmin.php b/core/Menu/MenuAdmin.php
index 4b61a542ff..eec409ce3a 100644
--- a/core/Menu/MenuAdmin.php
+++ b/core/Menu/MenuAdmin.php
@@ -9,7 +9,6 @@
namespace Piwik\Menu;
use Piwik\Development;
-use Piwik\Piwik;
/**
* Contains menu entries for the Admin menu.
@@ -109,7 +108,7 @@ class MenuAdmin extends MenuAbstract
/**
* Triggers the Menu.MenuAdmin.addItems hook and returns the admin menu.
*
- * @return Array
+ * @return array
*/
public function getMenu()
{
diff --git a/core/Menu/MenuTop.php b/core/Menu/MenuTop.php
index 434c112ae4..6d50918574 100644
--- a/core/Menu/MenuTop.php
+++ b/core/Menu/MenuTop.php
@@ -8,8 +8,6 @@
*/
namespace Piwik\Menu;
-use Piwik\Piwik;
-
/**
* Contains menu entries for the Top menu (the menu at the very top of the page).
* Plugins can implement the `configureTopMenu()` method of the `Menu` plugin class to add, rename of remove
@@ -47,7 +45,7 @@ class MenuTop extends MenuAbstract
/**
* Triggers the Menu.Top.addItems hook and returns the menu.
*
- * @return Array
+ * @return array
*/
public function getMenu()
{
diff --git a/core/Metrics.php b/core/Metrics.php
index 63a04dfc8b..7445ed4244 100644
--- a/core/Metrics.php
+++ b/core/Metrics.php
@@ -9,7 +9,6 @@
namespace Piwik;
use Piwik\Cache as PiwikCache;
-use Piwik\Columns\MetricsList;
use Piwik\Container\StaticContainer;
require_once PIWIK_INCLUDE_PATH . "/core/Piwik.php";
@@ -179,7 +178,7 @@ class Metrics
public static function getMappingFromIdToName()
{
- $cache = StaticContainer::get(PiwikCache\Transient::class);
+ $cache = PiwikCache::getTransientCache();
$cacheKey = CacheId::siteAware(CacheId::pluginAware('Metrics.mappingFromIdToName'));
$value = $cache->fetch($cacheKey);
diff --git a/core/Metrics/Sorter.php b/core/Metrics/Sorter.php
index 422d0ed1ab..9d4c1b4d30 100644
--- a/core/Metrics/Sorter.php
+++ b/core/Metrics/Sorter.php
@@ -11,7 +11,6 @@ use Piwik\DataTable;
use Piwik\DataTable\Row;
use Piwik\Metrics;
use Piwik\Plugin\Metric;
-use Piwik\Plugin\Report;
class Sorter
{
diff --git a/core/MetricsFormatter.php b/core/MetricsFormatter.php
index 9a039fd796..a080afadc4 100644
--- a/core/MetricsFormatter.php
+++ b/core/MetricsFormatter.php
@@ -64,13 +64,4 @@ class MetricsFormatter
{
return Site::getCurrencySymbolFor($idSite);
}
-
- /**
- * @deprecated Use Piwik\Intl\Data\Provider\CurrencyDataProvider instead.
- * @see \Piwik\Intl\Data\Provider\CurrencyDataProvider::getCurrencyList()
- */
- public static function getCurrencyList()
- {
- return Site::getCurrencyList();
- }
}
diff --git a/core/NumberFormatter.php b/core/NumberFormatter.php
index 15fbc8a0cd..808f547eee 100644
--- a/core/NumberFormatter.php
+++ b/core/NumberFormatter.php
@@ -239,7 +239,7 @@ class NumberFormatter
if ($minimumFractionDigits <= $maximumFractionDigits) {
// Strip any trailing zeroes.
$minorDigits = rtrim($minorDigits, '0');
- if (strlen($minorDigits) && strlen($minorDigits) < $minimumFractionDigits) {
+ if (strlen($minorDigits) < $minimumFractionDigits) {
// Now there are too few digits, re-add trailing zeroes
// until the desired length is reached.
$neededZeroes = $minimumFractionDigits - strlen($minorDigits);
diff --git a/core/Period/Range.php b/core/Period/Range.php
index a81d2c2781..b2987d509c 100644
--- a/core/Period/Range.php
+++ b/core/Period/Range.php
@@ -463,14 +463,23 @@ class Range extends Period
$period = Common::getRequestVar('period');
}
- if (365 == $subXPeriods && 'day' == $period && Date::today()->isLeapYear()) {
+ if (365 == $subXPeriods && 'day' == $period && Date::factory($date)->isLeapYear()) {
$subXPeriods = 366;
}
+ if ($period === 'range') {
+ $rangePeriod = new Range($period, $date);
+ $daysDifference = self::getNumDaysDifference($rangePeriod->getDateStart(), $rangePeriod->getDateEnd());
+ $end = $rangePeriod->getDateStart()->subDay(1);
+ $from = $end->subDay($daysDifference);
+
+ return array("$from,$end", false);
+ }
+
// can't get the last date for range periods & dates that use lastN/previousN
$strLastDate = false;
$lastPeriod = false;
- if ($period != 'range' && !preg_match('/(last|previous)([0-9]*)/', $date, $regs)) {
+ if (!preg_match('/(last|previous)([0-9]*)/', $date, $regs)) {
if (strpos($date, ',')) {
// date in the form of 2011-01-01,2011-02-02
@@ -489,6 +498,13 @@ class Range extends Period
return array($strLastDate, $lastPeriod);
}
+
+ private static function getNumDaysDifference(Date $date1, Date $date2)
+ {
+ $days = (abs($date1->getTimestamp() - $date2->getTimestamp())) / 60 / 60 / 24;
+ return (int) round($days);
+ }
+
/**
* Returns a date range string given a period type, end date and number of periods
* the range spans over.
diff --git a/core/Piwik.php b/core/Piwik.php
index 1768b8219d..32520ffec4 100644
--- a/core/Piwik.php
+++ b/core/Piwik.php
@@ -19,11 +19,6 @@ use Piwik\Plugins\UsersManager\API as APIUsersManager;
use Piwik\Translation\Translator;
/**
- * @see core/Translate.php
- */
-require_once PIWIK_INCLUDE_PATH . '/core/Translate.php';
-
-/**
* Main piwik helper class.
*
* Contains helper methods for a variety of common tasks. Plugin developers are
@@ -336,20 +331,6 @@ class Piwik
}
/**
- * Helper method user to set the current as superuser.
- * This should be used with great care as this gives the user all permissions.
- *
- * This method is deprecated, use {@link Access::doAsSuperUser()} instead.
- *
- * @param bool $bool true to set current user as Super User
- * @deprecated
- */
- public static function setUserHasSuperUserAccess($bool = true)
- {
- Access::getInstance()->setSuperUserAccess($bool);
- }
-
- /**
* Check that the current user has superuser access.
*
* @throws Exception if the current user is not the superuser.
@@ -819,19 +800,4 @@ class Piwik
return $translator->translate($translationId, $args, $language);
}
-
- /**
- * Executes a callback with superuser privileges, making sure those privileges are rescinded
- * before this method exits. Privileges will be rescinded even if an exception is thrown.
- *
- * @param callback $function The callback to execute. Should accept no arguments.
- * @return mixed The result of `$function`.
- * @throws Exception rethrows any exceptions thrown by `$function`.
- * @api
- * @deprecated since Matomo 3.8.0 use `Piwik\Access::doAsSuperUser` instead
- */
- public static function doAsSuperUser($function)
- {
- return Access::doAsSuperUser($function);
- }
}
diff --git a/core/Plugin.php b/core/Plugin.php
index a3187bf70f..2d3cb5978e 100644
--- a/core/Plugin.php
+++ b/core/Plugin.php
@@ -8,7 +8,6 @@
*/
namespace Piwik;
-use Piwik\Container\StaticContainer;
use Piwik\Plugin\Dependency;
use Piwik\Plugin\Manager;
use Piwik\Plugin\MetadataLoader;
@@ -108,7 +107,7 @@ class Plugin
* perfect but efficient. If the cache is used we need to make sure to call setId() before usage as there
* is maybe a different key set since last usage.
*
- * @var \Piwik\Cache\Eager
+ * @var \Matomo\Cache\Eager
*/
private $cache;
@@ -223,16 +222,6 @@ class Plugin
}
/**
- * @ignore
- * @deprecated since 2.15.0 use {@link registerEvents()} instead.
- * @return array
- */
- public function getListHooksRegistered()
- {
- return $this->registerEvents();
- }
-
- /**
* This method is executed after a plugin is loaded and translations are registered.
* Useful for initialization code that uses translated strings.
*/
diff --git a/core/Plugin/ArchivedMetric.php b/core/Plugin/ArchivedMetric.php
index 656caeab15..befb126b83 100644
--- a/core/Plugin/ArchivedMetric.php
+++ b/core/Plugin/ArchivedMetric.php
@@ -11,7 +11,6 @@ use Piwik\Archive\DataTableFactory;
use Piwik\Columns\Dimension;
use Piwik\Common;
use Piwik\DataTable;
-use Piwik\DataTable\Row;
use Piwik\Metrics\Formatter;
use Piwik\Piwik;
diff --git a/core/Plugin/Controller.php b/core/Plugin/Controller.php
index 2bc6a5c2f3..986cdae1b3 100644
--- a/core/Plugin/Controller.php
+++ b/core/Plugin/Controller.php
@@ -15,7 +15,6 @@ use Piwik\API\Request;
use Piwik\Common;
use Piwik\Config as PiwikConfig;
use Piwik\Container\StaticContainer;
-use Piwik\DataTable\Filter\SafeDecodeLabel;
use Piwik\Date;
use Piwik\Exception\NoPrivilegesException;
use Piwik\Exception\NoWebsiteFoundException;
@@ -1035,6 +1034,7 @@ abstract class Controller
{
if (!empty($this->idSite)) {
Access::getInstance()->checkUserHasViewAccess($this->idSite);
+ new Site($this->idSite);
} elseif (empty($this->site) || empty($this->idSite)) {
throw new Exception("The requested website idSite is not found in the request, or is invalid.
Please check that you are logged in Matomo and have permission to access the specified website.");
diff --git a/core/Plugin/Manager.php b/core/Plugin/Manager.php
index df3e19dc19..63cc0b548e 100644
--- a/core/Plugin/Manager.php
+++ b/core/Plugin/Manager.php
@@ -18,7 +18,6 @@ use Piwik\Config as PiwikConfig;
use Piwik\Container\StaticContainer;
use Piwik\Development;
use Piwik\EventDispatcher;
-use Piwik\Exception\Exception;
use Piwik\Exception\PluginDeactivatedException;
use Piwik\Filesystem;
use Piwik\Log;
@@ -70,6 +69,7 @@ class Manager
// These are always activated and cannot be deactivated
protected $pluginToAlwaysActivate = array(
+ 'BulkTracking',
'CoreHome',
'CoreUpdater',
'CoreAdminHome',
@@ -1388,7 +1388,7 @@ class Manager
return true;
}
- $hooks = $plugin->getListHooksRegistered();
+ $hooks = $plugin->registerEvents();
$hookNames = array_keys($hooks);
foreach ($hookNames as $name) {
if (strpos($name, self::TRACKER_EVENT_PREFIX) === 0) {
diff --git a/core/Plugin/WidgetsProvider.php b/core/Plugin/WidgetsProvider.php
index 9763b6c560..66c3406034 100644
--- a/core/Plugin/WidgetsProvider.php
+++ b/core/Plugin/WidgetsProvider.php
@@ -11,7 +11,6 @@ namespace Piwik\Plugin;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Plugin;
-use Exception;
use Piwik\Widget\Widget;
use Piwik\Widget\WidgetConfig;
use Piwik\Widget\WidgetContainerConfig;
diff --git a/core/Registry.php b/core/Registry.php
deleted file mode 100644
index 09fc0131bf..0000000000
--- a/core/Registry.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-namespace Piwik;
-
-use Piwik\Container\StaticContainer;
-
-/**
- * Registry class.
- *
- * @method static Registry getInstance()
- * @api
- * @deprecated This class will be removed, use the container instead.
- */
-class Registry extends Singleton
-{
- public static function isRegistered($key)
- {
- return self::getInstance()->hasKey($key);
- }
-
- public static function get($key)
- {
- return self::getInstance()->getKey($key);
- }
-
- public static function set($key, $value)
- {
- self::getInstance()->setKey($key, $value);
- }
-
- public function setKey($key, $value)
- {
- if ($key === 'auth') {
- $key = 'Piwik\Auth';
- }
-
- StaticContainer::getContainer()->set($key, $value);
- }
-
- public function getKey($key)
- {
- if ($key === 'auth') {
- $key = 'Piwik\Auth';
- }
-
- return StaticContainer::get($key);
- }
-
- public function hasKey($key)
- {
- if ($key === 'auth') {
- $key = 'Piwik\Auth';
- }
-
- return StaticContainer::getContainer()->has($key);
- }
-}
diff --git a/core/Session.php b/core/Session.php
index dd5b1229d7..5b73ef961a 100644
--- a/core/Session.php
+++ b/core/Session.php
@@ -27,18 +27,6 @@ class Session extends Zend_Session
protected static $sessionStarted = false;
/**
- * Are we using file-based session store?
- *
- * @return bool True if file-based; false otherwise
- */
- public static function isSessionHandler($handler)
- {
- $config = Config::getInstance();
- return !isset($config->General['session_save_handler'])
- || $config->General['session_save_handler'] === $handler;
- }
-
- /**
* Start the session
*
* @param array|bool $options An array of configuration options; the auto-start (bool) setting is ignored
@@ -91,7 +79,7 @@ class Session extends Zend_Session
$currentSaveHandler = ini_get('session.save_handler');
- if (!SettingsPiwik::isPiwikInstalled()) {
+ if (!SettingsPiwik::isMatomoInstalled()) {
// Note: this handler doesn't work well in load-balanced environments and may have a concurrency issue with locked session files
// for "files", use our own folder to prevent local session file hijacking
@@ -101,10 +89,7 @@ class Session extends Zend_Session
@ini_set('session.save_handler', 'files');
@ini_set('session.save_path', $sessionPath);
- } elseif (self::isSessionHandler('dbtable')
- || self::isSessionHandler('files')
- || in_array($currentSaveHandler, array('user', 'mm'))
- ) {
+ } else {
// as of Matomo 3.7.0 we only support files session handler during installation
// We consider these to be misconfigurations, in that:
@@ -143,7 +128,7 @@ class Session extends Zend_Session
'ignoreInScreenWriter' => true,
]);
- if (SettingsPiwik::isPiwikInstalled()) {
+ if (SettingsPiwik::isMatomoInstalled()) {
$pathToSessions = '';
} else {
$pathToSessions = Filechecks::getErrorMessageMissingPermissions(self::getSessionsDirectory());
diff --git a/core/Session/SaveHandler/DbTable.php b/core/Session/SaveHandler/DbTable.php
index 87634acb5e..15163c463e 100644
--- a/core/Session/SaveHandler/DbTable.php
+++ b/core/Session/SaveHandler/DbTable.php
@@ -9,10 +9,10 @@
namespace Piwik\Session\SaveHandler;
-use Piwik\Common;
use Piwik\Db;
use Piwik\DbHelper;
use Exception;
+use Piwik\SettingsPiwik;
use Piwik\Updater\Migration;
use Zend_Session;
use Zend_Session_SaveHandler_Interface;
@@ -27,6 +27,7 @@ class DbTable implements Zend_Session_SaveHandler_Interface
protected $maxLifetime;
const TABLE_NAME = 'session';
+ const TOKEN_HASH_ALGO = 'sha512';
/**
* @param array $config
@@ -37,6 +38,13 @@ class DbTable implements Zend_Session_SaveHandler_Interface
$this->maxLifetime = ini_get('session.gc_maxlifetime');
}
+ private function hashSessionId($id)
+ {
+ $salt = SettingsPiwik::getSalt();
+ return hash(self::TOKEN_HASH_ALGO, $id . $salt);
+ }
+
+
/**
* Destructor
*
@@ -79,6 +87,7 @@ class DbTable implements Zend_Session_SaveHandler_Interface
*/
public function read($id)
{
+ $id = $this->hashSessionId($id);
$sql = 'SELECT ' . $this->config['dataColumn'] . ' FROM ' . $this->config['name']
. ' WHERE ' . $this->config['primary'] . ' = ?'
. ' AND ' . $this->config['modifiedColumn'] . ' + ' . $this->config['lifetimeColumn'] . ' >= ?';
@@ -131,6 +140,8 @@ class DbTable implements Zend_Session_SaveHandler_Interface
*/
public function write($id, $data)
{
+ $id = $this->hashSessionId($id);
+
$sql = 'INSERT INTO ' . $this->config['name']
. ' (' . $this->config['primary'] . ','
. $this->config['modifiedColumn'] . ','
@@ -156,6 +167,8 @@ class DbTable implements Zend_Session_SaveHandler_Interface
*/
public function destroy($id)
{
+ $id = $this->hashSessionId($id);
+
$sql = 'DELETE FROM ' . $this->config['name'] . ' WHERE ' . $this->config['primary'] . ' = ?';
$this->query($sql, array($id));
diff --git a/core/Settings/Measurable/MeasurableProperty.php b/core/Settings/Measurable/MeasurableProperty.php
index 7ff7d889b4..f2fcfa492b 100644
--- a/core/Settings/Measurable/MeasurableProperty.php
+++ b/core/Settings/Measurable/MeasurableProperty.php
@@ -11,7 +11,6 @@ namespace Piwik\Settings\Measurable;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
-use Piwik\Settings\Storage;
use Exception;
/**
diff --git a/core/Settings/Measurable/MeasurableSetting.php b/core/Settings/Measurable/MeasurableSetting.php
index d1464e682b..19507c4c13 100644
--- a/core/Settings/Measurable/MeasurableSetting.php
+++ b/core/Settings/Measurable/MeasurableSetting.php
@@ -11,7 +11,6 @@ namespace Piwik\Settings\Measurable;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
-use Piwik\Settings\Storage;
/**
* Describes a Measurable setting for a measurable type such as a website, a mobile app, ...
diff --git a/core/Settings/Measurable/MeasurableSettings.php b/core/Settings/Measurable/MeasurableSettings.php
index 89cf9aeb94..8096c27903 100644
--- a/core/Settings/Measurable/MeasurableSettings.php
+++ b/core/Settings/Measurable/MeasurableSettings.php
@@ -8,10 +8,8 @@
*/
namespace Piwik\Settings\Measurable;
-use Piwik\Db;
use Piwik\Piwik;
use Piwik\Settings\Settings;
-use Piwik\Settings\Storage;
use Piwik\Site;
use Exception;
diff --git a/core/Settings/Plugin/SystemConfigSetting.php b/core/Settings/Plugin/SystemConfigSetting.php
index 1f7953542c..c5ee3adfb5 100644
--- a/core/Settings/Plugin/SystemConfigSetting.php
+++ b/core/Settings/Plugin/SystemConfigSetting.php
@@ -9,11 +9,9 @@
namespace Piwik\Settings\Plugin;
-use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Settings\Setting;
-use Piwik\Settings\Storage;
/**
* Describes a system wide setting. Only the Super User can change this type of setting by d efault and
diff --git a/core/Settings/Plugin/SystemSetting.php b/core/Settings/Plugin/SystemSetting.php
index 6c5eb28eb3..305aaff18d 100644
--- a/core/Settings/Plugin/SystemSetting.php
+++ b/core/Settings/Plugin/SystemSetting.php
@@ -13,7 +13,6 @@ use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Settings\Setting;
-use Piwik\Settings\Storage;
/**
* Describes a system wide setting. Only the Super User can change this type of setting by default and
diff --git a/core/Settings/Plugin/SystemSettings.php b/core/Settings/Plugin/SystemSettings.php
index 9dafa19af1..bff43a4a19 100644
--- a/core/Settings/Plugin/SystemSettings.php
+++ b/core/Settings/Plugin/SystemSettings.php
@@ -8,10 +8,8 @@
*/
namespace Piwik\Settings\Plugin;
-use Piwik\Db;
use Piwik\Piwik;
use Piwik\Settings\Settings;
-use Piwik\Settings\Storage;
/**
* Base class of all system settings providers. Plugins that define their own configuration settings
diff --git a/core/Settings/Plugin/UserSetting.php b/core/Settings/Plugin/UserSetting.php
index 68499529b7..4cc9a543ee 100644
--- a/core/Settings/Plugin/UserSetting.php
+++ b/core/Settings/Plugin/UserSetting.php
@@ -10,11 +10,9 @@
namespace Piwik\Settings\Plugin;
use Piwik\Container\StaticContainer;
-use Piwik\Db;
use Piwik\Piwik;
use Exception;
use Piwik\Settings\Setting;
-use Piwik\Settings\Storage;
/**
* Describes a per user setting. Each user will be able to change this setting for themselves,
diff --git a/core/Settings/Plugin/UserSettings.php b/core/Settings/Plugin/UserSettings.php
index 3320f8ecbd..d38ec1f19e 100644
--- a/core/Settings/Plugin/UserSettings.php
+++ b/core/Settings/Plugin/UserSettings.php
@@ -8,10 +8,8 @@
*/
namespace Piwik\Settings\Plugin;
-use Piwik\Db;
use Piwik\Piwik;
use Piwik\Settings\Settings;
-use Piwik\Settings\Storage;
/**
* Base class of all plugin settings providers. Plugins that define their own configuration settings
diff --git a/core/Settings/Storage/Backend/Cache.php b/core/Settings/Storage/Backend/Cache.php
index d8646929fd..b751bdb27f 100644
--- a/core/Settings/Storage/Backend/Cache.php
+++ b/core/Settings/Storage/Backend/Cache.php
@@ -9,7 +9,6 @@
namespace Piwik\Settings\Storage\Backend;
-use Piwik\Settings\Storage;
use Piwik\Tracker;
use Piwik\Cache as PiwikCache;
diff --git a/core/Settings/Storage/Backend/MeasurableSettingsTable.php b/core/Settings/Storage/Backend/MeasurableSettingsTable.php
index 77c56150fc..5ef9a90cb3 100644
--- a/core/Settings/Storage/Backend/MeasurableSettingsTable.php
+++ b/core/Settings/Storage/Backend/MeasurableSettingsTable.php
@@ -10,11 +10,8 @@
namespace Piwik\Settings\Storage\Backend;
use Piwik\Common;
-use Piwik\Concurrency\Lock;
-use Piwik\Container\StaticContainer;
use Piwik\Db;
use Exception;
-use Piwik\Version;
/**
* Measurable settings backend. Stores all settings in a "site_setting" database table.
diff --git a/core/Settings/Storage/Backend/NullBackend.php b/core/Settings/Storage/Backend/NullBackend.php
index 69262ed21f..3c89ec1367 100644
--- a/core/Settings/Storage/Backend/NullBackend.php
+++ b/core/Settings/Storage/Backend/NullBackend.php
@@ -9,8 +9,6 @@
namespace Piwik\Settings\Storage\Backend;
-use Piwik\Settings\Storage;
-
/**
* Static / temporary storage where a value shall never be persisted. Meaning it will use the default value
* for each request until configured differently. Useful for tests etc.
diff --git a/core/Settings/Storage/Backend/PluginSettingsTable.php b/core/Settings/Storage/Backend/PluginSettingsTable.php
index fddd60fc36..d6255a5180 100644
--- a/core/Settings/Storage/Backend/PluginSettingsTable.php
+++ b/core/Settings/Storage/Backend/PluginSettingsTable.php
@@ -10,11 +10,8 @@
namespace Piwik\Settings\Storage\Backend;
use Piwik\Common;
-use Piwik\Concurrency\Lock;
-use Piwik\Container\StaticContainer;
use Piwik\Db;
use Exception;
-use Piwik\Version;
/**
* Plugin settings backend. Stores all settings in a "plugin_setting" database table.
diff --git a/core/SettingsPiwik.php b/core/SettingsPiwik.php
index 9be5fdf119..9e54807e9f 100644
--- a/core/SettingsPiwik.php
+++ b/core/SettingsPiwik.php
@@ -216,21 +216,10 @@ class SettingsPiwik
}
/**
- * @see SettingsPiwik::isPiwikInstalled
* @return bool
*/
public static function isMatomoInstalled()
{
- return self::isPiwikInstalled();
- }
-
- /**
- * Return true if Piwik is installed (installation is done).
- * @deprecated since Matomo 3.8.0, please use {@link isMatomoInstalled()} instead.
- * @return bool
- */
- public static function isPiwikInstalled()
- {
$config = Config::getInstance()->getLocalPath();
$exists = file_exists($config);
@@ -474,7 +463,7 @@ class SettingsPiwik
public static function getPiwikInstanceId()
{
// until Piwik is installed, we use hostname as instance_id
- if (!self::isPiwikInstalled()
+ if (!self::isMatomoInstalled()
&& Common::isPhpCliMode()) {
// enterprise:install use case
return Config::getHostname();
@@ -507,7 +496,7 @@ class SettingsPiwik
*/
public static function isHttpsForced()
{
- if (!SettingsPiwik::isPiwikInstalled()) {
+ if (!SettingsPiwik::isMatomoInstalled()) {
// Only enable this feature after Piwik is already installed
return false;
}
diff --git a/core/Site.php b/core/Site.php
index 2323dd249c..2ad385b40e 100644
--- a/core/Site.php
+++ b/core/Site.php
@@ -10,9 +10,7 @@
namespace Piwik;
use Exception;
-use Piwik\Container\StaticContainer;
use Piwik\Exception\UnexpectedWebsiteFoundException;
-use Piwik\Intl\Data\Provider\CurrencyDataProvider;
use Piwik\Plugins\SitesManager\API;
/**
@@ -630,24 +628,6 @@ class Site
return $symbol;
}
-
- /**
- * Returns the list of all known currency symbols.
- *
- * @return array An array mapping currency codes to their respective currency symbols
- * and a description, eg, `array('USD' => array('$', 'US dollar'))`.
- *
- * @deprecated Use Piwik\Intl\Data\Provider\CurrencyDataProvider instead.
- * @see \Piwik\Intl\Data\Provider\CurrencyDataProvider::getCurrencyList()
- * @api
- */
- public static function getCurrencyList()
- {
- /** @var CurrencyDataProvider $dataProvider */
- $dataProvider = StaticContainer::get('Piwik\Intl\Data\Provider\CurrencyDataProvider');
- return $dataProvider->getCurrencyList();
- }
-
/**
* Returns the excluded IP addresses of the site with the specified ID.
*
diff --git a/core/TaskScheduler.php b/core/TaskScheduler.php
deleted file mode 100644
index 211b720d68..0000000000
--- a/core/TaskScheduler.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-
-namespace Piwik;
-
-use Piwik\Container\StaticContainer;
-use Piwik\Scheduler\Scheduler;
-use Piwik\Scheduler\Task;
-
-// When set to true, all scheduled tasks will be triggered in all requests (careful!)
-//define('DEBUG_FORCE_SCHEDULED_TASKS', true);
-
-/**
- * Manages scheduled task execution.
- *
- * A scheduled task is a callback that should be executed every so often (such as daily,
- * weekly, monthly, etc.). They are registered by extending {@link \Piwik\Plugin\Tasks}.
- *
- * Tasks are executed when the `core:archive` command is executed.
- *
- * ### Examples
- *
- * **Scheduling a task**
- *
- * class Tasks extends \Piwik\Plugin\Tasks
- * {
- * public function schedule()
- * {
- * $this->hourly('myTask'); // myTask() will be executed once every hour
- * }
- * public function myTask()
- * {
- * // do something
- * }
- * }
- *
- * **Executing all pending tasks**
- *
- * $results = TaskScheduler::runTasks();
- * $task1Result = $results[0];
- * $task1Name = $task1Result['task'];
- * $task1Output = $task1Result['output'];
- *
- * echo "Executed task '$task1Name'. Task output:\n$task1Output";
- *
- * @deprecated Use Piwik\Scheduler\Scheduler instead
- * @see \Piwik\Scheduler\Scheduler
- */
-class TaskScheduler
-{
- /**
- * Executes tasks that are scheduled to run, then reschedules them.
- *
- * @return array An array describing the results of scheduled task execution. Each element
- * in the array will have the following format:
- *
- * ```
- * array(
- * 'task' => 'task name',
- * 'output' => '... task output ...'
- * )
- * ```
- */
- public static function runTasks()
- {
- return self::getInstance()->run();
- }
-
- /**
- * Determines a task's scheduled time and persists it, overwriting the previous scheduled time.
- *
- * Call this method if your task's scheduled time has changed due to, for example, an option that
- * was changed.
- *
- * @param Task $task Describes the scheduled task being rescheduled.
- * @api
- */
- public static function rescheduleTask(Task $task)
- {
- self::getInstance()->rescheduleTask($task);
- }
-
- /**
- * Returns true if the TaskScheduler is currently running a scheduled task.
- *
- * @return bool
- */
- public static function isTaskBeingExecuted()
- {
- return self::getInstance()->isRunningTask();
- }
-
- /**
- * Return the next scheduled time given the class and method names of a scheduled task.
- *
- * @param string $className The name of the class that contains the scheduled task method.
- * @param string $methodName The name of the scheduled task method.
- * @param string|null $methodParameter Optional method parameter.
- * @return mixed int|bool The time in miliseconds when the scheduled task will be executed
- * next or false if it is not scheduled to run.
- */
- public static function getScheduledTimeForMethod($className, $methodName, $methodParameter = null)
- {
- return self::getInstance()->getScheduledTimeForMethod($className, $methodName, $methodParameter);
- }
-
- /**
- * @return Scheduler
- */
- private static function getInstance()
- {
- return StaticContainer::getContainer()->get('Piwik\Scheduler\Scheduler');
- }
-}
diff --git a/core/Tracker.php b/core/Tracker.php
index 6c95a9ddbe..640a898346 100644
--- a/core/Tracker.php
+++ b/core/Tracker.php
@@ -97,7 +97,7 @@ class Tracker
public function isInstalled()
{
if (is_null($this->isInstalled)) {
- $this->isInstalled = SettingsPiwik::isPiwikInstalled();
+ $this->isInstalled = SettingsPiwik::isMatomoInstalled();
}
return $this->isInstalled;
diff --git a/core/Tracker/Action.php b/core/Tracker/Action.php
index d0caddcdc3..17efcf9127 100644
--- a/core/Tracker/Action.php
+++ b/core/Tracker/Action.php
@@ -12,10 +12,8 @@ namespace Piwik\Tracker;
use Exception;
use Piwik\Common;
use Piwik\Container\StaticContainer;
-use Piwik\Piwik;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Plugin\Manager;
-use Piwik\Tracker;
use Psr\Log\LoggerInterface;
/**
diff --git a/core/Tracker/Cache.php b/core/Tracker/Cache.php
index f20223d234..c3928b83aa 100644
--- a/core/Tracker/Cache.php
+++ b/core/Tracker/Cache.php
@@ -11,7 +11,6 @@ namespace Piwik\Tracker;
use Piwik\Access;
use Piwik\ArchiveProcessor\Rules;
use Piwik\Cache as PiwikCache;
-use Piwik\Common;
use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Option;
@@ -29,12 +28,12 @@ class Cache
/**
* Public for tests only
- * @var \Piwik\Cache\Lazy
+ * @var \Matomo\Cache\Lazy
*/
public static $cache;
/**
- * @return \Piwik\Cache\Lazy
+ * @return \Matomo\Cache\Lazy
*/
private static function getCache()
{
diff --git a/core/Tracker/Db.php b/core/Tracker/Db.php
index c3d1eeb987..5c92f5a6de 100644
--- a/core/Tracker/Db.php
+++ b/core/Tracker/Db.php
@@ -14,10 +14,7 @@ use Piwik\Common;
use Piwik\Config;
use Piwik\Piwik;
use Piwik\Timer;
-use Piwik\Tracker;
use Piwik\Tracker\Db\DbException;
-use Piwik\Tracker\Db\Mysqli;
-use Piwik\Tracker\Db\Pdo\Mysql;
/**
* Simple database wrapper.
diff --git a/core/Tracker/GoalManager.php b/core/Tracker/GoalManager.php
index 5353e68a8f..ea4f9c29f7 100644
--- a/core/Tracker/GoalManager.php
+++ b/core/Tracker/GoalManager.php
@@ -254,7 +254,7 @@ class GoalManager
$goals = $this->getGoalDefinitions($idSite);
if (!isset($goals[$idGoal])) {
- return null;
+ throw new InvalidRequestParameterException('idGoal ' . $idGoal . ' does not exist');
}
$goal = $goals[$idGoal];
@@ -877,10 +877,14 @@ class GoalManager
private function getGoalFromVisitor(VisitProperties $visitProperties, Request $request, $action)
{
+ $lastVisitTime = $visitProperties->getProperty('visit_last_action_time');
+ if (!$lastVisitTime) {
+ $lastVisitTime = $request->getCurrentTimestamp();
+ }
$goal = array(
'idvisit' => $visitProperties->getProperty('idvisit'),
'idvisitor' => $visitProperties->getProperty('idvisitor'),
- 'server_time' => Date::getDatetimeFromTimestamp($visitProperties->getProperty('visit_last_action_time')),
+ 'server_time' => Date::getDatetimeFromTimestamp($lastVisitTime),
);
$visitDimensions = VisitDimension::getAllDimensions();
diff --git a/core/Tracker/Handler.php b/core/Tracker/Handler.php
index f4c9fa9339..212383d298 100644
--- a/core/Tracker/Handler.php
+++ b/core/Tracker/Handler.php
@@ -9,13 +9,11 @@
namespace Piwik\Tracker;
-use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\Exception\InvalidRequestParameterException;
use Piwik\Exception\UnexpectedWebsiteFoundException;
use Piwik\Tracker;
use Exception;
-use Piwik\Url;
use Psr\Log\LoggerInterface;
class Handler
@@ -108,13 +106,11 @@ class Handler
}
$this->response->outputException($tracker, $e, $statusCode);
- $this->redirectIfNeeded($requestSet);
}
public function finish(Tracker $tracker, RequestSet $requestSet)
{
$this->response->outputResponse($tracker);
- $this->redirectIfNeeded($requestSet);
return $this->response->getOutput();
}
@@ -123,12 +119,4 @@ class Handler
return $this->response;
}
- protected function redirectIfNeeded(RequestSet $requestSet)
- {
- $redirectUrl = $requestSet->shouldPerformRedirectToUrl();
-
- if (!empty($redirectUrl)) {
- Url::redirectToUrl($redirectUrl);
- }
- }
}
diff --git a/core/Tracker/Model.php b/core/Tracker/Model.php
index 8c4c4fb71b..2735d6e4a4 100644
--- a/core/Tracker/Model.php
+++ b/core/Tracker/Model.php
@@ -417,6 +417,16 @@ class Model
return $visitRow;
}
+ public function hasVisit($idSite, $idVisit)
+ {
+ // will use INDEX index_idsite_idvisitor (idsite, idvisitor)
+ $sql = 'SELECT idsite FROM ' . Common::prefixTable('log_visit') . ' WHERE idvisit = ? LIMIT 1';
+ $bindSql = array($idVisit);
+
+ $val = $this->getDb()->fetchOne($sql, $bindSql);
+ return $val == $idSite;
+ }
+
private function findVisitorByVisitorId($idVisitor, $select, $from, $where, $bindSql)
{
$cache = Cache::getCacheGeneral();
diff --git a/core/Tracker/Request.php b/core/Tracker/Request.php
index d35b538fc1..7da7f12287 100644
--- a/core/Tracker/Request.php
+++ b/core/Tracker/Request.php
@@ -16,7 +16,7 @@ use Piwik\Cookie;
use Piwik\Exception\InvalidRequestParameterException;
use Piwik\Exception\UnexpectedWebsiteFoundException;
use Piwik\IP;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Piwik;
use Piwik\Plugins\CustomVariables\CustomVariables;
use Piwik\Plugins\UsersManager\UsersManager;
@@ -875,7 +875,7 @@ class Request
}
/**
- * Matches implementation of PiwikTracker::getUserIdHashed
+ * Matches implementation of MatomoTracker::getUserIdHashed
*
* @param $userId
* @return string
diff --git a/core/Tracker/RequestSet.php b/core/Tracker/RequestSet.php
index 23e3e8d13a..959d4ca40d 100644
--- a/core/Tracker/RequestSet.php
+++ b/core/Tracker/RequestSet.php
@@ -10,8 +10,6 @@ namespace Piwik\Tracker;
use Piwik\Common;
use Piwik\Piwik;
-use Piwik\Plugins\SitesManager\SiteUrls;
-use Piwik\Url;
class RequestSet
{
@@ -119,18 +117,6 @@ class RequestSet
return !empty($this->requests);
}
- protected function getRedirectUrl()
- {
- return Common::getRequestVar('redirecturl', false, 'string');
- }
-
- protected function hasRedirectUrl()
- {
- $redirectUrl = $this->getRedirectUrl();
-
- return !empty($redirectUrl);
- }
-
protected function getAllSiteIdsWithinRequest()
{
if (empty($this->requests)) {
@@ -145,41 +131,6 @@ class RequestSet
return array_values(array_unique($siteIds));
}
- // TODO maybe move to response? or somewhere else? not sure where!
- public function shouldPerformRedirectToUrl()
- {
- if (!$this->hasRedirectUrl()) {
- return false;
- }
-
- if (!$this->hasRequests()) {
- return false;
- }
-
- $redirectUrl = $this->getRedirectUrl();
- $host = Url::getHostFromUrl($redirectUrl);
-
- if (empty($host)) {
- return false;
- }
-
- $urls = new SiteUrls();
- $siteUrls = $urls->getAllCachedSiteUrls();
- $siteIds = $this->getAllSiteIdsWithinRequest();
-
- foreach ($siteIds as $siteId) {
- if (empty($siteUrls[$siteId])) {
- $siteUrls[$siteId] = array();
- }
-
- if (Url::isHostInUrls($host, $siteUrls[$siteId])) {
- return $redirectUrl;
- }
- }
-
- return false;
- }
-
public function getState()
{
$requests = array(
diff --git a/core/Tracker/Settings.php b/core/Tracker/Settings.php
index 84111c67a4..0fd61612f9 100644
--- a/core/Tracker/Settings.php
+++ b/core/Tracker/Settings.php
@@ -8,7 +8,6 @@
*/
namespace Piwik\Tracker;
-use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Tracker;
use Piwik\DeviceDetector\DeviceDetectorFactory;
diff --git a/core/Tracker/TableLogAction.php b/core/Tracker/TableLogAction.php
index fb6ef52464..834f275312 100644
--- a/core/Tracker/TableLogAction.php
+++ b/core/Tracker/TableLogAction.php
@@ -10,7 +10,6 @@
namespace Piwik\Tracker;
use Piwik\Common;
-use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Segment\SegmentExpression;
diff --git a/core/Tracker/TableLogAction/Cache.php b/core/Tracker/TableLogAction/Cache.php
index 32e132d76c..4cea0ed7c0 100644
--- a/core/Tracker/TableLogAction/Cache.php
+++ b/core/Tracker/TableLogAction/Cache.php
@@ -31,11 +31,11 @@ class Cache
private $logger;
/**
- * @var \Piwik\Cache\Lazy
+ * @var \Matomo\Cache\Lazy
*/
private $cache;
- public function __construct(LoggerInterface $logger, Config $config, \Piwik\Cache\Lazy $cache)
+ public function __construct(LoggerInterface $logger, Config $config, \Matomo\Cache\Lazy $cache)
{
$this->isEnabled = (bool)$config->General['enable_segments_subquery_cache'];
$this->limitActionIds = $config->General['segments_subquery_cache_limit'];
diff --git a/core/Tracker/TrackerCodeGenerator.php b/core/Tracker/TrackerCodeGenerator.php
index 9d7e87c62b..343052bdcb 100644
--- a/core/Tracker/TrackerCodeGenerator.php
+++ b/core/Tracker/TrackerCodeGenerator.php
@@ -10,7 +10,6 @@ namespace Piwik\Tracker;
use Piwik\Common;
use Piwik\DbHelper;
-use Piwik\Option;
use Piwik\Piwik;
use Piwik\Plugins\CustomVariables\CustomVariables;
use Piwik\Plugins\SitesManager\API as APISitesManager;
diff --git a/core/Tracker/TrackerConfig.php b/core/Tracker/TrackerConfig.php
index 3f027201b7..99ffbbfa86 100644
--- a/core/Tracker/TrackerConfig.php
+++ b/core/Tracker/TrackerConfig.php
@@ -9,7 +9,6 @@
namespace Piwik\Tracker;
use Piwik\Config;
-use Piwik\Tracker;
class TrackerConfig
{
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index d3de0015ca..cd72105076 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -15,7 +15,7 @@ use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Date;
use Piwik\Exception\UnexpectedWebsiteFoundException;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugins\UserCountry\Columns\Base;
use Piwik\Tracker;
@@ -409,7 +409,10 @@ class Visit implements VisitInterface
if ($wasInserted) {
Common::printDebug('Updated existing visit: ' . var_export($valuesToUpdate, true));
- } else {
+ } elseif (!$this->getModel()->hasVisit($idSite, $idVisit)) {
+ // mostly for WordPress. see https://github.com/matomo-org/matomo/pull/15587
+ // as WP doesn't set `MYSQLI_CLIENT_FOUND_ROWS` and therefore when the update succeeded but no value changed
+ // it would still return 0 vs OnPremise would return 1 or 2.
throw new VisitorNotFoundInDb(
"The visitor with idvisitor=" . bin2hex($this->visitProperties->getProperty('idvisitor'))
. " and idvisit=" . @$this->visitProperties->getProperty('idvisit')
diff --git a/core/Tracker/VisitExcluded.php b/core/Tracker/VisitExcluded.php
index 838f0cf2a7..bc330b0996 100644
--- a/core/Tracker/VisitExcluded.php
+++ b/core/Tracker/VisitExcluded.php
@@ -13,7 +13,7 @@ use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\DeviceDetector\DeviceDetectorFactory;
use Piwik\Exception\UnexpectedWebsiteFoundException;
-use Piwik\Network\IP;
+use Matomo\Network\IP;
use Piwik\Piwik;
use Piwik\Plugins\SitesManager\SiteUrls;
use Piwik\Tracker\Visit\ReferrerSpamFilter;
diff --git a/core/Tracker/Visitor.php b/core/Tracker/Visitor.php
index 8203915dc2..284eaf7048 100644
--- a/core/Tracker/Visitor.php
+++ b/core/Tracker/Visitor.php
@@ -8,8 +8,6 @@
*/
namespace Piwik\Tracker;
-use Piwik\Config;
-use Piwik\Tracker;
use Piwik\Tracker\Visit\VisitProperties;
class Visitor
diff --git a/core/Translate.php b/core/Translate.php
index 73cd53c92e..84c46f38da 100644
--- a/core/Translate.php
+++ b/core/Translate.php
@@ -27,7 +27,8 @@ class Translate
*/
public static function clean($s)
{
- return html_entity_decode(trim($s), ENT_QUOTES, 'UTF-8');
+ self::triggerDeprecationNotice();
+ return self::getTranslator()->clean($s);
}
/**
@@ -51,6 +52,7 @@ class Translate
*/
public static function reloadLanguage($language = false)
{
+ self::triggerDeprecationNotice();
}
/**
@@ -61,6 +63,7 @@ class Translate
*/
public static function loadCoreTranslation($language = false)
{
+ self::triggerDeprecationNotice();
self::getTranslator()->addDirectory(PIWIK_INCLUDE_PATH . '/lang');
}
@@ -69,6 +72,7 @@ class Translate
*/
public static function mergeTranslationArray($translation)
{
+ self::triggerDeprecationNotice();
}
/**
@@ -77,12 +81,14 @@ class Translate
*/
public static function getLanguageToLoad()
{
+ self::triggerDeprecationNotice();
return self::getTranslator()->getCurrentLanguage();
}
/** Reset the cached language to load. Used in tests. */
public static function reset()
{
+ self::triggerDeprecationNotice();
self::getTranslator()->reset();
}
@@ -92,11 +98,13 @@ class Translate
*/
public static function getLanguageLoaded()
{
+ self::triggerDeprecationNotice();
return self::getTranslator()->getCurrentLanguage();
}
public static function getLanguageDefault()
{
+ self::triggerDeprecationNotice();
return self::getTranslator()->getDefaultLanguage();
}
@@ -105,11 +113,13 @@ class Translate
*/
public static function getJavascriptTranslations()
{
+ self::triggerDeprecationNotice();
return self::getTranslator()->getJavascriptTranslations();
}
public static function findTranslationKeyForTranslation($translation)
{
+ self::triggerDeprecationNotice();
return self::getTranslator()->findTranslationKeyForTranslation($translation);
}
@@ -123,7 +133,15 @@ class Translate
public static function loadAllTranslations()
{
+ self::triggerDeprecationNotice();
self::loadCoreTranslation();
Manager::getInstance()->loadPluginTranslations();
}
+
+ protected static function triggerDeprecationNotice()
+ {
+ if (Development::isEnabled()) {
+ Log::warning('Using \Piwik\Translate is deprecated. Use \Piwik\Translation\Translator instead.');
+ }
+ }
}
diff --git a/core/Translation/Loader/LoaderCache.php b/core/Translation/Loader/LoaderCache.php
index 0726ef58f8..b84af80b6b 100644
--- a/core/Translation/Loader/LoaderCache.php
+++ b/core/Translation/Loader/LoaderCache.php
@@ -8,7 +8,7 @@
namespace Piwik\Translation\Loader;
-use Piwik\Cache;
+use Matomo\Cache\Lazy;
/**
* Caches the translations loaded by another loader.
@@ -21,11 +21,11 @@ class LoaderCache implements LoaderInterface
private $loader;
/**
- * @var Cache\Lazy
+ * @var Lazy
*/
private $cache;
- public function __construct(LoaderInterface $loader, Cache\Lazy $cache)
+ public function __construct(LoaderInterface $loader, Lazy $cache)
{
$this->loader = $loader;
$this->cache = $cache;
diff --git a/core/Translation/Translator.php b/core/Translation/Translator.php
index 91950a4af4..e58998c803 100644
--- a/core/Translation/Translator.php
+++ b/core/Translation/Translator.php
@@ -10,7 +10,6 @@ namespace Piwik\Translation;
use Piwik\Config;
use Piwik\Piwik;
-use Piwik\Plugin;
use Piwik\Translation\Loader\LoaderInterface;
/**
@@ -62,6 +61,17 @@ class Translator
}
/**
+ * Clean a string that may contain HTML special chars, single/double quotes, HTML entities, leading/trailing whitespace
+ *
+ * @param string $s
+ * @return string
+ */
+ public static function clean($s)
+ {
+ return html_entity_decode(trim($s), ENT_QUOTES, 'UTF-8');
+ }
+
+ /**
* Returns an internationalized string using a translation ID. If a translation
* cannot be found for the ID, the ID is returned.
*
diff --git a/core/Twig.php b/core/Twig.php
index 687e67be75..165747e938 100644
--- a/core/Twig.php
+++ b/core/Twig.php
@@ -240,7 +240,7 @@ class Twig
{
$getJavascriptTranslations = new Twig_SimpleFunction(
'getJavascriptTranslations',
- array('Piwik\\Translate', 'getJavascriptTranslations')
+ array(StaticContainer::get('Piwik\Translation\Translator'), 'getJavascriptTranslations')
);
$this->twig->addFunction($getJavascriptTranslations);
}
diff --git a/core/Unzip.php b/core/Unzip.php
index 4f43d1824f..80d648d6ed 100644
--- a/core/Unzip.php
+++ b/core/Unzip.php
@@ -8,10 +8,10 @@
namespace Piwik;
-use Piwik\Decompress\Gzip;
-use Piwik\Decompress\PclZip;
-use Piwik\Decompress\Tar;
-use Piwik\Decompress\ZipArchive;
+use Matomo\Decompress\Gzip;
+use Matomo\Decompress\PclZip;
+use Matomo\Decompress\Tar;
+use Matomo\Decompress\ZipArchive;
/**
* Factory for Decompress adapters.
@@ -23,7 +23,7 @@ class Unzip
*
* @param string $name Name of unarchiver
* @param string $filename Name of .zip archive
- * @return \Piwik\Decompress\DecompressInterface
+ * @return \Matomo\Decompress\DecompressInterface
*/
public static function factory($name, $filename)
{
diff --git a/core/Updater.php b/core/Updater.php
index c82b6c70e1..f13e020b1c 100644
--- a/core/Updater.php
+++ b/core/Updater.php
@@ -13,7 +13,6 @@ use Piwik\Container\StaticContainer;
use Piwik\Plugin\Manager;
use Piwik\Plugins\Installation\ServerFilesGenerator;
use Piwik\Updater\Migration;
-use Piwik\Updater\Migration\Db\Sql;
use Piwik\Exception\MissingFilePermissionException;
use Piwik\Updater\UpdateObserver;
use Zend_Db_Exception;
@@ -242,7 +241,9 @@ class Updater
$className = $this->getUpdateClassName($componentName, $fileVersion);
if (!class_exists($className, false)) {
- throw new \Exception("The class $className was not found in $file");
+ // throwing an error here causes Matomo to show the safe mode instead of showing an exception fatal only
+ // that makes it possible to deactivate / uninstall a broken plugin to recover Matomo directly
+ throw new \Error("The class $className was not found in $file");
}
if (in_array($className, $classNames)) {
@@ -545,14 +546,6 @@ class Updater
}
/**
- * @deprecated since Piwik 3.0.0, use {@link executeMigrations()} instead.
- */
- public function executeMigrationQueries($file, $migrationQueries)
- {
- $this->executeMigrations($file, $migrationQueries);
- }
-
- /**
* Execute multiple migration queries from a single Update file.
*
* @param string $file The path to the Updates file.
@@ -637,7 +630,7 @@ class Updater
*/
public static function updateDatabase($file, $sqlarray)
{
- self::$activeInstance->executeMigrationQueries($file, $sqlarray);
+ self::$activeInstance->executeMigrations($file, $sqlarray);
}
/**
diff --git a/core/Updater/Migration.php b/core/Updater/Migration.php
index 6a6fa3a8e2..b6009bb4b7 100644
--- a/core/Updater/Migration.php
+++ b/core/Updater/Migration.php
@@ -7,7 +7,6 @@
*/
namespace Piwik\Updater;
-use Piwik\Db;
use Exception;
/**
diff --git a/core/Updater/Migration/Db/DropIndex.php b/core/Updater/Migration/Db/DropIndex.php
index 5f6c98ebff..c1509b8ad4 100644
--- a/core/Updater/Migration/Db/DropIndex.php
+++ b/core/Updater/Migration/Db/DropIndex.php
@@ -7,8 +7,6 @@
*/
namespace Piwik\Updater\Migration\Db;
-use Piwik\Db;
-
/**
* @see Factory::dropIndex()
* @ignore
diff --git a/core/Updater/Migration/Db/DropTable.php b/core/Updater/Migration/Db/DropTable.php
index 63c6567390..84e71c38f1 100644
--- a/core/Updater/Migration/Db/DropTable.php
+++ b/core/Updater/Migration/Db/DropTable.php
@@ -7,8 +7,6 @@
*/
namespace Piwik\Updater\Migration\Db;
-use Piwik\Db;
-
/**
* @see Factory::dropTable()
* @ignore
diff --git a/core/Updater/Migration/Db/Insert.php b/core/Updater/Migration/Db/Insert.php
index 0867129227..d4453fe386 100644
--- a/core/Updater/Migration/Db/Insert.php
+++ b/core/Updater/Migration/Db/Insert.php
@@ -7,7 +7,6 @@
*/
namespace Piwik\Updater\Migration\Db;
use Piwik\Common;
-use Piwik\Db;
/**
* @see Factory::insert()
diff --git a/core/Updater/Migration/Db/Sql.php b/core/Updater/Migration/Db/Sql.php
index 4510075008..fad808054a 100644
--- a/core/Updater/Migration/Db/Sql.php
+++ b/core/Updater/Migration/Db/Sql.php
@@ -8,7 +8,6 @@
namespace Piwik\Updater\Migration\Db;
use Piwik\Common;
use Piwik\Db;
-use Piwik\Updater\Migration as MigrationInterface;
use Piwik\Updater\Migration\Db as DbMigration;
/**
diff --git a/core/Updater/Migration/Factory.php b/core/Updater/Migration/Factory.php
index 776e889bee..3c4cc36e92 100644
--- a/core/Updater/Migration/Factory.php
+++ b/core/Updater/Migration/Factory.php
@@ -7,8 +7,6 @@
*/
namespace Piwik\Updater\Migration;
-use Interop\Container\ContainerInterface;
-use Piwik\Common;
use Piwik\Updater\Migration\Db\Factory as DbFactory;
use Piwik\Updater\Migration\Plugin\Factory as PluginFactory;
diff --git a/core/Updater/Migration/Plugin/Factory.php b/core/Updater/Migration/Plugin/Factory.php
index b6e97b8cd1..f320fb11b8 100644
--- a/core/Updater/Migration/Plugin/Factory.php
+++ b/core/Updater/Migration/Plugin/Factory.php
@@ -58,4 +58,19 @@ class Factory
'pluginName' => $pluginName
));
}
+
+ /**
+ * Uninstalls the given plugin during an update.
+ *
+ * If the plugin is still active or if any other error occurs it will be ignored.
+ *
+ * @param string $pluginName
+ * @return Uninstall
+ */
+ public function uninstall($pluginName)
+ {
+ return $this->container->make('Piwik\Updater\Migration\Plugin\Uninstall', array(
+ 'pluginName' => $pluginName
+ ));
+ }
}
diff --git a/core/Updater/Migration/Plugin/Uninstall.php b/core/Updater/Migration/Plugin/Uninstall.php
new file mode 100644
index 0000000000..77e95d2f24
--- /dev/null
+++ b/core/Updater/Migration/Plugin/Uninstall.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Updater\Migration\Plugin;
+
+use Piwik\Config;
+use Piwik\Plugin;
+use Piwik\Updater\Migration;
+
+/**
+ * Uninstalls the given plugin during the update
+ */
+class Uninstall extends Migration
+{
+ /**
+ * @var string
+ */
+ private $pluginName;
+
+ /**
+ * @var Plugin\Manager
+ */
+ private $pluginManager;
+
+ public function __construct(Plugin\Manager $pluginManager, $pluginName)
+ {
+ $this->pluginManager = $pluginManager;
+ $this->pluginName = $pluginName;
+ }
+
+ public function __toString()
+ {
+ $domain = Config::getLocalConfigPath() == Config::getDefaultLocalConfigPath() ? '' : Config::getHostname();
+ $domainArg = !empty($domain) ? "--matomo-domain=\"$domain\" " : '';
+
+ return sprintf('./console %splugin:uninstall "%s"', $domainArg, $this->pluginName);
+ }
+
+ public function shouldIgnoreError($exception)
+ {
+ return true;
+ }
+
+ public function exec()
+ {
+ $this->pluginManager->uninstallPlugin($this->pluginName);
+ }
+
+}
diff --git a/core/Updates.php b/core/Updates.php
index b458f70e77..a44038ea18 100644
--- a/core/Updates.php
+++ b/core/Updates.php
@@ -20,32 +20,10 @@ use Piwik\Updater\Migration;
* method if you need to run SQL queries. Override the {@link doUpdate()} method to do other types
* of updating, eg, to activate/deactivate plugins or create files.
*
- * If you define SQL queries in {@link getMigrationQueries()}, you have to call {@link Updater::executeMigrationQueries()},
- * eg:
- *
- * public function doUpdate(Updater $updater)
- * {
- * $updater->executeMigrationQueries(__FILE__, $this->getMigrationQueries());
- * }
- *
* @example core/Updates/0.4.2.php
*/
abstract class Updates
{
- /**
- * @deprecated since v2.12.0 use getMigrationQueries() instead. Will be removed in Piwik 4.0.0
- */
- public static function getSql()
- {
- return array();
- }
-
- /**
- * @deprecated since v2.12.0 use doUpdate() instead. Will be removed in Piwik 4.0.0
- */
- public static function update()
- {
- }
/**
* Return migrations to be executed in this update.
@@ -60,19 +38,7 @@ abstract class Updates
*/
public function getMigrations(Updater $updater)
{
- return $this->getMigrationQueries($updater);
- }
-
- /**
- * Return SQL to be executed in this update.
- *
- * @param Updater $updater
- * @return array
- * @deprecated since Piwik 3.0.0, implement {@link getMigrations()} instead. Will be removed in Piwik 4.0.0
- */
- public function getMigrationQueries(Updater $updater)
- {
- return static::getSql();
+ return array();
}
/**
@@ -88,7 +54,6 @@ abstract class Updates
*/
public function doUpdate(Updater $updater)
{
- static::update();
}
/**
diff --git a/core/Updates/1.5-b1.php b/core/Updates/1.5-b1.php
index 5ba1204f9b..abec02aeac 100644
--- a/core/Updates/1.5-b1.php
+++ b/core/Updates/1.5-b1.php
@@ -9,7 +9,6 @@
namespace Piwik\Updates;
-use Piwik\Common;
use Piwik\Updater;
use Piwik\Updates;
use Piwik\Updater\Migration\Factory as MigrationFactory;
diff --git a/core/Updates/2.10.0-b5.php b/core/Updates/2.10.0-b5.php
index d33cbac760..328502a540 100644
--- a/core/Updates/2.10.0-b5.php
+++ b/core/Updates/2.10.0-b5.php
@@ -11,7 +11,6 @@ namespace Piwik\Updates;
use Piwik\Common;
use Piwik\DataAccess\ArchiveTableCreator;
-use Piwik\DataTable;
use Piwik\Db;
use Piwik\Updater;
use Piwik\Updates;
diff --git a/core/Updates/2.14.0-b2.php b/core/Updates/2.14.0-b2.php
index 5a7af21b98..22335d3972 100644
--- a/core/Updates/2.14.0-b2.php
+++ b/core/Updates/2.14.0-b2.php
@@ -11,7 +11,6 @@ namespace Piwik\Updates;
use Piwik\Updater;
use Piwik\Updates;
-use Piwik\Db;
use Piwik\Updater\Migration\Factory as MigrationFactory;
class Updates_2_14_0_b2 extends Updates
diff --git a/core/Updates/2.14.2.php b/core/Updates/2.14.2.php
index 4cbcc452bd..b2fbe91c4d 100644
--- a/core/Updates/2.14.2.php
+++ b/core/Updates/2.14.2.php
@@ -15,7 +15,6 @@ use Piwik\Option;
use Piwik\Plugin\Dimension\ActionDimension;
use Piwik\Plugin\Dimension\ConversionDimension;
use Piwik\Plugin\Dimension\VisitDimension;
-use Piwik\Tracker\Visit;
use Piwik\Updater;
use Piwik\Updates;
use Piwik\Updater\Migration\Factory as MigrationFactory;
diff --git a/core/Updates/2.15.0-b12.php b/core/Updates/2.15.0-b12.php
index 21265a7e6a..24d2fa1bbf 100644
--- a/core/Updates/2.15.0-b12.php
+++ b/core/Updates/2.15.0-b12.php
@@ -9,7 +9,6 @@
namespace Piwik\Updates;
use Piwik\Config;
-use Piwik\UpdateCheck;
use Piwik\Updater;
use Piwik\Updates;
diff --git a/core/Updates/2.15.0-b17.php b/core/Updates/2.15.0-b17.php
index 2aa5bce413..1c4502fde3 100644
--- a/core/Updates/2.15.0-b17.php
+++ b/core/Updates/2.15.0-b17.php
@@ -22,7 +22,7 @@ class Updates_2_15_0_b17 extends Updates
* Perform the incremental version update.
*
* This method should perform all updating logic. If you define queries in an overridden `getMigrationQueries()`
- * method, you must call {@link Updater::executeMigrationQueries()} here.
+ * method, you must call {@link Updater::executeMigrations()} here.
*
* See {@link Updates} for an example.
*
diff --git a/core/Updates/2.15.0-b20.php b/core/Updates/2.15.0-b20.php
index eb6aa37ffb..222c1ccdb9 100644
--- a/core/Updates/2.15.0-b20.php
+++ b/core/Updates/2.15.0-b20.php
@@ -23,7 +23,7 @@ class Updates_2_15_0_b20 extends Updates
* Perform the incremental version update.
*
* This method should perform all updating logic. If you define queries in an overridden `getMigrationQueries()`
- * method, you must call {@link Updater::executeMigrationQueries()} here.
+ * method, you must call {@link Updater::executeMigrations()} here.
*
* See {@link Updates} for an example.
*
diff --git a/core/Updates/2.16.3-b2.php b/core/Updates/2.16.3-b2.php
index 968fcb75d5..0c0afaed86 100644
--- a/core/Updates/2.16.3-b2.php
+++ b/core/Updates/2.16.3-b2.php
@@ -21,7 +21,7 @@ class Updates_2_16_3_b2 extends PiwikUpdates
public function doUpdate(Updater $updater)
{
try {
- \Piwik\Plugin\Manager::getInstance()->activatePlugin('CustomPiwikJs');
+ \Piwik\Plugin\Manager::getInstance()->activatePlugin('CustomJsTracker');
} catch (\Exception $e) {
}
}
diff --git a/core/Updates/2.16.3-rc2.php b/core/Updates/2.16.3-rc2.php
index 42e8bb749d..0b90ddfee8 100644
--- a/core/Updates/2.16.3-rc2.php
+++ b/core/Updates/2.16.3-rc2.php
@@ -8,10 +8,6 @@
*/
namespace Piwik\Updates;
-use Piwik\Plugins\ScheduledReports\API as ScheduledReportsAPI;
-use Piwik\Plugins\ScheduledReports\Model as ScheduledReportsModel;
-use Piwik\Site;
-use Piwik\Updater;
use Piwik\Updates as PiwikUpdates;
/**
diff --git a/core/Updates/3.0.0-b3.php b/core/Updates/3.0.0-b3.php
index a9e23f7ffd..44f652e409 100644
--- a/core/Updates/3.0.0-b3.php
+++ b/core/Updates/3.0.0-b3.php
@@ -12,7 +12,6 @@ namespace Piwik\Updates;
use Piwik\Config;
use Piwik\Plugin;
use Piwik\Updater;
-use Piwik\Updates as PiwikUpdates;
use Piwik\Updates;
class Updates_3_0_0_b3 extends Updates
diff --git a/core/Updates/3.10.0-b2.php b/core/Updates/3.10.0-b2.php
index e67490b6c0..1625a1db0a 100644
--- a/core/Updates/3.10.0-b2.php
+++ b/core/Updates/3.10.0-b2.php
@@ -11,7 +11,6 @@ namespace Piwik\Updates;
use Piwik\Updater;
use Piwik\Updates as PiwikUpdates;
-use Piwik\Updater\Migration;
use Piwik\Updater\Migration\Factory as MigrationFactory;
/**
diff --git a/core/Updates/3.11.0-b1.php b/core/Updates/3.11.0-b1.php
index 0fbe7b5000..e72a7d2570 100644
--- a/core/Updates/3.11.0-b1.php
+++ b/core/Updates/3.11.0-b1.php
@@ -11,7 +11,6 @@ namespace Piwik\Updates;
use Piwik\Updater;
use Piwik\Updates as PiwikUpdates;
-use Piwik\Updater\Migration;
use Piwik\Updater\Migration\Factory as MigrationFactory;
/**
diff --git a/core/Updates/3.12.0-b1.php b/core/Updates/3.12.0-b1.php
index 347a588946..75bcf381c8 100644
--- a/core/Updates/3.12.0-b1.php
+++ b/core/Updates/3.12.0-b1.php
@@ -11,7 +11,6 @@ namespace Piwik\Updates;
use Piwik\Updater;
use Piwik\Updates as PiwikUpdates;
-use Piwik\Updater\Migration;
use Piwik\Updater\Migration\Factory as MigrationFactory;
/**
diff --git a/core/Updates/3.5.1-b1.php b/core/Updates/3.5.1-b1.php
index 94a674d2f8..372b260869 100644
--- a/core/Updates/3.5.1-b1.php
+++ b/core/Updates/3.5.1-b1.php
@@ -12,7 +12,6 @@ namespace Piwik\Updates;
use Piwik\Filesystem;
use Piwik\Notification;
use Piwik\Plugin\Manager;
-use Piwik\SettingsServer;
use Piwik\Updater;
use Piwik\Updates as PiwikUpdates;
diff --git a/core/Updates/3.6.0-b3.php b/core/Updates/3.6.0-b3.php
index df68234600..47210592ec 100644
--- a/core/Updates/3.6.0-b3.php
+++ b/core/Updates/3.6.0-b3.php
@@ -9,7 +9,6 @@
namespace Piwik\Updates;
-use Piwik\Common;
use Piwik\Updater\Migration\Factory as MigrationFactory;
use Piwik\Updater;
use Piwik\Updates;
diff --git a/core/Updates/3.6.1-b2.php b/core/Updates/3.6.1-b2.php
index 6014e35bb6..d279a51808 100644
--- a/core/Updates/3.6.1-b2.php
+++ b/core/Updates/3.6.1-b2.php
@@ -9,7 +9,6 @@
namespace Piwik\Updates;
-use Piwik\Common;
use Piwik\Updater\Migration\Factory as MigrationFactory;
use Piwik\Updates;
use Piwik\Updater;
diff --git a/core/Updates/3.8.0-b3.php b/core/Updates/3.8.0-b3.php
index 0455683138..93a29a94a2 100644
--- a/core/Updates/3.8.0-b3.php
+++ b/core/Updates/3.8.0-b3.php
@@ -16,7 +16,6 @@ use Piwik\Plugin;
use Piwik\Updater;
use Piwik\Updates as PiwikUpdates;
use Piwik\Updater\Migration\Factory as MigrationFactory;
-use Piwik\Plugins\UsersManager\Model;
class Updates_3_8_0_b3 extends PiwikUpdates
{
diff --git a/core/Updates/4.0.0-b1.php b/core/Updates/4.0.0-b1.php
index 8fa33ba36b..c38b1a1eb5 100644
--- a/core/Updates/4.0.0-b1.php
+++ b/core/Updates/4.0.0-b1.php
@@ -9,9 +9,11 @@
namespace Piwik\Updates;
+use Piwik\Common;
+use Piwik\Config;
+use Piwik\Plugins\UserCountry\LocationProvider;
use Piwik\Updater;
use Piwik\Updates as PiwikUpdates;
-use Piwik\Updater\Migration;
use Piwik\Updater\Migration\Factory as MigrationFactory;
/**
@@ -31,17 +33,59 @@ class Updates_4_0_0_b1 extends PiwikUpdates
public function getMigrations(Updater $updater)
{
- $migration1 = $this->migration->db->changeColumnType('log_action', 'name', 'VARCHAR(4096)');
- $migration2 = $this->migration->db->changeColumnType('log_conversion', 'url', 'VARCHAR(4096)');
+ $migrations = [];
+ $migrations[] = $this->migration->db->changeColumnType('log_action', 'name', 'VARCHAR(4096)');
+ $migrations[] = $this->migration->db->changeColumnType('log_conversion', 'url', 'VARCHAR(4096)');
- return array(
- $migration1,
- $migration2
- );
+ $customTrackerPluginActive = false;
+ if (in_array('CustomPiwikJs', Config::getInstance()->Plugins['Plugins'])) {
+ $customTrackerPluginActive = true;
+ }
+
+ $migrations[] = $this->migration->plugin->activate('BulkTracking');
+ $migrations[] = $this->migration->plugin->deactivate('CustomPiwikJs');
+ $migrations[] = $this->migration->plugin->uninstall('CustomPiwikJs');
+
+ if ($customTrackerPluginActive) {
+ $migrations[] = $this->migration->plugin->activate('CustomJsTracker');
+ }
+
+ // Move the site search fields of log_visit out of custom variables into their own fields
+ $migrations[] = $this->migration->db->addColumn('log_link_visit_action', 'search_cat', 'VARCHAR(200) NULL');
+ $migrations[] = $this->migration->db->addColumn('log_link_visit_action', 'search_count', 'INTEGER(10) UNSIGNED NULL');
+ $visitActionTable = Common::prefixTable('log_link_visit_action');
+ $migrations[] = $this->migration->db->sql("UPDATE $visitActionTable SET search_cat = custom_var_v4 WHERE custom_var_k4 = '_pk_scat'");
+ $migrations[] = $this->migration->db->sql("UPDATE $visitActionTable SET search_count = custom_var_v5 WHERE custom_var_k5 = '_pk_scount'");
+
+ if ($this->usesGeoIpLegacyLocationProvider()) {
+ // activate GeoIp2 plugin for users still using GeoIp2 Legacy (others might have it disabled on purpose)
+ $migrations[] = $this->migration->plugin->activate('GeoIp2');
+ }
+
+ // remove old options
+ $migrations[] = $this->migration->db->sql('DELETE FROM `' . Common::prefixTable('option') . '` WHERE option_name IN ("geoip.updater_period", "geoip.loc_db_url", "geoip.isp_db_url", "geoip.org_db_url")');
+
+ return $migrations;
}
public function doUpdate(Updater $updater)
{
$updater->executeMigrations(__FILE__, $this->getMigrations($updater));
+
+ if ($this->usesGeoIpLegacyLocationProvider()) {
+ // switch to default provider if GeoIp Legacy was still in use
+ LocationProvider::setCurrentProvider(LocationProvider\DefaultProvider::ID);
+ }
+ }
+
+ protected function usesGeoIpLegacyLocationProvider()
+ {
+ $currentProvider = LocationProvider::getCurrentProviderId();
+
+ return in_array($currentProvider, [
+ 'geoip_pecl',
+ 'geoip_php',
+ 'geoip_serverbased',
+ ]);
}
}
diff --git a/core/Url.php b/core/Url.php
index 8d87f5e929..834d4c7062 100644
--- a/core/Url.php
+++ b/core/Url.php
@@ -9,7 +9,7 @@
namespace Piwik;
use Exception;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
/**
* Provides URL related helper methods.
@@ -613,8 +613,8 @@ class Url
*/
public static function getHostSanitized($host)
{
- if (!class_exists("Piwik\\Network\\IPUtils")) {
- throw new Exception("Piwik\\Network\\IPUtils could not be found, maybe you are using Matomo from git and need to update Composer. $ php composer.phar update");
+ if (!class_exists("Matomo\\Network\\IPUtils")) {
+ throw new Exception("Matomo\\Network\\IPUtils could not be found, maybe you are using Matomo from git and need to update Composer. $ php composer.phar update");
}
return IPUtils::sanitizeIp($host);
}
diff --git a/core/Validators/IdSite.php b/core/Validators/IdSite.php
index 99ef3e382e..bcb71b2eac 100644
--- a/core/Validators/IdSite.php
+++ b/core/Validators/IdSite.php
@@ -9,9 +9,7 @@
namespace Piwik\Validators;
-use Piwik\Piwik;
use Piwik\Site;
-use Piwik\UrlHelper;
class IdSite extends BaseValidator
{
diff --git a/core/Validators/IpRanges.php b/core/Validators/IpRanges.php
index 5e52f3751b..0bb6b7893c 100644
--- a/core/Validators/IpRanges.php
+++ b/core/Validators/IpRanges.php
@@ -9,7 +9,7 @@
namespace Piwik\Validators;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Piwik;
class IpRanges extends BaseValidator
diff --git a/core/Version.php b/core/Version.php
index 80fad681ff..3ed1f570a7 100644
--- a/core/Version.php
+++ b/core/Version.php
@@ -20,7 +20,8 @@ final class Version
* The current Matomo version.
* @var string
*/
- const VERSION = '3.13.4-b2';
+ const VERSION = '4.0.0-b1';
+ const MAJOR_VERSION = 4;
public function isStableVersion($version)
{
diff --git a/core/View.php b/core/View.php
index fba7366e4c..a35903e3da 100644
--- a/core/View.php
+++ b/core/View.php
@@ -11,7 +11,6 @@ namespace Piwik;
use Exception;
use Piwik\AssetManager\UIAssetCacheBuster;
use Piwik\Container\StaticContainer;
-use Piwik\Plugins\UsersManager\API as APIUsersManager;
use Piwik\View\ViewInterface;
use Twig_Environment;
@@ -124,6 +123,15 @@ class View implements ViewInterface
private $useStrictReferrerPolicy = true;
/**
+ * Can be disabled to not send headers when rendering a view. This can be useful if heaps of views are being
+ * rendered during one request to possibly prevent a segmentation fault see eg #15307 . It should not be disabled
+ * for a main view, but could be disabled for views that are being rendered eg during a twig event as a "subview" which
+ * is part of the "main view".
+ * @var bool
+ */
+ public $sendHeadersWhenRendering = true;
+
+ /**
* Constructor.
*
* @param string $templateFile The template file to load. Must be in the following format:
@@ -275,21 +283,23 @@ class View implements ViewInterface
// can fail, for example at installation (no plugin loaded yet)
}
- ProxyHttp::overrideCacheControlHeaders('no-store');
+ if ($this->sendHeadersWhenRendering) {
+ ProxyHttp::overrideCacheControlHeaders('no-store');
- Common::sendHeader('Content-Type: ' . $this->contentType);
- // always sending this header, sometimes empty, to ensure that Dashboard embed loads
- // - when calling sendHeader() multiple times, the last one prevails
- if(!empty($this->xFrameOptions)) {
- Common::sendHeader('X-Frame-Options: ' . (string)$this->xFrameOptions);
- }
+ Common::sendHeader('Content-Type: ' . $this->contentType);
+ // always sending this header, sometimes empty, to ensure that Dashboard embed loads
+ // - when calling sendHeader() multiple times, the last one prevails
+ if(!empty($this->xFrameOptions)) {
+ Common::sendHeader('X-Frame-Options: ' . (string)$this->xFrameOptions);
+ }
- // don't send Referer-Header for outgoing links
- if (!empty($this->useStrictReferrerPolicy)) {
- Common::sendHeader('Referrer-Policy: same-origin');
- } else {
- // always send explicit default header
- Common::sendHeader('Referrer-Policy: no-referrer-when-downgrade');
+ // don't send Referer-Header for outgoing links
+ if (!empty($this->useStrictReferrerPolicy)) {
+ Common::sendHeader('Referrer-Policy: same-origin');
+ } else {
+ // always send explicit default header
+ Common::sendHeader('Referrer-Policy: no-referrer-when-downgrade');
+ }
}
return $this->renderTwigTemplate();
diff --git a/core/ViewDataTable/Request.php b/core/ViewDataTable/Request.php
index 265d057de4..c582d702cd 100644
--- a/core/ViewDataTable/Request.php
+++ b/core/ViewDataTable/Request.php
@@ -11,8 +11,6 @@ namespace Piwik\ViewDataTable;
use Piwik\API\Request as ApiRequest;
use Piwik\Common;
-use Piwik\DataTable;
-use Piwik\Period;
class Request
{
diff --git a/core/Visualization/Sparkline.php b/core/Visualization/Sparkline.php
index f564fbf46c..635d9f6fbb 100644
--- a/core/Visualization/Sparkline.php
+++ b/core/Visualization/Sparkline.php
@@ -57,7 +57,13 @@ class Sparkline implements ViewInterface
public function main()
{
- $sparkline = new \Davaxi\Sparkline();
+ try {
+ $sparkline = new \Davaxi\Sparkline();
+ } catch (\Exception $exception) {
+ // Ignore GD not installed exception
+ return;
+ }
+
$thousandSeparator = Piwik::translate('Intl_NumberSymbolGroup');
$decimalSeparator = Piwik::translate('Intl_NumberSymbolDecimal');
@@ -205,7 +211,9 @@ class Sparkline implements ViewInterface
}
public function render() {
- $this->sparkline->display();
- $this->sparkline->destroy();
+ if ($this->sparkline instanceof \Davaxi\Sparkline) {
+ $this->sparkline->display();
+ $this->sparkline->destroy();
+ }
}
}
diff --git a/core/Widget/WidgetsList.php b/core/Widget/WidgetsList.php
index 6636c605d8..6f998071f4 100644
--- a/core/Widget/WidgetsList.php
+++ b/core/Widget/WidgetsList.php
@@ -8,7 +8,6 @@
*/
namespace Piwik\Widget;
-use Piwik\Cache as PiwikCache;
use Piwik\Container\StaticContainer;
use Piwik\Development;
use Piwik\Piwik;
diff --git a/core/testMinimumPhpVersion.php b/core/testMinimumPhpVersion.php
index f79290c1fd..4508fe9e82 100644
--- a/core/testMinimumPhpVersion.php
+++ b/core/testMinimumPhpVersion.php
@@ -21,7 +21,7 @@ $piwik_errorMessage = '';
// 2) tests/travis/generator/Generator.php
// 3) composer.json (in two places)
// 4) tests/PHPUnit/Integration/ReleaseCheckListTest.php
-$piwik_minimumPHPVersion = '5.5.9';
+$piwik_minimumPHPVersion = '7.2.0';
$piwik_currentPHPVersion = PHP_VERSION;
$minimumPhpInvalid = version_compare($piwik_minimumPHPVersion, $piwik_currentPHPVersion) > 0;
if ($minimumPhpInvalid) {
diff --git a/js/piwik.js b/js/piwik.js
index 3d353a384d..31e05210de 100644
--- a/js/piwik.js
+++ b/js/piwik.js
@@ -19,6 +19,7 @@
* Incompatible with these (and earlier) versions of:
* - IE4 - try..catch and for..in introduced in IE5
* - IE5 - named anonymous functions, array.push, encodeURIComponent, decodeURIComponent, and getElementsByTagName introduced in IE5.5
+ * - IE6 and 7 - window.JSON introduced in IE8
* - Firefox 1.0 and Netscape 8.x - FF1.5 adds array.indexOf, among other things
* - Mozilla 1.7 and Netscape 6.x-7.x
* - Netscape 4.8
@@ -26,933 +27,8 @@
* - Opera 7
*/
-/*global JSON_PIWIK:true */
-
-if (typeof JSON_PIWIK !== 'object' && typeof window.JSON === 'object' && window.JSON.stringify && window.JSON.parse) {
- JSON_PIWIK = window.JSON;
-} else {
- (function () {
- // we make sure to not break any site that uses JSON3 as well as we do not know if they run it in conflict mode
- // or not.
- var exports = {};
-
- // Create a JSON object only if one does not already exist. We create the
- // methods in a closure to avoid creating global variables.
-
- /*! 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 = typeof define === "function" && define.amd;
-
- // 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);
- /************************************************************
- * end JSON
- ************************************************************/
-
- JSON_PIWIK = exports;
-
- })();
-}
-
/* startjslint */
/*jslint browser:true, plusplus:true, vars:true, nomen:true, evil:true, regexp: false, bitwise: true, white: true */
-/*global JSON_PIWIK */
/*global window */
/*global unescape */
/*global ActiveXObject */
@@ -989,7 +65,7 @@ if (typeof JSON_PIWIK !== 'object' && typeof window.JSON === 'object' && window.
setCampaignNameKey, setCampaignKeywordKey,
getConsentRequestsQueue, requireConsent, getRememberedConsent, hasRememberedConsent, isConsentRequired,
setConsentGiven, rememberConsentGiven, forgetConsentGiven, unload, hasConsent,
- discardHashTag, alwaysUseSendBeacon,
+ discardHashTag, alwaysUseSendBeacon, disableAlwaysUseSendBeacon,
setCookieNamePrefix, setCookieDomain, setCookiePath, setSecureCookie, setVisitorIdCookie, getCookieDomain, hasCookies, setSessionCookie,
setVisitorCookieTimeout, setSessionCookieTimeout, setReferralCookieTimeout, getCookie, getCookiePath, getSessionCookieTimeout,
setConversionAttributionFirstReferrer, tracker, request,
@@ -1016,7 +92,7 @@ if (typeof JSON_PIWIK !== 'object' && typeof window.JSON === 'object' && window.
CONTENT_ATTR, CONTENT_CLASS, CONTENT_NAME_ATTR, CONTENT_PIECE_ATTR, CONTENT_PIECE_CLASS,
CONTENT_TARGET_ATTR, CONTENT_TARGET_CLASS, CONTENT_IGNOREINTERACTION_ATTR, CONTENT_IGNOREINTERACTION_CLASS,
trackCallbackOnLoad, trackCallbackOnReady, buildContentImpressionsRequests, wasContentImpressionAlreadyTracked,
- getQuery, getContent, setVisitorId, getContentImpressionsRequestsFromNodes, buildContentInteractionTrackingRedirectUrl,
+ getQuery, getContent, setVisitorId, getContentImpressionsRequestsFromNodes,
buildContentInteractionRequestNode, buildContentInteractionRequest, buildContentImpressionRequest,
appendContentInteractionToRequestIfPossible, setupInteractionsTracking, trackContentImpressionClickInteraction,
internalIsNodeVisible, clearTrackedContentImpressions, getTrackerUrl, trackAllContentImpressions,
@@ -1025,8 +101,8 @@ if (typeof JSON_PIWIK !== 'object' && typeof window.JSON === 'object' && window.
trackContentInteractionNode, trackContentImpressionsWithinNode, trackContentImpression,
enableTrackOnlyVisibleContent, trackContentInteraction, clearEnableTrackOnlyVisibleContent, logAllContentBlocksOnPage,
trackVisibleContentImpressions, isTrackOnlyVisibleContentEnabled, port, isUrlToCurrentDomain, piwikTrackers,
- isNodeAuthorizedToTriggerInteraction, replaceHrefIfInternalLink, getConfigDownloadExtensions, disableLinkTracking,
- substr, setAnyAttribute, wasContentTargetAttrReplaced, max, abs, childNodes, compareDocumentPosition, body,
+ isNodeAuthorizedToTriggerInteraction, getConfigDownloadExtensions, disableLinkTracking,
+ substr, setAnyAttribute, max, abs, childNodes, compareDocumentPosition, body,
getConfigVisitorCookieTimeout, getRemainingVisitorCookieTimeout, getDomains, getConfigCookiePath,
getConfigIdPageView, newVisitor, uuid, createTs, visitCount, currentVisitTs, lastVisitTs, lastEcommerceOrderTs,
"", "\b", "\t", "\n", "\f", "\r", "\"", "\\", apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
@@ -3096,7 +2172,7 @@ if (typeof window.Piwik !== 'object') {
configTrackerPause = 500,
// If enabled, always use sendBeacon if the browser supports it
- configAlwaysUseSendBeacon = false,
+ configAlwaysUseSendBeacon = true,
// Minimum visit time after initial page view (in milliseconds)
configMinimumVisitTime,
@@ -4027,7 +3103,7 @@ if (typeof window.Piwik !== 'object') {
cookie = getCookie(cookieName);
if (cookie.length) {
- cookie = JSON_PIWIK.parse(cookie);
+ cookie = windowAlias.JSON.parse(cookie);
if (isObject(cookie)) {
return cookie;
@@ -4056,7 +3132,7 @@ if (typeof window.Piwik !== 'object') {
return hash(
(navigatorAlias.userAgent || '') +
(navigatorAlias.platform || '') +
- JSON_PIWIK.stringify(browserFeatures) +
+ windowAlias.JSON.stringify(browserFeatures) +
(new Date()).getTime() +
Math.random()
).slice(0, 16);
@@ -4068,7 +3144,7 @@ if (typeof window.Piwik !== 'object') {
return hash(
(navigatorAlias.userAgent || '') +
(navigatorAlias.platform || '') +
- JSON_PIWIK.stringify(browserFeatures)).slice(0, 6);
+ windowAlias.JSON.stringify(browserFeatures)).slice(0, 6);
}
function getCurrentTimestampInSeconds()
@@ -4294,7 +3370,7 @@ if (typeof window.Piwik !== 'object') {
if (cookie.length) {
try {
- cookie = JSON_PIWIK.parse(cookie);
+ cookie = windowAlias.JSON.parse(cookie);
if (isObject(cookie)) {
return cookie;
}
@@ -4511,7 +3587,7 @@ if (typeof window.Piwik !== 'object') {
purify(referralUrl.slice(0, referralUrlMaxLength))
];
- setCookie(cookieReferrerName, JSON_PIWIK.stringify(attributionCookie), configReferralCookieTimeout, configCookiePath, configCookieDomain);
+ setCookie(cookieReferrerName, windowAlias.JSON.stringify(attributionCookie), configReferralCookieTimeout, configCookiePath, configCookieDomain, configCookieIsSecure);
}
}
@@ -4572,14 +3648,14 @@ if (typeof window.Piwik !== 'object') {
// custom data
if (customData) {
- request += '&data=' + encodeWrapper(JSON_PIWIK.stringify(customData));
+ request += '&data=' + encodeWrapper(windowAlias.JSON.stringify(customData));
} else if (configCustomData) {
- request += '&data=' + encodeWrapper(JSON_PIWIK.stringify(configCustomData));
+ request += '&data=' + encodeWrapper(windowAlias.JSON.stringify(configCustomData));
}
// Custom Variables, scope "page"
function appendCustomVariablesToRequest(customVariables, parameterName) {
- var customVariablesStringified = JSON_PIWIK.stringify(customVariables);
+ var customVariablesStringified = windowAlias.JSON.stringify(customVariables);
if (customVariablesStringified.length > 2) {
return '&' + parameterName + '=' + encodeWrapper(customVariablesStringified);
}
@@ -4606,7 +3682,7 @@ if (typeof window.Piwik !== 'object') {
}
if (configStoreCustomVariablesInCookie) {
- setCookie(cookieCustomVariablesName, JSON_PIWIK.stringify(customVariables), configSessionCookieTimeout, configCookiePath, configCookieDomain);
+ setCookie(cookieCustomVariablesName, windowAlias.JSON.stringify(customVariables), configSessionCookieTimeout, configCookiePath, configCookieDomain, configCookieIsSecure);
}
}
@@ -4729,7 +3805,7 @@ if (typeof window.Piwik !== 'object') {
items.push(ecommerceItems[sku]);
}
}
- request += '&ec_items=' + encodeWrapper(JSON_PIWIK.stringify(items));
+ request += '&ec_items=' + encodeWrapper(windowAlias.JSON.stringify(items));
}
request = getRequest(request, configCustomData, 'ecommerce', lastEcommerceOrderTs);
sendRequest(request, configTrackerPause);
@@ -4848,10 +3924,6 @@ if (typeof window.Piwik !== 'object') {
var href = query.getAttributeValueFromNode(sourceElement, 'href');
- if (startsUrlWithTrackerUrl(href)) {
- return;
- }
-
var originalSourcePath = sourceElement.pathname || getPathName(sourceElement.href);
// browsers, such as Safari, don't downcase hostname and href
@@ -4886,28 +3958,6 @@ if (typeof window.Piwik !== 'object') {
return getRequest(params, null, 'contentInteraction');
}
- function buildContentInteractionTrackingRedirectUrl(url, contentInteraction, contentName, contentPiece, contentTarget)
- {
- if (!isDefined(url)) {
- return;
- }
-
- if (startsUrlWithTrackerUrl(url)) {
- return url;
- }
-
- var redirectUrl = content.toAbsoluteUrl(url);
- var request = 'redirecturl=' + encodeWrapper(redirectUrl) + '&';
- request += buildContentInteractionRequest(contentInteraction, contentName, contentPiece, (contentTarget || url));
-
- var separator = '&';
- if (configTrackerUrl.indexOf('?') < 0) {
- separator = '?';
- }
-
- return configTrackerUrl + separator + request;
- }
-
function isNodeAuthorizedToTriggerInteraction(contentNode, interactedNode)
{
if (!contentNode || !interactedNode) {
@@ -4987,81 +4037,6 @@ if (typeof window.Piwik !== 'object') {
return false;
}
- function replaceHrefIfInternalLink(contentBlock)
- {
- if (!contentBlock) {
- return false;
- }
-
- var targetNode = content.findTargetNode(contentBlock);
-
- if (!targetNode || content.shouldIgnoreInteraction(targetNode)) {
- return false;
- }
-
- var link = getLinkIfShouldBeProcessed(targetNode);
-
- if (linkTrackingEnabled && link && link.type) {
-
- return false; // will be handled via outlink or download.
- }
-
- if (query.isLinkElement(targetNode) &&
- query.hasNodeAttributeWithValue(targetNode, 'href')) {
- var url = String(query.getAttributeValueFromNode(targetNode, 'href'));
-
- if (0 === url.indexOf('#')) {
- return false;
- }
-
- if (startsUrlWithTrackerUrl(url)) {
- return true;
- }
-
- if (!content.isUrlToCurrentDomain(url)) {
- return false;
- }
-
- var block = content.buildContentBlock(contentBlock);
-
- if (!block) {
- return;
- }
-
- var contentName = block.name;
- var contentPiece = block.piece;
- var contentTarget = block.target;
-
- if (!query.hasNodeAttributeWithValue(targetNode, content.CONTENT_TARGET_ATTR) || targetNode.wasContentTargetAttrReplaced) {
- // make sure we still track the correct content target when an interaction is happening
- targetNode.wasContentTargetAttrReplaced = true;
- contentTarget = content.toAbsoluteUrl(url);
- query.setAnyAttribute(targetNode, content.CONTENT_TARGET_ATTR, contentTarget);
- }
-
- var targetUrl = buildContentInteractionTrackingRedirectUrl(url, 'click', contentName, contentPiece, contentTarget);
-
- // location.href does not respect target=_blank so we prefer to use this
- content.setHrefAttribute(targetNode, targetUrl);
-
- return true;
- }
-
- return false;
- }
-
- function replaceHrefsIfInternalLink(contentNodes)
- {
- if (!contentNodes || !contentNodes.length) {
- return;
- }
-
- var index;
- for (index = 0; index < contentNodes.length; index++) {
- replaceHrefIfInternalLink(contentNodes[index]);
- }
- }
-
function trackContentImpressionClickInteraction (targetNode)
{
return function (event) {
@@ -5084,47 +4059,23 @@ if (typeof window.Piwik !== 'object') {
return;
}
- setExpireDateTime(configTrackerPause);
-
- if (query.isLinkElement(targetNode) &&
- query.hasNodeAttributeWithValue(targetNode, 'href') &&
- query.hasNodeAttributeWithValue(targetNode, content.CONTENT_TARGET_ATTR)) {
- // there is a href attribute, the link was replaced with piwik.php but later the href was changed again by the application.
- var href = query.getAttributeValueFromNode(targetNode, 'href');
- if (!startsUrlWithTrackerUrl(href) && targetNode.wasContentTargetAttrReplaced) {
- query.setAnyAttribute(targetNode, content.CONTENT_TARGET_ATTR, '');
- }
- }
-
- var link = getLinkIfShouldBeProcessed(targetNode);
-
- if (linkTrackingInstalled && link && link.type) {
- // click ignore, will be tracked via processClick, we do not want to track it twice
-
- return link.type;
- }
-
- if (replaceHrefIfInternalLink(contentBlock)) {
- return 'href';
+ if (!contentBlock) {
+ return false;
}
- var block = content.buildContentBlock(contentBlock);
+ var theTargetNode = content.findTargetNode(contentBlock);
- if (!block) {
- return;
+ if (!theTargetNode || content.shouldIgnoreInteraction(theTargetNode)) {
+ return false;
}
- var contentName = block.name;
- var contentPiece = block.piece;
- var contentTarget = block.target;
+ var link = getLinkIfShouldBeProcessed(theTargetNode);
- // click on any non link element, or on a link element that has not an href attribute or on an anchor
- var request = buildContentInteractionRequest('click', contentName, contentPiece, contentTarget);
- if (request) {
- sendRequest(request, configTrackerPause);
+ if (linkTrackingEnabled && link && link.type) {
+ return link.type; // will be handled via outlink or download.
}
- return request;
+ return trackerInstance.trackContentInteractionNode(interactedElement, 'click');
};
}
@@ -5171,7 +4122,6 @@ if (typeof window.Piwik !== 'object') {
return [];
}
- replaceHrefsIfInternalLink(contentNodes);
setupInteractionsTracking(contentNodes);
var requests = [];
@@ -5822,7 +4772,6 @@ if (typeof window.Piwik !== 'object') {
this.buildContentImpressionRequest = buildContentImpressionRequest;
this.buildContentInteractionRequest = buildContentInteractionRequest;
this.buildContentInteractionRequestNode = buildContentInteractionRequestNode;
- this.buildContentInteractionTrackingRedirectUrl = buildContentInteractionTrackingRedirectUrl;
this.getContentImpressionsRequestsFromNodes = getContentImpressionsRequestsFromNodes;
this.getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet = getCurrentlyVisibleContentImpressionsRequestsIfNotTrackedYet;
this.trackCallbackOnLoad = trackCallbackOnLoad;
@@ -5834,7 +4783,6 @@ if (typeof window.Piwik !== 'object') {
this.trackContentImpressionClickInteraction = trackContentImpressionClickInteraction;
this.internalIsNodeVisible = isVisible;
this.isNodeAuthorizedToTriggerInteraction = isNodeAuthorizedToTriggerInteraction;
- this.replaceHrefIfInternalLink = replaceHrefIfInternalLink;
this.getDomains = function () {
return configHostsAlias;
};
@@ -5909,7 +4857,7 @@ if (typeof window.Piwik !== 'object') {
* To access specific data point, you should use the other functions getAttributionReferrer* and getAttributionCampaign*
*
* @return array Attribution array, Example use:
- * 1) Call JSON_PIWIK.stringify(piwikTracker.getAttributionInfo())
+ * 1) Call windowAlias.JSON.stringify(piwikTracker.getAttributionInfo())
* 2) Pass this json encoded string to the Tracking API (php or java client): setAttributionInfo()
*/
this.getAttributionInfo = function () {
@@ -6787,6 +5735,14 @@ if (typeof window.Piwik !== 'object') {
};
/**
+ * Disables send beacon usage instead and instead enables using regular XHR when possible. This makes
+ * callbacks work and also tracking requests will appear in the browser developer tools console.
+ */
+ this.disableAlwaysUseSendBeacon = function () {
+ configAlwaysUseSendBeacon = false;
+ };
+
+ /**
* Add click listener to a specific link element.
* When clicked, Piwik will log the click automatically.
*
@@ -7231,12 +6187,16 @@ if (typeof window.Piwik !== 'object') {
return;
}
+ var theRequest = null;
+
trackCallback(function () {
- var request = buildContentInteractionRequestNode(domNode, contentInteraction);
- if (request) {
- sendRequest(request, configTrackerPause);
+ theRequest = buildContentInteractionRequestNode(domNode, contentInteraction);
+ if (theRequest) {
+ sendRequest(theRequest, configTrackerPause);
}
});
+ //note: return value is only for tests... will only work if dom is already ready...
+ return theRequest;
};
/**
@@ -7309,7 +6269,7 @@ if (typeof window.Piwik !== 'object') {
if (!isDefined(category) || category === null || category === false || !category.length) {
category = "";
} else if (category instanceof Array) {
- category = JSON_PIWIK.stringify(category);
+ category = windowAlias.JSON.stringify(category);
}
customVariablesPage[5] = ['_pkc', category];
@@ -7825,7 +6785,7 @@ if (typeof window.Piwik !== 'object') {
Piwik = {
initialized: false,
- JSON: JSON_PIWIK,
+ JSON: windowAlias.JSON,
/**
* DOM Document related methods
diff --git a/js/piwik.min.js b/js/piwik.min.js
index ce23fb3bcc..73dc8589eb 100644
--- a/js/piwik.min.js
+++ b/js/piwik.min.js
@@ -8,70 +8,59 @@
* @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
* @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
*/
-;if(typeof JSON_PIWIK!=="object"&&typeof window.JSON==="object"&&window.JSON.stringify&&window.JSON.parse){JSON_PIWIK=window.JSON}else{(function(){var a={};
-/*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
-(function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());
-var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
-}catch(ae){aj=false}}ad=aj}if(ac=="json-parse"){var ag=V.parse;if(typeof ag=="function"){try{if(ag("0")===0&&!ag(false)){ak=ag(ah);var af=ak.a.length==5&&ak.a[0]===1;if(af){try{af=!ag('"\t"')}catch(ae){}if(af){try{af=ag("01")!==1}catch(ae){}}if(af){try{af=ag("1.")!==1}catch(ae){}}}}}catch(ae){af=false}}ad=af}}}return o[ac]=!!ad}if(!o("json")){var U="[object Function]",Q="[object Date]",N="[object Number]",O="[object String]",E="[object Array]",A="[object Boolean]";var F=o("bug-string-char-index");if(!B){var s=J.floor;var Z=[0,31,59,90,120,151,181,212,243,273,304,334];var D=function(ac,ad){return Z[ad]+365*(ac-1970)+s((ac-1969+(ad=+(ad>1)))/4)-s((ac-1901+ad)/100)+s((ac-1601+ad)/400)}}if(!(r=n.hasOwnProperty)){r=function(ae){var ac={},ad;if((ac.__proto__=null,ac.__proto__={toString:1},ac).toString!=u){r=function(ah){var ag=this.__proto__,af=ah in (this.__proto__=null,this);this.__proto__=ag;return af}}else{ad=ac.constructor;r=function(ag){var af=(this.constructor||ad).prototype;return ag in this&&!(ag in af&&this[ag]===af[ag])
-}}ac=null;return r.call(this,ae)}}m=function(ae,ah){var af=0,ac,ad,ag;(ac=function(){this.valueOf=0}).prototype.valueOf=0;ad=new ac();for(ag in ad){if(r.call(ad,ag)){af++}}ac=ad=null;if(!af){ad=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];m=function(aj,an){var am=u.call(aj)==U,al,ak;var ai=!am&&typeof aj.constructor!="function"&&e[typeof aj.hasOwnProperty]&&aj.hasOwnProperty||r;for(al in aj){if(!(am&&al=="prototype")&&ai.call(aj,al)){an(al)}}for(ak=ad.length;al=ad[--ak];ai.call(aj,al)&&an(al)){}}}else{if(af==2){m=function(aj,am){var ai={},al=u.call(aj)==U,ak;for(ak in aj){if(!(al&&ak=="prototype")&&!r.call(ai,ak)&&(ai[ak]=1)&&r.call(aj,ak)){am(ak)}}}}else{m=function(aj,am){var al=u.call(aj)==U,ak,ai;for(ak in aj){if(!(al&&ak=="prototype")&&r.call(aj,ak)&&!(ai=ak==="constructor")){am(ak)}}if(ai||r.call(aj,(ak="constructor"))){am(ak)}}}}return m(ae,ah)};if(!o("json-stringify")){var q={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};
-var I="000000";var t=function(ac,ad){return(I+(ad||0)).slice(-ac)};var z="\\u00";var C=function(ai){var ad='"',ag=0,ah=ai.length,ac=!F||ah>10;var af=ac&&(F?ai.split(""):ai);for(;ag<ah;ag++){var ae=ai.charCodeAt(ag);switch(ae){case 8:case 9:case 10:case 12:case 13:case 34:case 92:ad+=q[ae];break;default:if(ae<32){ad+=z+t(2,ae.toString(16));break}ad+=ac?af[ag]:ai.charAt(ag)}}return ad+'"'};var p=function(ai,aA,ag,al,ax,ac,aj){var at,ae,ap,az,ay,ak,aw,au,aq,an,ar,ad,ah,af,av,ao;try{at=aA[ai]}catch(am){}if(typeof at=="object"&&at){ae=u.call(at);if(ae==Q&&!r.call(at,"toJSON")){if(at>-1/0&&at<1/0){if(D){ay=s(at/86400000);for(ap=s(ay/365.2425)+1970-1;D(ap+1,0)<=ay;ap++){}for(az=s((ay-D(ap,0))/30.42);D(ap,az+1)<=ay;az++){}ay=1+ay-D(ap,az);ak=(at%86400000+86400000)%86400000;aw=s(ak/3600000)%24;au=s(ak/60000)%60;aq=s(ak/1000)%60;an=ak%1000}else{ap=at.getUTCFullYear();az=at.getUTCMonth();ay=at.getUTCDate();aw=at.getUTCHours();au=at.getUTCMinutes();aq=at.getUTCSeconds();an=at.getUTCMilliseconds()}at=(ap<=0||ap>=10000?(ap<0?"-":"+")+t(6,ap<0?-ap:ap):t(4,ap))+"-"+t(2,az+1)+"-"+t(2,ay)+"T"+t(2,aw)+":"+t(2,au)+":"+t(2,aq)+"."+t(3,an)+"Z"
-}else{at=null}}else{if(typeof at.toJSON=="function"&&((ae!=N&&ae!=O&&ae!=E)||r.call(at,"toJSON"))){at=at.toJSON(ai)}}}if(ag){at=ag.call(aA,ai,at)}if(at===null){return"null"}ae=u.call(at);if(ae==A){return""+at}else{if(ae==N){return at>-1/0&&at<1/0?""+at:"null"}else{if(ae==O){return C(""+at)}}}if(typeof at=="object"){for(af=aj.length;af--;){if(aj[af]===at){throw aa()}}aj.push(at);ar=[];av=ac;ac+=ax;if(ae==E){for(ah=0,af=at.length;ah<af;ah++){ad=p(ah,at,ag,al,ax,ac,aj);ar.push(ad===L?"null":ad)}ao=ar.length?(ax?"[\n"+ac+ar.join(",\n"+ac)+"\n"+av+"]":("["+ar.join(",")+"]")):"[]"}else{m(al||at,function(aC){var aB=p(aC,at,ag,al,ax,ac,aj);if(aB!==L){ar.push(C(aC)+":"+(ax?" ":"")+aB)}});ao=ar.length?(ax?"{\n"+ac+ar.join(",\n"+ac)+"\n"+av+"}":("{"+ar.join(",")+"}")):"{}"}aj.pop();return ao}};V.stringify=function(ac,ae,af){var ad,al,aj,ai;if(e[typeof ae]&&ae){if((ai=u.call(ae))==U){al=ae}else{if(ai==E){aj={};for(var ah=0,ag=ae.length,ak;ah<ag;ak=ae[ah++],((ai=u.call(ak)),ai==O||ai==N)&&(aj[ak]=1)){}}}}if(af){if((ai=u.call(af))==N){if((af-=af%1)>0){for(ad="",af>10&&(af=10);
-ad.length<af;ad+=" "){}}}else{if(ai==O){ad=af.length<=10?af:af.slice(0,10)}}}return p("",(ak={},ak[""]=ac,ak),al,aj,ad,"",[])}}if(!o("json-parse")){var M=R.fromCharCode;var l={92:"\\",34:'"',47:"/",98:"\b",116:"\t",110:"\n",102:"\f",114:"\r"};var G,X;var H=function(){G=X=null;throw T()};var y=function(){var ah=X,af=ah.length,ag,ae,ac,ai,ad;while(G<af){ad=ah.charCodeAt(G);switch(ad){case 9:case 10:case 13:case 32:G++;break;case 123:case 125:case 91:case 93:case 58:case 44:ag=F?ah.charAt(G):ah[G];G++;return ag;case 34:for(ag="@",G++;G<af;){ad=ah.charCodeAt(G);if(ad<32){H()}else{if(ad==92){ad=ah.charCodeAt(++G);switch(ad){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:ag+=l[ad];G++;break;case 117:ae=++G;for(ac=G+4;G<ac;G++){ad=ah.charCodeAt(G);if(!(ad>=48&&ad<=57||ad>=97&&ad<=102||ad>=65&&ad<=70)){H()}}ag+=M("0x"+ah.slice(ae,G));break;default:H()}}else{if(ad==34){break}ad=ah.charCodeAt(G);ae=G;while(ad>=32&&ad!=92&&ad!=34){ad=ah.charCodeAt(++G)}ag+=ah.slice(ae,G)}}}if(ah.charCodeAt(G)==34){G++;
-return ag}H();default:ae=G;if(ad==45){ai=true;ad=ah.charCodeAt(++G)}if(ad>=48&&ad<=57){if(ad==48&&((ad=ah.charCodeAt(G+1)),ad>=48&&ad<=57)){H()}ai=false;for(;G<af&&((ad=ah.charCodeAt(G)),ad>=48&&ad<=57);G++){}if(ah.charCodeAt(G)==46){ac=++G;for(;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}ad=ah.charCodeAt(G);if(ad==101||ad==69){ad=ah.charCodeAt(++G);if(ad==43||ad==45){G++}for(ac=G;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}return +ah.slice(ae,G)}if(ai){H()}if(ah.slice(G,G+4)=="true"){G+=4;return true}else{if(ah.slice(G,G+5)=="false"){G+=5;return false}else{if(ah.slice(G,G+4)=="null"){G+=4;return null}}}H()}}return"$"};var W=function(ad){var ac,ae;if(ad=="$"){H()}if(typeof ad=="string"){if((F?ad.charAt(0):ad[0])=="@"){return ad.slice(1)}if(ad=="["){ac=[];for(;;ae||(ae=true)){ad=y();if(ad=="]"){break}if(ae){if(ad==","){ad=y();if(ad=="]"){H()}}else{H()}}if(ad==","){H()}ac.push(W(ad))}return ac}else{if(ad=="{"){ac={};for(;;ae||(ae=true)){ad=y();
-if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON_PIWIK=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Matomo=window.Piwik=(function(){var r,b={},y={},G=document,h=navigator,X=screen,T=window,i=T.performance||T.mozPerformance||T.msPerformance||T.webkitPerformance,t=T.encodeURIComponent,S=T.decodeURIComponent,l=unescape,I=[],E,e,ah=[],x=0,ab=0,U=0,m=false;
-function p(ao){try{return S(ao)}catch(ap){return unescape(ao)}}function J(ap){var ao=typeof ap;return ao!=="undefined"}function A(ao){return typeof ao==="function"}function W(ao){return typeof ao==="object"}function w(ao){return typeof ao==="string"||ao instanceof String}function ag(ao){return typeof ao==="number"||ao instanceof Number}function Y(ao){return J(ao)&&(ag(ao)||(w(ao)&&ao.length))}function B(ap){if(!ap){return true}var ao;var aq=true;for(ao in ap){if(Object.prototype.hasOwnProperty.call(ap,ao)){aq=false}}return aq}function ak(ao){var ap=typeof console;if(ap!=="undefined"&&console&&console.error){console.error(ao)}}function af(){var au,at,aw,ap,ao;for(au=0;au<arguments.length;au+=1){ao=null;if(arguments[au]&&arguments[au].slice){ao=arguments[au].slice()}ap=arguments[au];aw=ap.shift();var av,aq;var ar=w(aw)&&aw.indexOf("::")>0;if(ar){av=aw.split("::");aq=av[0];aw=av[1];if("object"===typeof e[aq]&&"function"===typeof e[aq][aw]){e[aq][aw].apply(e[aq],ap)}else{if(ao){ah.push(ao)}}}else{for(at=0;
-at<I.length;at++){if(w(aw)){aq=I[at];var ax=aw.indexOf(".")>0;if(ax){av=aw.split(".");if(aq&&"object"===typeof aq[av[0]]){aq=aq[av[0]];aw=av[1]}else{if(ao){ah.push(ao);break}}}if(aq[aw]){aq[aw].apply(aq,ap)}else{var ay="The method '"+aw+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: https://developer.piwik.org/api-reference/tracking-javascript';ak(ay);if(!ax){throw new TypeError(ay)}}if(aw==="addTracker"){break}if(aw==="setTrackerUrl"||aw==="setSiteId"){break}}else{aw.apply(I[at],ap)}}}}}function an(ar,aq,ap,ao){if(ar.addEventListener){ar.addEventListener(aq,ap,ao);return true}if(ar.attachEvent){return ar.attachEvent("on"+aq,ap)}ar["on"+aq]=ap}function n(ao){if(G.readyState==="complete"){ao()}else{if(T.addEventListener){T.addEventListener("load",ao,false)}else{if(T.attachEvent){T.attachEvent("onload",ao)}}}}function q(ar){var ao=false;if(G.attachEvent){ao=G.readyState==="complete"}else{ao=G.readyState!=="loading"}if(ao){ar();return}var aq;if(G.addEventListener){an(G,"DOMContentLoaded",function ap(){G.removeEventListener("DOMContentLoaded",ap,false);
-if(!ao){ao=true;ar()}})}else{if(G.attachEvent){G.attachEvent("onreadystatechange",function ap(){if(G.readyState==="complete"){G.detachEvent("onreadystatechange",ap);if(!ao){ao=true;ar()}}});if(G.documentElement.doScroll&&T===T.top){(function ap(){if(!ao){try{G.documentElement.doScroll("left")}catch(at){setTimeout(ap,0);return}ao=true;ar()}}())}}}an(T,"load",function(){if(!ao){ao=true;ar()}},false)}function ac(ap,av,aw){if(!ap){return""}var ao="",ar,aq,at,au;for(ar in b){if(Object.prototype.hasOwnProperty.call(b,ar)){au=b[ar]&&"function"===typeof b[ar][ap];if(au){aq=b[ar][ap];at=aq(av||{},aw);if(at){ao+=at}}}}return ao}function ai(){var ao;m=true;ac("unload");if(r){do{ao=new Date()}while(ao.getTimeAlias()<r)}}function o(aq,ap){var ao=G.createElement("script");ao.type="text/javascript";ao.src=aq;if(ao.readyState){ao.onreadystatechange=function(){var ar=this.readyState;if(ar==="loaded"||ar==="complete"){ao.onreadystatechange=null;ap()}}}else{ao.onload=ap}G.getElementsByTagName("head")[0].appendChild(ao)
-}function K(){var ao="";try{ao=T.top.document.referrer}catch(aq){if(T.parent){try{ao=T.parent.document.referrer}catch(ap){ao=""}}}if(ao===""){ao=G.referrer}return ao}function s(ao){var aq=new RegExp("^([a-z]+):"),ap=aq.exec(ao);return ap?ap[1]:null}function d(ao){var aq=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),ap=aq.exec(ao);return ap?ap[1]:ao}function aj(ap,ao){ap=String(ap);return ap.lastIndexOf(ao,0)===0}function R(ap,ao){ap=String(ap);return ap.indexOf(ao,ap.length-ao.length)!==-1}function z(ap,ao){ap=String(ap);return ap.indexOf(ao)!==-1}function g(ap,ao){ap=String(ap);return ap.substr(0,ap.length-ao)}function F(ar,aq,au){ar=String(ar);if(!au){au=""}var ao=ar.indexOf("#");var av=ar.length;if(ao===-1){ao=av}var at=ar.substr(0,ao);var ap=ar.substr(ao,av-ao);if(at.indexOf("?")===-1){at+="?"}else{if(!R(at,"?")){at+="&"}}return at+t(aq)+"="+t(au)+ap}function k(ap,aq){ap=String(ap);if(ap.indexOf("?"+aq+"=")===-1&&ap.indexOf("&"+aq+"=")===-1){return ap}var ar=ap.indexOf("?");
-if(ar===-1){return ap}var ao=ap.substr(ar+1);var aw=ap.substr(0,ar);if(ao){var ax="";var az=ao.indexOf("#");if(az!==-1){ax=ao.substr(az+1);ao=ao.substr(0,az)}var at;var av=ao.split("&");var au=av.length-1;for(au;au>=0;au--){at=av[au].split("=")[0];if(at===aq){av.splice(au,1)}}var ay=av.join("&");if(ay){aw=aw+"?"+ay}if(ax){aw+="#"+ax}}return aw}function f(aq,ap){var ao="[\\?&#]"+ap+"=([^&#]*)";var at=new RegExp(ao);var ar=at.exec(aq);return ar?S(ar[1]):""}function a(ao){if(ao&&String(ao)===ao){return ao.replace(/^\s+|\s+$/g,"")}return ao}function D(ao){return unescape(t(ao))}function am(aE){var aq=function(aK,aJ){return(aK<<aJ)|(aK>>>(32-aJ))},aF=function(aM){var aK="",aL,aJ;for(aL=7;aL>=0;aL--){aJ=(aM>>>(aL*4))&15;aK+=aJ.toString(16)}return aK},au,aH,aG,ap=[],ay=1732584193,aw=4023233417,av=2562383102,at=271733878,ar=3285377520,aD,aC,aB,aA,az,aI,ao,ax=[];aE=D(aE);ao=aE.length;for(aH=0;aH<ao-3;aH+=4){aG=aE.charCodeAt(aH)<<24|aE.charCodeAt(aH+1)<<16|aE.charCodeAt(aH+2)<<8|aE.charCodeAt(aH+3);
-ax.push(aG)}switch(ao&3){case 0:aH=2147483648;break;case 1:aH=aE.charCodeAt(ao-1)<<24|8388608;break;case 2:aH=aE.charCodeAt(ao-2)<<24|aE.charCodeAt(ao-1)<<16|32768;break;case 3:aH=aE.charCodeAt(ao-3)<<24|aE.charCodeAt(ao-2)<<16|aE.charCodeAt(ao-1)<<8|128;break}ax.push(aH);while((ax.length&15)!==14){ax.push(0)}ax.push(ao>>>29);ax.push((ao<<3)&4294967295);for(au=0;au<ax.length;au+=16){for(aH=0;aH<16;aH++){ap[aH]=ax[au+aH]}for(aH=16;aH<=79;aH++){ap[aH]=aq(ap[aH-3]^ap[aH-8]^ap[aH-14]^ap[aH-16],1)}aD=ay;aC=aw;aB=av;aA=at;az=ar;for(aH=0;aH<=19;aH++){aI=(aq(aD,5)+((aC&aB)|(~aC&aA))+az+ap[aH]+1518500249)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=20;aH<=39;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+1859775393)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=40;aH<=59;aH++){aI=(aq(aD,5)+((aC&aB)|(aC&aA)|(aB&aA))+az+ap[aH]+2400959708)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=60;aH<=79;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+3395469782)&4294967295;az=aA;aA=aB;aB=aq(aC,30);
-aC=aD;aD=aI}ay=(ay+aD)&4294967295;aw=(aw+aC)&4294967295;av=(av+aB)&4294967295;at=(at+aA)&4294967295;ar=(ar+az)&4294967295}aI=aF(ay)+aF(aw)+aF(av)+aF(at)+aF(ar);return aI.toLowerCase()}function aa(aq,ao,ap){if(!aq){aq=""}if(!ao){ao=""}if(aq==="translate.googleusercontent.com"){if(ap===""){ap=ao}ao=f(ao,"u");aq=d(ao)}else{if(aq==="cc.bingj.com"||aq==="webcache.googleusercontent.com"||aq.slice(0,5)==="74.6."){ao=G.links[0].href;aq=d(ao)}}return[aq,ao,ap]}function L(ap){var ao=ap.length;if(ap.charAt(--ao)==="."){ap=ap.slice(0,ao)}if(ap.slice(0,2)==="*."){ap=ap.slice(1)}if(ap.indexOf("/")!==-1){ap=ap.substr(0,ap.indexOf("/"))}return ap}function al(ap){ap=ap&&ap.text?ap.text:ap;if(!w(ap)){var ao=G.getElementsByTagName("title");if(ao&&J(ao[0])){ap=ao[0].text}}return ap}function P(ao){if(!ao){return[]}if(!J(ao.children)&&J(ao.childNodes)){return ao.children}if(J(ao.children)){return ao.children}return[]}function V(ap,ao){if(!ap||!ao){return false}if(ap.contains){return ap.contains(ao)}if(ap===ao){return true
-}if(ap.compareDocumentPosition){return !!(ap.compareDocumentPosition(ao)&16)}return false}function M(aq,ar){if(aq&&aq.indexOf){return aq.indexOf(ar)}if(!J(aq)||aq===null){return -1}if(!aq.length){return -1}var ao=aq.length;if(ao===0){return -1}var ap=0;while(ap<ao){if(aq[ap]===ar){return ap}ap++}return -1}function j(aq){if(!aq){return false}function ao(at,au){if(T.getComputedStyle){return G.defaultView.getComputedStyle(at,null)[au]}if(at.currentStyle){return at.currentStyle[au]}}function ar(at){at=at.parentNode;while(at){if(at===G){return true}at=at.parentNode}return false}function ap(av,aB,at,ay,aw,az,ax){var au=av.parentNode,aA=1;if(!ar(av)){return false}if(9===au.nodeType){return true}if("0"===ao(av,"opacity")||"none"===ao(av,"display")||"hidden"===ao(av,"visibility")){return false}if(!J(aB)||!J(at)||!J(ay)||!J(aw)||!J(az)||!J(ax)){aB=av.offsetTop;aw=av.offsetLeft;ay=aB+av.offsetHeight;at=aw+av.offsetWidth;az=av.offsetWidth;ax=av.offsetHeight}if(aq===av&&(0===ax||0===az)&&"hidden"===ao(av,"overflow")){return false
-}if(au){if(("hidden"===ao(au,"overflow")||"scroll"===ao(au,"overflow"))){if(aw+aA>au.offsetWidth+au.scrollLeft||aw+az-aA<au.scrollLeft||aB+aA>au.offsetHeight+au.scrollTop||aB+ax-aA<au.scrollTop){return false}}if(av.offsetParent===au){aw+=au.offsetLeft;aB+=au.offsetTop}return ap(au,aB,at,ay,aw,az,ax)}return true}return ap(aq)}var ae={htmlCollectionToArray:function(aq){var ao=[],ap;if(!aq||!aq.length){return ao}for(ap=0;ap<aq.length;ap++){ao.push(aq[ap])}return ao},find:function(ao){if(!document.querySelectorAll||!ao){return[]}var ap=document.querySelectorAll(ao);return this.htmlCollectionToArray(ap)},findMultiple:function(aq){if(!aq||!aq.length){return[]}var ap,ar;var ao=[];for(ap=0;ap<aq.length;ap++){ar=this.find(aq[ap]);ao=ao.concat(ar)}ao=this.makeNodesUnique(ao);return ao},findNodesByTagName:function(ap,ao){if(!ap||!ao||!ap.getElementsByTagName){return[]}var aq=ap.getElementsByTagName(ao);return this.htmlCollectionToArray(aq)},makeNodesUnique:function(ao){var au=[].concat(ao);ao.sort(function(aw,av){if(aw===av){return 0
-}var ay=M(au,aw);var ax=M(au,av);if(ay===ax){return 0}return ay>ax?-1:1});if(ao.length<=1){return ao}var ap=0;var ar=0;var at=[];var aq;aq=ao[ap++];while(aq){if(aq===ao[ap]){ar=at.push(ap)}aq=ao[ap++]||null}while(ar--){ao.splice(at[ar],1)}return ao},getAttributeValueFromNode:function(at,aq){if(!this.hasNodeAttribute(at,aq)){return}if(at&&at.getAttribute){return at.getAttribute(aq)}if(!at||!at.attributes){return}var ar=(typeof at.attributes[aq]);if("undefined"===ar){return}if(at.attributes[aq].value){return at.attributes[aq].value}if(at.attributes[aq].nodeValue){return at.attributes[aq].nodeValue}var ap;var ao=at.attributes;if(!ao){return}for(ap=0;ap<ao.length;ap++){if(ao[ap].nodeName===aq){return ao[ap].nodeValue}}return null},hasNodeAttributeWithValue:function(ap,ao){var aq=this.getAttributeValueFromNode(ap,ao);return !!aq},hasNodeAttribute:function(aq,ao){if(aq&&aq.hasAttribute){return aq.hasAttribute(ao)}if(aq&&aq.attributes){var ap=(typeof aq.attributes[ao]);return"undefined"!==ap}return false
-},hasNodeCssClass:function(aq,ao){if(aq&&ao&&aq.className){var ap=typeof aq.className==="string"?aq.className.split(" "):[];if(-1!==M(ap,ao)){return true}}return false},findNodesHavingAttribute:function(at,aq,ao){if(!ao){ao=[]}if(!at||!aq){return ao}var ar=P(at);if(!ar||!ar.length){return ao}var ap,au;for(ap=0;ap<ar.length;ap++){au=ar[ap];if(this.hasNodeAttribute(au,aq)){ao.push(au)}ao=this.findNodesHavingAttribute(au,aq,ao)}return ao},findFirstNodeHavingAttribute:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeAttribute(aq,ap)){return aq}var ao=this.findNodesHavingAttribute(aq,ap);if(ao&&ao.length){return ao[0]}},findFirstNodeHavingAttributeWithValue:function(ar,aq){if(!ar||!aq){return}if(this.hasNodeAttributeWithValue(ar,aq)){return ar}var ao=this.findNodesHavingAttribute(ar,aq);if(!ao||!ao.length){return}var ap;for(ap=0;ap<ao.length;ap++){if(this.getAttributeValueFromNode(ao[ap],aq)){return ao[ap]}}},findNodesHavingCssClass:function(at,ar,ao){if(!ao){ao=[]}if(!at||!ar){return ao}if(at.getElementsByClassName){var au=at.getElementsByClassName(ar);
-return this.htmlCollectionToArray(au)}var aq=P(at);if(!aq||!aq.length){return[]}var ap,av;for(ap=0;ap<aq.length;ap++){av=aq[ap];if(this.hasNodeCssClass(av,ar)){ao.push(av)}ao=this.findNodesHavingCssClass(av,ar,ao)}return ao},findFirstNodeHavingClass:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeCssClass(aq,ap)){return aq}var ao=this.findNodesHavingCssClass(aq,ap);if(ao&&ao.length){return ao[0]}},isLinkElement:function(ap){if(!ap){return false}var ao=String(ap.nodeName).toLowerCase();var ar=["a","area"];var aq=M(ar,ao);return aq!==-1},setAnyAttribute:function(ap,ao,aq){if(!ap||!ao){return}if(ap.setAttribute){ap.setAttribute(ao,aq)}else{ap[ao]=aq}}};var v={CONTENT_ATTR:"data-track-content",CONTENT_CLASS:"piwikTrackContent",CONTENT_NAME_ATTR:"data-content-name",CONTENT_PIECE_ATTR:"data-content-piece",CONTENT_PIECE_CLASS:"piwikContentPiece",CONTENT_TARGET_ATTR:"data-content-target",CONTENT_TARGET_CLASS:"piwikContentTarget",CONTENT_IGNOREINTERACTION_ATTR:"data-content-ignoreinteraction",CONTENT_IGNOREINTERACTION_CLASS:"piwikContentIgnoreInteraction",location:undefined,findContentNodes:function(){var ap="."+this.CONTENT_CLASS;
-var ao="["+this.CONTENT_ATTR+"]";var aq=ae.findMultiple([ap,ao]);return aq},findContentNodesWithinNode:function(ar){if(!ar){return[]}var ap=ae.findNodesHavingCssClass(ar,this.CONTENT_CLASS);var ao=ae.findNodesHavingAttribute(ar,this.CONTENT_ATTR);if(ao&&ao.length){var aq;for(aq=0;aq<ao.length;aq++){ap.push(ao[aq])}}if(ae.hasNodeAttribute(ar,this.CONTENT_ATTR)){ap.push(ar)}else{if(ae.hasNodeCssClass(ar,this.CONTENT_CLASS)){ap.push(ar)}}ap=ae.makeNodesUnique(ap);return ap},findParentContentNode:function(ap){if(!ap){return}var aq=ap;var ao=0;while(aq&&aq!==G&&aq.parentNode){if(ae.hasNodeAttribute(aq,this.CONTENT_ATTR)){return aq}if(ae.hasNodeCssClass(aq,this.CONTENT_CLASS)){return aq}aq=aq.parentNode;if(ao>1000){break}ao++}},findPieceNode:function(ap){var ao;ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.findFirstNodeHavingClass(ap,this.CONTENT_PIECE_CLASS)}if(ao){return ao}return ap},findTargetNodeNoDefault:function(ao){if(!ao){return}var ap=ae.findFirstNodeHavingAttributeWithValue(ao,this.CONTENT_TARGET_ATTR);
-if(ap){return ap}ap=ae.findFirstNodeHavingAttribute(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingClass(ao,this.CONTENT_TARGET_CLASS);if(ap){return ap}},findTargetNode:function(ao){var ap=this.findTargetNodeNoDefault(ao);if(ap){return ap}return ao},findContentName:function(ap){if(!ap){return}var at=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_NAME_ATTR);if(at){return ae.getAttributeValueFromNode(at,this.CONTENT_NAME_ATTR)}var ao=this.findContentPiece(ap);if(ao){return this.removeDomainIfIsInLink(ao)}if(ae.hasNodeAttributeWithValue(ap,"title")){return ae.getAttributeValueFromNode(ap,"title")}var aq=this.findPieceNode(ap);if(ae.hasNodeAttributeWithValue(aq,"title")){return ae.getAttributeValueFromNode(aq,"title")}var ar=this.findTargetNode(ap);if(ae.hasNodeAttributeWithValue(ar,"title")){return ae.getAttributeValueFromNode(ar,"title")}},findContentPiece:function(ap){if(!ap){return}var ar=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_PIECE_ATTR);
-if(ar){return ae.getAttributeValueFromNode(ar,this.CONTENT_PIECE_ATTR)}var ao=this.findPieceNode(ap);var aq=this.findMediaUrlInNode(ao);if(aq){return this.toAbsoluteUrl(aq)}},findContentTarget:function(aq){if(!aq){return}var ar=this.findTargetNode(aq);if(ae.hasNodeAttributeWithValue(ar,this.CONTENT_TARGET_ATTR)){return ae.getAttributeValueFromNode(ar,this.CONTENT_TARGET_ATTR)}var ap;if(ae.hasNodeAttributeWithValue(ar,"href")){ap=ae.getAttributeValueFromNode(ar,"href");return this.toAbsoluteUrl(ap)}var ao=this.findPieceNode(aq);if(ae.hasNodeAttributeWithValue(ao,"href")){ap=ae.getAttributeValueFromNode(ao,"href");return this.toAbsoluteUrl(ap)}},isSameDomain:function(ao){if(!ao||!ao.indexOf){return false}if(0===ao.indexOf(this.getLocation().origin)){return true}var ap=ao.indexOf(this.getLocation().host);if(8>=ap&&0<=ap){return true}return false},removeDomainIfIsInLink:function(aq){var ap="^https?://[^/]+";var ao="^.*//[^/]+";if(aq&&aq.search&&-1!==aq.search(new RegExp(ap))&&this.isSameDomain(aq)){aq=aq.replace(new RegExp(ao),"");
-if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq=["img","embed","video","audio"];var ao=at.nodeName.toLowerCase();if(-1!==M(aq,ao)&&ae.findFirstNodeHavingAttributeWithValue(at,"src")){var ar=ae.findFirstNodeHavingAttributeWithValue(at,"src");return ae.getAttributeValueFromNode(ar,"src")}if(ao==="object"&&ae.hasNodeAttributeWithValue(at,"data")){return ae.getAttributeValueFromNode(at,"data")}if(ao==="object"){var au=ae.findNodesByTagName(at,"param");if(au&&au.length){var ap;for(ap=0;ap<au.length;ap++){if("movie"===ae.getAttributeValueFromNode(au[ap],"name")&&ae.hasNodeAttributeWithValue(au[ap],"value")){return ae.getAttributeValueFromNode(au[ap],"value")}}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;
-if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]
-}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
-}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
-if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
-try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")+";SameSite=Lax"}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
-if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
-var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
-dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
-}function ay(){if(dc()){bQ()}bJ()}function df(){if(aN||!a5){return}aN=true;an(T,"focus",ba);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aN&&dc()){bQ()}}})}function cB(dm){var dj=new Date();var di=dj.getTime();cX=di;if(cA&&di<cA){var dk=cA-di;setTimeout(dm,dk);cf(dk+50);cA+=50;return}if(cA===false){var dl=800;cA=di+dl}dm()}function aO(){if(aC(cK)){bA=false}else{if(aC(bd)){bA=true}}}function bE(dj,di,dk){aO();if(!bA){cI.push(dj);return}if(!cO&&dj){if(cz&&bA){dj+="&consent=1"}cB(function(){if(cV&&a6(dj,dk)){cf(100);return}if(c9==="POST"||String(dj).length>2000){c3(dj,dk)}else{cp(dj,dk)}cf(di)})}if(!aN){df()}}function cj(di){if(cO){return false}return(di&&di.length)}function c2(di,dm){if(!dm||dm>=di.length){return[di]}var dj=0;var dk=di.length;var dl=[];for(dj;dj<dk;dj+=dm){dl.push(di.slice(dj,dj+dm))}return dl}function de(dj,di){if(!cj(dj)){return}if(!bA){cI.push(dj);return}cB(function(){var dm=c2(dj,50);var dk=0,dl;for(dk;dk<dm.length;dk++){dl='{"requests":["?'+dm[dk].join('","?')+'"]}';
-c3(dl,null,false)}cf(di)})}function aT(di){return bj+di+"."+b5+"."+bn}function bX(dk,dj,di){dd(dk,"",-86400,dj,di)}function b4(){if(bk){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var di=bj+"testcookie";dd(di,"1",undefined,bo,cW,bR);var dj=aC(di)==="1"?"1":"0";bX(di);return dj}function bh(){bn=b6((cW||cT)+(bo||"/")).slice(0,4)}function cF(){if(J(c7.res)){return c7}var dj,dl,dm={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dj in dm){if(Object.prototype.hasOwnProperty.call(dm,dj)){dl=h.mimeTypes[dm[dj]];c7[dj]=(dl&&dl.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c7.java="1"
-}if(A(T.GearsFactory)){c7.gears="1"}c7.cookie=b4()}var dk=parseInt(X.width,10);var di=parseInt(X.height,10);c7.res=parseInt(dk,10)+"x"+parseInt(di,10);return c7}function bW(){var dj=aT("cvar"),di=aC(dj);if(di.length){di=JSON_PIWIK.parse(di);if(W(di)){return di}}return{}}function cC(){if(aQ===false){aQ=bW()}}function cP(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)).slice(0,6)}function bf(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dj=bf();var dk=az();var di=String(dj)+dk;return di}function c1(dk){dk=String(dk);var dn=az();var dl=dn.length;var dm=dk.substr(-1*dl,dl);var dj=parseInt(dk.substr(0,dk.length-dl),10);if(dj&&dm&&dm===dn){var di=bf();if(aZ<=0){return true}if(di>=dj&&di<=(dj+aZ)){return true}}return false}function dg(di){if(!cL){return""}var dm=f(di,av);if(!dm){return""}dm=String(dm);
-var dk=new RegExp("^[a-zA-Z0-9]+$");if(dm.length===32&&dk.test(dm)){var dj=dm.substr(16,32);if(c1(dj)){var dl=dm.substr(0,16);return dl}}return""}function cM(){if(!bN){bN=dg(bM)}var dk=new Date(),di=Math.round(dk.getTime()/1000),dj=aT("id"),dn=aC(dj),dm,dl;if(dn){dm=dn.split(".");dm.unshift("0");if(bN.length){dm[1]=bN}return dm}if(bN.length){dl=bN}else{if("0"===b4()){dl=""}else{dl=cP()}}dm=["1",dl,di,0,di,"",""];return dm}function aY(){var dq=cM(),dl=dq[0],dm=dq[1],dj=dq[2],di=dq[3],dn=dq[4],dk=dq[5];if(!J(dq[6])){dq[6]=""}var dp=dq[6];return{newVisitor:dl,uuid:dm,createTs:dj,visitCount:di,currentVisitTs:dn,lastVisitTs:dk,lastEcommerceOrderTs:dp}}function aG(){var dl=new Date(),dj=dl.getTime(),dm=aY().createTs;var di=parseInt(dm,10);var dk=(di*1000)+cH-dj;return dk}function aL(di){if(!b5){return}var dk=new Date(),dj=Math.round(dk.getTime()/1000);if(!J(di)){di=aY()}var dl=di.uuid+"."+di.createTs+"."+di.visitCount+"."+dj+"."+di.lastVisitTs+"."+di.lastEcommerceOrderTs;dd(aT("id"),dl,aG(),bo,cW,bR)
-}function bL(){var di=aC(aT("ref"));if(di.length){try{di=JSON_PIWIK.parse(di);if(W(di)){return di}}catch(dj){}}return["","",0,""]}function bv(dj){var di="testvalue";dd("test",di,10000,null,dj);if(aC("test")===di){bX("test",null,dj);return true}return false}function aE(){var dj=bk;bk=false;var di,dk;for(di=0;di<bt.length;di++){dk=aT(bt[di]);if(dk!==cK&&dk!==bd&&0!==aC(dk)){bX(dk,bo,cW)}}bk=dj}function b2(di){b5=di;aL()}function dh(dm){if(!dm||!W(dm)){return}var dl=[];var dk;for(dk in dm){if(Object.prototype.hasOwnProperty.call(dm,dk)){dl.push(dk)}}var dn={};dl.sort();var di=dl.length;var dj;for(dj=0;dj<di;dj++){dn[dl[dj]]=dm[dl[dj]]}return dn}function cc(){dd(aT("ses"),"1",co,bo,cW,bR)}function bg(){var dl="";var dj="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dk=dj.length;var di;for(di=0;di<6;di++){dl+=dj.charAt(Math.floor(Math.random()*dk))}return dl}function cs(dk,dG,dH,dl){var dF,dj=new Date(),dt=Math.round(dj.getTime()/1000),dq,dE,dm=1024,dN,du,dC=aQ,dn=aT("ses"),dA=aT("ref"),dx=aT("cvar"),dy=aC(dn),dD=bL(),dJ=a4||bM,dr,di;
-if(bk){aE()}if(cO){return""}var dz=aY();if(!J(dl)){dl=""}var dw=G.characterSet||G.charset;if(!dw||dw.toLowerCase()==="utf-8"){dw=null}dr=dD[0];di=dD[1];dq=dD[2];dE=dD[3];if(!dy){var dI=co/1000;if(!dz.lastVisitTs||(dt-dz.lastVisitTs)>dI){dz.visitCount++;dz.lastVisitTs=dz.currentVisitTs}if(!bu||!dr.length){for(dF in cq){if(Object.prototype.hasOwnProperty.call(cq,dF)){dr=f(dJ,cq[dF]);if(dr.length){break}}}for(dF in bF){if(Object.prototype.hasOwnProperty.call(bF,dF)){di=f(dJ,bF[dF]);if(di.length){break}}}}dN=d(bm);du=dE.length?d(dE):"";if(dN.length&&!aV(dN)&&(!bu||!du.length||aV(du))){dE=bm}if(dE.length||dr.length){dq=dt;dD=[dr,di,dq,b1(dE.slice(0,dm))];dd(dA,JSON_PIWIK.stringify(dD),c4,bo,cW)}}dk+="&idsite="+b5+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dj.getHours()+"&m="+dj.getMinutes()+"&s="+dj.getSeconds()+"&url="+t(b1(dJ))+(bm.length?"&urlref="+t(b1(bm)):"")+((bx&&bx.length)?"&uid="+t(bx):"")+"&_id="+dz.uuid+"&_idts="+dz.createTs+"&_idvc="+dz.visitCount+"&_idn="+dz.newVisitor+(dr.length?"&_rcn="+t(dr):"")+(di.length?"&_rck="+t(di):"")+"&_refts="+dq+"&_viewts="+dz.lastVisitTs+(String(dz.lastEcommerceOrderTs).length?"&_ects="+dz.lastEcommerceOrderTs:"")+(String(dE).length?"&_ref="+t(b1(dE.slice(0,dm))):"")+(dw?"&cs="+t(dw):"")+"&send_image=0";
-var dM=cF();for(dF in dM){if(Object.prototype.hasOwnProperty.call(dM,dF)){dk+="&"+dF+"="+dM[dF]}}var dL=[];if(dG){for(dF in dG){if(Object.prototype.hasOwnProperty.call(dG,dF)&&/^dimension\d+$/.test(dF)){var dp=dF.replace("dimension","");dL.push(parseInt(dp,10));dL.push(String(dp));dk+="&"+dF+"="+t(dG[dF]);delete dG[dF]}}}if(dG&&B(dG)){dG=null}for(dF in bl){if(Object.prototype.hasOwnProperty.call(bl,dF)){var dv=(-1===M(dL,dF));if(dv){dk+="&dimension"+dF+"="+t(bl[dF])}}}if(dG){dk+="&data="+t(JSON_PIWIK.stringify(dG))}else{if(ao){dk+="&data="+t(JSON_PIWIK.stringify(ao))}}function ds(dO,dP){var dQ=JSON_PIWIK.stringify(dO);if(dQ.length>2){return"&"+dP+"="+t(dQ)}return""}var dK=dh(bV);var dB=dh(cl);dk+=ds(dK,"cvar");dk+=ds(dB,"e_cvar");if(aQ){dk+=ds(aQ,"_cvar");for(dF in dC){if(Object.prototype.hasOwnProperty.call(dC,dF)){if(aQ[dF][0]===""||aQ[dF][1]===""){delete aQ[dF]}}}if(bP){dd(dx,JSON_PIWIK.stringify(aQ),co,bo,cW)}}if(a2){if(cm){dk+="&gt_ms="+cm}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dk+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
-}}}if(aK){dk+="&pv_id="+aK}dz.lastEcommerceOrderTs=J(dl)&&String(dl).length?dl:dz.lastEcommerceOrderTs;aL(dz);cc();dk+=ac(dH,{tracker:bH,request:dk});if(cY.length){dk+="&"+cY}if(A(ca)){dk=ca(dk)}return dk}bQ=function a7(){var di=new Date();di=di.getTime();if(!cX){return false}if((cX+(1000*c6))<=di){return false}if(cX+a5<=di){bH.ping();return true}return false};function bp(dl,dk,dr,dm,di,du){var dp="idgoal=0",dq,dj=new Date(),ds=[],dt,dn=String(dl).length;if(dn){dp+="&ec_id="+t(dl);dq=Math.round(dj.getTime()/1000)}dp+="&revenue="+dk;if(String(dr).length){dp+="&ec_st="+dr}if(String(dm).length){dp+="&ec_tx="+dm}if(String(di).length){dp+="&ec_sh="+di}if(String(du).length){dp+="&ec_dt="+du}if(cZ){for(dt in cZ){if(Object.prototype.hasOwnProperty.call(cZ,dt)){if(!J(cZ[dt][1])){cZ[dt][1]=""}if(!J(cZ[dt][2])){cZ[dt][2]=""}if(!J(cZ[dt][3])||String(cZ[dt][3]).length===0){cZ[dt][3]=0}if(!J(cZ[dt][4])||String(cZ[dt][4]).length===0){cZ[dt][4]=1}ds.push(cZ[dt])}}dp+="&ec_items="+t(JSON_PIWIK.stringify(ds))
-}dp=cs(dp,ao,"ecommerce",dq);bE(dp,bI);if(dn){cZ={}}}function bY(di,dm,dl,dk,dj,dn){if(String(di).length&&J(dm)){bp(di,dm,dl,dk,dj,dn)}}function br(di){if(J(di)){bp("",di,"","","","")}}function bZ(dj,dl,dk){aK=bg();var di=cs("action_name="+t(al(dj||bi)),dl,"log");bE(di,bI,dk)}function a0(dk,dj){var dl,di="(^| )(piwik[_-]"+dj;if(dk){for(dl=0;dl<dk.length;dl++){di+="|"+dk[dl]}}di+=")( |$)";return new RegExp(di)}function aU(di){return(aD&&di&&0===String(di).indexOf(aD))}function cu(dm,di,dn,dj){if(aU(di)){return 0}var dl=a0(bK,"download"),dk=a0(a8,"link"),dp=new RegExp("\\.("+c5.join("|")+")([?&#]|$)","i");if(dk.test(dm)){return"link"}if(dj||dl.test(dm)||dp.test(di)){return"download"}if(dn){return 0}return"link"}function au(dj){var di;di=dj.parentNode;while(di!==null&&J(di)){if(ae.isLinkElement(dj)){break}dj=di;di=dj.parentNode}return dj}function db(dn){dn=au(dn);if(!ae.hasNodeAttribute(dn,"href")){return}if(!J(dn.href)){return}var dm=ae.getAttributeValueFromNode(dn,"href");if(aU(dm)){return
-}var dj=dn.pathname||ck(dn.href);var dp=dn.hostname||d(dn.href);var dq=dp.toLowerCase();var dk=dn.href.replace(dp,dq);var dl=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dl.test(dk)){var di=cu(dn.className,dk,ar(dq,dj),ae.hasNodeAttribute(dn,"download"));if(di){return{type:di,href:dk}}}}function aP(di,dj,dk,dl){var dm=v.buildInteractionRequestParams(di,dj,dk,dl);if(!dm){return}return cs(dm,null,"contentInteraction")}function cJ(dk,dl,dq,di,dj){if(!J(dk)){return}if(aU(dk)){return dk}var dn=v.toAbsoluteUrl(dk);var dm="redirecturl="+t(dn)+"&";dm+=aP(dl,dq,di,(dj||dk));var dp="&";if(aD.indexOf("?")<0){dp="?"}return aD+dp+dm}function bb(di,dj){if(!di||!dj){return false}var dk=v.findTargetNode(di);if(v.shouldIgnoreInteraction(dk)){return false}dk=v.findTargetNodeNoDefault(di);if(dk&&!V(dk,dj)){return false}return true}function ct(dk,dj,dm){if(!dk){return}var di=v.findParentContentNode(dk);if(!di){return}if(!bb(di,dk)){return}var dl=v.buildContentBlock(di);
-if(!dl){return}if(!dl.target&&dm){dl.target=dm}return v.buildInteractionRequestParams(dj,dl.name,dl.piece,dl.target)}function aW(dj){if(!b9||!b9.length){return false}var di,dk;for(di=0;di<b9.length;di++){dk=b9[di];if(dk&&dk.name===dj.name&&dk.piece===dj.piece&&dk.target===dj.target){return true}}return false}function bD(dl){if(!dl){return false}var dp=v.findTargetNode(dl);if(!dp||v.shouldIgnoreInteraction(dp)){return false}var dq=db(dp);if(c8&&dq&&dq.type){return false}if(ae.isLinkElement(dp)&&ae.hasNodeAttributeWithValue(dp,"href")){var di=String(ae.getAttributeValueFromNode(dp,"href"));if(0===di.indexOf("#")){return false}if(aU(di)){return true}if(!v.isUrlToCurrentDomain(di)){return false}var dm=v.buildContentBlock(dl);if(!dm){return}var dk=dm.name;var dr=dm.piece;var dn=dm.target;if(!ae.hasNodeAttributeWithValue(dp,v.CONTENT_TARGET_ATTR)||dp.wasContentTargetAttrReplaced){dp.wasContentTargetAttrReplaced=true;dn=v.toAbsoluteUrl(di);ae.setAnyAttribute(dp,v.CONTENT_TARGET_ATTR,dn)}var dj=cJ(di,"click",dk,dr,dn);
-v.setHrefAttribute(dp,dj);return true}return false}function aM(dj){if(!dj||!dj.length){return}var di;for(di=0;di<dj.length;di++){bD(dj[di])}}function aX(di){return function(dj){if(!di){return}var dm=v.findParentContentNode(di);var dn;if(dj){dn=dj.target||dj.srcElement}if(!dn){dn=di}if(!bb(dm,dn)){return}cf(bI);if(ae.isLinkElement(di)&&ae.hasNodeAttributeWithValue(di,"href")&&ae.hasNodeAttributeWithValue(di,v.CONTENT_TARGET_ATTR)){var dk=ae.getAttributeValueFromNode(di,"href");if(!aU(dk)&&di.wasContentTargetAttrReplaced){ae.setAnyAttribute(di,v.CONTENT_TARGET_ATTR,"")}}var ds=db(di);if(ap&&ds&&ds.type){return ds.type}if(bD(dm)){return"href"}var dp=v.buildContentBlock(dm);if(!dp){return}var dl=dp.name;var dt=dp.piece;var dr=dp.target;var dq=aP("click",dl,dt,dr);if(dq){bE(dq,bI)}return dq}}function b0(dk){if(!dk||!dk.length){return}var di,dj;for(di=0;di<dk.length;di++){dj=v.findTargetNode(dk[di]);if(dj&&!dj.contentInteractionTrackingSetupDone){dj.contentInteractionTrackingSetupDone=true;an(dj,"click",aX(dj))
-}}}function bw(dk,dl){if(!dk||!dk.length){return[]}var di,dj;for(di=0;di<dk.length;di++){if(aW(dk[di])){dk.splice(di,1);di--}else{b9.push(dk[di])}}if(!dk||!dk.length){return[]}aM(dl);b0(dl);var dm=[];for(di=0;di<dk.length;di++){dj=cs(v.buildImpressionRequestParams(dk[di].name,dk[di].piece,dk[di].target),undefined,"contentImpressions");if(dj){dm.push(dj)}}return dm}function cy(dj){var di=v.collectContent(dj);return bw(di,dj)}function a9(dj){if(!dj||!dj.length){return[]}var di;for(di=0;di<dj.length;di++){if(!v.isNodeVisible(dj[di])){dj.splice(di,1);di--}}if(!dj||!dj.length){return[]}return cy(dj)}function aF(dk,di,dj){var dl=v.buildImpressionRequestParams(dk,di,dj);return cs(dl,null,"contentImpression")}function da(dl,dj){if(!dl){return}var di=v.findParentContentNode(dl);var dk=v.buildContentBlock(di);if(!dk){return}if(!dj){dj="Unknown"}return aP(dj,dk.name,dk.piece,dk.target)}function cN(dj,dl,di,dk){return"e_c="+t(dj)+"&e_a="+t(dl)+(J(di)?"&e_n="+t(di):"")+(J(dk)?"&e_v="+t(dk):"")}function at(dk,dm,di,dl,dp,dn){if(a(String(dk)).length===0||a(String(dm)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");
-return false}var dj=cs(cN(dk,dm,di,dl),dp,"event");bE(dj,bI,dn)}function b7(di,dl,dj,dm){var dk=cs("search="+t(di)+(dl?"&search_cat="+t(dl):"")+(J(dj)?"&search_count="+dj:""),dm,"sitesearch");bE(dk,bI)}function cS(di,dm,dl,dk){var dj=cs("idgoal="+di+(dm?"&revenue="+dm:""),dl,"goal");bE(dj,bI,dk)}function c0(dl,di,dq,dp,dk){var dn=di+"="+t(b1(dl));var dj=ct(dk,"click",dl);if(dj){dn+="&"+dj}var dm=cs(dn,dq,"link");bE(dm,bI,dp)}function bT(dj,di){if(dj!==""){return dj+di.charAt(0).toUpperCase()+di.slice(1)}return di}function cg(dn){var dm,di,dl=["","webkit","ms","moz"],dk;if(!be){for(di=0;di<dl.length;di++){dk=dl[di];if(Object.prototype.hasOwnProperty.call(G,bT(dk,"hidden"))){if(G[bT(dk,"visibilityState")]==="prerender"){dm=true}break}}}if(dm){an(G,dk+"visibilitychange",function dj(){G.removeEventListener(dk+"visibilitychange",dj,false);dn()});return}dn()}function bq(){var dj=aY().uuid;var di=aI();return dj+di}function ci(di){if(!di){return}if(!ae.hasNodeAttribute(di,"href")){return}var dj=ae.getAttributeValueFromNode(di,"href");
-if(!dj||aU(dj)){return}dj=k(dj,av);var dk=bq();dj=F(dj,av,dk);ae.setAnyAttribute(di,"href",dj)}function aA(dl){var dm=ae.getAttributeValueFromNode(dl,"href");if(!dm){return false}dm=String(dm);var dj=dm.indexOf("//")===0||dm.indexOf("http://")===0||dm.indexOf("https://")===0;if(!dj){return false}var di=dl.pathname||ck(dl.href);var dk=(dl.hostname||d(dl.href)).toLowerCase();if(ar(dk,di)){if(!cE(cT,L(dk))){return true}return false}return false}function cD(di){var dj=db(di);if(dj&&dj.type){dj.href=p(dj.href);c0(dj.href,dj.type,undefined,null,di);return}if(cL){di=au(di);if(aA(di)){ci(di)}}}function cv(){return G.all&&!G.addEventListener}function cU(di){var dk=di.which;var dj=(typeof di.button);if(!dk&&dj!=="undefined"){if(cv()){if(di.button&1){dk=1}else{if(di.button&2){dk=3}else{if(di.button&4){dk=2}}}}else{if(di.button===0||di.button==="0"){dk=1}else{if(di.button&1){dk=2}else{if(di.button&2){dk=3}}}}}return dk}function bS(di){switch(cU(di)){case 1:return"left";case 2:return"middle";case 3:return"right"
-}}function a1(di){return di.target||di.srcElement}function aB(di){return function(dl){dl=dl||T.event;var dk=bS(dl);var dm=a1(dl);if(dl.type==="click"){var dj=false;if(di&&dk==="middle"){dj=true}if(dm&&!dj){cD(dm)}}else{if(dl.type==="mousedown"){if(dk==="middle"&&dm){aR=dk;bz=dm}else{aR=bz=null}}else{if(dl.type==="mouseup"){if(dk===aR&&dm===bz){cD(dm)}aR=bz=null}else{if(dl.type==="contextmenu"){cD(dm)}}}}}}function aq(dk,dj){var di=typeof dj;if(di==="undefined"){dj=true}an(dk,"click",aB(dj),false);if(dj){an(dk,"mouseup",aB(dj),false);an(dk,"mousedown",aB(dj),false);an(dk,"contextmenu",aB(dj),false)}}function bC(dk,dm){ap=true;var dl,dj=a0(by,"ignore"),dn=G.links,di=null,dp=null;if(dn){for(dl=0;dl<dn.length;dl++){di=dn[dl];if(!dj.test(di.className)){dp=typeof di.piwikTrackers;if("undefined"===dp){di.piwikTrackers=[]}if(-1===M(di.piwikTrackers,dm)){di.piwikTrackers.push(dm);aq(di,dk)}}}}}function aS(dj,dm,dn){if(ce){return true}ce=true;var dp=false;var dl,dk;function di(){dp=true}n(function(){function dq(ds){setTimeout(function(){if(!ce){return
-}dp=false;dn.trackVisibleContentImpressions();dq(ds)},ds)}function dr(ds){setTimeout(function(){if(!ce){return}if(dp){dp=false;dn.trackVisibleContentImpressions()}dr(ds)},ds)}if(dj){dl=["scroll","resize"];for(dk=0;dk<dl.length;dk++){if(G.addEventListener){G.addEventListener(dl[dk],di,false)}else{T.attachEvent("on"+dl[dk],di)}}dr(100)}if(dm&&dm>0){dm=parseInt(dm,10);dq(dm)}})}var bB={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var di=this.requests;this.requests=[];if(di.length===1){bE(di[0],bI)}else{de(di,bI)}},push:function(di){if(!di){return}if(m||!this.enabled){bE(di,bI);return}bB.requests.push(di);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bB.timeout=null;bB.sendRequests()},bB.interval);var dj="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dj)){b[dj]={unload:function(){if(bB.timeout){clearTimeout(bB.timeout)}bB.sendRequests()}}}}};bh();aL();this.hasConsent=function(){return bA};this.getVisitorId=function(){return aY().uuid
-};this.getVisitorInfo=function(){return cM()};this.getAttributionInfo=function(){return bL()};this.getAttributionCampaignName=function(){return bL()[0]};this.getAttributionCampaignKeyword=function(){return bL()[1]};this.getAttributionReferrerTimestamp=function(){return bL()[2]};this.getAttributionReferrerUrl=function(){return bL()[3]};this.setTrackerUrl=function(di){aD=di};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bG)};this.addTracker=function(di,dk){if(!J(di)||null===di){di=this.getTrackerUrl()}var dj=new Q(di,dk);I.push(dj);e.trigger("TrackerAdded",[this]);return dj};this.getSiteId=function(){return b5};this.setSiteId=function(di){b2(di)};this.resetUserId=function(){bx=""};this.setUserId=function(di){if(Y(di)){bx=di}};this.getUserId=function(){return bx};this.setCustomData=function(di,dj){if(W(di)){ao=di}else{if(!ao){ao={}}ao[di]=dj}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(di){ca=di};this.appendToTrackingUrl=function(di){cY=di
-};this.getRequest=function(di){return cs(di)};this.addPlugin=function(di,dj){b[di]=dj};this.setCustomDimension=function(di,dj){di=parseInt(di,10);if(di>0){if(!J(dj)){dj=""}if(!w(dj)){dj=String(dj)}bl[di]=dj}};this.getCustomDimension=function(di){di=parseInt(di,10);if(di>0&&Object.prototype.hasOwnProperty.call(bl,di)){return bl[di]}};this.deleteCustomDimension=function(di){di=parseInt(di,10);if(di>0){delete bl[di]}};this.setCustomVariable=function(dj,di,dm,dk){var dl;if(!J(dk)){dk="visit"}if(!J(di)){return}if(!J(dm)){dm=""}if(dj>0){di=!w(di)?String(di):di;dm=!w(dm)?String(dm):dm;dl=[di.slice(0,bs),dm.slice(0,bs)];if(dk==="visit"||dk===2){cC();aQ[dj]=dl}else{if(dk==="page"||dk===3){bV[dj]=dl}else{if(dk==="event"){cl[dj]=dl}}}}};this.getCustomVariable=function(dj,dk){var di;if(!J(dk)){dk="visit"}if(dk==="page"||dk===3){di=bV[dj]}else{if(dk==="event"){di=cl[dj]}else{if(dk==="visit"||dk===2){cC();di=aQ[dj]}}}if(!J(di)||(di&&di[0]==="")){return false}return di};this.deleteCustomVariable=function(di,dj){if(this.getCustomVariable(di,dj)){this.setCustomVariable(di,"","",dj)
-}};this.deleteCustomVariables=function(di){if(di==="page"||di===3){bV={}}else{if(di==="event"){cl={}}else{if(di==="visit"||di===2){aQ={}}}}};this.storeCustomVariablesInCookie=function(){bP=true};this.setLinkTrackingTimer=function(di){bI=di};this.getLinkTrackingTimer=function(){return bI};this.setDownloadExtensions=function(di){if(w(di)){di=di.split("|")}c5=di};this.addDownloadExtensions=function(dj){var di;if(w(dj)){dj=dj.split("|")}for(di=0;di<dj.length;di++){c5.push(dj[di])}};this.removeDownloadExtensions=function(dk){var dj,di=[];if(w(dk)){dk=dk.split("|")}for(dj=0;dj<c5.length;dj++){if(M(dk,c5[dj])===-1){di.push(c5[dj])}}c5=di};this.setDomains=function(di){ax=w(di)?[di]:di;var dm=false,dk=0,dj;for(dk;dk<ax.length;dk++){dj=String(ax[dk]);if(cE(cT,L(dj))){dm=true;break}var dl=ck(dj);if(dl&&dl!=="/"&&dl!=="/*"){dm=true;break}}if(!dm){ax.push(cT)}};this.enableCrossDomainLinking=function(){cL=true};this.disableCrossDomainLinking=function(){cL=false};this.isCrossDomainLinkingEnabled=function(){return cL
-};this.setCrossDomainLinkingTimeout=function(di){aZ=di};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bq())};this.setIgnoreClasses=function(di){by=w(di)?[di]:di};this.setRequestMethod=function(di){c9=di||ch};this.setRequestContentType=function(di){cw=di||aH};this.setReferrerUrl=function(di){bm=di};this.setCustomUrl=function(di){a4=bU(bM,di)};this.getCurrentUrl=function(){return a4||bM};this.setDocumentTitle=function(di){bi=di};this.setAPIUrl=function(di){bG=di};this.setDownloadClasses=function(di){bK=w(di)?[di]:di};this.setLinkClasses=function(di){a8=w(di)?[di]:di};this.setCampaignNameKey=function(di){cq=w(di)?[di]:di};this.setCampaignKeywordKey=function(di){bF=w(di)?[di]:di};this.discardHashTag=function(di){bO=di};this.setCookieNamePrefix=function(di){bj=di;aQ=bW()};this.setCookieDomain=function(di){var dj=L(di);if(bv(dj)){cW=dj;bh()}};this.getCookieDomain=function(){return cW};this.hasCookies=function(){return"1"===b4()};this.setSessionCookie=function(dk,dj,di){if(!dk){throw new Error("Missing cookie name")
-}if(!J(di)){di=co}bt.push(dk);dd(aT(dk),dj,di,bo,cW)};this.getCookie=function(dj){var di=aC(aT(dj));if(di===0){return null}return di};this.setCookiePath=function(di){bo=di;bh()};this.getCookiePath=function(di){return bo};this.setVisitorCookieTimeout=function(di){cH=di*1000};this.setSessionCookieTimeout=function(di){co=di*1000};this.getSessionCookieTimeout=function(){return co};this.setReferralCookieTimeout=function(di){c4=di*1000};this.setConversionAttributionFirstReferrer=function(di){bu=di};this.setSecureCookie=function(di){bR=di};this.disableCookies=function(){bk=true;c7.cookie="0";if(b5){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dj){var di=h.doNotTrack||h.msDoNotTrack;cO=dj&&(di==="yes"||di==="1");if(cO){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cV=true};this.addListener=function(dj,di){aq(dj,di)};this.enableLinkTracking=function(dj){c8=true;var di=this;cg(function(){q(function(){bC(dj,di)})})};this.enableJSErrorTracking=function(){if(cR){return
-}cR=true;var di=T.onerror;T.onerror=function(dn,dl,dk,dm,dj){cg(function(){var dp="JavaScript Errors";var dq=dl+":"+dk;if(dm){dq+=":"+dm}at(dp,dq,dn)});if(di){return di(dn,dl,dk,dm,dj)}return false}};this.disablePerformanceTracking=function(){a2=false};this.setGenerationTimeMs=function(di){cm=parseInt(di,10)};this.setVisitStandardLength=function(di){di=Math.max(di,5);c6=di};this.enableHeartBeatTimer=function(di){di=Math.max(di,5);a5=(di||15)*1000;if(cX!==null){df()}};this.disableHeartBeatTimer=function(){bJ();if(a5||aN){if(T.removeEventListener){T.removeEventListener("focus",ba);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",ba);T.detachEvent("onblur",ay)}}}a5=null;aN=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(di){if(T.location.protocol==="file:"){T.location=di}};this.setCountPreRendered=function(di){be=di};this.trackGoal=function(di,dl,dk,dj){cg(function(){cS(di,dl,dk,dj)})};this.trackLink=function(dj,di,dl,dk){cg(function(){c0(dj,di,dl,dk)
-})};this.getNumTrackedPageViews=function(){return cr};this.trackPageView=function(di,dk,dj){b9=[];cI=[];if(N(b5)){cg(function(){Z(aD,bG,b5)})}else{cg(function(){cr++;bZ(di,dk,dj)})}};this.trackAllContentImpressions=function(){if(N(b5)){return}cg(function(){q(function(){var di=v.findContentNodes();var dj=cy(di);de(dj,bI)})})};this.trackVisibleContentImpressions=function(di,dj){if(N(b5)){return}if(!J(di)){di=true}if(!J(dj)){dj=750}aS(di,dj,this);cg(function(){n(function(){var dk=v.findContentNodes();var dl=a9(dk);de(dl,bI)})})};this.trackContentImpression=function(dk,di,dj){if(N(b5)){return}dk=a(dk);di=a(di);dj=a(dj);if(!dk){return}di=di||"Unknown";cg(function(){var dl=aF(dk,di,dj);bE(dl,bI)})};this.trackContentImpressionsWithinNode=function(di){if(N(b5)||!di){return}cg(function(){if(ce){n(function(){var dj=v.findContentNodesWithinNode(di);var dk=a9(dj);de(dk,bI)})}else{q(function(){var dj=v.findContentNodesWithinNode(di);var dk=cy(dj);de(dk,bI)})}})};this.trackContentInteraction=function(dk,dl,di,dj){if(N(b5)){return
-}dk=a(dk);dl=a(dl);di=a(di);dj=a(dj);if(!dk||!dl){return}di=di||"Unknown";cg(function(){var dm=aP(dk,dl,di,dj);if(dm){bE(dm,bI)}})};this.trackContentInteractionNode=function(dj,di){if(N(b5)||!dj){return}cg(function(){var dk=da(dj,di);if(dk){bE(dk,bI)}})};this.logAllContentBlocksOnPage=function(){var dk=v.findContentNodes();var di=v.collectContent(dk);var dj=typeof console;if(dj!=="undefined"&&console&&console.log){console.log(di)}};this.trackEvent=function(dj,dl,di,dk,dn,dm){cg(function(){at(dj,dl,di,dk,dn,dm)})};this.trackSiteSearch=function(di,dk,dj,dl){b9=[];cg(function(){b7(di,dk,dj,dl)})};this.setEcommerceView=function(dl,di,dk,dj){if(Y(dk)){dk=String(dk)}if(!J(dk)||dk===null||dk===false||!dk.length){dk=""}else{if(dk instanceof Array){dk=JSON_PIWIK.stringify(dk)}}bV[5]=["_pkc",dk];if(J(dj)&&dj!==null&&dj!==false&&String(dj).length){bV[2]=["_pkp",dj]}if(!Y(dl)&&!Y(di)){return}if(Y(dl)){bV[3]=["_pks",dl]}if(!Y(di)){di=""}bV[4]=["_pkn",di]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(cZ))
-};this.addEcommerceItem=function(dm,di,dk,dj,dl){if(Y(dm)){cZ[dm]=[String(dm),di,dk,dj,dl]}};this.removeEcommerceItem=function(di){if(Y(di)){di=String(di);delete cZ[di]}};this.clearEcommerceCart=function(){cZ={}};this.trackEcommerceOrder=function(di,dm,dl,dk,dj,dn){bY(di,dm,dl,dk,dj,dn)};this.trackEcommerceCartUpdate=function(di){br(di)};this.trackRequest=function(dj,dl,dk,di){cg(function(){var dm=cs(dj,dl,di);bE(dm,bI,dk)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bB.enabled=false};this.setRequestQueueInterval=function(di){if(di<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bB.interval=di};this.queueRequest=function(di){cg(function(){var dj=cs(di);bB.push(dj)})};this.isConsentRequired=function(){return cz};this.getRememberedConsent=function(){var di=aC(bd);if(aC(cK)){if(di){bX(bd,bo,cW)}return null}if(!di||di===0){return null}return di};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
-};this.requireConsent=function(){cz=true;bA=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bA){aE()}}}};this.setConsentGiven=function(){bA=true;bX(cK,bo,cW);var dj,di;for(dj=0;dj<cI.length;dj++){di=typeof cI[dj];if(di==="string"){bE(cI[dj],bI)}else{if(di==="object"){de(cI[dj],bI)}}}cI=[]};this.rememberConsentGiven=function(dj){if(dj){dj=dj*60*60*1000}else{dj=30*365*24*60*60*1000}this.setConsentGiven();var di=new Date().getTime();dd(bd,di,dj,bo,cW,bR)};this.forgetConsentGiven=function(){var di=30*365*24*60*60*1000;bX(bd,bo,cW);dd(cK,new Date().getTime(),di,bo,cW,bR);this.requireConsent()};this.isUserOptedOut=function(){return !bA};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
+;if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Matomo=window.Piwik=(function(){var r,b={},y={},G=document,h=navigator,X=screen,T=window,i=T.performance||T.mozPerformance||T.msPerformance||T.webkitPerformance,t=T.encodeURIComponent,S=T.decodeURIComponent,l=unescape,I=[],E,e,ah=[],x=0,ab=0,U=0,m=false;function p(ao){try{return S(ao)}catch(ap){return unescape(ao)}}function J(ap){var ao=typeof ap;return ao!=="undefined"}function A(ao){return typeof ao==="function"}function W(ao){return typeof ao==="object"}function w(ao){return typeof ao==="string"||ao instanceof String}function ag(ao){return typeof ao==="number"||ao instanceof Number
+}function Y(ao){return J(ao)&&(ag(ao)||(w(ao)&&ao.length))}function B(ap){if(!ap){return true}var ao;var aq=true;for(ao in ap){if(Object.prototype.hasOwnProperty.call(ap,ao)){aq=false}}return aq}function ak(ao){var ap=typeof console;if(ap!=="undefined"&&console&&console.error){console.error(ao)}}function af(){var au,at,aw,ap,ao;for(au=0;au<arguments.length;au+=1){ao=null;if(arguments[au]&&arguments[au].slice){ao=arguments[au].slice()}ap=arguments[au];aw=ap.shift();var av,aq;var ar=w(aw)&&aw.indexOf("::")>0;if(ar){av=aw.split("::");aq=av[0];aw=av[1];if("object"===typeof e[aq]&&"function"===typeof e[aq][aw]){e[aq][aw].apply(e[aq],ap)}else{if(ao){ah.push(ao)}}}else{for(at=0;at<I.length;at++){if(w(aw)){aq=I[at];var ax=aw.indexOf(".")>0;if(ax){av=aw.split(".");if(aq&&"object"===typeof aq[av[0]]){aq=aq[av[0]];aw=av[1]}else{if(ao){ah.push(ao);break}}}if(aq[aw]){aq[aw].apply(aq,ap)}else{var ay="The method '"+aw+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: https://developer.piwik.org/api-reference/tracking-javascript';
+ak(ay);if(!ax){throw new TypeError(ay)}}if(aw==="addTracker"){break}if(aw==="setTrackerUrl"||aw==="setSiteId"){break}}else{aw.apply(I[at],ap)}}}}}function an(ar,aq,ap,ao){if(ar.addEventListener){ar.addEventListener(aq,ap,ao);return true}if(ar.attachEvent){return ar.attachEvent("on"+aq,ap)}ar["on"+aq]=ap}function n(ao){if(G.readyState==="complete"){ao()}else{if(T.addEventListener){T.addEventListener("load",ao,false)}else{if(T.attachEvent){T.attachEvent("onload",ao)}}}}function q(ar){var ao=false;if(G.attachEvent){ao=G.readyState==="complete"}else{ao=G.readyState!=="loading"}if(ao){ar();return}var aq;if(G.addEventListener){an(G,"DOMContentLoaded",function ap(){G.removeEventListener("DOMContentLoaded",ap,false);if(!ao){ao=true;ar()}})}else{if(G.attachEvent){G.attachEvent("onreadystatechange",function ap(){if(G.readyState==="complete"){G.detachEvent("onreadystatechange",ap);if(!ao){ao=true;ar()}}});if(G.documentElement.doScroll&&T===T.top){(function ap(){if(!ao){try{G.documentElement.doScroll("left")
+}catch(at){setTimeout(ap,0);return}ao=true;ar()}}())}}}an(T,"load",function(){if(!ao){ao=true;ar()}},false)}function ac(ap,av,aw){if(!ap){return""}var ao="",ar,aq,at,au;for(ar in b){if(Object.prototype.hasOwnProperty.call(b,ar)){au=b[ar]&&"function"===typeof b[ar][ap];if(au){aq=b[ar][ap];at=aq(av||{},aw);if(at){ao+=at}}}}return ao}function ai(){var ao;m=true;ac("unload");if(r){do{ao=new Date()}while(ao.getTimeAlias()<r)}}function o(aq,ap){var ao=G.createElement("script");ao.type="text/javascript";ao.src=aq;if(ao.readyState){ao.onreadystatechange=function(){var ar=this.readyState;if(ar==="loaded"||ar==="complete"){ao.onreadystatechange=null;ap()}}}else{ao.onload=ap}G.getElementsByTagName("head")[0].appendChild(ao)}function K(){var ao="";try{ao=T.top.document.referrer}catch(aq){if(T.parent){try{ao=T.parent.document.referrer}catch(ap){ao=""}}}if(ao===""){ao=G.referrer}return ao}function s(ao){var aq=new RegExp("^([a-z]+):"),ap=aq.exec(ao);return ap?ap[1]:null}function d(ao){var aq=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),ap=aq.exec(ao);
+return ap?ap[1]:ao}function aj(ap,ao){ap=String(ap);return ap.lastIndexOf(ao,0)===0}function R(ap,ao){ap=String(ap);return ap.indexOf(ao,ap.length-ao.length)!==-1}function z(ap,ao){ap=String(ap);return ap.indexOf(ao)!==-1}function g(ap,ao){ap=String(ap);return ap.substr(0,ap.length-ao)}function F(ar,aq,au){ar=String(ar);if(!au){au=""}var ao=ar.indexOf("#");var av=ar.length;if(ao===-1){ao=av}var at=ar.substr(0,ao);var ap=ar.substr(ao,av-ao);if(at.indexOf("?")===-1){at+="?"}else{if(!R(at,"?")){at+="&"}}return at+t(aq)+"="+t(au)+ap}function k(ap,aq){ap=String(ap);if(ap.indexOf("?"+aq+"=")===-1&&ap.indexOf("&"+aq+"=")===-1){return ap}var ar=ap.indexOf("?");if(ar===-1){return ap}var ao=ap.substr(ar+1);var aw=ap.substr(0,ar);if(ao){var ax="";var az=ao.indexOf("#");if(az!==-1){ax=ao.substr(az+1);ao=ao.substr(0,az)}var at;var av=ao.split("&");var au=av.length-1;for(au;au>=0;au--){at=av[au].split("=")[0];if(at===aq){av.splice(au,1)}}var ay=av.join("&");if(ay){aw=aw+"?"+ay}if(ax){aw+="#"+ax}}return aw
+}function f(aq,ap){var ao="[\\?&#]"+ap+"=([^&#]*)";var at=new RegExp(ao);var ar=at.exec(aq);return ar?S(ar[1]):""}function a(ao){if(ao&&String(ao)===ao){return ao.replace(/^\s+|\s+$/g,"")}return ao}function D(ao){return unescape(t(ao))}function am(aE){var aq=function(aK,aJ){return(aK<<aJ)|(aK>>>(32-aJ))},aF=function(aM){var aK="",aL,aJ;for(aL=7;aL>=0;aL--){aJ=(aM>>>(aL*4))&15;aK+=aJ.toString(16)}return aK},au,aH,aG,ap=[],ay=1732584193,aw=4023233417,av=2562383102,at=271733878,ar=3285377520,aD,aC,aB,aA,az,aI,ao,ax=[];aE=D(aE);ao=aE.length;for(aH=0;aH<ao-3;aH+=4){aG=aE.charCodeAt(aH)<<24|aE.charCodeAt(aH+1)<<16|aE.charCodeAt(aH+2)<<8|aE.charCodeAt(aH+3);ax.push(aG)}switch(ao&3){case 0:aH=2147483648;break;case 1:aH=aE.charCodeAt(ao-1)<<24|8388608;break;case 2:aH=aE.charCodeAt(ao-2)<<24|aE.charCodeAt(ao-1)<<16|32768;break;case 3:aH=aE.charCodeAt(ao-3)<<24|aE.charCodeAt(ao-2)<<16|aE.charCodeAt(ao-1)<<8|128;break}ax.push(aH);while((ax.length&15)!==14){ax.push(0)}ax.push(ao>>>29);ax.push((ao<<3)&4294967295);
+for(au=0;au<ax.length;au+=16){for(aH=0;aH<16;aH++){ap[aH]=ax[au+aH]}for(aH=16;aH<=79;aH++){ap[aH]=aq(ap[aH-3]^ap[aH-8]^ap[aH-14]^ap[aH-16],1)}aD=ay;aC=aw;aB=av;aA=at;az=ar;for(aH=0;aH<=19;aH++){aI=(aq(aD,5)+((aC&aB)|(~aC&aA))+az+ap[aH]+1518500249)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=20;aH<=39;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+1859775393)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=40;aH<=59;aH++){aI=(aq(aD,5)+((aC&aB)|(aC&aA)|(aB&aA))+az+ap[aH]+2400959708)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=60;aH<=79;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+3395469782)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}ay=(ay+aD)&4294967295;aw=(aw+aC)&4294967295;av=(av+aB)&4294967295;at=(at+aA)&4294967295;ar=(ar+az)&4294967295}aI=aF(ay)+aF(aw)+aF(av)+aF(at)+aF(ar);return aI.toLowerCase()}function aa(aq,ao,ap){if(!aq){aq=""}if(!ao){ao=""}if(aq==="translate.googleusercontent.com"){if(ap===""){ap=ao}ao=f(ao,"u");aq=d(ao)}else{if(aq==="cc.bingj.com"||aq==="webcache.googleusercontent.com"||aq.slice(0,5)==="74.6."){ao=G.links[0].href;
+aq=d(ao)}}return[aq,ao,ap]}function L(ap){var ao=ap.length;if(ap.charAt(--ao)==="."){ap=ap.slice(0,ao)}if(ap.slice(0,2)==="*."){ap=ap.slice(1)}if(ap.indexOf("/")!==-1){ap=ap.substr(0,ap.indexOf("/"))}return ap}function al(ap){ap=ap&&ap.text?ap.text:ap;if(!w(ap)){var ao=G.getElementsByTagName("title");if(ao&&J(ao[0])){ap=ao[0].text}}return ap}function P(ao){if(!ao){return[]}if(!J(ao.children)&&J(ao.childNodes)){return ao.children}if(J(ao.children)){return ao.children}return[]}function V(ap,ao){if(!ap||!ao){return false}if(ap.contains){return ap.contains(ao)}if(ap===ao){return true}if(ap.compareDocumentPosition){return !!(ap.compareDocumentPosition(ao)&16)}return false}function M(aq,ar){if(aq&&aq.indexOf){return aq.indexOf(ar)}if(!J(aq)||aq===null){return -1}if(!aq.length){return -1}var ao=aq.length;if(ao===0){return -1}var ap=0;while(ap<ao){if(aq[ap]===ar){return ap}ap++}return -1}function j(aq){if(!aq){return false}function ao(at,au){if(T.getComputedStyle){return G.defaultView.getComputedStyle(at,null)[au]
+}if(at.currentStyle){return at.currentStyle[au]}}function ar(at){at=at.parentNode;while(at){if(at===G){return true}at=at.parentNode}return false}function ap(av,aB,at,ay,aw,az,ax){var au=av.parentNode,aA=1;if(!ar(av)){return false}if(9===au.nodeType){return true}if("0"===ao(av,"opacity")||"none"===ao(av,"display")||"hidden"===ao(av,"visibility")){return false}if(!J(aB)||!J(at)||!J(ay)||!J(aw)||!J(az)||!J(ax)){aB=av.offsetTop;aw=av.offsetLeft;ay=aB+av.offsetHeight;at=aw+av.offsetWidth;az=av.offsetWidth;ax=av.offsetHeight}if(aq===av&&(0===ax||0===az)&&"hidden"===ao(av,"overflow")){return false}if(au){if(("hidden"===ao(au,"overflow")||"scroll"===ao(au,"overflow"))){if(aw+aA>au.offsetWidth+au.scrollLeft||aw+az-aA<au.scrollLeft||aB+aA>au.offsetHeight+au.scrollTop||aB+ax-aA<au.scrollTop){return false}}if(av.offsetParent===au){aw+=au.offsetLeft;aB+=au.offsetTop}return ap(au,aB,at,ay,aw,az,ax)}return true}return ap(aq)}var ae={htmlCollectionToArray:function(aq){var ao=[],ap;if(!aq||!aq.length){return ao
+}for(ap=0;ap<aq.length;ap++){ao.push(aq[ap])}return ao},find:function(ao){if(!document.querySelectorAll||!ao){return[]}var ap=document.querySelectorAll(ao);return this.htmlCollectionToArray(ap)},findMultiple:function(aq){if(!aq||!aq.length){return[]}var ap,ar;var ao=[];for(ap=0;ap<aq.length;ap++){ar=this.find(aq[ap]);ao=ao.concat(ar)}ao=this.makeNodesUnique(ao);return ao},findNodesByTagName:function(ap,ao){if(!ap||!ao||!ap.getElementsByTagName){return[]}var aq=ap.getElementsByTagName(ao);return this.htmlCollectionToArray(aq)},makeNodesUnique:function(ao){var au=[].concat(ao);ao.sort(function(aw,av){if(aw===av){return 0}var ay=M(au,aw);var ax=M(au,av);if(ay===ax){return 0}return ay>ax?-1:1});if(ao.length<=1){return ao}var ap=0;var ar=0;var at=[];var aq;aq=ao[ap++];while(aq){if(aq===ao[ap]){ar=at.push(ap)}aq=ao[ap++]||null}while(ar--){ao.splice(at[ar],1)}return ao},getAttributeValueFromNode:function(at,aq){if(!this.hasNodeAttribute(at,aq)){return}if(at&&at.getAttribute){return at.getAttribute(aq)
+}if(!at||!at.attributes){return}var ar=(typeof at.attributes[aq]);if("undefined"===ar){return}if(at.attributes[aq].value){return at.attributes[aq].value}if(at.attributes[aq].nodeValue){return at.attributes[aq].nodeValue}var ap;var ao=at.attributes;if(!ao){return}for(ap=0;ap<ao.length;ap++){if(ao[ap].nodeName===aq){return ao[ap].nodeValue}}return null},hasNodeAttributeWithValue:function(ap,ao){var aq=this.getAttributeValueFromNode(ap,ao);return !!aq},hasNodeAttribute:function(aq,ao){if(aq&&aq.hasAttribute){return aq.hasAttribute(ao)}if(aq&&aq.attributes){var ap=(typeof aq.attributes[ao]);return"undefined"!==ap}return false},hasNodeCssClass:function(aq,ao){if(aq&&ao&&aq.className){var ap=typeof aq.className==="string"?aq.className.split(" "):[];if(-1!==M(ap,ao)){return true}}return false},findNodesHavingAttribute:function(at,aq,ao){if(!ao){ao=[]}if(!at||!aq){return ao}var ar=P(at);if(!ar||!ar.length){return ao}var ap,au;for(ap=0;ap<ar.length;ap++){au=ar[ap];if(this.hasNodeAttribute(au,aq)){ao.push(au)
+}ao=this.findNodesHavingAttribute(au,aq,ao)}return ao},findFirstNodeHavingAttribute:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeAttribute(aq,ap)){return aq}var ao=this.findNodesHavingAttribute(aq,ap);if(ao&&ao.length){return ao[0]}},findFirstNodeHavingAttributeWithValue:function(ar,aq){if(!ar||!aq){return}if(this.hasNodeAttributeWithValue(ar,aq)){return ar}var ao=this.findNodesHavingAttribute(ar,aq);if(!ao||!ao.length){return}var ap;for(ap=0;ap<ao.length;ap++){if(this.getAttributeValueFromNode(ao[ap],aq)){return ao[ap]}}},findNodesHavingCssClass:function(at,ar,ao){if(!ao){ao=[]}if(!at||!ar){return ao}if(at.getElementsByClassName){var au=at.getElementsByClassName(ar);return this.htmlCollectionToArray(au)}var aq=P(at);if(!aq||!aq.length){return[]}var ap,av;for(ap=0;ap<aq.length;ap++){av=aq[ap];if(this.hasNodeCssClass(av,ar)){ao.push(av)}ao=this.findNodesHavingCssClass(av,ar,ao)}return ao},findFirstNodeHavingClass:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeCssClass(aq,ap)){return aq
+}var ao=this.findNodesHavingCssClass(aq,ap);if(ao&&ao.length){return ao[0]}},isLinkElement:function(ap){if(!ap){return false}var ao=String(ap.nodeName).toLowerCase();var ar=["a","area"];var aq=M(ar,ao);return aq!==-1},setAnyAttribute:function(ap,ao,aq){if(!ap||!ao){return}if(ap.setAttribute){ap.setAttribute(ao,aq)}else{ap[ao]=aq}}};var v={CONTENT_ATTR:"data-track-content",CONTENT_CLASS:"piwikTrackContent",CONTENT_NAME_ATTR:"data-content-name",CONTENT_PIECE_ATTR:"data-content-piece",CONTENT_PIECE_CLASS:"piwikContentPiece",CONTENT_TARGET_ATTR:"data-content-target",CONTENT_TARGET_CLASS:"piwikContentTarget",CONTENT_IGNOREINTERACTION_ATTR:"data-content-ignoreinteraction",CONTENT_IGNOREINTERACTION_CLASS:"piwikContentIgnoreInteraction",location:undefined,findContentNodes:function(){var ap="."+this.CONTENT_CLASS;var ao="["+this.CONTENT_ATTR+"]";var aq=ae.findMultiple([ap,ao]);return aq},findContentNodesWithinNode:function(ar){if(!ar){return[]}var ap=ae.findNodesHavingCssClass(ar,this.CONTENT_CLASS);
+var ao=ae.findNodesHavingAttribute(ar,this.CONTENT_ATTR);if(ao&&ao.length){var aq;for(aq=0;aq<ao.length;aq++){ap.push(ao[aq])}}if(ae.hasNodeAttribute(ar,this.CONTENT_ATTR)){ap.push(ar)}else{if(ae.hasNodeCssClass(ar,this.CONTENT_CLASS)){ap.push(ar)}}ap=ae.makeNodesUnique(ap);return ap},findParentContentNode:function(ap){if(!ap){return}var aq=ap;var ao=0;while(aq&&aq!==G&&aq.parentNode){if(ae.hasNodeAttribute(aq,this.CONTENT_ATTR)){return aq}if(ae.hasNodeCssClass(aq,this.CONTENT_CLASS)){return aq}aq=aq.parentNode;if(ao>1000){break}ao++}},findPieceNode:function(ap){var ao;ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.findFirstNodeHavingClass(ap,this.CONTENT_PIECE_CLASS)}if(ao){return ao}return ap},findTargetNodeNoDefault:function(ao){if(!ao){return}var ap=ae.findFirstNodeHavingAttributeWithValue(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingAttribute(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingClass(ao,this.CONTENT_TARGET_CLASS);
+if(ap){return ap}},findTargetNode:function(ao){var ap=this.findTargetNodeNoDefault(ao);if(ap){return ap}return ao},findContentName:function(ap){if(!ap){return}var at=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_NAME_ATTR);if(at){return ae.getAttributeValueFromNode(at,this.CONTENT_NAME_ATTR)}var ao=this.findContentPiece(ap);if(ao){return this.removeDomainIfIsInLink(ao)}if(ae.hasNodeAttributeWithValue(ap,"title")){return ae.getAttributeValueFromNode(ap,"title")}var aq=this.findPieceNode(ap);if(ae.hasNodeAttributeWithValue(aq,"title")){return ae.getAttributeValueFromNode(aq,"title")}var ar=this.findTargetNode(ap);if(ae.hasNodeAttributeWithValue(ar,"title")){return ae.getAttributeValueFromNode(ar,"title")}},findContentPiece:function(ap){if(!ap){return}var ar=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_PIECE_ATTR);if(ar){return ae.getAttributeValueFromNode(ar,this.CONTENT_PIECE_ATTR)}var ao=this.findPieceNode(ap);var aq=this.findMediaUrlInNode(ao);if(aq){return this.toAbsoluteUrl(aq)
+}},findContentTarget:function(aq){if(!aq){return}var ar=this.findTargetNode(aq);if(ae.hasNodeAttributeWithValue(ar,this.CONTENT_TARGET_ATTR)){return ae.getAttributeValueFromNode(ar,this.CONTENT_TARGET_ATTR)}var ap;if(ae.hasNodeAttributeWithValue(ar,"href")){ap=ae.getAttributeValueFromNode(ar,"href");return this.toAbsoluteUrl(ap)}var ao=this.findPieceNode(aq);if(ae.hasNodeAttributeWithValue(ao,"href")){ap=ae.getAttributeValueFromNode(ao,"href");return this.toAbsoluteUrl(ap)}},isSameDomain:function(ao){if(!ao||!ao.indexOf){return false}if(0===ao.indexOf(this.getLocation().origin)){return true}var ap=ao.indexOf(this.getLocation().host);if(8>=ap&&0<=ap){return true}return false},removeDomainIfIsInLink:function(aq){var ap="^https?://[^/]+";var ao="^.*//[^/]+";if(aq&&aq.search&&-1!==aq.search(new RegExp(ap))&&this.isSameDomain(aq)){aq=aq.replace(new RegExp(ao),"");if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq=["img","embed","video","audio"];var ao=at.nodeName.toLowerCase();
+if(-1!==M(aq,ao)&&ae.findFirstNodeHavingAttributeWithValue(at,"src")){var ar=ae.findFirstNodeHavingAttributeWithValue(at,"src");return ae.getAttributeValueFromNode(ar,"src")}if(ao==="object"&&ae.hasNodeAttributeWithValue(at,"data")){return ae.getAttributeValueFromNode(at,"data")}if(ao==="object"){var au=ae.findNodesByTagName(at,"param");if(au&&au.length){var ap;for(ap=0;ap<au.length;ap++){if("movie"===ae.getAttributeValueFromNode(au[ap],"name")&&ae.hasNodeAttributeWithValue(au[ap],"value")){return ae.getAttributeValueFromNode(au[ap],"value")}}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;
+if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao
+},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true
+}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)
+}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cb,b6){var bF=this,bc="mtm_consent",cH="mtm_consent_removed",b1=aa(G.domain,T.location.href,K()),cQ=L(b1[0]),bK=p(b1[1]),bl=p(b1[2]),cO=false,cf="GET",c6=cf,aH="application/x-www-form-urlencoded; charset=UTF-8",cu=aH,aD=cb||"",bE="",cV="",b3=b6||"",bw="",bL="",a3,bh="",c2=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cQ],bx=[],bI=[],a7=[],bG=500,cS=true,cE,a4,bO,c3=1800,bM,ao,co=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bD=["pk_kwd","piwik_kwd","utm_term"],bi="_pk_",av="pk_vid",aY=180,cT,bn,bP=false,bj=false,cL,bd,bt,cF=33955200000,cm=1800000,c1=15768000000,a1=true,ck=0,bN=false,aP=false,b8,bT={},cj={},bk={},br=200,cW={},c4={},b7=[],cc=false,cy=false,ap=false,c5=false,cI=false,aM=false,bb=u(),cN=null,cU=null,b9,aQ,by,b4=am,bm,aK,cp=0,bs=["id","ses","cvar","ref"],cx=false,bz=null,cG=[],aw=U++;
+try{bh=G.title}catch(cv){bh=""}function da(dl,dj,di,dk,dh,dg){if(bj){return}var df;if(di){df=new Date();df.setTime(df.getTime()+di)}G.cookie=dl+"="+t(dj)+(di?";expires="+df.toGMTString():"")+";path="+(dk||"/")+(dh?";domain="+dh:"")+(dg?";secure":"")+";SameSite=Lax"}function aC(dh){if(bj){return 0}var df=new RegExp("(^|;)[ ]*"+dh+"=([^;]*)"),dg=df.exec(G.cookie);return dg?S(dg[2]):0}bz=!aC(cH);function bZ(df){var dg;df=k(df,av);if(bM){dg=new RegExp("#.*");return df.replace(dg,"")}return df}function bS(dh,df){var di=s(df),dg;if(di){return df}if(df.slice(0,1)==="/"){return s(dh)+"://"+d(dh)+df}dh=bZ(dh);dg=dh.indexOf("?");if(dg>=0){dh=dh.slice(0,dg)}dg=dh.lastIndexOf("/");if(dg!==dh.length-1){dh=dh.slice(0,dg+1)}return dh+df}function cC(dh,df){var dg;dh=String(dh).toLowerCase();df=String(df).toLowerCase();if(dh===df){return true}if(df.slice(0,1)==="."){if(dh===df.slice(1)){return true}dg=dh.length-df.length;if((dg>0)&&(dh.slice(dg)===df)){return true}}return false}function ci(df){var dg=document.createElement("a");
+if(df.indexOf("//")!==0&&df.indexOf("http")!==0){if(df.indexOf("*")===0){df=df.substr(1)}if(df.indexOf(".")===0){df=df.substr(1)}df="http://"+df}dg.href=v.toAbsoluteUrl(df);if(dg.pathname){return dg.pathname}return""}function a2(dg,df){if(!aj(df,"/")){df="/"+df}if(!aj(dg,"/")){dg="/"+dg}var dh=(df==="/"||df==="/*");if(dh){return true}if(dg===df){return true}df=String(df).toLowerCase();dg=String(dg).toLowerCase();if(R(df,"*")){df=df.slice(0,-1);dh=(!df||df==="/");if(dh){return true}if(dg===df){return true}return dg.indexOf(df)===0}if(!R(dg,"/")){dg+="/"}if(!R(df,"/")){df+="/"}return dg.indexOf(df)===0}function ar(dj,dl){var dg,df,dh,di,dk;for(dg=0;dg<ax.length;dg++){di=L(ax[dg]);dk=ci(ax[dg]);if(cC(dj,di)&&a2(dl,dk)){return true}}return false}function aU(di){var dg,df,dh;for(dg=0;dg<ax.length;dg++){df=L(ax[dg].toLowerCase());if(di===df){return true}if(df.slice(0,1)==="."){if(di===df.slice(1)){return true}dh=di.length-df.length;if((dh>0)&&(di.slice(dh)===df)){return true}}}return false}function cn(df,dh){df=df.replace("send_image=0","send_image=1");
+var dg=new Image(1,1);dg.onload=function(){E=0;if(typeof dh==="function"){dh({request:df,trackerUrl:aD,success:true})}};dg.onerror=function(){if(typeof dh==="function"){dh({request:df,trackerUrl:aD,success:false})}};dg.src=aD+(aD.indexOf("?")<0?"?":"&")+df}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a5(di,dm){var dh=aJ();if(!dh){return false}var dl={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dk=false;var dg=aD;try{var df=new Blob([di],dl);if(di.length<=2000){df=new Blob([],dl);dg=dg+(dg.indexOf("?")<0?"?":"&")+di}dk=h.sendBeacon(dg,df)}catch(dj){return false}if(dk&&typeof dm==="function"){dm({request:di,trackerUrl:aD,success:true,isSendBeacon:true})}return dk}function c0(dg,dh,df){if(!J(df)||null===df){df=true}if(m&&a5(dg,dh)){return}setTimeout(function(){if(m&&a5(dg,dh)){return}var dk;try{var dj=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dj.open("POST",aD,true);
+dj.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dl=m&&a5(dg,dh);if(!dl&&df){cn(dg,dh)}else{if(typeof dh==="function"){dh({request:dg,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dh==="function")){dh({request:dg,trackerUrl:aD,success:true,xhr:this})}}};dj.setRequestHeader("Content-Type",cu);dj.withCredentials=true;dj.send(dg)}catch(di){dk=m&&a5(dg,dh);if(!dk&&df){cn(dg,dh)}else{if(typeof dh==="function"){dh({request:dg,trackerUrl:aD,success:false})}}}},50)}function cd(dg){var df=new Date();var dh=df.getTime()+dg;if(!r||dh>r){r=dh}}function cl(df){if(b9||!a4||!bz){return}b9=setTimeout(function dg(){b9=null;if(!bb){bb=(!G.hasFocus||G.hasFocus())}if(!bb){cl(a4);return}if(bO()){return}var dh=new Date(),di=a4-(dh.getTime()-cU);di=Math.min(a4,di);cl(di)},df||a4)}function bH(){if(!b9){return}clearTimeout(b9);b9=null}function a9(){bb=true;cN=new Date().getTime()}function c9(){var df=new Date().getTime();return !cN||(df-cN)>a4
+}function ay(){if(c9()){bO()}bH()}function dc(){if(aM||!a4){return}aM=true;an(T,"focus",a9);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aM&&c9()){bO()}}})}function cz(dj){var dg=new Date();var df=dg.getTime();cU=df;if(cy&&df<cy){var dh=cy-df;setTimeout(dj,dh);cd(dh+50);cy+=50;return}if(cy===false){var di=800;cy=df+di}dj()}function aN(){if(aC(cH)){bz=false}else{if(aC(bc)){bz=true}}}function bC(dg,df,dh){aN();if(!bz){cG.push(dg);return}if(!cL&&dg){if(cx&&bz){dg+="&consent=1"}cz(function(){if(cS&&a5(dg,dh)){cd(100);return}if(c6==="POST"||String(dg).length>2000){c0(dg,dh)}else{cn(dg,dh)}cd(df)})}if(!aM){dc()}}function ch(df){if(cL){return false}return(df&&df.length)}function cZ(df,dj){if(!dj||dj>=df.length){return[df]}var dg=0;var dh=df.length;var di=[];for(dg;dg<dh;dg+=dj){di.push(df.slice(dg,dg+dj))}return di}function db(dg,df){if(!ch(dg)){return}if(!bz){cG.push(dg);return}cz(function(){var dj=cZ(dg,50);var dh=0,di;for(dh;dh<dj.length;dh++){di='{"requests":["?'+dj[dh].join('","?')+'"]}';
+c0(di,null,false)}cd(df)})}function aS(df){return bi+df+"."+b3+"."+bm}function bV(dh,dg,df){da(dh,"",-86400,dg,df)}function b2(){if(bj){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var df=bi+"testcookie";da(df,"1",undefined,bn,cT,bP);var dg=aC(df)==="1"?"1":"0";bV(df);return dg}function bg(){bm=b4((cT||cQ)+(bn||"/")).slice(0,4)}function cD(){if(J(c4.res)){return c4}var dg,di,dj={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dg in dj){if(Object.prototype.hasOwnProperty.call(dj,dg)){di=h.mimeTypes[dj[dg]];c4[dg]=(di&&di.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c4.java="1"
+}if(A(T.GearsFactory)){c4.gears="1"}c4.cookie=b2()}var dh=parseInt(X.width,10);var df=parseInt(X.height,10);c4.res=parseInt(dh,10)+"x"+parseInt(df,10);return c4}function bU(){var dg=aS("cvar"),df=aC(dg);if(df.length){df=T.JSON.parse(df);if(W(df)){return df}}return{}}function cA(){if(aP===false){aP=bU()}}function cM(){var df=cD();return b4((h.userAgent||"")+(h.platform||"")+T.JSON.stringify(df)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var df=cD();return b4((h.userAgent||"")+(h.platform||"")+T.JSON.stringify(df)).slice(0,6)}function be(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dg=be();var dh=az();var df=String(dg)+dh;return df}function cY(dh){dh=String(dh);var dk=az();var di=dk.length;var dj=dh.substr(-1*di,di);var dg=parseInt(dh.substr(0,dh.length-di),10);if(dg&&dj&&dj===dk){var df=be();if(aY<=0){return true}if(df>=dg&&df<=(dg+aY)){return true}}return false}function dd(df){if(!cI){return""}var dj=f(df,av);if(!dj){return""}dj=String(dj);var dh=new RegExp("^[a-zA-Z0-9]+$");
+if(dj.length===32&&dh.test(dj)){var dg=dj.substr(16,32);if(cY(dg)){var di=dj.substr(0,16);return di}}return""}function cJ(){if(!bL){bL=dd(bK)}var dh=new Date(),df=Math.round(dh.getTime()/1000),dg=aS("id"),dk=aC(dg),dj,di;if(dk){dj=dk.split(".");dj.unshift("0");if(bL.length){dj[1]=bL}return dj}if(bL.length){di=bL}else{if("0"===b2()){di=""}else{di=cM()}}dj=["1",di,df,0,df,"",""];return dj}function aX(){var dm=cJ(),di=dm[0],dj=dm[1],dg=dm[2],df=dm[3],dk=dm[4],dh=dm[5];if(!J(dm[6])){dm[6]=""}var dl=dm[6];return{newVisitor:di,uuid:dj,createTs:dg,visitCount:df,currentVisitTs:dk,lastVisitTs:dh,lastEcommerceOrderTs:dl}}function aG(){var di=new Date(),dg=di.getTime(),dj=aX().createTs;var df=parseInt(dj,10);var dh=(df*1000)+cF-dg;return dh}function aL(df){if(!b3){return}var dh=new Date(),dg=Math.round(dh.getTime()/1000);if(!J(df)){df=aX()}var di=df.uuid+"."+df.createTs+"."+df.visitCount+"."+dg+"."+df.lastVisitTs+"."+df.lastEcommerceOrderTs;da(aS("id"),di,aG(),bn,cT,bP)}function bJ(){var df=aC(aS("ref"));
+if(df.length){try{df=T.JSON.parse(df);if(W(df)){return df}}catch(dg){}}return["","",0,""]}function bu(dg){var df="testvalue";da("test",df,10000,null,dg);if(aC("test")===df){bV("test",null,dg);return true}return false}function aE(){var dg=bj;bj=false;var df,dh;for(df=0;df<bs.length;df++){dh=aS(bs[df]);if(dh!==cH&&dh!==bc&&0!==aC(dh)){bV(dh,bn,cT)}}bj=dg}function b0(df){b3=df;aL()}function de(dj){if(!dj||!W(dj)){return}var di=[];var dh;for(dh in dj){if(Object.prototype.hasOwnProperty.call(dj,dh)){di.push(dh)}}var dk={};di.sort();var df=di.length;var dg;for(dg=0;dg<df;dg++){dk[di[dg]]=dj[di[dg]]}return dk}function ca(){da(aS("ses"),"1",cm,bn,cT,bP)}function bf(){var di="";var dg="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dh=dg.length;var df;for(df=0;df<6;df++){di+=dg.charAt(Math.floor(Math.random()*dh))}return di}function cq(dh,dD,dE,di){var dC,dg=new Date(),dq=Math.round(dg.getTime()/1000),dm,dB,dj=1024,dK,dr,dz=aP,dk=aS("ses"),dx=aS("ref"),du=aS("cvar"),dv=aC(dk),dA=bJ(),dG=a3||bK,dn,df;
+if(bj){aE()}if(cL){return""}var dw=aX();if(!J(di)){di=""}var dt=G.characterSet||G.charset;if(!dt||dt.toLowerCase()==="utf-8"){dt=null}dn=dA[0];df=dA[1];dm=dA[2];dB=dA[3];if(!dv){var dF=cm/1000;if(!dw.lastVisitTs||(dq-dw.lastVisitTs)>dF){dw.visitCount++;dw.lastVisitTs=dw.currentVisitTs}if(!bt||!dn.length){for(dC in co){if(Object.prototype.hasOwnProperty.call(co,dC)){dn=f(dG,co[dC]);if(dn.length){break}}}for(dC in bD){if(Object.prototype.hasOwnProperty.call(bD,dC)){df=f(dG,bD[dC]);if(df.length){break}}}}dK=d(bl);dr=dB.length?d(dB):"";if(dK.length&&!aU(dK)&&(!bt||!dr.length||aU(dr))){dB=bl}if(dB.length||dn.length){dm=dq;dA=[dn,df,dm,bZ(dB.slice(0,dj))];da(dx,T.JSON.stringify(dA),c1,bn,cT,bP)}}dh+="&idsite="+b3+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dg.getHours()+"&m="+dg.getMinutes()+"&s="+dg.getSeconds()+"&url="+t(bZ(dG))+(bl.length?"&urlref="+t(bZ(bl)):"")+((bw&&bw.length)?"&uid="+t(bw):"")+"&_id="+dw.uuid+"&_idts="+dw.createTs+"&_idvc="+dw.visitCount+"&_idn="+dw.newVisitor+(dn.length?"&_rcn="+t(dn):"")+(df.length?"&_rck="+t(df):"")+"&_refts="+dm+"&_viewts="+dw.lastVisitTs+(String(dw.lastEcommerceOrderTs).length?"&_ects="+dw.lastEcommerceOrderTs:"")+(String(dB).length?"&_ref="+t(bZ(dB.slice(0,dj))):"")+(dt?"&cs="+t(dt):"")+"&send_image=0";
+var dJ=cD();for(dC in dJ){if(Object.prototype.hasOwnProperty.call(dJ,dC)){dh+="&"+dC+"="+dJ[dC]}}var dI=[];if(dD){for(dC in dD){if(Object.prototype.hasOwnProperty.call(dD,dC)&&/^dimension\d+$/.test(dC)){var dl=dC.replace("dimension","");dI.push(parseInt(dl,10));dI.push(String(dl));dh+="&"+dC+"="+t(dD[dC]);delete dD[dC]}}}if(dD&&B(dD)){dD=null}for(dC in bk){if(Object.prototype.hasOwnProperty.call(bk,dC)){var ds=(-1===M(dI,dC));if(ds){dh+="&dimension"+dC+"="+t(bk[dC])}}}if(dD){dh+="&data="+t(T.JSON.stringify(dD))}else{if(ao){dh+="&data="+t(T.JSON.stringify(ao))}}function dp(dL,dM){var dN=T.JSON.stringify(dL);if(dN.length>2){return"&"+dM+"="+t(dN)}return""}var dH=de(bT);var dy=de(cj);dh+=dp(dH,"cvar");dh+=dp(dy,"e_cvar");if(aP){dh+=dp(aP,"_cvar");for(dC in dz){if(Object.prototype.hasOwnProperty.call(dz,dC)){if(aP[dC][0]===""||aP[dC][1]===""){delete aP[dC]}}}if(bN){da(du,T.JSON.stringify(aP),cm,bn,cT,bP)}}if(a1){if(ck){dh+="&gt_ms="+ck}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dh+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
+}}}if(aK){dh+="&pv_id="+aK}dw.lastEcommerceOrderTs=J(di)&&String(di).length?di:dw.lastEcommerceOrderTs;aL(dw);ca();dh+=ac(dE,{tracker:bF,request:dh});if(cV.length){dh+="&"+cV}if(A(b8)){dh=b8(dh)}return dh}bO=function a6(){var df=new Date();df=df.getTime();if(!cU){return false}if((cU+(1000*c3))<=df){return false}if(cU+a4<=df){bF.ping();return true}return false};function bo(di,dh,dn,dj,df,dr){var dl="idgoal=0",dm,dg=new Date(),dp=[],dq,dk=String(di).length;if(dk){dl+="&ec_id="+t(di);dm=Math.round(dg.getTime()/1000)}dl+="&revenue="+dh;if(String(dn).length){dl+="&ec_st="+dn}if(String(dj).length){dl+="&ec_tx="+dj}if(String(df).length){dl+="&ec_sh="+df}if(String(dr).length){dl+="&ec_dt="+dr}if(cW){for(dq in cW){if(Object.prototype.hasOwnProperty.call(cW,dq)){if(!J(cW[dq][1])){cW[dq][1]=""}if(!J(cW[dq][2])){cW[dq][2]=""}if(!J(cW[dq][3])||String(cW[dq][3]).length===0){cW[dq][3]=0}if(!J(cW[dq][4])||String(cW[dq][4]).length===0){cW[dq][4]=1}dp.push(cW[dq])}}dl+="&ec_items="+t(T.JSON.stringify(dp))
+}dl=cq(dl,ao,"ecommerce",dm);bC(dl,bG);if(dk){cW={}}}function bW(df,dj,di,dh,dg,dk){if(String(df).length&&J(dj)){bo(df,dj,di,dh,dg,dk)}}function bq(df){if(J(df)){bo("",df,"","","","")}}function bX(dg,di,dh){aK=bf();var df=cq("action_name="+t(al(dg||bh)),di,"log");bC(df,bG,dh)}function aZ(dh,dg){var di,df="(^| )(piwik[_-]"+dg;if(dh){for(di=0;di<dh.length;di++){df+="|"+dh[di]}}df+=")( |$)";return new RegExp(df)}function aT(df){return(aD&&df&&0===String(df).indexOf(aD))}function cs(dj,df,dk,dg){if(aT(df)){return 0}var di=aZ(bI,"download"),dh=aZ(a7,"link"),dl=new RegExp("\\.("+c2.join("|")+")([?&#]|$)","i");if(dh.test(dj)){return"link"}if(dg||di.test(dj)||dl.test(df)){return"download"}if(dk){return 0}return"link"}function au(dg){var df;df=dg.parentNode;while(df!==null&&J(df)){if(ae.isLinkElement(dg)){break}dg=df;df=dg.parentNode}return dg}function c8(dk){dk=au(dk);if(!ae.hasNodeAttribute(dk,"href")){return}if(!J(dk.href)){return}var dj=ae.getAttributeValueFromNode(dk,"href");var dg=dk.pathname||ci(dk.href);
+var dl=dk.hostname||d(dk.href);var dm=dl.toLowerCase();var dh=dk.href.replace(dl,dm);var di=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!di.test(dh)){var df=cs(dk.className,dh,ar(dm,dg),ae.hasNodeAttribute(dk,"download"));if(df){return{type:df,href:dh}}}}function aO(df,dg,dh,di){var dj=v.buildInteractionRequestParams(df,dg,dh,di);if(!dj){return}return cq(dj,null,"contentInteraction")}function ba(df,dg){if(!df||!dg){return false}var dh=v.findTargetNode(df);if(v.shouldIgnoreInteraction(dh)){return false}dh=v.findTargetNodeNoDefault(df);if(dh&&!V(dh,dg)){return false}return true}function cr(dh,dg,dj){if(!dh){return}var df=v.findParentContentNode(dh);if(!df){return}if(!ba(df,dh)){return}var di=v.buildContentBlock(df);if(!di){return}if(!di.target&&dj){di.target=dj}return v.buildInteractionRequestParams(dg,di.name,di.piece,di.target)}function aV(dg){if(!b7||!b7.length){return false}var df,dh;for(df=0;df<b7.length;df++){dh=b7[df];if(dh&&dh.name===dg.name&&dh.piece===dg.piece&&dh.target===dg.target){return true
+}}return false}function aW(df){return function(dj){if(!df){return}var dh=v.findParentContentNode(df);var dg;if(dj){dg=dj.target||dj.srcElement}if(!dg){dg=df}if(!ba(dh,dg)){return}if(!dh){return false}var dk=v.findTargetNode(dh);if(!dk||v.shouldIgnoreInteraction(dk)){return false}var di=c8(dk);if(c5&&di&&di.type){return di.type}return bF.trackContentInteractionNode(dg,"click")}}function bY(dh){if(!dh||!dh.length){return}var df,dg;for(df=0;df<dh.length;df++){dg=v.findTargetNode(dh[df]);if(dg&&!dg.contentInteractionTrackingSetupDone){dg.contentInteractionTrackingSetupDone=true;an(dg,"click",aW(dg))}}}function bv(dh,di){if(!dh||!dh.length){return[]}var df,dg;for(df=0;df<dh.length;df++){if(aV(dh[df])){dh.splice(df,1);df--}else{b7.push(dh[df])}}if(!dh||!dh.length){return[]}bY(di);var dj=[];for(df=0;df<dh.length;df++){dg=cq(v.buildImpressionRequestParams(dh[df].name,dh[df].piece,dh[df].target),undefined,"contentImpressions");if(dg){dj.push(dg)}}return dj}function cw(dg){var df=v.collectContent(dg);
+return bv(df,dg)}function a8(dg){if(!dg||!dg.length){return[]}var df;for(df=0;df<dg.length;df++){if(!v.isNodeVisible(dg[df])){dg.splice(df,1);df--}}if(!dg||!dg.length){return[]}return cw(dg)}function aF(dh,df,dg){var di=v.buildImpressionRequestParams(dh,df,dg);return cq(di,null,"contentImpression")}function c7(di,dg){if(!di){return}var df=v.findParentContentNode(di);var dh=v.buildContentBlock(df);if(!dh){return}if(!dg){dg="Unknown"}return aO(dg,dh.name,dh.piece,dh.target)}function cK(dg,di,df,dh){return"e_c="+t(dg)+"&e_a="+t(di)+(J(df)?"&e_n="+t(df):"")+(J(dh)?"&e_v="+t(dh):"")}function at(dh,dj,df,di,dl,dk){if(a(String(dh)).length===0||a(String(dj)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");return false}var dg=cq(cK(dh,dj,df,di),dl,"event");bC(dg,bG,dk)}function b5(df,di,dg,dj){var dh=cq("search="+t(df)+(di?"&search_cat="+t(di):"")+(J(dg)?"&search_count="+dg:""),dj,"sitesearch");bC(dh,bG)}function cP(df,dj,di,dh){var dg=cq("idgoal="+df+(dj?"&revenue="+dj:""),di,"goal");
+bC(dg,bG,dh)}function cX(di,df,dm,dl,dh){var dk=df+"="+t(bZ(di));var dg=cr(dh,"click",di);if(dg){dk+="&"+dg}var dj=cq(dk,dm,"link");bC(dj,bG,dl)}function bR(dg,df){if(dg!==""){return dg+df.charAt(0).toUpperCase()+df.slice(1)}return df}function ce(dk){var dj,df,di=["","webkit","ms","moz"],dh;if(!bd){for(df=0;df<di.length;df++){dh=di[df];if(Object.prototype.hasOwnProperty.call(G,bR(dh,"hidden"))){if(G[bR(dh,"visibilityState")]==="prerender"){dj=true}break}}}if(dj){an(G,dh+"visibilitychange",function dg(){G.removeEventListener(dh+"visibilitychange",dg,false);dk()});return}dk()}function bp(){var dg=aX().uuid;var df=aI();return dg+df}function cg(df){if(!df){return}if(!ae.hasNodeAttribute(df,"href")){return}var dg=ae.getAttributeValueFromNode(df,"href");if(!dg||aT(dg)){return}dg=k(dg,av);var dh=bp();dg=F(dg,av,dh);ae.setAnyAttribute(df,"href",dg)}function aA(di){var dj=ae.getAttributeValueFromNode(di,"href");if(!dj){return false}dj=String(dj);var dg=dj.indexOf("//")===0||dj.indexOf("http://")===0||dj.indexOf("https://")===0;
+if(!dg){return false}var df=di.pathname||ci(di.href);var dh=(di.hostname||d(di.href)).toLowerCase();if(ar(dh,df)){if(!cC(cQ,L(dh))){return true}return false}return false}function cB(df){var dg=c8(df);if(dg&&dg.type){dg.href=p(dg.href);cX(dg.href,dg.type,undefined,null,df);return}if(cI){df=au(df);if(aA(df)){cg(df)}}}function ct(){return G.all&&!G.addEventListener}function cR(df){var dh=df.which;var dg=(typeof df.button);if(!dh&&dg!=="undefined"){if(ct()){if(df.button&1){dh=1}else{if(df.button&2){dh=3}else{if(df.button&4){dh=2}}}}else{if(df.button===0||df.button==="0"){dh=1}else{if(df.button&1){dh=2}else{if(df.button&2){dh=3}}}}}return dh}function bQ(df){switch(cR(df)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function a0(df){return df.target||df.srcElement}function aB(df){return function(di){di=di||T.event;var dh=bQ(di);var dj=a0(di);if(di.type==="click"){var dg=false;if(df&&dh==="middle"){dg=true}if(dj&&!dg){cB(dj)}}else{if(di.type==="mousedown"){if(dh==="middle"&&dj){aQ=dh;
+by=dj}else{aQ=by=null}}else{if(di.type==="mouseup"){if(dh===aQ&&dj===by){cB(dj)}aQ=by=null}else{if(di.type==="contextmenu"){cB(dj)}}}}}}function aq(dh,dg){var df=typeof dg;if(df==="undefined"){dg=true}an(dh,"click",aB(dg),false);if(dg){an(dh,"mouseup",aB(dg),false);an(dh,"mousedown",aB(dg),false);an(dh,"contextmenu",aB(dg),false)}}function bB(dh,dj){ap=true;var di,dg=aZ(bx,"ignore"),dk=G.links,df=null,dl=null;if(dk){for(di=0;di<dk.length;di++){df=dk[di];if(!dg.test(df.className)){dl=typeof df.piwikTrackers;if("undefined"===dl){df.piwikTrackers=[]}if(-1===M(df.piwikTrackers,dj)){df.piwikTrackers.push(dj);aq(df,dh)}}}}}function aR(dg,dj,dk){if(cc){return true}cc=true;var dl=false;var di,dh;function df(){dl=true}n(function(){function dm(dp){setTimeout(function(){if(!cc){return}dl=false;dk.trackVisibleContentImpressions();dm(dp)},dp)}function dn(dp){setTimeout(function(){if(!cc){return}if(dl){dl=false;dk.trackVisibleContentImpressions()}dn(dp)},dp)}if(dg){di=["scroll","resize"];for(dh=0;dh<di.length;
+dh++){if(G.addEventListener){G.addEventListener(di[dh],df,false)}else{T.attachEvent("on"+di[dh],df)}}dn(100)}if(dj&&dj>0){dj=parseInt(dj,10);dm(dj)}})}var bA={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var df=this.requests;this.requests=[];if(df.length===1){bC(df[0],bG)}else{db(df,bG)}},push:function(df){if(!df){return}if(m||!this.enabled){bC(df,bG);return}bA.requests.push(df);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bA.timeout=null;bA.sendRequests()},bA.interval);var dg="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dg)){b[dg]={unload:function(){if(bA.timeout){clearTimeout(bA.timeout)}bA.sendRequests()}}}}};bg();aL();this.hasConsent=function(){return bz};this.getVisitorId=function(){return aX().uuid};this.getVisitorInfo=function(){return cJ()};this.getAttributionInfo=function(){return bJ()};this.getAttributionCampaignName=function(){return bJ()[0]};this.getAttributionCampaignKeyword=function(){return bJ()[1]
+};this.getAttributionReferrerTimestamp=function(){return bJ()[2]};this.getAttributionReferrerUrl=function(){return bJ()[3]};this.setTrackerUrl=function(df){aD=df};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bE)};this.addTracker=function(df,dh){if(!J(df)||null===df){df=this.getTrackerUrl()}var dg=new Q(df,dh);I.push(dg);e.trigger("TrackerAdded",[this]);return dg};this.getSiteId=function(){return b3};this.setSiteId=function(df){b0(df)};this.resetUserId=function(){bw=""};this.setUserId=function(df){if(Y(df)){bw=df}};this.getUserId=function(){return bw};this.setCustomData=function(df,dg){if(W(df)){ao=df}else{if(!ao){ao={}}ao[df]=dg}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(df){b8=df};this.appendToTrackingUrl=function(df){cV=df};this.getRequest=function(df){return cq(df)};this.addPlugin=function(df,dg){b[df]=dg};this.setCustomDimension=function(df,dg){df=parseInt(df,10);if(df>0){if(!J(dg)){dg=""}if(!w(dg)){dg=String(dg)
+}bk[df]=dg}};this.getCustomDimension=function(df){df=parseInt(df,10);if(df>0&&Object.prototype.hasOwnProperty.call(bk,df)){return bk[df]}};this.deleteCustomDimension=function(df){df=parseInt(df,10);if(df>0){delete bk[df]}};this.setCustomVariable=function(dg,df,dj,dh){var di;if(!J(dh)){dh="visit"}if(!J(df)){return}if(!J(dj)){dj=""}if(dg>0){df=!w(df)?String(df):df;dj=!w(dj)?String(dj):dj;di=[df.slice(0,br),dj.slice(0,br)];if(dh==="visit"||dh===2){cA();aP[dg]=di}else{if(dh==="page"||dh===3){bT[dg]=di}else{if(dh==="event"){cj[dg]=di}}}}};this.getCustomVariable=function(dg,dh){var df;if(!J(dh)){dh="visit"}if(dh==="page"||dh===3){df=bT[dg]}else{if(dh==="event"){df=cj[dg]}else{if(dh==="visit"||dh===2){cA();df=aP[dg]}}}if(!J(df)||(df&&df[0]==="")){return false}return df};this.deleteCustomVariable=function(df,dg){if(this.getCustomVariable(df,dg)){this.setCustomVariable(df,"","",dg)}};this.deleteCustomVariables=function(df){if(df==="page"||df===3){bT={}}else{if(df==="event"){cj={}}else{if(df==="visit"||df===2){aP={}
+}}}};this.storeCustomVariablesInCookie=function(){bN=true};this.setLinkTrackingTimer=function(df){bG=df};this.getLinkTrackingTimer=function(){return bG};this.setDownloadExtensions=function(df){if(w(df)){df=df.split("|")}c2=df};this.addDownloadExtensions=function(dg){var df;if(w(dg)){dg=dg.split("|")}for(df=0;df<dg.length;df++){c2.push(dg[df])}};this.removeDownloadExtensions=function(dh){var dg,df=[];if(w(dh)){dh=dh.split("|")}for(dg=0;dg<c2.length;dg++){if(M(dh,c2[dg])===-1){df.push(c2[dg])}}c2=df};this.setDomains=function(df){ax=w(df)?[df]:df;var dj=false,dh=0,dg;for(dh;dh<ax.length;dh++){dg=String(ax[dh]);if(cC(cQ,L(dg))){dj=true;break}var di=ci(dg);if(di&&di!=="/"&&di!=="/*"){dj=true;break}}if(!dj){ax.push(cQ)}};this.enableCrossDomainLinking=function(){cI=true};this.disableCrossDomainLinking=function(){cI=false};this.isCrossDomainLinkingEnabled=function(){return cI};this.setCrossDomainLinkingTimeout=function(df){aY=df};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bp())
+};this.setIgnoreClasses=function(df){bx=w(df)?[df]:df};this.setRequestMethod=function(df){c6=df||cf};this.setRequestContentType=function(df){cu=df||aH};this.setReferrerUrl=function(df){bl=df};this.setCustomUrl=function(df){a3=bS(bK,df)};this.getCurrentUrl=function(){return a3||bK};this.setDocumentTitle=function(df){bh=df};this.setAPIUrl=function(df){bE=df};this.setDownloadClasses=function(df){bI=w(df)?[df]:df};this.setLinkClasses=function(df){a7=w(df)?[df]:df};this.setCampaignNameKey=function(df){co=w(df)?[df]:df};this.setCampaignKeywordKey=function(df){bD=w(df)?[df]:df};this.discardHashTag=function(df){bM=df};this.setCookieNamePrefix=function(df){bi=df;aP=bU()};this.setCookieDomain=function(df){var dg=L(df);if(bu(dg)){cT=dg;bg()}};this.getCookieDomain=function(){return cT};this.hasCookies=function(){return"1"===b2()};this.setSessionCookie=function(dh,dg,df){if(!dh){throw new Error("Missing cookie name")}if(!J(df)){df=cm}bs.push(dh);da(aS(dh),dg,df,bn,cT)};this.getCookie=function(dg){var df=aC(aS(dg));
+if(df===0){return null}return df};this.setCookiePath=function(df){bn=df;bg()};this.getCookiePath=function(df){return bn};this.setVisitorCookieTimeout=function(df){cF=df*1000};this.setSessionCookieTimeout=function(df){cm=df*1000};this.getSessionCookieTimeout=function(){return cm};this.setReferralCookieTimeout=function(df){c1=df*1000};this.setConversionAttributionFirstReferrer=function(df){bt=df};this.setSecureCookie=function(df){bP=df};this.disableCookies=function(){bj=true;c4.cookie="0";if(b3){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dg){var df=h.doNotTrack||h.msDoNotTrack;cL=dg&&(df==="yes"||df==="1");if(cL){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cS=true};this.disableAlwaysUseSendBeacon=function(){cS=false};this.addListener=function(dg,df){aq(dg,df)};this.enableLinkTracking=function(dg){c5=true;var df=this;ce(function(){q(function(){bB(dg,df)})})};this.enableJSErrorTracking=function(){if(cO){return}cO=true;var df=T.onerror;T.onerror=function(dk,di,dh,dj,dg){ce(function(){var dl="JavaScript Errors";
+var dm=di+":"+dh;if(dj){dm+=":"+dj}at(dl,dm,dk)});if(df){return df(dk,di,dh,dj,dg)}return false}};this.disablePerformanceTracking=function(){a1=false};this.setGenerationTimeMs=function(df){ck=parseInt(df,10)};this.setVisitStandardLength=function(df){df=Math.max(df,5);c3=df};this.enableHeartBeatTimer=function(df){df=Math.max(df,5);a4=(df||15)*1000;if(cU!==null){dc()}};this.disableHeartBeatTimer=function(){bH();if(a4||aM){if(T.removeEventListener){T.removeEventListener("focus",a9);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",a9);T.detachEvent("onblur",ay)}}}a4=null;aM=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(df){if(T.location.protocol==="file:"){T.location=df}};this.setCountPreRendered=function(df){bd=df};this.trackGoal=function(df,di,dh,dg){ce(function(){cP(df,di,dh,dg)})};this.trackLink=function(dg,df,di,dh){ce(function(){cX(dg,df,di,dh)})};this.getNumTrackedPageViews=function(){return cp
+};this.trackPageView=function(df,dh,dg){b7=[];cG=[];if(N(b3)){ce(function(){Z(aD,bE,b3)})}else{ce(function(){cp++;bX(df,dh,dg)})}};this.trackAllContentImpressions=function(){if(N(b3)){return}ce(function(){q(function(){var df=v.findContentNodes();var dg=cw(df);db(dg,bG)})})};this.trackVisibleContentImpressions=function(df,dg){if(N(b3)){return}if(!J(df)){df=true}if(!J(dg)){dg=750}aR(df,dg,this);ce(function(){n(function(){var dh=v.findContentNodes();var di=a8(dh);db(di,bG)})})};this.trackContentImpression=function(dh,df,dg){if(N(b3)){return}dh=a(dh);df=a(df);dg=a(dg);if(!dh){return}df=df||"Unknown";ce(function(){var di=aF(dh,df,dg);bC(di,bG)})};this.trackContentImpressionsWithinNode=function(df){if(N(b3)||!df){return}ce(function(){if(cc){n(function(){var dg=v.findContentNodesWithinNode(df);var dh=a8(dg);db(dh,bG)})}else{q(function(){var dg=v.findContentNodesWithinNode(df);var dh=cw(dg);db(dh,bG)})}})};this.trackContentInteraction=function(dh,di,df,dg){if(N(b3)){return}dh=a(dh);di=a(di);df=a(df);
+dg=a(dg);if(!dh||!di){return}df=df||"Unknown";ce(function(){var dj=aO(dh,di,df,dg);if(dj){bC(dj,bG)}})};this.trackContentInteractionNode=function(dh,dg){if(N(b3)||!dh){return}var df=null;ce(function(){df=c7(dh,dg);if(df){bC(df,bG)}});return df};this.logAllContentBlocksOnPage=function(){var dh=v.findContentNodes();var df=v.collectContent(dh);var dg=typeof console;if(dg!=="undefined"&&console&&console.log){console.log(df)}};this.trackEvent=function(dg,di,df,dh,dk,dj){ce(function(){at(dg,di,df,dh,dk,dj)})};this.trackSiteSearch=function(df,dh,dg,di){b7=[];ce(function(){b5(df,dh,dg,di)})};this.setEcommerceView=function(di,df,dh,dg){if(Y(dh)){dh=String(dh)}if(!J(dh)||dh===null||dh===false||!dh.length){dh=""}else{if(dh instanceof Array){dh=T.JSON.stringify(dh)}}bT[5]=["_pkc",dh];if(J(dg)&&dg!==null&&dg!==false&&String(dg).length){bT[2]=["_pkp",dg]}if(!Y(di)&&!Y(df)){return}if(Y(di)){bT[3]=["_pks",di]}if(!Y(df)){df=""}bT[4]=["_pkn",df]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(cW))
+};this.addEcommerceItem=function(dj,df,dh,dg,di){if(Y(dj)){cW[dj]=[String(dj),df,dh,dg,di]}};this.removeEcommerceItem=function(df){if(Y(df)){df=String(df);delete cW[df]}};this.clearEcommerceCart=function(){cW={}};this.trackEcommerceOrder=function(df,dj,di,dh,dg,dk){bW(df,dj,di,dh,dg,dk)};this.trackEcommerceCartUpdate=function(df){bq(df)};this.trackRequest=function(dg,di,dh,df){ce(function(){var dj=cq(dg,di,df);bC(dj,bG,dh)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bA.enabled=false};this.setRequestQueueInterval=function(df){if(df<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bA.interval=df};this.queueRequest=function(df){ce(function(){var dg=cq(df);bA.push(dg)})};this.isConsentRequired=function(){return cx};this.getRememberedConsent=function(){var df=aC(bc);if(aC(cH)){if(df){bV(bc,bn,cT)}return null}if(!df||df===0){return null}return df};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
+};this.requireConsent=function(){cx=true;bz=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bz){aE()}}}};this.setConsentGiven=function(){bz=true;bV(cH,bn,cT);var dg,df;for(dg=0;dg<cG.length;dg++){df=typeof cG[dg];if(df==="string"){bC(cG[dg],bG)}else{if(df==="object"){db(cG[dg],bG)}}}cG=[]};this.rememberConsentGiven=function(dg){if(dg){dg=dg*60*60*1000}else{dg=30*365*24*60*60*1000}this.setConsentGiven();var df=new Date().getTime();da(bc,df,dg,bn,cT,bP)};this.forgetConsentGiven=function(){var df=30*365*24*60*60*1000;bV(bc,bn,cT);da(cH,new Date().getTime(),df,bn,cT,bP);this.requireConsent()};this.isUserOptedOut=function(){return !bz};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
if(av[ap]>1&&ap!=="addTracker"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ad(ao,aq){var ap=new Q(ao,aq);I.push(ap);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[ap]);return ap}an(T,"beforeunload",ai,false);an(T,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getPiwikUrl());
-if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
+if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:T.JSON,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
}y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||T,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ao,ap){if(!J(ap)){ap=this.getAsyncTracker().getSiteId()}if(!J(ao)){ao=this.getAsyncTracker().getTrackerUrl()}return new Q(ao,ap)},getAsyncTrackers:function(){return I},addTracker:function(ao,aq){var ap;if(!I.length){ap=ad(ao,aq)}else{ap=I[0].addTracker(ao,aq)}return ap},getAsyncTracker:function(ap,at){var ar;if(I&&I.length&&I[0]){ar=I[0]}else{return ad(ap,at)}if(!at&&!ap){return ar}if((!J(at)||null===at)&&ar){at=ar.getSiteId()}if((!J(ap)||null===ap)&&ar){ap=ar.getTrackerUrl()}var aq,ao=0;for(ao;ao<I.length;ao++){aq=I[ao];if(aq&&String(aq.getSiteId())===String(at)&&aq.getTrackerUrl()===ap){return aq}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])
}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return e});define("matomo",[],function(){return e})}return e}())}
/*!!! pluginTrackerHook */
diff --git a/lang/cs.json b/lang/cs.json
index f7ff8aa473..87ea4adce0 100644
--- a/lang/cs.json
+++ b/lang/cs.json
@@ -111,6 +111,7 @@
"ConfigFileIsNotWritable": "Konfigurační soubor Matomo %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 Matomo",
+ "CurrentlyUsingUnsecureHttp": "Momentálně používáte Matomo přes nezabezpečený protokol HTTP. To může způsobit, že vaše Matomo může zranitelné z pohledu bezpečnostních chyb. Můžete také porušovat zákony na ochranu soukromí, protože některé funkce včetně souborů cookie pro rozhodnutí se k neúčasti nebudou fungovat. Doporučujeme nastavit Matomo pro použití SSL (HTTPS) pro zvýšení bezpečnosti.",
"CreatedByUser": "vytvořil %s",
"CurrentMonth": "Tento měsíc",
"CurrentWeek": "Tento týden",
diff --git a/lang/pt.json b/lang/pt.json
index c2dc33f72b..e31d11bbc4 100644
--- a/lang/pt.json
+++ b/lang/pt.json
@@ -111,6 +111,7 @@
"ConfigFileIsNotWritable": "O ficheiro de configuração do Matomo %1$s não é modificável, as suas alterações podem não ser guardadas. %2$s Por favor altere as permissões do ficheiro de configuração para o mesmo ser modificável.",
"Continue": "Continuar",
"ContinueToPiwik": "Continuar para o Matomo",
+ "CurrentlyUsingUnsecureHttp": "Atualmente está a utilizar o Matomo sob o HTTP inseguro. Isto pode fazer com que o Matomo seja vulnerável à exploração de falhas de segurança. Pode também estar a violar leis de privacidade, dado que algumas funcionalidades, incluindo cookies de exclusão, não irão funcionar. Recomendamos que configure o Matomo para utilizar SSL (HTTPS) para uma segurança melhorada.",
"CreatedByUser": "criado por %s",
"CurrentMonth": "Mês atual",
"CurrentWeek": "Semana atual",
diff --git a/lang/ru.json b/lang/ru.json
index bf1c0b9656..5b76212320 100644
--- a/lang/ru.json
+++ b/lang/ru.json
@@ -111,6 +111,7 @@
"ConfigFileIsNotWritable": "Файл конфигурации Matomo %1$s закрыт для записи, ваши изменения не будут сохранены. %2$s Пожалуйста, измените разрешения конфигурационного файла и разрешите запись в него.",
"Continue": "Продолжить",
"ContinueToPiwik": "Перейти к Matomo",
+ "CurrentlyUsingUnsecureHttp": "Сейчас вы используете Matomo через незащищённое соединение. Это делает Matomo уязвимым к разного рода эксплойтам. Некоторые функции (напр., файлы cookies) могут не работать. Мы рекомендуем настроить Matomo с использованием защищённого соединения для большей безопасности.",
"CreatedByUser": "сделано %s",
"CurrentMonth": "Текущий месяц",
"CurrentWeek": "Текущая неделя",
@@ -303,6 +304,8 @@
"OneVisit": "1 посещение",
"OnlyEnterIfRequired": "Введите имя пользователя, если ваш SMTP сервер требует этого.",
"OnlyEnterIfRequiredPassword": "Введите пароль, если ваш SMTP сервер требует этого.",
+ "SmtpFromEmailHelp": "По умолчанию noreply@{DOMAIN}, где {DOMAIN} будет заменено на значение вашего домена Matomo.%1$s<br> Если отправка писем не работает, вам может понадобиться установить этот адрес, совпадающий с вашим пользователем SMTP.",
+ "NameShownInTheSenderColumn": "Имя, отображаемое в поле отправителя",
"OnlyUsedIfUserPwdIsSet": "Используется если имя пользователя\/пароль заданы, спросите у своего провайдера, если не уверены в выборе метода.",
"OpenSourceWebAnalytics": "открытая\/свободная аналитическая платформа",
"OperationAtLeast": "Не менее",
diff --git a/lang/sl.json b/lang/sl.json
index 42e6a39a4a..a2886790ed 100644
--- a/lang/sl.json
+++ b/lang/sl.json
@@ -34,6 +34,8 @@
"DoubleClickToChangePeriod": "Uporabite dvojni klik za uporabo tega obdobja",
"Close": "Zapri",
"ClickToSearch": "Klikni za iskanje",
+ "Copy": "kopiraj",
+ "Confirm": "potrdi",
"ColumnActionsPerVisit": "Dejanj na obisk",
"ColumnActionsPerVisitDocumentation": "Povprečno število dejanj (ogledov strani, prenosov ali izhodnih povezav), ki so bila izvedena med obiskom.",
"ColumnAverageGenerationTime": "Povp. čas generiranja",
@@ -41,6 +43,7 @@
"ColumnAverageTimeOnPage": "Povpr. čas na strani",
"ColumnAverageTimeOnPageDocumentation": "Povprečen čas, ki so ga obiskovalci porabili na tej strani (samo na strani, ne na celotni spletni strani).",
"ColumnAvgTimeOnSite": "Povpr. čas na spletni strani",
+ "ColumnSumTimeOnSite": "skupni čas na strani",
"ColumnAvgTimeOnSiteDocumentation": "Povprečno trajanje obiska.",
"ColumnBounceRate": "Odbojno razmerje",
"ColumnBounceRateDocumentation": "Delež obiskov, ki je vseboval zgolj en sam ogled strani. Obiskovalec je zapustil spletno stran direktno z vhodne strani.",
@@ -62,6 +65,7 @@
"ColumnNbActions": "Dejanj",
"ColumnNbActionsDocumentation": "Število akcij obiskovalcev. Akcije so lahko prikazi strani, prenosi ali izhodi preko zunanjih povezav.",
"ColumnNbUniqVisitors": "Edinstveni obiskovalci",
+ "ColumnNbUniqVisitorsDocumentation": "Število ne podvojenih obiskovalcev tvoje spletne strani. Vsak uporabnik je štet le enkrat, tudi če obišče stran večkrat dnevno.",
"ColumnNbUsers": "Uporabniki",
"ColumnNbUsersDocumentation": "Število uporabnikov, ki so prijavljeni v vaše spletno mesto. To je število unikatnih aktivnih uporabnikov, ki imajo nastavljen User ID (prek funkcije 'setUserId' v sledilni kodi).",
"ColumnNbVisits": "Obiskov",
@@ -472,7 +476,12 @@
"VerifyAccount": "Preverjanje računa",
"ValidateSslCertificate": "Potrdi SSL certifikat",
"VerifyLoginData": "Zagotovite, da je kombinacija uporabniškega imena in gesla pravilna.",
- "YouAreOffline": "Oprostite, trenutno ste offline"
+ "YouAreOffline": "Oprostite, trenutno ste offline",
+ "ExceptionNoViewAccess": "Prosim preveri uporabniško ime in geslo, ter se prepričaj, da imaš %sdostop do vsaj ene spletne strani.",
+ "Mobile_HowtoExitAndroid": "Ponovno klikni NAZAJ za izhod.",
+ "MatomoMarketplace": "Matomo Tržnica",
+ "EnterAuthCode": "Vnesi avtentikacijsko geslo",
+ "EnterCorrectAuthCode": "Vnesi pravilno avtentikacijsko geslo"
},
"RowEvolution": {
"AvailableMetrics": "Razpoložljive metrike",
diff --git a/lang/zh-cn.json b/lang/zh-cn.json
index 6c108964bf..1f6f113224 100644
--- a/lang/zh-cn.json
+++ b/lang/zh-cn.json
@@ -111,6 +111,7 @@
"ConfigFileIsNotWritable": "Matomo 配置文件 %1$s 无法写入,无法保存部分修改。%2$s 请修改配置文件的权限为可写。",
"Continue": "继续",
"ContinueToPiwik": "继续使用Matomo",
+ "CurrentlyUsingUnsecureHttp": "您当前正在通过不安全的HTTP使用Matomo。 这会使您的Matomo容易受到安全漏洞的攻击。 您可能还违反了隐私法,因为某些功能(包括选择退出Cookie)将无法使用。 我们建议您将Matomo设置为使用SSL(HTTPS),以提高安全性。",
"CreatedByUser": "版权所有 %s",
"CurrentMonth": "本月",
"CurrentWeek": "本周",
diff --git a/libs/MaxMindGeoIP/geoip.inc b/libs/MaxMindGeoIP/geoip.inc
deleted file mode 100644
index 519e48d373..0000000000
--- a/libs/MaxMindGeoIP/geoip.inc
+++ /dev/null
@@ -1,1953 +0,0 @@
-<?php
-
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
-/* geoip.inc
- *
- * Copyright (C) 2007 MaxMind LLC
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-define("GEOIP_COUNTRY_BEGIN", 16776960);
-define("GEOIP_STATE_BEGIN_REV0", 16700000);
-define("GEOIP_STATE_BEGIN_REV1", 16000000);
-define("GEOIP_STANDARD", 0);
-define("GEOIP_MEMORY_CACHE", 1);
-define("GEOIP_SHARED_MEMORY", 2);
-define("STRUCTURE_INFO_MAX_SIZE", 20);
-define("DATABASE_INFO_MAX_SIZE", 100);
-if (!defined('GEOIP_COUNTRY_EDITION')) {
- // GeoIP PECL installed?
- define("GEOIP_COUNTRY_EDITION", 1);
-}
-if (!defined('GEOIP_PROXY_EDITION')) {
- // GeoIP PECL installed?
- define("GEOIP_PROXY_EDITION", 8);
-}
-if (!defined('GEOIP_ASNUM_EDITION')) {
- // GeoIP PECL installed?
- define("GEOIP_ASNUM_EDITION", 9);
-}
-if (!defined('GEOIP_NETSPEED_EDITION')) {
- // GeoIP PECL installed?
- define("GEOIP_NETSPEED_EDITION", 10);
-}
-if (!defined('GEOIP_REGION_EDITION_REV0')) {
- // GeoIP PECL installed?
- define("GEOIP_REGION_EDITION_REV0", 7);
-}
-if (!defined('GEOIP_REGION_EDITION_REV1')) {
- // GeoIP PECL installed?
- define("GEOIP_REGION_EDITION_REV1", 3);
-}
-if (!defined('GEOIP_CITY_EDITION_REV0')) {
- // GeoIP PECL installed?
- define("GEOIP_CITY_EDITION_REV0", 6);
-}
-if (!defined('GEOIP_CITY_EDITION_REV1')) {
- // GeoIP PECL installed?
- define("GEOIP_CITY_EDITION_REV1", 2);
-}
-if (!defined('GEOIP_ORG_EDITION')) {
- // GeoIP PECL installed?
- define("GEOIP_ORG_EDITION", 5);
-}
-if (!defined('GEOIP_ISP_EDITION')) {
- // GeoIP PECL installed?
- define("GEOIP_ISP_EDITION", 4);
-}
-define("SEGMENT_RECORD_LENGTH", 3);
-define("STANDARD_RECORD_LENGTH", 3);
-define("ORG_RECORD_LENGTH", 4);
-define("MAX_RECORD_LENGTH", 4);
-define("MAX_ORG_RECORD_LENGTH", 300);
-define("GEOIP_SHM_KEY", 0x4f415401);
-define("US_OFFSET", 1);
-define("CANADA_OFFSET", 677);
-define("WORLD_OFFSET", 1353);
-define("FIPS_RANGE", 360);
-if (!defined('GEOIP_UNKNOWN_SPEED')) {
- // GeoIP PECL installed?
- define("GEOIP_UNKNOWN_SPEED", 0);
-}
-if (!defined('GEOIP_DIALUP_SPEED')) {
- // GeoIP PECL installed?
- define("GEOIP_DIALUP_SPEED", 1);
-}
-if (!defined('GEOIP_CABLEDSL_SPEED')) {
- // GeoIP PECL installed?
- define("GEOIP_CABLEDSL_SPEED", 2);
-}
-if (!defined('GEOIP_CORPORATE_SPEED')) {
- // GeoIP PECL installed?
- define("GEOIP_CORPORATE_SPEED", 3);
-}
-if (!defined('GEOIP_DOMAIN_EDITION')) {
- // GeoIP PECL installed?
- define("GEOIP_DOMAIN_EDITION", 11);
-}
-//if (!defined('GEOIP_COUNTRY_EDITION_V6')) {
- // GeoIP PECL installed?
- define("GEOIP_COUNTRY_EDITION_V6", 12);
-//}
-define("GEOIP_LOCATIONA_EDITION", 13);
-define("GEOIP_ACCURACYRADIUS_EDITION", 14);
-define("GEOIP_CITYCOMBINED_EDITION", 15);
-define("GEOIP_CITY_EDITION_REV1_V6", 30);
-define("GEOIP_CITY_EDITION_REV0_V6", 31);
-if (!defined('GEOIP_NETSPEED_EDITION_REV1')) {
- // GeoIP PECL installed?
- define("GEOIP_NETSPEED_EDITION_REV1", 32);
-}
-define("GEOIP_NETSPEED_EDITION_REV1_V6", 33);
-define("GEOIP_USERTYPE_EDITION", 28);
-define("GEOIP_USERTYPE_EDITION_V6", 29);
-define("GEOIP_ASNUM_EDITION_V6", 21);
-define("GEOIP_ISP_EDITION_V6", 22);
-define("GEOIP_ORG_EDITION_V6", 23);
-define("GEOIP_DOMAIN_EDITION_V6", 24);
-
-define("CITYCOMBINED_FIXED_RECORD", 7);
-
-class GeoIP
-{
- public $flags;
- public $filehandle;
- public $memory_buffer;
- public $databaseType;
- public $databaseSegments;
- public $record_length;
- public $shmid;
- public $GEOIP_COUNTRY_CODE_TO_NUMBER = array(
- "" => 0,
- "AP" => 1,
- "EU" => 2,
- "AD" => 3,
- "AE" => 4,
- "AF" => 5,
- "AG" => 6,
- "AI" => 7,
- "AL" => 8,
- "AM" => 9,
- "CW" => 10,
- "AO" => 11,
- "AQ" => 12,
- "AR" => 13,
- "AS" => 14,
- "AT" => 15,
- "AU" => 16,
- "AW" => 17,
- "AZ" => 18,
- "BA" => 19,
- "BB" => 20,
- "BD" => 21,
- "BE" => 22,
- "BF" => 23,
- "BG" => 24,
- "BH" => 25,
- "BI" => 26,
- "BJ" => 27,
- "BM" => 28,
- "BN" => 29,
- "BO" => 30,
- "BR" => 31,
- "BS" => 32,
- "BT" => 33,
- "BV" => 34,
- "BW" => 35,
- "BY" => 36,
- "BZ" => 37,
- "CA" => 38,
- "CC" => 39,
- "CD" => 40,
- "CF" => 41,
- "CG" => 42,
- "CH" => 43,
- "CI" => 44,
- "CK" => 45,
- "CL" => 46,
- "CM" => 47,
- "CN" => 48,
- "CO" => 49,
- "CR" => 50,
- "CU" => 51,
- "CV" => 52,
- "CX" => 53,
- "CY" => 54,
- "CZ" => 55,
- "DE" => 56,
- "DJ" => 57,
- "DK" => 58,
- "DM" => 59,
- "DO" => 60,
- "DZ" => 61,
- "EC" => 62,
- "EE" => 63,
- "EG" => 64,
- "EH" => 65,
- "ER" => 66,
- "ES" => 67,
- "ET" => 68,
- "FI" => 69,
- "FJ" => 70,
- "FK" => 71,
- "FM" => 72,
- "FO" => 73,
- "FR" => 74,
- "SX" => 75,
- "GA" => 76,
- "GB" => 77,
- "GD" => 78,
- "GE" => 79,
- "GF" => 80,
- "GH" => 81,
- "GI" => 82,
- "GL" => 83,
- "GM" => 84,
- "GN" => 85,
- "GP" => 86,
- "GQ" => 87,
- "GR" => 88,
- "GS" => 89,
- "GT" => 90,
- "GU" => 91,
- "GW" => 92,
- "GY" => 93,
- "HK" => 94,
- "HM" => 95,
- "HN" => 96,
- "HR" => 97,
- "HT" => 98,
- "HU" => 99,
- "ID" => 100,
- "IE" => 101,
- "IL" => 102,
- "IN" => 103,
- "IO" => 104,
- "IQ" => 105,
- "IR" => 106,
- "IS" => 107,
- "IT" => 108,
- "JM" => 109,
- "JO" => 110,
- "JP" => 111,
- "KE" => 112,
- "KG" => 113,
- "KH" => 114,
- "KI" => 115,
- "KM" => 116,
- "KN" => 117,
- "KP" => 118,
- "KR" => 119,
- "KW" => 120,
- "KY" => 121,
- "KZ" => 122,
- "LA" => 123,
- "LB" => 124,
- "LC" => 125,
- "LI" => 126,
- "LK" => 127,
- "LR" => 128,
- "LS" => 129,
- "LT" => 130,
- "LU" => 131,
- "LV" => 132,
- "LY" => 133,
- "MA" => 134,
- "MC" => 135,
- "MD" => 136,
- "MG" => 137,
- "MH" => 138,
- "MK" => 139,
- "ML" => 140,
- "MM" => 141,
- "MN" => 142,
- "MO" => 143,
- "MP" => 144,
- "MQ" => 145,
- "MR" => 146,
- "MS" => 147,
- "MT" => 148,
- "MU" => 149,
- "MV" => 150,
- "MW" => 151,
- "MX" => 152,
- "MY" => 153,
- "MZ" => 154,
- "NA" => 155,
- "NC" => 156,
- "NE" => 157,
- "NF" => 158,
- "NG" => 159,
- "NI" => 160,
- "NL" => 161,
- "NO" => 162,
- "NP" => 163,
- "NR" => 164,
- "NU" => 165,
- "NZ" => 166,
- "OM" => 167,
- "PA" => 168,
- "PE" => 169,
- "PF" => 170,
- "PG" => 171,
- "PH" => 172,
- "PK" => 173,
- "PL" => 174,
- "PM" => 175,
- "PN" => 176,
- "PR" => 177,
- "PS" => 178,
- "PT" => 179,
- "PW" => 180,
- "PY" => 181,
- "QA" => 182,
- "RE" => 183,
- "RO" => 184,
- "RU" => 185,
- "RW" => 186,
- "SA" => 187,
- "SB" => 188,
- "SC" => 189,
- "SD" => 190,
- "SE" => 191,
- "SG" => 192,
- "SH" => 193,
- "SI" => 194,
- "SJ" => 195,
- "SK" => 196,
- "SL" => 197,
- "SM" => 198,
- "SN" => 199,
- "SO" => 200,
- "SR" => 201,
- "ST" => 202,
- "SV" => 203,
- "SY" => 204,
- "SZ" => 205,
- "TC" => 206,
- "TD" => 207,
- "TF" => 208,
- "TG" => 209,
- "TH" => 210,
- "TJ" => 211,
- "TK" => 212,
- "TM" => 213,
- "TN" => 214,
- "TO" => 215,
- "TL" => 216,
- "TR" => 217,
- "TT" => 218,
- "TV" => 219,
- "TW" => 220,
- "TZ" => 221,
- "UA" => 222,
- "UG" => 223,
- "UM" => 224,
- "US" => 225,
- "UY" => 226,
- "UZ" => 227,
- "VA" => 228,
- "VC" => 229,
- "VE" => 230,
- "VG" => 231,
- "VI" => 232,
- "VN" => 233,
- "VU" => 234,
- "WF" => 235,
- "WS" => 236,
- "YE" => 237,
- "YT" => 238,
- "RS" => 239,
- "ZA" => 240,
- "ZM" => 241,
- "ME" => 242,
- "ZW" => 243,
- "A1" => 244,
- "A2" => 245,
- "O1" => 246,
- "AX" => 247,
- "GG" => 248,
- "IM" => 249,
- "JE" => 250,
- "BL" => 251,
- "MF" => 252,
- "BQ" => 253,
- "SS" => 254
- );
-
- public $GEOIP_COUNTRY_CODES = array(
- "",
- "AP",
- "EU",
- "AD",
- "AE",
- "AF",
- "AG",
- "AI",
- "AL",
- "AM",
- "CW",
- "AO",
- "AQ",
- "AR",
- "AS",
- "AT",
- "AU",
- "AW",
- "AZ",
- "BA",
- "BB",
- "BD",
- "BE",
- "BF",
- "BG",
- "BH",
- "BI",
- "BJ",
- "BM",
- "BN",
- "BO",
- "BR",
- "BS",
- "BT",
- "BV",
- "BW",
- "BY",
- "BZ",
- "CA",
- "CC",
- "CD",
- "CF",
- "CG",
- "CH",
- "CI",
- "CK",
- "CL",
- "CM",
- "CN",
- "CO",
- "CR",
- "CU",
- "CV",
- "CX",
- "CY",
- "CZ",
- "DE",
- "DJ",
- "DK",
- "DM",
- "DO",
- "DZ",
- "EC",
- "EE",
- "EG",
- "EH",
- "ER",
- "ES",
- "ET",
- "FI",
- "FJ",
- "FK",
- "FM",
- "FO",
- "FR",
- "SX",
- "GA",
- "GB",
- "GD",
- "GE",
- "GF",
- "GH",
- "GI",
- "GL",
- "GM",
- "GN",
- "GP",
- "GQ",
- "GR",
- "GS",
- "GT",
- "GU",
- "GW",
- "GY",
- "HK",
- "HM",
- "HN",
- "HR",
- "HT",
- "HU",
- "ID",
- "IE",
- "IL",
- "IN",
- "IO",
- "IQ",
- "IR",
- "IS",
- "IT",
- "JM",
- "JO",
- "JP",
- "KE",
- "KG",
- "KH",
- "KI",
- "KM",
- "KN",
- "KP",
- "KR",
- "KW",
- "KY",
- "KZ",
- "LA",
- "LB",
- "LC",
- "LI",
- "LK",
- "LR",
- "LS",
- "LT",
- "LU",
- "LV",
- "LY",
- "MA",
- "MC",
- "MD",
- "MG",
- "MH",
- "MK",
- "ML",
- "MM",
- "MN",
- "MO",
- "MP",
- "MQ",
- "MR",
- "MS",
- "MT",
- "MU",
- "MV",
- "MW",
- "MX",
- "MY",
- "MZ",
- "NA",
- "NC",
- "NE",
- "NF",
- "NG",
- "NI",
- "NL",
- "NO",
- "NP",
- "NR",
- "NU",
- "NZ",
- "OM",
- "PA",
- "PE",
- "PF",
- "PG",
- "PH",
- "PK",
- "PL",
- "PM",
- "PN",
- "PR",
- "PS",
- "PT",
- "PW",
- "PY",
- "QA",
- "RE",
- "RO",
- "RU",
- "RW",
- "SA",
- "SB",
- "SC",
- "SD",
- "SE",
- "SG",
- "SH",
- "SI",
- "SJ",
- "SK",
- "SL",
- "SM",
- "SN",
- "SO",
- "SR",
- "ST",
- "SV",
- "SY",
- "SZ",
- "TC",
- "TD",
- "TF",
- "TG",
- "TH",
- "TJ",
- "TK",
- "TM",
- "TN",
- "TO",
- "TL",
- "TR",
- "TT",
- "TV",
- "TW",
- "TZ",
- "UA",
- "UG",
- "UM",
- "US",
- "UY",
- "UZ",
- "VA",
- "VC",
- "VE",
- "VG",
- "VI",
- "VN",
- "VU",
- "WF",
- "WS",
- "YE",
- "YT",
- "RS",
- "ZA",
- "ZM",
- "ME",
- "ZW",
- "A1",
- "A2",
- "O1",
- "AX",
- "GG",
- "IM",
- "JE",
- "BL",
- "MF",
- "BQ",
- "SS",
- "O1"
- );
-
- public $GEOIP_COUNTRY_CODES3 = array(
- "",
- "AP",
- "EU",
- "AND",
- "ARE",
- "AFG",
- "ATG",
- "AIA",
- "ALB",
- "ARM",
- "CUW",
- "AGO",
- "ATA",
- "ARG",
- "ASM",
- "AUT",
- "AUS",
- "ABW",
- "AZE",
- "BIH",
- "BRB",
- "BGD",
- "BEL",
- "BFA",
- "BGR",
- "BHR",
- "BDI",
- "BEN",
- "BMU",
- "BRN",
- "BOL",
- "BRA",
- "BHS",
- "BTN",
- "BVT",
- "BWA",
- "BLR",
- "BLZ",
- "CAN",
- "CCK",
- "COD",
- "CAF",
- "COG",
- "CHE",
- "CIV",
- "COK",
- "CHL",
- "CMR",
- "CHN",
- "COL",
- "CRI",
- "CUB",
- "CPV",
- "CXR",
- "CYP",
- "CZE",
- "DEU",
- "DJI",
- "DNK",
- "DMA",
- "DOM",
- "DZA",
- "ECU",
- "EST",
- "EGY",
- "ESH",
- "ERI",
- "ESP",
- "ETH",
- "FIN",
- "FJI",
- "FLK",
- "FSM",
- "FRO",
- "FRA",
- "SXM",
- "GAB",
- "GBR",
- "GRD",
- "GEO",
- "GUF",
- "GHA",
- "GIB",
- "GRL",
- "GMB",
- "GIN",
- "GLP",
- "GNQ",
- "GRC",
- "SGS",
- "GTM",
- "GUM",
- "GNB",
- "GUY",
- "HKG",
- "HMD",
- "HND",
- "HRV",
- "HTI",
- "HUN",
- "IDN",
- "IRL",
- "ISR",
- "IND",
- "IOT",
- "IRQ",
- "IRN",
- "ISL",
- "ITA",
- "JAM",
- "JOR",
- "JPN",
- "KEN",
- "KGZ",
- "KHM",
- "KIR",
- "COM",
- "KNA",
- "PRK",
- "KOR",
- "KWT",
- "CYM",
- "KAZ",
- "LAO",
- "LBN",
- "LCA",
- "LIE",
- "LKA",
- "LBR",
- "LSO",
- "LTU",
- "LUX",
- "LVA",
- "LBY",
- "MAR",
- "MCO",
- "MDA",
- "MDG",
- "MHL",
- "MKD",
- "MLI",
- "MMR",
- "MNG",
- "MAC",
- "MNP",
- "MTQ",
- "MRT",
- "MSR",
- "MLT",
- "MUS",
- "MDV",
- "MWI",
- "MEX",
- "MYS",
- "MOZ",
- "NAM",
- "NCL",
- "NER",
- "NFK",
- "NGA",
- "NIC",
- "NLD",
- "NOR",
- "NPL",
- "NRU",
- "NIU",
- "NZL",
- "OMN",
- "PAN",
- "PER",
- "PYF",
- "PNG",
- "PHL",
- "PAK",
- "POL",
- "SPM",
- "PCN",
- "PRI",
- "PSE",
- "PRT",
- "PLW",
- "PRY",
- "QAT",
- "REU",
- "ROU",
- "RUS",
- "RWA",
- "SAU",
- "SLB",
- "SYC",
- "SDN",
- "SWE",
- "SGP",
- "SHN",
- "SVN",
- "SJM",
- "SVK",
- "SLE",
- "SMR",
- "SEN",
- "SOM",
- "SUR",
- "STP",
- "SLV",
- "SYR",
- "SWZ",
- "TCA",
- "TCD",
- "ATF",
- "TGO",
- "THA",
- "TJK",
- "TKL",
- "TKM",
- "TUN",
- "TON",
- "TLS",
- "TUR",
- "TTO",
- "TUV",
- "TWN",
- "TZA",
- "UKR",
- "UGA",
- "UMI",
- "USA",
- "URY",
- "UZB",
- "VAT",
- "VCT",
- "VEN",
- "VGB",
- "VIR",
- "VNM",
- "VUT",
- "WLF",
- "WSM",
- "YEM",
- "MYT",
- "SRB",
- "ZAF",
- "ZMB",
- "MNE",
- "ZWE",
- "A1",
- "A2",
- "O1",
- "ALA",
- "GGY",
- "IMN",
- "JEY",
- "BLM",
- "MAF",
- "BES",
- "SSD",
- "O1"
- );
-
- public $GEOIP_COUNTRY_NAMES = array(
- "",
- "Asia/Pacific Region",
- "Europe",
- "Andorra",
- "United Arab Emirates",
- "Afghanistan",
- "Antigua and Barbuda",
- "Anguilla",
- "Albania",
- "Armenia",
- "Curacao",
- "Angola",
- "Antarctica",
- "Argentina",
- "American Samoa",
- "Austria",
- "Australia",
- "Aruba",
- "Azerbaijan",
- "Bosnia and Herzegovina",
- "Barbados",
- "Bangladesh",
- "Belgium",
- "Burkina Faso",
- "Bulgaria",
- "Bahrain",
- "Burundi",
- "Benin",
- "Bermuda",
- "Brunei Darussalam",
- "Bolivia",
- "Brazil",
- "Bahamas",
- "Bhutan",
- "Bouvet Island",
- "Botswana",
- "Belarus",
- "Belize",
- "Canada",
- "Cocos (Keeling) Islands",
- "Congo, The Democratic Republic of the",
- "Central African Republic",
- "Congo",
- "Switzerland",
- "Cote D'Ivoire",
- "Cook Islands",
- "Chile",
- "Cameroon",
- "China",
- "Colombia",
- "Costa Rica",
- "Cuba",
- "Cape Verde",
- "Christmas Island",
- "Cyprus",
- "Czech Republic",
- "Germany",
- "Djibouti",
- "Denmark",
- "Dominica",
- "Dominican Republic",
- "Algeria",
- "Ecuador",
- "Estonia",
- "Egypt",
- "Western Sahara",
- "Eritrea",
- "Spain",
- "Ethiopia",
- "Finland",
- "Fiji",
- "Falkland Islands (Malvinas)",
- "Micronesia, Federated States of",
- "Faroe Islands",
- "France",
- "Sint Maarten (Dutch part)",
- "Gabon",
- "United Kingdom",
- "Grenada",
- "Georgia",
- "French Guiana",
- "Ghana",
- "Gibraltar",
- "Greenland",
- "Gambia",
- "Guinea",
- "Guadeloupe",
- "Equatorial Guinea",
- "Greece",
- "South Georgia and the South Sandwich Islands",
- "Guatemala",
- "Guam",
- "Guinea-Bissau",
- "Guyana",
- "Hong Kong",
- "Heard Island and McDonald Islands",
- "Honduras",
- "Croatia",
- "Haiti",
- "Hungary",
- "Indonesia",
- "Ireland",
- "Israel",
- "India",
- "British Indian Ocean Territory",
- "Iraq",
- "Iran, Islamic Republic of",
- "Iceland",
- "Italy",
- "Jamaica",
- "Jordan",
- "Japan",
- "Kenya",
- "Kyrgyzstan",
- "Cambodia",
- "Kiribati",
- "Comoros",
- "Saint Kitts and Nevis",
- "Korea, Democratic People's Republic of",
- "Korea, Republic of",
- "Kuwait",
- "Cayman Islands",
- "Kazakhstan",
- "Lao People's Democratic Republic",
- "Lebanon",
- "Saint Lucia",
- "Liechtenstein",
- "Sri Lanka",
- "Liberia",
- "Lesotho",
- "Lithuania",
- "Luxembourg",
- "Latvia",
- "Libya",
- "Morocco",
- "Monaco",
- "Moldova, Republic of",
- "Madagascar",
- "Marshall Islands",
- "Macedonia",
- "Mali",
- "Myanmar",
- "Mongolia",
- "Macau",
- "Northern Mariana Islands",
- "Martinique",
- "Mauritania",
- "Montserrat",
- "Malta",
- "Mauritius",
- "Maldives",
- "Malawi",
- "Mexico",
- "Malaysia",
- "Mozambique",
- "Namibia",
- "New Caledonia",
- "Niger",
- "Norfolk Island",
- "Nigeria",
- "Nicaragua",
- "Netherlands",
- "Norway",
- "Nepal",
- "Nauru",
- "Niue",
- "New Zealand",
- "Oman",
- "Panama",
- "Peru",
- "French Polynesia",
- "Papua New Guinea",
- "Philippines",
- "Pakistan",
- "Poland",
- "Saint Pierre and Miquelon",
- "Pitcairn Islands",
- "Puerto Rico",
- "Palestinian Territory",
- "Portugal",
- "Palau",
- "Paraguay",
- "Qatar",
- "Reunion",
- "Romania",
- "Russian Federation",
- "Rwanda",
- "Saudi Arabia",
- "Solomon Islands",
- "Seychelles",
- "Sudan",
- "Sweden",
- "Singapore",
- "Saint Helena",
- "Slovenia",
- "Svalbard and Jan Mayen",
- "Slovakia",
- "Sierra Leone",
- "San Marino",
- "Senegal",
- "Somalia",
- "Suriname",
- "Sao Tome and Principe",
- "El Salvador",
- "Syrian Arab Republic",
- "Swaziland",
- "Turks and Caicos Islands",
- "Chad",
- "French Southern Territories",
- "Togo",
- "Thailand",
- "Tajikistan",
- "Tokelau",
- "Turkmenistan",
- "Tunisia",
- "Tonga",
- "Timor-Leste",
- "Turkey",
- "Trinidad and Tobago",
- "Tuvalu",
- "Taiwan",
- "Tanzania, United Republic of",
- "Ukraine",
- "Uganda",
- "United States Minor Outlying Islands",
- "United States",
- "Uruguay",
- "Uzbekistan",
- "Holy See (Vatican City State)",
- "Saint Vincent and the Grenadines",
- "Venezuela",
- "Virgin Islands, British",
- "Virgin Islands, U.S.",
- "Vietnam",
- "Vanuatu",
- "Wallis and Futuna",
- "Samoa",
- "Yemen",
- "Mayotte",
- "Serbia",
- "South Africa",
- "Zambia",
- "Montenegro",
- "Zimbabwe",
- "Anonymous Proxy",
- "Satellite Provider",
- "Other",
- "Aland Islands",
- "Guernsey",
- "Isle of Man",
- "Jersey",
- "Saint Barthelemy",
- "Saint Martin",
- "Bonaire, Saint Eustatius and Saba",
- "South Sudan",
- "Other"
- );
-
- public $GEOIP_CONTINENT_CODES = array(
- "--",
- "AS",
- "EU",
- "EU",
- "AS",
- "AS",
- "NA",
- "NA",
- "EU",
- "AS",
- "NA",
- "AF",
- "AN",
- "SA",
- "OC",
- "EU",
- "OC",
- "NA",
- "AS",
- "EU",
- "NA",
- "AS",
- "EU",
- "AF",
- "EU",
- "AS",
- "AF",
- "AF",
- "NA",
- "AS",
- "SA",
- "SA",
- "NA",
- "AS",
- "AN",
- "AF",
- "EU",
- "NA",
- "NA",
- "AS",
- "AF",
- "AF",
- "AF",
- "EU",
- "AF",
- "OC",
- "SA",
- "AF",
- "AS",
- "SA",
- "NA",
- "NA",
- "AF",
- "AS",
- "AS",
- "EU",
- "EU",
- "AF",
- "EU",
- "NA",
- "NA",
- "AF",
- "SA",
- "EU",
- "AF",
- "AF",
- "AF",
- "EU",
- "AF",
- "EU",
- "OC",
- "SA",
- "OC",
- "EU",
- "EU",
- "NA",
- "AF",
- "EU",
- "NA",
- "AS",
- "SA",
- "AF",
- "EU",
- "NA",
- "AF",
- "AF",
- "NA",
- "AF",
- "EU",
- "AN",
- "NA",
- "OC",
- "AF",
- "SA",
- "AS",
- "AN",
- "NA",
- "EU",
- "NA",
- "EU",
- "AS",
- "EU",
- "AS",
- "AS",
- "AS",
- "AS",
- "AS",
- "EU",
- "EU",
- "NA",
- "AS",
- "AS",
- "AF",
- "AS",
- "AS",
- "OC",
- "AF",
- "NA",
- "AS",
- "AS",
- "AS",
- "NA",
- "AS",
- "AS",
- "AS",
- "NA",
- "EU",
- "AS",
- "AF",
- "AF",
- "EU",
- "EU",
- "EU",
- "AF",
- "AF",
- "EU",
- "EU",
- "AF",
- "OC",
- "EU",
- "AF",
- "AS",
- "AS",
- "AS",
- "OC",
- "NA",
- "AF",
- "NA",
- "EU",
- "AF",
- "AS",
- "AF",
- "NA",
- "AS",
- "AF",
- "AF",
- "OC",
- "AF",
- "OC",
- "AF",
- "NA",
- "EU",
- "EU",
- "AS",
- "OC",
- "OC",
- "OC",
- "AS",
- "NA",
- "SA",
- "OC",
- "OC",
- "AS",
- "AS",
- "EU",
- "NA",
- "OC",
- "NA",
- "AS",
- "EU",
- "OC",
- "SA",
- "AS",
- "AF",
- "EU",
- "EU",
- "AF",
- "AS",
- "OC",
- "AF",
- "AF",
- "EU",
- "AS",
- "AF",
- "EU",
- "EU",
- "EU",
- "AF",
- "EU",
- "AF",
- "AF",
- "SA",
- "AF",
- "NA",
- "AS",
- "AF",
- "NA",
- "AF",
- "AN",
- "AF",
- "AS",
- "AS",
- "OC",
- "AS",
- "AF",
- "OC",
- "AS",
- "EU",
- "NA",
- "OC",
- "AS",
- "AF",
- "EU",
- "AF",
- "OC",
- "NA",
- "SA",
- "AS",
- "EU",
- "NA",
- "SA",
- "NA",
- "NA",
- "AS",
- "OC",
- "OC",
- "OC",
- "AS",
- "AF",
- "EU",
- "AF",
- "AF",
- "EU",
- "AF",
- "--",
- "--",
- "--",
- "EU",
- "EU",
- "EU",
- "EU",
- "NA",
- "NA",
- "NA",
- "AF",
- "--"
- );
-}
-
-function geoip_load_shared_mem($file)
-{
- $fp = fopen($file, "rb");
- if (!$fp) {
- print "error opening $file: $php_errormsg\n";
- exit;
- }
- $s_array = fstat($fp);
- $size = $s_array['size'];
- if (($shmid = @shmop_open(GEOIP_SHM_KEY, "w", 0, 0))) {
- shmop_delete($shmid);
- shmop_close($shmid);
- }
- $shmid = shmop_open(GEOIP_SHM_KEY, "c", 0644, $size);
- shmop_write($shmid, fread($fp, $size), 0);
- shmop_close($shmid);
-}
-
-function _setup_segments($gi)
-{
- $gi->databaseType = GEOIP_COUNTRY_EDITION;
- $gi->record_length = STANDARD_RECORD_LENGTH;
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
- $offset = @shmop_size($gi->shmid) - 3;
- for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
- $delim = @shmop_read($gi->shmid, $offset, 3);
- $offset += 3;
- if ($delim == (chr(255) . chr(255) . chr(255))) {
- $gi->databaseType = ord(@shmop_read($gi->shmid, $offset, 1));
- if ($gi->databaseType >= 106) {
- $gi->databaseType -= 105;
- }
- $offset++;
-
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0) {
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
- } elseif ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
- } elseif (($gi->databaseType == GEOIP_CITY_EDITION_REV0)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
- || ($gi->databaseType == GEOIP_ORG_EDITION)
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
- || ($gi->databaseType == GEOIP_ISP_EDITION)
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
- || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
- || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_ASNUM_EDITION)
- || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)
- ) {
- $gi->databaseSegments = 0;
- $buf = @shmop_read($gi->shmid, $offset, SEGMENT_RECORD_LENGTH);
- for ($j = 0; $j < SEGMENT_RECORD_LENGTH; $j++) {
- $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
- }
- if (($gi->databaseType == GEOIP_ORG_EDITION)
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
- || ($gi->databaseType == GEOIP_ISP_EDITION)
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
- ) {
- $gi->record_length = ORG_RECORD_LENGTH;
- }
- }
- break;
- } else {
- $offset -= 4;
- }
- }
- if (($gi->databaseType == GEOIP_COUNTRY_EDITION) ||
- ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6) ||
- ($gi->databaseType == GEOIP_PROXY_EDITION) ||
- ($gi->databaseType == GEOIP_NETSPEED_EDITION)
- ) {
- $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
- }
- } else {
- $filepos = ftell($gi->filehandle);
- fseek($gi->filehandle, -3, SEEK_END);
- for ($i = 0; $i < STRUCTURE_INFO_MAX_SIZE; $i++) {
- $delim = fread($gi->filehandle, 3);
- if ($delim == (chr(255) . chr(255) . chr(255))) {
- $gi->databaseType = ord(fread($gi->filehandle, 1));
- if ($gi->databaseType >= 106) {
- $gi->databaseType -= 105;
- }
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0) {
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV0;
- } elseif ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
- $gi->databaseSegments = GEOIP_STATE_BEGIN_REV1;
- } elseif (($gi->databaseType == GEOIP_CITY_EDITION_REV0)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_ORG_EDITION)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
- || ($gi->databaseType == GEOIP_ISP_EDITION)
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
- || ($gi->databaseType == GEOIP_LOCATIONA_EDITION)
- || ($gi->databaseType == GEOIP_ACCURACYRADIUS_EDITION)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV0_V6)
- || ($gi->databaseType == GEOIP_CITY_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1)
- || ($gi->databaseType == GEOIP_NETSPEED_EDITION_REV1_V6)
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION)
- || ($gi->databaseType == GEOIP_USERTYPE_EDITION_V6)
- || ($gi->databaseType == GEOIP_ASNUM_EDITION)
- || ($gi->databaseType == GEOIP_ASNUM_EDITION_V6)
- ) {
- $gi->databaseSegments = 0;
- $buf = fread($gi->filehandle, SEGMENT_RECORD_LENGTH);
- for ($j = 0; $j < SEGMENT_RECORD_LENGTH; $j++) {
- $gi->databaseSegments += (ord($buf[$j]) << ($j * 8));
- }
- if (($gi->databaseType == GEOIP_ORG_EDITION)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION)
- || ($gi->databaseType == GEOIP_ISP_EDITION)
- || ($gi->databaseType == GEOIP_ORG_EDITION_V6)
- || ($gi->databaseType == GEOIP_DOMAIN_EDITION_V6)
- || ($gi->databaseType == GEOIP_ISP_EDITION_V6)
- ) {
- $gi->record_length = ORG_RECORD_LENGTH;
- }
- }
- break;
- } else {
- fseek($gi->filehandle, -4, SEEK_CUR);
- }
- }
- if (($gi->databaseType == GEOIP_COUNTRY_EDITION) ||
- ($gi->databaseType == GEOIP_COUNTRY_EDITION_V6) ||
- ($gi->databaseType == GEOIP_PROXY_EDITION) ||
- ($gi->databaseType == GEOIP_NETSPEED_EDITION)
- ) {
- $gi->databaseSegments = GEOIP_COUNTRY_BEGIN;
- }
- fseek($gi->filehandle, $filepos, SEEK_SET);
- }
- return $gi;
-}
-
-function geoip_open($filename, $flags)
-{
- $gi = new GeoIP;
- $gi->flags = $flags;
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
- $gi->shmid = @shmop_open(GEOIP_SHM_KEY, "a", 0, 0);
- } else {
- $gi->filehandle = fopen($filename, "rb") or die("Can not open $filename\n");
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
- $s_array = fstat($gi->filehandle);
- $gi->memory_buffer = fread($gi->filehandle, $s_array['size']);
- }
- }
-
- $gi = _setup_segments($gi);
- return $gi;
-}
-
-function geoip_close($gi)
-{
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
- return true;
- }
-
- return fclose($gi->filehandle);
-}
-
-function geoip_country_id_by_name_v6($gi, $name)
-{
- $rec = dns_get_record($name, DNS_AAAA);
- if (!$rec) {
- return false;
- }
- $addr = $rec[0]["ipv6"];
- if (!$addr || $addr == $name) {
- return false;
- }
- return geoip_country_id_by_addr_v6($gi, $addr);
-}
-
-function geoip_country_id_by_name($gi, $name)
-{
- $addr = gethostbyname($name);
- if (!$addr || $addr == $name) {
- return false;
- }
- return geoip_country_id_by_addr($gi, $addr);
-}
-
-if (!function_exists('geoip_country_code_by_name_v6')) {
-// GeoIP PECL installed?
-function geoip_country_code_by_name_v6($gi, $name)
-{
- $country_id = geoip_country_id_by_name_v6($gi, $name);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
- }
- return false;
-}
-}
-if (!function_exists('geoip_country_code_by_name')) {
-// GeoIP PECL installed?
-function geoip_country_code_by_name($gi, $name)
-{
- $country_id = geoip_country_id_by_name($gi, $name);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
- }
- return false;
-}
-}
-
-if (!function_exists('geoip_country_name_by_name_v6')) {
-// GeoIP PECL installed?
-function geoip_country_name_by_name_v6($gi, $name)
-{
- $country_id = geoip_country_id_by_name_v6($gi, $name);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
- }
- return false;
-}
-}
-if (!function_exists('geoip_country_name_by_name')) {
-// GeoIP PECL installed?
-function geoip_country_name_by_name($gi, $name)
-{
- $country_id = geoip_country_id_by_name($gi, $name);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
- }
- return false;
-}
-}
-
-function geoip_country_id_by_addr_v6($gi, $addr)
-{
- $ipnum = inet_pton($addr);
- return _geoip_seek_country_v6($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
-}
-
-function geoip_country_id_by_addr($gi, $addr)
-{
- $ipnum = ip2long($addr);
- return _geoip_seek_country($gi, $ipnum) - GEOIP_COUNTRY_BEGIN;
-}
-
-function geoip_country_code_by_addr_v6($gi, $addr)
-{
- $country_id = geoip_country_id_by_addr_v6($gi, $addr);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
- }
- return false;
-}
-
-function geoip_country_code_by_addr($gi, $addr)
-{
- if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
- $record = geoip_record_by_addr($gi, $addr);
- if ($record !== false) {
- return $record->country_code;
- }
- } else {
- $country_id = geoip_country_id_by_addr($gi, $addr);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_CODES[$country_id];
- }
- }
- return false;
-}
-
-function geoip_country_name_by_addr_v6($gi, $addr)
-{
- $country_id = geoip_country_id_by_addr_v6($gi, $addr);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
- }
- return false;
-}
-
-function geoip_country_name_by_addr($gi, $addr)
-{
- if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
- $record = geoip_record_by_addr($gi, $addr);
- return $record->country_name;
- } else {
- $country_id = geoip_country_id_by_addr($gi, $addr);
- if ($country_id !== false) {
- return $gi->GEOIP_COUNTRY_NAMES[$country_id];
- }
- }
- return false;
-}
-
-function _geoip_seek_country_v6($gi, $ipnum)
-{
- # arrays from unpack start with offset 1
- # yet another php mystery. array_merge work around
- # this broken behaviour
- $v6vec = array_merge(unpack("C16", $ipnum));
-
- $offset = 0;
- for ($depth = 127; $depth >= 0; --$depth) {
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
- $buf = _safe_substr(
- $gi->memory_buffer,
- 2 * $gi->record_length * $offset,
- 2 * $gi->record_length
- );
- } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
- $buf = @shmop_read(
- $gi->shmid,
- 2 * $gi->record_length * $offset,
- 2 * $gi->record_length
- );
- } else {
- fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
- or die("fseek failed");
- $buf = fread($gi->filehandle, 2 * $gi->record_length);
- }
- $x = array(0, 0);
- for ($i = 0; $i < 2; ++$i) {
- for ($j = 0; $j < $gi->record_length; ++$j) {
- $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
- }
- }
-
- $bnum = 127 - $depth;
- $idx = $bnum >> 3;
- $b_mask = 1 << ($bnum & 7 ^ 7);
- if (($v6vec[$idx] & $b_mask) > 0) {
- if ($x[1] >= $gi->databaseSegments) {
- return $x[1];
- }
- $offset = $x[1];
- } else {
- if ($x[0] >= $gi->databaseSegments) {
- return $x[0];
- }
- $offset = $x[0];
- }
- }
- trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
- return false;
-}
-
-function _geoip_seek_country($gi, $ipnum)
-{
- $offset = 0;
- for ($depth = 31; $depth >= 0; --$depth) {
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
- $buf = _safe_substr(
- $gi->memory_buffer,
- 2 * $gi->record_length * $offset,
- 2 * $gi->record_length
- );
- } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
- $buf = @shmop_read(
- $gi->shmid,
- 2 * $gi->record_length * $offset,
- 2 * $gi->record_length
- );
- } else {
- fseek($gi->filehandle, 2 * $gi->record_length * $offset, SEEK_SET) == 0
- or die("fseek failed");
- $buf = fread($gi->filehandle, 2 * $gi->record_length);
- }
- $x = array(0, 0);
- for ($i = 0; $i < 2; ++$i) {
- for ($j = 0; $j < $gi->record_length; ++$j) {
- $x[$i] += ord($buf[$gi->record_length * $i + $j]) << ($j * 8);
- }
- }
- if ($ipnum & (1 << $depth)) {
- if ($x[1] >= $gi->databaseSegments) {
- return $x[1];
- }
- $offset = $x[1];
- } else {
- if ($x[0] >= $gi->databaseSegments) {
- return $x[0];
- }
- $offset = $x[0];
- }
- }
- trigger_error("error traversing database - perhaps it is corrupt?", E_USER_ERROR);
- return false;
-}
-
-function _common_get_org($gi, $seek_org)
-{
- $record_pointer = $seek_org + (2 * $gi->record_length - 1) * $gi->databaseSegments;
- if ($gi->flags & GEOIP_SHARED_MEMORY) {
- $org_buf = @shmop_read($gi->shmid, $record_pointer, MAX_ORG_RECORD_LENGTH);
- } else {
- fseek($gi->filehandle, $record_pointer, SEEK_SET);
- $org_buf = fread($gi->filehandle, MAX_ORG_RECORD_LENGTH);
- }
- $org_buf = _safe_substr($org_buf, 0, strpos($org_buf, "\0"));
- return $org_buf;
-}
-
-function _get_org_v6($gi, $ipnum)
-{
- $seek_org = _geoip_seek_country_v6($gi, $ipnum);
- if ($seek_org == $gi->databaseSegments) {
- return null;
- }
- return _common_get_org($gi, $seek_org);
-}
-
-function _get_org($gi, $ipnum)
-{
- $seek_org = _geoip_seek_country($gi, $ipnum);
- if ($seek_org == $gi->databaseSegments) {
- return null;
- }
- return _common_get_org($gi, $seek_org);
-}
-
-
-function geoip_name_by_addr_v6($gi, $addr)
-{
- if ($addr == null) {
- return 0;
- }
- $ipnum = inet_pton($addr);
- return _get_org_v6($gi, $ipnum);
-}
-
-function geoip_name_by_addr($gi, $addr)
-{
- if ($addr == null) {
- return 0;
- }
- $ipnum = ip2long($addr);
- return _get_org($gi, $ipnum);
-}
-
-function geoip_org_by_addr($gi, $addr)
-{
- return geoip_name_by_addr($gi, $addr);
-}
-
-function _get_region($gi, $ipnum)
-{
- if ($gi->databaseType == GEOIP_REGION_EDITION_REV0) {
- $seek_region = _geoip_seek_country($gi, $ipnum) - GEOIP_STATE_BEGIN_REV0;
- if ($seek_region >= 1000) {
- $country_code = "US";
- $region = chr(($seek_region - 1000) / 26 + 65) . chr(($seek_region - 1000) % 26 + 65);
- } else {
- $country_code = $gi->GEOIP_COUNTRY_CODES[$seek_region];
- $region = "";
- }
- return array($country_code, $region);
- } elseif ($gi->databaseType == GEOIP_REGION_EDITION_REV1) {
- $seek_region = _geoip_seek_country($gi, $ipnum) - GEOIP_STATE_BEGIN_REV1;
- if ($seek_region < US_OFFSET) {
- $country_code = "";
- $region = "";
- } elseif ($seek_region < CANADA_OFFSET) {
- $country_code = "US";
- $region = chr(($seek_region - US_OFFSET) / 26 + 65) . chr(($seek_region - US_OFFSET) % 26 + 65);
- } elseif ($seek_region < WORLD_OFFSET) {
- $country_code = "CA";
- $region = chr(($seek_region - CANADA_OFFSET) / 26 + 65) . chr(($seek_region - CANADA_OFFSET) % 26 + 65);
- } else {
- $country_code = $gi->GEOIP_COUNTRY_CODES[($seek_region - WORLD_OFFSET) / FIPS_RANGE];
- $region = "";
- }
- return array($country_code, $region);
- }
-}
-
-function geoip_region_by_addr($gi, $addr)
-{
- if ($addr == null) {
- return 0;
- }
- $ipnum = ip2long($addr);
- return _get_region($gi, $ipnum);
-}
-
-if(!function_exists('getdnsattributes')) {
-function getdnsattributes($l, $ip)
-{
- $r = new Net_DNS_Resolver();
- $r->nameservers = array("ws1.maxmind.com");
- $p = $r->search($l . "." . $ip . ".s.maxmind.com", "TXT", "IN");
- $str = is_object($p->answer[0]) ? $p->answer[0]->string() : '';
- $str = substr($str, 1, -1);
- return $str;
-}
-}
-function _safe_substr($string, $start, $length)
-{
- // workaround php's broken substr, strpos, etc handling with
- // mbstring.func_overload and mbstring.internal_encoding
- $mbExists = extension_loaded('mbstring');
-
- if ($mbExists) {
- $enc = mb_internal_encoding();
- mb_internal_encoding('ISO-8859-1');
- }
-
- $buf = substr($string, $start, $length);
-
- if ($mbExists) {
- mb_internal_encoding($enc);
- }
-
- return $buf;
-}
diff --git a/libs/MaxMindGeoIP/geoipcity.inc b/libs/MaxMindGeoIP/geoipcity.inc
deleted file mode 100644
index 44ed49b878..0000000000
--- a/libs/MaxMindGeoIP/geoipcity.inc
+++ /dev/null
@@ -1,241 +0,0 @@
-<?php
-
-/* geoipcity.inc
- *
- * Copyright (C) 2013 MaxMind, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-
-define("FULL_RECORD_LENGTH", 50);
-
-require_once 'geoip.inc';
-require_once 'geoipregionvars.php';
-
-class geoiprecord
-{
- public $country_code;
- public $country_code3;
- public $country_name;
- public $region;
- public $city;
- public $postal_code;
- public $latitude;
- public $longitude;
- public $area_code;
- public $dma_code; # metro and dma code are the same. use metro_code
- public $metro_code;
- public $continent_code;
-}
-
-class geoipdnsrecord
-{
- public $country_code;
- public $country_code3;
- public $country_name;
- public $region;
- public $regionname;
- public $city;
- public $postal_code;
- public $latitude;
- public $longitude;
- public $areacode;
- public $dmacode;
- public $isp;
- public $org;
- public $metrocode;
-}
-
-function getrecordwithdnsservice($str)
-{
- $record = new geoipdnsrecord;
- $keyvalue = explode(";", $str);
- foreach ($keyvalue as $keyvalue2) {
- list($key, $value) = explode("=", $keyvalue2);
- if ($key == "co") {
- $record->country_code = $value;
- }
- if ($key == "ci") {
- $record->city = $value;
- }
- if ($key == "re") {
- $record->region = $value;
- }
- if ($key == "ac") {
- $record->areacode = $value;
- }
- if ($key == "dm" || $key == "me") {
- $record->dmacode = $value;
- $record->metrocode = $value;
- }
- if ($key == "is") {
- $record->isp = $value;
- }
- if ($key == "or") {
- $record->org = $value;
- }
- if ($key == "zi") {
- $record->postal_code = $value;
- }
- if ($key == "la") {
- $record->latitude = $value;
- }
- if ($key == "lo") {
- $record->longitude = $value;
- }
- }
- $number = $GLOBALS['GEOIP_COUNTRY_CODE_TO_NUMBER'][$record->country_code];
- $record->country_code3 = $GLOBALS['GEOIP_COUNTRY_CODES3'][$number];
- $record->country_name = $GLOBALS['GEOIP_COUNTRY_NAMES'][$number];
- if ($record->region != "") {
- if (($record->country_code == "US") || ($record->country_code == "CA")) {
- $record->regionname = $GLOBALS['ISO'][$record->country_code][$record->region];
- } else {
- $record->regionname = $GLOBALS['FIPS'][$record->country_code][$record->region];
- }
- }
- return $record;
-}
-
-
-function _get_record_v6($gi, $ipnum)
-{
- $seek_country = _geoip_seek_country_v6($gi, $ipnum);
- if ($seek_country == $gi->databaseSegments) {
- return null;
- }
- return _common_get_record($gi, $seek_country);
-}
-
-function _common_get_record($gi, $seek_country)
-{
- // workaround php's broken substr, strpos, etc handling with
- // mbstring.func_overload and mbstring.internal_encoding
- $mbExists = extension_loaded('mbstring');
- if ($mbExists) {
- $enc = mb_internal_encoding();
- mb_internal_encoding('ISO-8859-1');
- }
-
- $record_pointer = $seek_country + (2 * $gi->record_length - 1) * $gi->databaseSegments;
-
- if ($gi->flags & GEOIP_MEMORY_CACHE) {
- $record_buf = substr($gi->memory_buffer, $record_pointer, FULL_RECORD_LENGTH);
- } elseif ($gi->flags & GEOIP_SHARED_MEMORY) {
- $record_buf = @shmop_read($gi->shmid, $record_pointer, FULL_RECORD_LENGTH);
- } else {
- fseek($gi->filehandle, $record_pointer, SEEK_SET);
- $record_buf = fread($gi->filehandle, FULL_RECORD_LENGTH);
- }
- $record = new geoiprecord;
- $record_buf_pos = 0;
- $char = ord(substr($record_buf, $record_buf_pos, 1));
- $record->country_code = $gi->GEOIP_COUNTRY_CODES[$char];
- $record->country_code3 = $gi->GEOIP_COUNTRY_CODES3[$char];
- $record->country_name = $gi->GEOIP_COUNTRY_NAMES[$char];
- $record->continent_code = $gi->GEOIP_CONTINENT_CODES[$char];
- $record_buf_pos++;
- $str_length = 0;
-
- // Get region
- $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1));
- while ($char != 0) {
- $str_length++;
- $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1));
- }
- if ($str_length > 0) {
- $record->region = substr($record_buf, $record_buf_pos, $str_length);
- }
- $record_buf_pos += $str_length + 1;
- $str_length = 0;
- // Get city
- $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1));
- while ($char != 0) {
- $str_length++;
- $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1));
- }
- if ($str_length > 0) {
- $record->city = substr($record_buf, $record_buf_pos, $str_length);
- }
- $record_buf_pos += $str_length + 1;
- $str_length = 0;
- // Get postal code
- $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1));
- while ($char != 0) {
- $str_length++;
- $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1));
- }
- if ($str_length > 0) {
- $record->postal_code = substr($record_buf, $record_buf_pos, $str_length);
- }
- $record_buf_pos += $str_length + 1;
- $str_length = 0;
- // Get latitude and longitude
- $latitude = 0;
- $longitude = 0;
- for ($j = 0; $j < 3; ++$j) {
- $char = ord(substr($record_buf, $record_buf_pos++, 1));
- $latitude += ($char << ($j * 8));
- }
- $record->latitude = ($latitude / 10000) - 180;
- for ($j = 0; $j < 3; ++$j) {
- $char = ord(substr($record_buf, $record_buf_pos++, 1));
- $longitude += ($char << ($j * 8));
- }
- $record->longitude = ($longitude / 10000) - 180;
- if (GEOIP_CITY_EDITION_REV1 == $gi->databaseType) {
- $metroarea_combo = 0;
- if ($record->country_code == "US") {
- for ($j = 0; $j < 3; ++$j) {
- $char = ord(substr($record_buf, $record_buf_pos++, 1));
- $metroarea_combo += ($char << ($j * 8));
- }
- $record->metro_code = $record->dma_code = floor($metroarea_combo / 1000);
- $record->area_code = $metroarea_combo % 1000;
- }
- }
- if ($mbExists) {
- mb_internal_encoding($enc);
- }
- return $record;
-}
-
-function GeoIP_record_by_addr_v6($gi, $addr)
-{
- if ($addr == null) {
- return 0;
- }
- $ipnum = inet_pton($addr);
- return _get_record_v6($gi, $ipnum);
-}
-
-function _get_record($gi, $ipnum)
-{
- $seek_country = _geoip_seek_country($gi, $ipnum);
- if ($seek_country == $gi->databaseSegments) {
- return null;
- }
- return _common_get_record($gi, $seek_country);
-}
-
-function GeoIP_record_by_addr($gi, $addr)
-{
- if ($addr == null) {
- return 0;
- }
- $ipnum = ip2long($addr);
- return _get_record($gi, $ipnum);
-}
diff --git a/libs/PiwikTracker/PiwikTracker.php b/libs/PiwikTracker/PiwikTracker.php
index 48b2869be5..b8775bf577 100644
--- a/libs/PiwikTracker/PiwikTracker.php
+++ b/libs/PiwikTracker/PiwikTracker.php
@@ -11,7 +11,7 @@
// code, this file has been left as a redirect to its new location in the
// vendor directory.
if (!class_exists('PiwikTracker')) {
- require_once __DIR__ . '/../../vendor/piwik/piwik-php-tracker/PiwikTracker.php';
+ require_once __DIR__ . '/../../vendor/matomo/matomo-php-tracker/PiwikTracker.php';
}
if (PiwikTracker::VERSION !== 1) {
diff --git a/libs/README.md b/libs/README.md
index 99caf96d63..999c5c732c 100644
--- a/libs/README.md
+++ b/libs/README.md
@@ -1,6 +1,6 @@
## Legal notice
-See the [LEGALNOTICE file](https://github.com/matomo-org/matomo/blob/3.x-dev/LEGALNOTICE).
+See the [LEGALNOTICE file](https://github.com/matomo-org/matomo/blob/4.x-dev/LEGALNOTICE).
## Matomo modifications to libs/
diff --git a/libs/Zend/Mail.php b/libs/Zend/Mail.php
index 27b115d4f2..001a1dd092 100644
--- a/libs/Zend/Mail.php
+++ b/libs/Zend/Mail.php
@@ -1153,7 +1153,7 @@ class Zend_Mail extends Zend_Mime_Message
/**
* Return mail headers
*
- * @return void
+ * @return array
*/
public function getHeaders()
{
diff --git a/libs/bower_components/jquery-placeholder/.bower.json b/libs/bower_components/jquery-placeholder/.bower.json
deleted file mode 100644
index 3b21bfba74..0000000000
--- a/libs/bower_components/jquery-placeholder/.bower.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "name": "jquery-placeholder",
- "description": "A jQuery plugin that enables HTML5 placeholder behavior for browsers that aren’t trying hard enough yet",
- "version": "2.0.9",
- "license": "MIT",
- "main": [
- "jquery.placeholder.js"
- ],
- "keywords": [
- "form",
- "placeholder",
- "jQuery",
- "jquery-plugin"
- ],
- "dependencies": {
- "jquery": ">=1.6"
- },
- "ignore": [
- "*",
- "!/bower.json",
- "!/jquery.placeholder.js"
- ],
- "homepage": "https://github.com/mathiasbynens/jquery-placeholder",
- "_release": "2.0.9",
- "_resolution": {
- "type": "version",
- "tag": "v2.0.9",
- "commit": "510a577397713934b46ccaceaa7ecc558cff313a"
- },
- "_source": "https://github.com/mathiasbynens/jquery-placeholder.git",
- "_target": "~2.0.8",
- "_originalSource": "jquery-placeholder"
-} \ No newline at end of file
diff --git a/libs/bower_components/jquery-placeholder/bower.json b/libs/bower_components/jquery-placeholder/bower.json
deleted file mode 100644
index 8b55e15971..0000000000
--- a/libs/bower_components/jquery-placeholder/bower.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "jquery-placeholder",
- "description": "A jQuery plugin that enables HTML5 placeholder behavior for browsers that aren’t trying hard enough yet",
- "version": "2.0.8",
- "license": "MIT",
- "main": ["jquery.placeholder.js"],
- "keywords": [
- "form",
- "placeholder",
- "jQuery",
- "jquery-plugin"
- ],
- "dependencies": {
- "jquery": ">=1.6"
- },
- "ignore": [
- "*",
- "!/bower.json",
- "!/jquery.placeholder.js"
- ]
-}
diff --git a/libs/bower_components/jquery-placeholder/jquery.placeholder.js b/libs/bower_components/jquery-placeholder/jquery.placeholder.js
deleted file mode 100644
index 94e5e2ca11..0000000000
--- a/libs/bower_components/jquery-placeholder/jquery.placeholder.js
+++ /dev/null
@@ -1,192 +0,0 @@
-/*! http://mths.be/placeholder v2.0.9 by @mathias */
-(function(factory) {
- if (typeof define === 'function' && define.amd) {
- // AMD
- define(['jquery'], factory);
- } else {
- // Browser globals
- factory(jQuery);
- }
-}(function($) {
-
- // Opera Mini v7 doesn’t support placeholder although its DOM seems to indicate so
- var isOperaMini = Object.prototype.toString.call(window.operamini) == '[object OperaMini]';
- var isInputSupported = 'placeholder' in document.createElement('input') && !isOperaMini;
- var isTextareaSupported = 'placeholder' in document.createElement('textarea') && !isOperaMini;
- var valHooks = $.valHooks;
- var propHooks = $.propHooks;
- var hooks;
- var placeholder;
-
- if (isInputSupported && isTextareaSupported) {
-
- placeholder = $.fn.placeholder = function() {
- return this;
- };
-
- placeholder.input = placeholder.textarea = true;
-
- } else {
-
- placeholder = $.fn.placeholder = function() {
- var $this = this;
- $this
- .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
- .not('.placeholder')
- .bind({
- 'focus.placeholder': clearPlaceholder,
- 'blur.placeholder': setPlaceholder
- })
- .data('placeholder-enabled', true)
- .trigger('blur.placeholder');
- return $this;
- };
-
- placeholder.input = isInputSupported;
- placeholder.textarea = isTextareaSupported;
-
- hooks = {
- 'get': function(element) {
- var $element = $(element);
-
- var $passwordInput = $element.data('placeholder-password');
- if ($passwordInput) {
- return $passwordInput[0].value;
- }
-
- return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value;
- },
- 'set': function(element, value) {
- var $element = $(element);
-
- var $passwordInput = $element.data('placeholder-password');
- if ($passwordInput) {
- return $passwordInput[0].value = value;
- }
-
- if (!$element.data('placeholder-enabled')) {
- return element.value = value;
- }
- if (value === '') {
- element.value = value;
- // Issue #56: Setting the placeholder causes problems if the element continues to have focus.
- if (element != safeActiveElement()) {
- // We can't use `triggerHandler` here because of dummy text/password inputs :(
- setPlaceholder.call(element);
- }
- } else if ($element.hasClass('placeholder')) {
- clearPlaceholder.call(element, true, value) || (element.value = value);
- } else {
- element.value = value;
- }
- // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363
- return $element;
- }
- };
-
- if (!isInputSupported) {
- valHooks.input = hooks;
- propHooks.value = hooks;
- }
- if (!isTextareaSupported) {
- valHooks.textarea = hooks;
- propHooks.value = hooks;
- }
-
- $(function() {
- // Look for forms
- $(document).delegate('form', 'submit.placeholder', function() {
- // Clear the placeholder values so they don't get submitted
- var $inputs = $('.placeholder', this).each(clearPlaceholder);
- setTimeout(function() {
- $inputs.each(setPlaceholder);
- }, 10);
- });
- });
-
- // Clear placeholder values upon page reload
- $(window).bind('beforeunload.placeholder', function() {
- $('.placeholder').each(function() {
- this.value = '';
- });
- });
-
- }
-
- function args(elem) {
- // Return an object of element attributes
- var newAttrs = {};
- var rinlinejQuery = /^jQuery\d+$/;
- $.each(elem.attributes, function(i, attr) {
- if (attr.specified && !rinlinejQuery.test(attr.name)) {
- newAttrs[attr.name] = attr.value;
- }
- });
- return newAttrs;
- }
-
- function clearPlaceholder(event, value) {
- var input = this;
- var $input = $(input);
- if (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) {
- if ($input.data('placeholder-password')) {
- $input = $input.hide().nextAll('input[type="password"]:first').show().attr('id', $input.removeAttr('id').data('placeholder-id'));
- // If `clearPlaceholder` was called from `$.valHooks.input.set`
- if (event === true) {
- return $input[0].value = value;
- }
- $input.focus();
- } else {
- input.value = '';
- $input.removeClass('placeholder');
- input == safeActiveElement() && input.select();
- }
- }
- }
-
- function setPlaceholder() {
- var $replacement;
- var input = this;
- var $input = $(input);
- var id = this.id;
- if (input.value === '') {
- if (input.type === 'password') {
- if (!$input.data('placeholder-textinput')) {
- try {
- $replacement = $input.clone().attr({ 'type': 'text' });
- } catch(e) {
- $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
- }
- $replacement
- .removeAttr('name')
- .data({
- 'placeholder-password': $input,
- 'placeholder-id': id
- })
- .bind('focus.placeholder', clearPlaceholder);
- $input
- .data({
- 'placeholder-textinput': $replacement,
- 'placeholder-id': id
- })
- .before($replacement);
- }
- $input = $input.removeAttr('id').hide().prevAll('input[type="text"]:first').attr('id', id).show();
- // Note: `$input[0] != input` now!
- }
- $input.addClass('placeholder');
- $input[0].value = $input.attr('placeholder');
- } else {
- $input.removeClass('placeholder');
- }
- }
-
- function safeActiveElement() {
- // Avoid IE9 `document.activeElement` of death
- // https://github.com/mathiasbynens/jquery-placeholder/pull/99
- try {
- return document.activeElement;
- } catch (exception) {}
- }
-
-}));
diff --git a/matomo.js b/matomo.js
index ce23fb3bcc..73dc8589eb 100644
--- a/matomo.js
+++ b/matomo.js
@@ -8,70 +8,59 @@
* @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
* @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
*/
-;if(typeof JSON_PIWIK!=="object"&&typeof window.JSON==="object"&&window.JSON.stringify&&window.JSON.parse){JSON_PIWIK=window.JSON}else{(function(){var a={};
-/*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
-(function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());
-var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
-}catch(ae){aj=false}}ad=aj}if(ac=="json-parse"){var ag=V.parse;if(typeof ag=="function"){try{if(ag("0")===0&&!ag(false)){ak=ag(ah);var af=ak.a.length==5&&ak.a[0]===1;if(af){try{af=!ag('"\t"')}catch(ae){}if(af){try{af=ag("01")!==1}catch(ae){}}if(af){try{af=ag("1.")!==1}catch(ae){}}}}}catch(ae){af=false}}ad=af}}}return o[ac]=!!ad}if(!o("json")){var U="[object Function]",Q="[object Date]",N="[object Number]",O="[object String]",E="[object Array]",A="[object Boolean]";var F=o("bug-string-char-index");if(!B){var s=J.floor;var Z=[0,31,59,90,120,151,181,212,243,273,304,334];var D=function(ac,ad){return Z[ad]+365*(ac-1970)+s((ac-1969+(ad=+(ad>1)))/4)-s((ac-1901+ad)/100)+s((ac-1601+ad)/400)}}if(!(r=n.hasOwnProperty)){r=function(ae){var ac={},ad;if((ac.__proto__=null,ac.__proto__={toString:1},ac).toString!=u){r=function(ah){var ag=this.__proto__,af=ah in (this.__proto__=null,this);this.__proto__=ag;return af}}else{ad=ac.constructor;r=function(ag){var af=(this.constructor||ad).prototype;return ag in this&&!(ag in af&&this[ag]===af[ag])
-}}ac=null;return r.call(this,ae)}}m=function(ae,ah){var af=0,ac,ad,ag;(ac=function(){this.valueOf=0}).prototype.valueOf=0;ad=new ac();for(ag in ad){if(r.call(ad,ag)){af++}}ac=ad=null;if(!af){ad=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];m=function(aj,an){var am=u.call(aj)==U,al,ak;var ai=!am&&typeof aj.constructor!="function"&&e[typeof aj.hasOwnProperty]&&aj.hasOwnProperty||r;for(al in aj){if(!(am&&al=="prototype")&&ai.call(aj,al)){an(al)}}for(ak=ad.length;al=ad[--ak];ai.call(aj,al)&&an(al)){}}}else{if(af==2){m=function(aj,am){var ai={},al=u.call(aj)==U,ak;for(ak in aj){if(!(al&&ak=="prototype")&&!r.call(ai,ak)&&(ai[ak]=1)&&r.call(aj,ak)){am(ak)}}}}else{m=function(aj,am){var al=u.call(aj)==U,ak,ai;for(ak in aj){if(!(al&&ak=="prototype")&&r.call(aj,ak)&&!(ai=ak==="constructor")){am(ak)}}if(ai||r.call(aj,(ak="constructor"))){am(ak)}}}}return m(ae,ah)};if(!o("json-stringify")){var q={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};
-var I="000000";var t=function(ac,ad){return(I+(ad||0)).slice(-ac)};var z="\\u00";var C=function(ai){var ad='"',ag=0,ah=ai.length,ac=!F||ah>10;var af=ac&&(F?ai.split(""):ai);for(;ag<ah;ag++){var ae=ai.charCodeAt(ag);switch(ae){case 8:case 9:case 10:case 12:case 13:case 34:case 92:ad+=q[ae];break;default:if(ae<32){ad+=z+t(2,ae.toString(16));break}ad+=ac?af[ag]:ai.charAt(ag)}}return ad+'"'};var p=function(ai,aA,ag,al,ax,ac,aj){var at,ae,ap,az,ay,ak,aw,au,aq,an,ar,ad,ah,af,av,ao;try{at=aA[ai]}catch(am){}if(typeof at=="object"&&at){ae=u.call(at);if(ae==Q&&!r.call(at,"toJSON")){if(at>-1/0&&at<1/0){if(D){ay=s(at/86400000);for(ap=s(ay/365.2425)+1970-1;D(ap+1,0)<=ay;ap++){}for(az=s((ay-D(ap,0))/30.42);D(ap,az+1)<=ay;az++){}ay=1+ay-D(ap,az);ak=(at%86400000+86400000)%86400000;aw=s(ak/3600000)%24;au=s(ak/60000)%60;aq=s(ak/1000)%60;an=ak%1000}else{ap=at.getUTCFullYear();az=at.getUTCMonth();ay=at.getUTCDate();aw=at.getUTCHours();au=at.getUTCMinutes();aq=at.getUTCSeconds();an=at.getUTCMilliseconds()}at=(ap<=0||ap>=10000?(ap<0?"-":"+")+t(6,ap<0?-ap:ap):t(4,ap))+"-"+t(2,az+1)+"-"+t(2,ay)+"T"+t(2,aw)+":"+t(2,au)+":"+t(2,aq)+"."+t(3,an)+"Z"
-}else{at=null}}else{if(typeof at.toJSON=="function"&&((ae!=N&&ae!=O&&ae!=E)||r.call(at,"toJSON"))){at=at.toJSON(ai)}}}if(ag){at=ag.call(aA,ai,at)}if(at===null){return"null"}ae=u.call(at);if(ae==A){return""+at}else{if(ae==N){return at>-1/0&&at<1/0?""+at:"null"}else{if(ae==O){return C(""+at)}}}if(typeof at=="object"){for(af=aj.length;af--;){if(aj[af]===at){throw aa()}}aj.push(at);ar=[];av=ac;ac+=ax;if(ae==E){for(ah=0,af=at.length;ah<af;ah++){ad=p(ah,at,ag,al,ax,ac,aj);ar.push(ad===L?"null":ad)}ao=ar.length?(ax?"[\n"+ac+ar.join(",\n"+ac)+"\n"+av+"]":("["+ar.join(",")+"]")):"[]"}else{m(al||at,function(aC){var aB=p(aC,at,ag,al,ax,ac,aj);if(aB!==L){ar.push(C(aC)+":"+(ax?" ":"")+aB)}});ao=ar.length?(ax?"{\n"+ac+ar.join(",\n"+ac)+"\n"+av+"}":("{"+ar.join(",")+"}")):"{}"}aj.pop();return ao}};V.stringify=function(ac,ae,af){var ad,al,aj,ai;if(e[typeof ae]&&ae){if((ai=u.call(ae))==U){al=ae}else{if(ai==E){aj={};for(var ah=0,ag=ae.length,ak;ah<ag;ak=ae[ah++],((ai=u.call(ak)),ai==O||ai==N)&&(aj[ak]=1)){}}}}if(af){if((ai=u.call(af))==N){if((af-=af%1)>0){for(ad="",af>10&&(af=10);
-ad.length<af;ad+=" "){}}}else{if(ai==O){ad=af.length<=10?af:af.slice(0,10)}}}return p("",(ak={},ak[""]=ac,ak),al,aj,ad,"",[])}}if(!o("json-parse")){var M=R.fromCharCode;var l={92:"\\",34:'"',47:"/",98:"\b",116:"\t",110:"\n",102:"\f",114:"\r"};var G,X;var H=function(){G=X=null;throw T()};var y=function(){var ah=X,af=ah.length,ag,ae,ac,ai,ad;while(G<af){ad=ah.charCodeAt(G);switch(ad){case 9:case 10:case 13:case 32:G++;break;case 123:case 125:case 91:case 93:case 58:case 44:ag=F?ah.charAt(G):ah[G];G++;return ag;case 34:for(ag="@",G++;G<af;){ad=ah.charCodeAt(G);if(ad<32){H()}else{if(ad==92){ad=ah.charCodeAt(++G);switch(ad){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:ag+=l[ad];G++;break;case 117:ae=++G;for(ac=G+4;G<ac;G++){ad=ah.charCodeAt(G);if(!(ad>=48&&ad<=57||ad>=97&&ad<=102||ad>=65&&ad<=70)){H()}}ag+=M("0x"+ah.slice(ae,G));break;default:H()}}else{if(ad==34){break}ad=ah.charCodeAt(G);ae=G;while(ad>=32&&ad!=92&&ad!=34){ad=ah.charCodeAt(++G)}ag+=ah.slice(ae,G)}}}if(ah.charCodeAt(G)==34){G++;
-return ag}H();default:ae=G;if(ad==45){ai=true;ad=ah.charCodeAt(++G)}if(ad>=48&&ad<=57){if(ad==48&&((ad=ah.charCodeAt(G+1)),ad>=48&&ad<=57)){H()}ai=false;for(;G<af&&((ad=ah.charCodeAt(G)),ad>=48&&ad<=57);G++){}if(ah.charCodeAt(G)==46){ac=++G;for(;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}ad=ah.charCodeAt(G);if(ad==101||ad==69){ad=ah.charCodeAt(++G);if(ad==43||ad==45){G++}for(ac=G;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}return +ah.slice(ae,G)}if(ai){H()}if(ah.slice(G,G+4)=="true"){G+=4;return true}else{if(ah.slice(G,G+5)=="false"){G+=5;return false}else{if(ah.slice(G,G+4)=="null"){G+=4;return null}}}H()}}return"$"};var W=function(ad){var ac,ae;if(ad=="$"){H()}if(typeof ad=="string"){if((F?ad.charAt(0):ad[0])=="@"){return ad.slice(1)}if(ad=="["){ac=[];for(;;ae||(ae=true)){ad=y();if(ad=="]"){break}if(ae){if(ad==","){ad=y();if(ad=="]"){H()}}else{H()}}if(ad==","){H()}ac.push(W(ad))}return ac}else{if(ad=="{"){ac={};for(;;ae||(ae=true)){ad=y();
-if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON_PIWIK=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Matomo=window.Piwik=(function(){var r,b={},y={},G=document,h=navigator,X=screen,T=window,i=T.performance||T.mozPerformance||T.msPerformance||T.webkitPerformance,t=T.encodeURIComponent,S=T.decodeURIComponent,l=unescape,I=[],E,e,ah=[],x=0,ab=0,U=0,m=false;
-function p(ao){try{return S(ao)}catch(ap){return unescape(ao)}}function J(ap){var ao=typeof ap;return ao!=="undefined"}function A(ao){return typeof ao==="function"}function W(ao){return typeof ao==="object"}function w(ao){return typeof ao==="string"||ao instanceof String}function ag(ao){return typeof ao==="number"||ao instanceof Number}function Y(ao){return J(ao)&&(ag(ao)||(w(ao)&&ao.length))}function B(ap){if(!ap){return true}var ao;var aq=true;for(ao in ap){if(Object.prototype.hasOwnProperty.call(ap,ao)){aq=false}}return aq}function ak(ao){var ap=typeof console;if(ap!=="undefined"&&console&&console.error){console.error(ao)}}function af(){var au,at,aw,ap,ao;for(au=0;au<arguments.length;au+=1){ao=null;if(arguments[au]&&arguments[au].slice){ao=arguments[au].slice()}ap=arguments[au];aw=ap.shift();var av,aq;var ar=w(aw)&&aw.indexOf("::")>0;if(ar){av=aw.split("::");aq=av[0];aw=av[1];if("object"===typeof e[aq]&&"function"===typeof e[aq][aw]){e[aq][aw].apply(e[aq],ap)}else{if(ao){ah.push(ao)}}}else{for(at=0;
-at<I.length;at++){if(w(aw)){aq=I[at];var ax=aw.indexOf(".")>0;if(ax){av=aw.split(".");if(aq&&"object"===typeof aq[av[0]]){aq=aq[av[0]];aw=av[1]}else{if(ao){ah.push(ao);break}}}if(aq[aw]){aq[aw].apply(aq,ap)}else{var ay="The method '"+aw+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: https://developer.piwik.org/api-reference/tracking-javascript';ak(ay);if(!ax){throw new TypeError(ay)}}if(aw==="addTracker"){break}if(aw==="setTrackerUrl"||aw==="setSiteId"){break}}else{aw.apply(I[at],ap)}}}}}function an(ar,aq,ap,ao){if(ar.addEventListener){ar.addEventListener(aq,ap,ao);return true}if(ar.attachEvent){return ar.attachEvent("on"+aq,ap)}ar["on"+aq]=ap}function n(ao){if(G.readyState==="complete"){ao()}else{if(T.addEventListener){T.addEventListener("load",ao,false)}else{if(T.attachEvent){T.attachEvent("onload",ao)}}}}function q(ar){var ao=false;if(G.attachEvent){ao=G.readyState==="complete"}else{ao=G.readyState!=="loading"}if(ao){ar();return}var aq;if(G.addEventListener){an(G,"DOMContentLoaded",function ap(){G.removeEventListener("DOMContentLoaded",ap,false);
-if(!ao){ao=true;ar()}})}else{if(G.attachEvent){G.attachEvent("onreadystatechange",function ap(){if(G.readyState==="complete"){G.detachEvent("onreadystatechange",ap);if(!ao){ao=true;ar()}}});if(G.documentElement.doScroll&&T===T.top){(function ap(){if(!ao){try{G.documentElement.doScroll("left")}catch(at){setTimeout(ap,0);return}ao=true;ar()}}())}}}an(T,"load",function(){if(!ao){ao=true;ar()}},false)}function ac(ap,av,aw){if(!ap){return""}var ao="",ar,aq,at,au;for(ar in b){if(Object.prototype.hasOwnProperty.call(b,ar)){au=b[ar]&&"function"===typeof b[ar][ap];if(au){aq=b[ar][ap];at=aq(av||{},aw);if(at){ao+=at}}}}return ao}function ai(){var ao;m=true;ac("unload");if(r){do{ao=new Date()}while(ao.getTimeAlias()<r)}}function o(aq,ap){var ao=G.createElement("script");ao.type="text/javascript";ao.src=aq;if(ao.readyState){ao.onreadystatechange=function(){var ar=this.readyState;if(ar==="loaded"||ar==="complete"){ao.onreadystatechange=null;ap()}}}else{ao.onload=ap}G.getElementsByTagName("head")[0].appendChild(ao)
-}function K(){var ao="";try{ao=T.top.document.referrer}catch(aq){if(T.parent){try{ao=T.parent.document.referrer}catch(ap){ao=""}}}if(ao===""){ao=G.referrer}return ao}function s(ao){var aq=new RegExp("^([a-z]+):"),ap=aq.exec(ao);return ap?ap[1]:null}function d(ao){var aq=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),ap=aq.exec(ao);return ap?ap[1]:ao}function aj(ap,ao){ap=String(ap);return ap.lastIndexOf(ao,0)===0}function R(ap,ao){ap=String(ap);return ap.indexOf(ao,ap.length-ao.length)!==-1}function z(ap,ao){ap=String(ap);return ap.indexOf(ao)!==-1}function g(ap,ao){ap=String(ap);return ap.substr(0,ap.length-ao)}function F(ar,aq,au){ar=String(ar);if(!au){au=""}var ao=ar.indexOf("#");var av=ar.length;if(ao===-1){ao=av}var at=ar.substr(0,ao);var ap=ar.substr(ao,av-ao);if(at.indexOf("?")===-1){at+="?"}else{if(!R(at,"?")){at+="&"}}return at+t(aq)+"="+t(au)+ap}function k(ap,aq){ap=String(ap);if(ap.indexOf("?"+aq+"=")===-1&&ap.indexOf("&"+aq+"=")===-1){return ap}var ar=ap.indexOf("?");
-if(ar===-1){return ap}var ao=ap.substr(ar+1);var aw=ap.substr(0,ar);if(ao){var ax="";var az=ao.indexOf("#");if(az!==-1){ax=ao.substr(az+1);ao=ao.substr(0,az)}var at;var av=ao.split("&");var au=av.length-1;for(au;au>=0;au--){at=av[au].split("=")[0];if(at===aq){av.splice(au,1)}}var ay=av.join("&");if(ay){aw=aw+"?"+ay}if(ax){aw+="#"+ax}}return aw}function f(aq,ap){var ao="[\\?&#]"+ap+"=([^&#]*)";var at=new RegExp(ao);var ar=at.exec(aq);return ar?S(ar[1]):""}function a(ao){if(ao&&String(ao)===ao){return ao.replace(/^\s+|\s+$/g,"")}return ao}function D(ao){return unescape(t(ao))}function am(aE){var aq=function(aK,aJ){return(aK<<aJ)|(aK>>>(32-aJ))},aF=function(aM){var aK="",aL,aJ;for(aL=7;aL>=0;aL--){aJ=(aM>>>(aL*4))&15;aK+=aJ.toString(16)}return aK},au,aH,aG,ap=[],ay=1732584193,aw=4023233417,av=2562383102,at=271733878,ar=3285377520,aD,aC,aB,aA,az,aI,ao,ax=[];aE=D(aE);ao=aE.length;for(aH=0;aH<ao-3;aH+=4){aG=aE.charCodeAt(aH)<<24|aE.charCodeAt(aH+1)<<16|aE.charCodeAt(aH+2)<<8|aE.charCodeAt(aH+3);
-ax.push(aG)}switch(ao&3){case 0:aH=2147483648;break;case 1:aH=aE.charCodeAt(ao-1)<<24|8388608;break;case 2:aH=aE.charCodeAt(ao-2)<<24|aE.charCodeAt(ao-1)<<16|32768;break;case 3:aH=aE.charCodeAt(ao-3)<<24|aE.charCodeAt(ao-2)<<16|aE.charCodeAt(ao-1)<<8|128;break}ax.push(aH);while((ax.length&15)!==14){ax.push(0)}ax.push(ao>>>29);ax.push((ao<<3)&4294967295);for(au=0;au<ax.length;au+=16){for(aH=0;aH<16;aH++){ap[aH]=ax[au+aH]}for(aH=16;aH<=79;aH++){ap[aH]=aq(ap[aH-3]^ap[aH-8]^ap[aH-14]^ap[aH-16],1)}aD=ay;aC=aw;aB=av;aA=at;az=ar;for(aH=0;aH<=19;aH++){aI=(aq(aD,5)+((aC&aB)|(~aC&aA))+az+ap[aH]+1518500249)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=20;aH<=39;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+1859775393)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=40;aH<=59;aH++){aI=(aq(aD,5)+((aC&aB)|(aC&aA)|(aB&aA))+az+ap[aH]+2400959708)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=60;aH<=79;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+3395469782)&4294967295;az=aA;aA=aB;aB=aq(aC,30);
-aC=aD;aD=aI}ay=(ay+aD)&4294967295;aw=(aw+aC)&4294967295;av=(av+aB)&4294967295;at=(at+aA)&4294967295;ar=(ar+az)&4294967295}aI=aF(ay)+aF(aw)+aF(av)+aF(at)+aF(ar);return aI.toLowerCase()}function aa(aq,ao,ap){if(!aq){aq=""}if(!ao){ao=""}if(aq==="translate.googleusercontent.com"){if(ap===""){ap=ao}ao=f(ao,"u");aq=d(ao)}else{if(aq==="cc.bingj.com"||aq==="webcache.googleusercontent.com"||aq.slice(0,5)==="74.6."){ao=G.links[0].href;aq=d(ao)}}return[aq,ao,ap]}function L(ap){var ao=ap.length;if(ap.charAt(--ao)==="."){ap=ap.slice(0,ao)}if(ap.slice(0,2)==="*."){ap=ap.slice(1)}if(ap.indexOf("/")!==-1){ap=ap.substr(0,ap.indexOf("/"))}return ap}function al(ap){ap=ap&&ap.text?ap.text:ap;if(!w(ap)){var ao=G.getElementsByTagName("title");if(ao&&J(ao[0])){ap=ao[0].text}}return ap}function P(ao){if(!ao){return[]}if(!J(ao.children)&&J(ao.childNodes)){return ao.children}if(J(ao.children)){return ao.children}return[]}function V(ap,ao){if(!ap||!ao){return false}if(ap.contains){return ap.contains(ao)}if(ap===ao){return true
-}if(ap.compareDocumentPosition){return !!(ap.compareDocumentPosition(ao)&16)}return false}function M(aq,ar){if(aq&&aq.indexOf){return aq.indexOf(ar)}if(!J(aq)||aq===null){return -1}if(!aq.length){return -1}var ao=aq.length;if(ao===0){return -1}var ap=0;while(ap<ao){if(aq[ap]===ar){return ap}ap++}return -1}function j(aq){if(!aq){return false}function ao(at,au){if(T.getComputedStyle){return G.defaultView.getComputedStyle(at,null)[au]}if(at.currentStyle){return at.currentStyle[au]}}function ar(at){at=at.parentNode;while(at){if(at===G){return true}at=at.parentNode}return false}function ap(av,aB,at,ay,aw,az,ax){var au=av.parentNode,aA=1;if(!ar(av)){return false}if(9===au.nodeType){return true}if("0"===ao(av,"opacity")||"none"===ao(av,"display")||"hidden"===ao(av,"visibility")){return false}if(!J(aB)||!J(at)||!J(ay)||!J(aw)||!J(az)||!J(ax)){aB=av.offsetTop;aw=av.offsetLeft;ay=aB+av.offsetHeight;at=aw+av.offsetWidth;az=av.offsetWidth;ax=av.offsetHeight}if(aq===av&&(0===ax||0===az)&&"hidden"===ao(av,"overflow")){return false
-}if(au){if(("hidden"===ao(au,"overflow")||"scroll"===ao(au,"overflow"))){if(aw+aA>au.offsetWidth+au.scrollLeft||aw+az-aA<au.scrollLeft||aB+aA>au.offsetHeight+au.scrollTop||aB+ax-aA<au.scrollTop){return false}}if(av.offsetParent===au){aw+=au.offsetLeft;aB+=au.offsetTop}return ap(au,aB,at,ay,aw,az,ax)}return true}return ap(aq)}var ae={htmlCollectionToArray:function(aq){var ao=[],ap;if(!aq||!aq.length){return ao}for(ap=0;ap<aq.length;ap++){ao.push(aq[ap])}return ao},find:function(ao){if(!document.querySelectorAll||!ao){return[]}var ap=document.querySelectorAll(ao);return this.htmlCollectionToArray(ap)},findMultiple:function(aq){if(!aq||!aq.length){return[]}var ap,ar;var ao=[];for(ap=0;ap<aq.length;ap++){ar=this.find(aq[ap]);ao=ao.concat(ar)}ao=this.makeNodesUnique(ao);return ao},findNodesByTagName:function(ap,ao){if(!ap||!ao||!ap.getElementsByTagName){return[]}var aq=ap.getElementsByTagName(ao);return this.htmlCollectionToArray(aq)},makeNodesUnique:function(ao){var au=[].concat(ao);ao.sort(function(aw,av){if(aw===av){return 0
-}var ay=M(au,aw);var ax=M(au,av);if(ay===ax){return 0}return ay>ax?-1:1});if(ao.length<=1){return ao}var ap=0;var ar=0;var at=[];var aq;aq=ao[ap++];while(aq){if(aq===ao[ap]){ar=at.push(ap)}aq=ao[ap++]||null}while(ar--){ao.splice(at[ar],1)}return ao},getAttributeValueFromNode:function(at,aq){if(!this.hasNodeAttribute(at,aq)){return}if(at&&at.getAttribute){return at.getAttribute(aq)}if(!at||!at.attributes){return}var ar=(typeof at.attributes[aq]);if("undefined"===ar){return}if(at.attributes[aq].value){return at.attributes[aq].value}if(at.attributes[aq].nodeValue){return at.attributes[aq].nodeValue}var ap;var ao=at.attributes;if(!ao){return}for(ap=0;ap<ao.length;ap++){if(ao[ap].nodeName===aq){return ao[ap].nodeValue}}return null},hasNodeAttributeWithValue:function(ap,ao){var aq=this.getAttributeValueFromNode(ap,ao);return !!aq},hasNodeAttribute:function(aq,ao){if(aq&&aq.hasAttribute){return aq.hasAttribute(ao)}if(aq&&aq.attributes){var ap=(typeof aq.attributes[ao]);return"undefined"!==ap}return false
-},hasNodeCssClass:function(aq,ao){if(aq&&ao&&aq.className){var ap=typeof aq.className==="string"?aq.className.split(" "):[];if(-1!==M(ap,ao)){return true}}return false},findNodesHavingAttribute:function(at,aq,ao){if(!ao){ao=[]}if(!at||!aq){return ao}var ar=P(at);if(!ar||!ar.length){return ao}var ap,au;for(ap=0;ap<ar.length;ap++){au=ar[ap];if(this.hasNodeAttribute(au,aq)){ao.push(au)}ao=this.findNodesHavingAttribute(au,aq,ao)}return ao},findFirstNodeHavingAttribute:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeAttribute(aq,ap)){return aq}var ao=this.findNodesHavingAttribute(aq,ap);if(ao&&ao.length){return ao[0]}},findFirstNodeHavingAttributeWithValue:function(ar,aq){if(!ar||!aq){return}if(this.hasNodeAttributeWithValue(ar,aq)){return ar}var ao=this.findNodesHavingAttribute(ar,aq);if(!ao||!ao.length){return}var ap;for(ap=0;ap<ao.length;ap++){if(this.getAttributeValueFromNode(ao[ap],aq)){return ao[ap]}}},findNodesHavingCssClass:function(at,ar,ao){if(!ao){ao=[]}if(!at||!ar){return ao}if(at.getElementsByClassName){var au=at.getElementsByClassName(ar);
-return this.htmlCollectionToArray(au)}var aq=P(at);if(!aq||!aq.length){return[]}var ap,av;for(ap=0;ap<aq.length;ap++){av=aq[ap];if(this.hasNodeCssClass(av,ar)){ao.push(av)}ao=this.findNodesHavingCssClass(av,ar,ao)}return ao},findFirstNodeHavingClass:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeCssClass(aq,ap)){return aq}var ao=this.findNodesHavingCssClass(aq,ap);if(ao&&ao.length){return ao[0]}},isLinkElement:function(ap){if(!ap){return false}var ao=String(ap.nodeName).toLowerCase();var ar=["a","area"];var aq=M(ar,ao);return aq!==-1},setAnyAttribute:function(ap,ao,aq){if(!ap||!ao){return}if(ap.setAttribute){ap.setAttribute(ao,aq)}else{ap[ao]=aq}}};var v={CONTENT_ATTR:"data-track-content",CONTENT_CLASS:"piwikTrackContent",CONTENT_NAME_ATTR:"data-content-name",CONTENT_PIECE_ATTR:"data-content-piece",CONTENT_PIECE_CLASS:"piwikContentPiece",CONTENT_TARGET_ATTR:"data-content-target",CONTENT_TARGET_CLASS:"piwikContentTarget",CONTENT_IGNOREINTERACTION_ATTR:"data-content-ignoreinteraction",CONTENT_IGNOREINTERACTION_CLASS:"piwikContentIgnoreInteraction",location:undefined,findContentNodes:function(){var ap="."+this.CONTENT_CLASS;
-var ao="["+this.CONTENT_ATTR+"]";var aq=ae.findMultiple([ap,ao]);return aq},findContentNodesWithinNode:function(ar){if(!ar){return[]}var ap=ae.findNodesHavingCssClass(ar,this.CONTENT_CLASS);var ao=ae.findNodesHavingAttribute(ar,this.CONTENT_ATTR);if(ao&&ao.length){var aq;for(aq=0;aq<ao.length;aq++){ap.push(ao[aq])}}if(ae.hasNodeAttribute(ar,this.CONTENT_ATTR)){ap.push(ar)}else{if(ae.hasNodeCssClass(ar,this.CONTENT_CLASS)){ap.push(ar)}}ap=ae.makeNodesUnique(ap);return ap},findParentContentNode:function(ap){if(!ap){return}var aq=ap;var ao=0;while(aq&&aq!==G&&aq.parentNode){if(ae.hasNodeAttribute(aq,this.CONTENT_ATTR)){return aq}if(ae.hasNodeCssClass(aq,this.CONTENT_CLASS)){return aq}aq=aq.parentNode;if(ao>1000){break}ao++}},findPieceNode:function(ap){var ao;ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.findFirstNodeHavingClass(ap,this.CONTENT_PIECE_CLASS)}if(ao){return ao}return ap},findTargetNodeNoDefault:function(ao){if(!ao){return}var ap=ae.findFirstNodeHavingAttributeWithValue(ao,this.CONTENT_TARGET_ATTR);
-if(ap){return ap}ap=ae.findFirstNodeHavingAttribute(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingClass(ao,this.CONTENT_TARGET_CLASS);if(ap){return ap}},findTargetNode:function(ao){var ap=this.findTargetNodeNoDefault(ao);if(ap){return ap}return ao},findContentName:function(ap){if(!ap){return}var at=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_NAME_ATTR);if(at){return ae.getAttributeValueFromNode(at,this.CONTENT_NAME_ATTR)}var ao=this.findContentPiece(ap);if(ao){return this.removeDomainIfIsInLink(ao)}if(ae.hasNodeAttributeWithValue(ap,"title")){return ae.getAttributeValueFromNode(ap,"title")}var aq=this.findPieceNode(ap);if(ae.hasNodeAttributeWithValue(aq,"title")){return ae.getAttributeValueFromNode(aq,"title")}var ar=this.findTargetNode(ap);if(ae.hasNodeAttributeWithValue(ar,"title")){return ae.getAttributeValueFromNode(ar,"title")}},findContentPiece:function(ap){if(!ap){return}var ar=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_PIECE_ATTR);
-if(ar){return ae.getAttributeValueFromNode(ar,this.CONTENT_PIECE_ATTR)}var ao=this.findPieceNode(ap);var aq=this.findMediaUrlInNode(ao);if(aq){return this.toAbsoluteUrl(aq)}},findContentTarget:function(aq){if(!aq){return}var ar=this.findTargetNode(aq);if(ae.hasNodeAttributeWithValue(ar,this.CONTENT_TARGET_ATTR)){return ae.getAttributeValueFromNode(ar,this.CONTENT_TARGET_ATTR)}var ap;if(ae.hasNodeAttributeWithValue(ar,"href")){ap=ae.getAttributeValueFromNode(ar,"href");return this.toAbsoluteUrl(ap)}var ao=this.findPieceNode(aq);if(ae.hasNodeAttributeWithValue(ao,"href")){ap=ae.getAttributeValueFromNode(ao,"href");return this.toAbsoluteUrl(ap)}},isSameDomain:function(ao){if(!ao||!ao.indexOf){return false}if(0===ao.indexOf(this.getLocation().origin)){return true}var ap=ao.indexOf(this.getLocation().host);if(8>=ap&&0<=ap){return true}return false},removeDomainIfIsInLink:function(aq){var ap="^https?://[^/]+";var ao="^.*//[^/]+";if(aq&&aq.search&&-1!==aq.search(new RegExp(ap))&&this.isSameDomain(aq)){aq=aq.replace(new RegExp(ao),"");
-if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq=["img","embed","video","audio"];var ao=at.nodeName.toLowerCase();if(-1!==M(aq,ao)&&ae.findFirstNodeHavingAttributeWithValue(at,"src")){var ar=ae.findFirstNodeHavingAttributeWithValue(at,"src");return ae.getAttributeValueFromNode(ar,"src")}if(ao==="object"&&ae.hasNodeAttributeWithValue(at,"data")){return ae.getAttributeValueFromNode(at,"data")}if(ao==="object"){var au=ae.findNodesByTagName(at,"param");if(au&&au.length){var ap;for(ap=0;ap<au.length;ap++){if("movie"===ae.getAttributeValueFromNode(au[ap],"name")&&ae.hasNodeAttributeWithValue(au[ap],"value")){return ae.getAttributeValueFromNode(au[ap],"value")}}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;
-if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]
-}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
-}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
-if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
-try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")+";SameSite=Lax"}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
-if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
-var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
-dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
-}function ay(){if(dc()){bQ()}bJ()}function df(){if(aN||!a5){return}aN=true;an(T,"focus",ba);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aN&&dc()){bQ()}}})}function cB(dm){var dj=new Date();var di=dj.getTime();cX=di;if(cA&&di<cA){var dk=cA-di;setTimeout(dm,dk);cf(dk+50);cA+=50;return}if(cA===false){var dl=800;cA=di+dl}dm()}function aO(){if(aC(cK)){bA=false}else{if(aC(bd)){bA=true}}}function bE(dj,di,dk){aO();if(!bA){cI.push(dj);return}if(!cO&&dj){if(cz&&bA){dj+="&consent=1"}cB(function(){if(cV&&a6(dj,dk)){cf(100);return}if(c9==="POST"||String(dj).length>2000){c3(dj,dk)}else{cp(dj,dk)}cf(di)})}if(!aN){df()}}function cj(di){if(cO){return false}return(di&&di.length)}function c2(di,dm){if(!dm||dm>=di.length){return[di]}var dj=0;var dk=di.length;var dl=[];for(dj;dj<dk;dj+=dm){dl.push(di.slice(dj,dj+dm))}return dl}function de(dj,di){if(!cj(dj)){return}if(!bA){cI.push(dj);return}cB(function(){var dm=c2(dj,50);var dk=0,dl;for(dk;dk<dm.length;dk++){dl='{"requests":["?'+dm[dk].join('","?')+'"]}';
-c3(dl,null,false)}cf(di)})}function aT(di){return bj+di+"."+b5+"."+bn}function bX(dk,dj,di){dd(dk,"",-86400,dj,di)}function b4(){if(bk){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var di=bj+"testcookie";dd(di,"1",undefined,bo,cW,bR);var dj=aC(di)==="1"?"1":"0";bX(di);return dj}function bh(){bn=b6((cW||cT)+(bo||"/")).slice(0,4)}function cF(){if(J(c7.res)){return c7}var dj,dl,dm={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dj in dm){if(Object.prototype.hasOwnProperty.call(dm,dj)){dl=h.mimeTypes[dm[dj]];c7[dj]=(dl&&dl.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c7.java="1"
-}if(A(T.GearsFactory)){c7.gears="1"}c7.cookie=b4()}var dk=parseInt(X.width,10);var di=parseInt(X.height,10);c7.res=parseInt(dk,10)+"x"+parseInt(di,10);return c7}function bW(){var dj=aT("cvar"),di=aC(dj);if(di.length){di=JSON_PIWIK.parse(di);if(W(di)){return di}}return{}}function cC(){if(aQ===false){aQ=bW()}}function cP(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)).slice(0,6)}function bf(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dj=bf();var dk=az();var di=String(dj)+dk;return di}function c1(dk){dk=String(dk);var dn=az();var dl=dn.length;var dm=dk.substr(-1*dl,dl);var dj=parseInt(dk.substr(0,dk.length-dl),10);if(dj&&dm&&dm===dn){var di=bf();if(aZ<=0){return true}if(di>=dj&&di<=(dj+aZ)){return true}}return false}function dg(di){if(!cL){return""}var dm=f(di,av);if(!dm){return""}dm=String(dm);
-var dk=new RegExp("^[a-zA-Z0-9]+$");if(dm.length===32&&dk.test(dm)){var dj=dm.substr(16,32);if(c1(dj)){var dl=dm.substr(0,16);return dl}}return""}function cM(){if(!bN){bN=dg(bM)}var dk=new Date(),di=Math.round(dk.getTime()/1000),dj=aT("id"),dn=aC(dj),dm,dl;if(dn){dm=dn.split(".");dm.unshift("0");if(bN.length){dm[1]=bN}return dm}if(bN.length){dl=bN}else{if("0"===b4()){dl=""}else{dl=cP()}}dm=["1",dl,di,0,di,"",""];return dm}function aY(){var dq=cM(),dl=dq[0],dm=dq[1],dj=dq[2],di=dq[3],dn=dq[4],dk=dq[5];if(!J(dq[6])){dq[6]=""}var dp=dq[6];return{newVisitor:dl,uuid:dm,createTs:dj,visitCount:di,currentVisitTs:dn,lastVisitTs:dk,lastEcommerceOrderTs:dp}}function aG(){var dl=new Date(),dj=dl.getTime(),dm=aY().createTs;var di=parseInt(dm,10);var dk=(di*1000)+cH-dj;return dk}function aL(di){if(!b5){return}var dk=new Date(),dj=Math.round(dk.getTime()/1000);if(!J(di)){di=aY()}var dl=di.uuid+"."+di.createTs+"."+di.visitCount+"."+dj+"."+di.lastVisitTs+"."+di.lastEcommerceOrderTs;dd(aT("id"),dl,aG(),bo,cW,bR)
-}function bL(){var di=aC(aT("ref"));if(di.length){try{di=JSON_PIWIK.parse(di);if(W(di)){return di}}catch(dj){}}return["","",0,""]}function bv(dj){var di="testvalue";dd("test",di,10000,null,dj);if(aC("test")===di){bX("test",null,dj);return true}return false}function aE(){var dj=bk;bk=false;var di,dk;for(di=0;di<bt.length;di++){dk=aT(bt[di]);if(dk!==cK&&dk!==bd&&0!==aC(dk)){bX(dk,bo,cW)}}bk=dj}function b2(di){b5=di;aL()}function dh(dm){if(!dm||!W(dm)){return}var dl=[];var dk;for(dk in dm){if(Object.prototype.hasOwnProperty.call(dm,dk)){dl.push(dk)}}var dn={};dl.sort();var di=dl.length;var dj;for(dj=0;dj<di;dj++){dn[dl[dj]]=dm[dl[dj]]}return dn}function cc(){dd(aT("ses"),"1",co,bo,cW,bR)}function bg(){var dl="";var dj="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dk=dj.length;var di;for(di=0;di<6;di++){dl+=dj.charAt(Math.floor(Math.random()*dk))}return dl}function cs(dk,dG,dH,dl){var dF,dj=new Date(),dt=Math.round(dj.getTime()/1000),dq,dE,dm=1024,dN,du,dC=aQ,dn=aT("ses"),dA=aT("ref"),dx=aT("cvar"),dy=aC(dn),dD=bL(),dJ=a4||bM,dr,di;
-if(bk){aE()}if(cO){return""}var dz=aY();if(!J(dl)){dl=""}var dw=G.characterSet||G.charset;if(!dw||dw.toLowerCase()==="utf-8"){dw=null}dr=dD[0];di=dD[1];dq=dD[2];dE=dD[3];if(!dy){var dI=co/1000;if(!dz.lastVisitTs||(dt-dz.lastVisitTs)>dI){dz.visitCount++;dz.lastVisitTs=dz.currentVisitTs}if(!bu||!dr.length){for(dF in cq){if(Object.prototype.hasOwnProperty.call(cq,dF)){dr=f(dJ,cq[dF]);if(dr.length){break}}}for(dF in bF){if(Object.prototype.hasOwnProperty.call(bF,dF)){di=f(dJ,bF[dF]);if(di.length){break}}}}dN=d(bm);du=dE.length?d(dE):"";if(dN.length&&!aV(dN)&&(!bu||!du.length||aV(du))){dE=bm}if(dE.length||dr.length){dq=dt;dD=[dr,di,dq,b1(dE.slice(0,dm))];dd(dA,JSON_PIWIK.stringify(dD),c4,bo,cW)}}dk+="&idsite="+b5+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dj.getHours()+"&m="+dj.getMinutes()+"&s="+dj.getSeconds()+"&url="+t(b1(dJ))+(bm.length?"&urlref="+t(b1(bm)):"")+((bx&&bx.length)?"&uid="+t(bx):"")+"&_id="+dz.uuid+"&_idts="+dz.createTs+"&_idvc="+dz.visitCount+"&_idn="+dz.newVisitor+(dr.length?"&_rcn="+t(dr):"")+(di.length?"&_rck="+t(di):"")+"&_refts="+dq+"&_viewts="+dz.lastVisitTs+(String(dz.lastEcommerceOrderTs).length?"&_ects="+dz.lastEcommerceOrderTs:"")+(String(dE).length?"&_ref="+t(b1(dE.slice(0,dm))):"")+(dw?"&cs="+t(dw):"")+"&send_image=0";
-var dM=cF();for(dF in dM){if(Object.prototype.hasOwnProperty.call(dM,dF)){dk+="&"+dF+"="+dM[dF]}}var dL=[];if(dG){for(dF in dG){if(Object.prototype.hasOwnProperty.call(dG,dF)&&/^dimension\d+$/.test(dF)){var dp=dF.replace("dimension","");dL.push(parseInt(dp,10));dL.push(String(dp));dk+="&"+dF+"="+t(dG[dF]);delete dG[dF]}}}if(dG&&B(dG)){dG=null}for(dF in bl){if(Object.prototype.hasOwnProperty.call(bl,dF)){var dv=(-1===M(dL,dF));if(dv){dk+="&dimension"+dF+"="+t(bl[dF])}}}if(dG){dk+="&data="+t(JSON_PIWIK.stringify(dG))}else{if(ao){dk+="&data="+t(JSON_PIWIK.stringify(ao))}}function ds(dO,dP){var dQ=JSON_PIWIK.stringify(dO);if(dQ.length>2){return"&"+dP+"="+t(dQ)}return""}var dK=dh(bV);var dB=dh(cl);dk+=ds(dK,"cvar");dk+=ds(dB,"e_cvar");if(aQ){dk+=ds(aQ,"_cvar");for(dF in dC){if(Object.prototype.hasOwnProperty.call(dC,dF)){if(aQ[dF][0]===""||aQ[dF][1]===""){delete aQ[dF]}}}if(bP){dd(dx,JSON_PIWIK.stringify(aQ),co,bo,cW)}}if(a2){if(cm){dk+="&gt_ms="+cm}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dk+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
-}}}if(aK){dk+="&pv_id="+aK}dz.lastEcommerceOrderTs=J(dl)&&String(dl).length?dl:dz.lastEcommerceOrderTs;aL(dz);cc();dk+=ac(dH,{tracker:bH,request:dk});if(cY.length){dk+="&"+cY}if(A(ca)){dk=ca(dk)}return dk}bQ=function a7(){var di=new Date();di=di.getTime();if(!cX){return false}if((cX+(1000*c6))<=di){return false}if(cX+a5<=di){bH.ping();return true}return false};function bp(dl,dk,dr,dm,di,du){var dp="idgoal=0",dq,dj=new Date(),ds=[],dt,dn=String(dl).length;if(dn){dp+="&ec_id="+t(dl);dq=Math.round(dj.getTime()/1000)}dp+="&revenue="+dk;if(String(dr).length){dp+="&ec_st="+dr}if(String(dm).length){dp+="&ec_tx="+dm}if(String(di).length){dp+="&ec_sh="+di}if(String(du).length){dp+="&ec_dt="+du}if(cZ){for(dt in cZ){if(Object.prototype.hasOwnProperty.call(cZ,dt)){if(!J(cZ[dt][1])){cZ[dt][1]=""}if(!J(cZ[dt][2])){cZ[dt][2]=""}if(!J(cZ[dt][3])||String(cZ[dt][3]).length===0){cZ[dt][3]=0}if(!J(cZ[dt][4])||String(cZ[dt][4]).length===0){cZ[dt][4]=1}ds.push(cZ[dt])}}dp+="&ec_items="+t(JSON_PIWIK.stringify(ds))
-}dp=cs(dp,ao,"ecommerce",dq);bE(dp,bI);if(dn){cZ={}}}function bY(di,dm,dl,dk,dj,dn){if(String(di).length&&J(dm)){bp(di,dm,dl,dk,dj,dn)}}function br(di){if(J(di)){bp("",di,"","","","")}}function bZ(dj,dl,dk){aK=bg();var di=cs("action_name="+t(al(dj||bi)),dl,"log");bE(di,bI,dk)}function a0(dk,dj){var dl,di="(^| )(piwik[_-]"+dj;if(dk){for(dl=0;dl<dk.length;dl++){di+="|"+dk[dl]}}di+=")( |$)";return new RegExp(di)}function aU(di){return(aD&&di&&0===String(di).indexOf(aD))}function cu(dm,di,dn,dj){if(aU(di)){return 0}var dl=a0(bK,"download"),dk=a0(a8,"link"),dp=new RegExp("\\.("+c5.join("|")+")([?&#]|$)","i");if(dk.test(dm)){return"link"}if(dj||dl.test(dm)||dp.test(di)){return"download"}if(dn){return 0}return"link"}function au(dj){var di;di=dj.parentNode;while(di!==null&&J(di)){if(ae.isLinkElement(dj)){break}dj=di;di=dj.parentNode}return dj}function db(dn){dn=au(dn);if(!ae.hasNodeAttribute(dn,"href")){return}if(!J(dn.href)){return}var dm=ae.getAttributeValueFromNode(dn,"href");if(aU(dm)){return
-}var dj=dn.pathname||ck(dn.href);var dp=dn.hostname||d(dn.href);var dq=dp.toLowerCase();var dk=dn.href.replace(dp,dq);var dl=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dl.test(dk)){var di=cu(dn.className,dk,ar(dq,dj),ae.hasNodeAttribute(dn,"download"));if(di){return{type:di,href:dk}}}}function aP(di,dj,dk,dl){var dm=v.buildInteractionRequestParams(di,dj,dk,dl);if(!dm){return}return cs(dm,null,"contentInteraction")}function cJ(dk,dl,dq,di,dj){if(!J(dk)){return}if(aU(dk)){return dk}var dn=v.toAbsoluteUrl(dk);var dm="redirecturl="+t(dn)+"&";dm+=aP(dl,dq,di,(dj||dk));var dp="&";if(aD.indexOf("?")<0){dp="?"}return aD+dp+dm}function bb(di,dj){if(!di||!dj){return false}var dk=v.findTargetNode(di);if(v.shouldIgnoreInteraction(dk)){return false}dk=v.findTargetNodeNoDefault(di);if(dk&&!V(dk,dj)){return false}return true}function ct(dk,dj,dm){if(!dk){return}var di=v.findParentContentNode(dk);if(!di){return}if(!bb(di,dk)){return}var dl=v.buildContentBlock(di);
-if(!dl){return}if(!dl.target&&dm){dl.target=dm}return v.buildInteractionRequestParams(dj,dl.name,dl.piece,dl.target)}function aW(dj){if(!b9||!b9.length){return false}var di,dk;for(di=0;di<b9.length;di++){dk=b9[di];if(dk&&dk.name===dj.name&&dk.piece===dj.piece&&dk.target===dj.target){return true}}return false}function bD(dl){if(!dl){return false}var dp=v.findTargetNode(dl);if(!dp||v.shouldIgnoreInteraction(dp)){return false}var dq=db(dp);if(c8&&dq&&dq.type){return false}if(ae.isLinkElement(dp)&&ae.hasNodeAttributeWithValue(dp,"href")){var di=String(ae.getAttributeValueFromNode(dp,"href"));if(0===di.indexOf("#")){return false}if(aU(di)){return true}if(!v.isUrlToCurrentDomain(di)){return false}var dm=v.buildContentBlock(dl);if(!dm){return}var dk=dm.name;var dr=dm.piece;var dn=dm.target;if(!ae.hasNodeAttributeWithValue(dp,v.CONTENT_TARGET_ATTR)||dp.wasContentTargetAttrReplaced){dp.wasContentTargetAttrReplaced=true;dn=v.toAbsoluteUrl(di);ae.setAnyAttribute(dp,v.CONTENT_TARGET_ATTR,dn)}var dj=cJ(di,"click",dk,dr,dn);
-v.setHrefAttribute(dp,dj);return true}return false}function aM(dj){if(!dj||!dj.length){return}var di;for(di=0;di<dj.length;di++){bD(dj[di])}}function aX(di){return function(dj){if(!di){return}var dm=v.findParentContentNode(di);var dn;if(dj){dn=dj.target||dj.srcElement}if(!dn){dn=di}if(!bb(dm,dn)){return}cf(bI);if(ae.isLinkElement(di)&&ae.hasNodeAttributeWithValue(di,"href")&&ae.hasNodeAttributeWithValue(di,v.CONTENT_TARGET_ATTR)){var dk=ae.getAttributeValueFromNode(di,"href");if(!aU(dk)&&di.wasContentTargetAttrReplaced){ae.setAnyAttribute(di,v.CONTENT_TARGET_ATTR,"")}}var ds=db(di);if(ap&&ds&&ds.type){return ds.type}if(bD(dm)){return"href"}var dp=v.buildContentBlock(dm);if(!dp){return}var dl=dp.name;var dt=dp.piece;var dr=dp.target;var dq=aP("click",dl,dt,dr);if(dq){bE(dq,bI)}return dq}}function b0(dk){if(!dk||!dk.length){return}var di,dj;for(di=0;di<dk.length;di++){dj=v.findTargetNode(dk[di]);if(dj&&!dj.contentInteractionTrackingSetupDone){dj.contentInteractionTrackingSetupDone=true;an(dj,"click",aX(dj))
-}}}function bw(dk,dl){if(!dk||!dk.length){return[]}var di,dj;for(di=0;di<dk.length;di++){if(aW(dk[di])){dk.splice(di,1);di--}else{b9.push(dk[di])}}if(!dk||!dk.length){return[]}aM(dl);b0(dl);var dm=[];for(di=0;di<dk.length;di++){dj=cs(v.buildImpressionRequestParams(dk[di].name,dk[di].piece,dk[di].target),undefined,"contentImpressions");if(dj){dm.push(dj)}}return dm}function cy(dj){var di=v.collectContent(dj);return bw(di,dj)}function a9(dj){if(!dj||!dj.length){return[]}var di;for(di=0;di<dj.length;di++){if(!v.isNodeVisible(dj[di])){dj.splice(di,1);di--}}if(!dj||!dj.length){return[]}return cy(dj)}function aF(dk,di,dj){var dl=v.buildImpressionRequestParams(dk,di,dj);return cs(dl,null,"contentImpression")}function da(dl,dj){if(!dl){return}var di=v.findParentContentNode(dl);var dk=v.buildContentBlock(di);if(!dk){return}if(!dj){dj="Unknown"}return aP(dj,dk.name,dk.piece,dk.target)}function cN(dj,dl,di,dk){return"e_c="+t(dj)+"&e_a="+t(dl)+(J(di)?"&e_n="+t(di):"")+(J(dk)?"&e_v="+t(dk):"")}function at(dk,dm,di,dl,dp,dn){if(a(String(dk)).length===0||a(String(dm)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");
-return false}var dj=cs(cN(dk,dm,di,dl),dp,"event");bE(dj,bI,dn)}function b7(di,dl,dj,dm){var dk=cs("search="+t(di)+(dl?"&search_cat="+t(dl):"")+(J(dj)?"&search_count="+dj:""),dm,"sitesearch");bE(dk,bI)}function cS(di,dm,dl,dk){var dj=cs("idgoal="+di+(dm?"&revenue="+dm:""),dl,"goal");bE(dj,bI,dk)}function c0(dl,di,dq,dp,dk){var dn=di+"="+t(b1(dl));var dj=ct(dk,"click",dl);if(dj){dn+="&"+dj}var dm=cs(dn,dq,"link");bE(dm,bI,dp)}function bT(dj,di){if(dj!==""){return dj+di.charAt(0).toUpperCase()+di.slice(1)}return di}function cg(dn){var dm,di,dl=["","webkit","ms","moz"],dk;if(!be){for(di=0;di<dl.length;di++){dk=dl[di];if(Object.prototype.hasOwnProperty.call(G,bT(dk,"hidden"))){if(G[bT(dk,"visibilityState")]==="prerender"){dm=true}break}}}if(dm){an(G,dk+"visibilitychange",function dj(){G.removeEventListener(dk+"visibilitychange",dj,false);dn()});return}dn()}function bq(){var dj=aY().uuid;var di=aI();return dj+di}function ci(di){if(!di){return}if(!ae.hasNodeAttribute(di,"href")){return}var dj=ae.getAttributeValueFromNode(di,"href");
-if(!dj||aU(dj)){return}dj=k(dj,av);var dk=bq();dj=F(dj,av,dk);ae.setAnyAttribute(di,"href",dj)}function aA(dl){var dm=ae.getAttributeValueFromNode(dl,"href");if(!dm){return false}dm=String(dm);var dj=dm.indexOf("//")===0||dm.indexOf("http://")===0||dm.indexOf("https://")===0;if(!dj){return false}var di=dl.pathname||ck(dl.href);var dk=(dl.hostname||d(dl.href)).toLowerCase();if(ar(dk,di)){if(!cE(cT,L(dk))){return true}return false}return false}function cD(di){var dj=db(di);if(dj&&dj.type){dj.href=p(dj.href);c0(dj.href,dj.type,undefined,null,di);return}if(cL){di=au(di);if(aA(di)){ci(di)}}}function cv(){return G.all&&!G.addEventListener}function cU(di){var dk=di.which;var dj=(typeof di.button);if(!dk&&dj!=="undefined"){if(cv()){if(di.button&1){dk=1}else{if(di.button&2){dk=3}else{if(di.button&4){dk=2}}}}else{if(di.button===0||di.button==="0"){dk=1}else{if(di.button&1){dk=2}else{if(di.button&2){dk=3}}}}}return dk}function bS(di){switch(cU(di)){case 1:return"left";case 2:return"middle";case 3:return"right"
-}}function a1(di){return di.target||di.srcElement}function aB(di){return function(dl){dl=dl||T.event;var dk=bS(dl);var dm=a1(dl);if(dl.type==="click"){var dj=false;if(di&&dk==="middle"){dj=true}if(dm&&!dj){cD(dm)}}else{if(dl.type==="mousedown"){if(dk==="middle"&&dm){aR=dk;bz=dm}else{aR=bz=null}}else{if(dl.type==="mouseup"){if(dk===aR&&dm===bz){cD(dm)}aR=bz=null}else{if(dl.type==="contextmenu"){cD(dm)}}}}}}function aq(dk,dj){var di=typeof dj;if(di==="undefined"){dj=true}an(dk,"click",aB(dj),false);if(dj){an(dk,"mouseup",aB(dj),false);an(dk,"mousedown",aB(dj),false);an(dk,"contextmenu",aB(dj),false)}}function bC(dk,dm){ap=true;var dl,dj=a0(by,"ignore"),dn=G.links,di=null,dp=null;if(dn){for(dl=0;dl<dn.length;dl++){di=dn[dl];if(!dj.test(di.className)){dp=typeof di.piwikTrackers;if("undefined"===dp){di.piwikTrackers=[]}if(-1===M(di.piwikTrackers,dm)){di.piwikTrackers.push(dm);aq(di,dk)}}}}}function aS(dj,dm,dn){if(ce){return true}ce=true;var dp=false;var dl,dk;function di(){dp=true}n(function(){function dq(ds){setTimeout(function(){if(!ce){return
-}dp=false;dn.trackVisibleContentImpressions();dq(ds)},ds)}function dr(ds){setTimeout(function(){if(!ce){return}if(dp){dp=false;dn.trackVisibleContentImpressions()}dr(ds)},ds)}if(dj){dl=["scroll","resize"];for(dk=0;dk<dl.length;dk++){if(G.addEventListener){G.addEventListener(dl[dk],di,false)}else{T.attachEvent("on"+dl[dk],di)}}dr(100)}if(dm&&dm>0){dm=parseInt(dm,10);dq(dm)}})}var bB={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var di=this.requests;this.requests=[];if(di.length===1){bE(di[0],bI)}else{de(di,bI)}},push:function(di){if(!di){return}if(m||!this.enabled){bE(di,bI);return}bB.requests.push(di);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bB.timeout=null;bB.sendRequests()},bB.interval);var dj="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dj)){b[dj]={unload:function(){if(bB.timeout){clearTimeout(bB.timeout)}bB.sendRequests()}}}}};bh();aL();this.hasConsent=function(){return bA};this.getVisitorId=function(){return aY().uuid
-};this.getVisitorInfo=function(){return cM()};this.getAttributionInfo=function(){return bL()};this.getAttributionCampaignName=function(){return bL()[0]};this.getAttributionCampaignKeyword=function(){return bL()[1]};this.getAttributionReferrerTimestamp=function(){return bL()[2]};this.getAttributionReferrerUrl=function(){return bL()[3]};this.setTrackerUrl=function(di){aD=di};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bG)};this.addTracker=function(di,dk){if(!J(di)||null===di){di=this.getTrackerUrl()}var dj=new Q(di,dk);I.push(dj);e.trigger("TrackerAdded",[this]);return dj};this.getSiteId=function(){return b5};this.setSiteId=function(di){b2(di)};this.resetUserId=function(){bx=""};this.setUserId=function(di){if(Y(di)){bx=di}};this.getUserId=function(){return bx};this.setCustomData=function(di,dj){if(W(di)){ao=di}else{if(!ao){ao={}}ao[di]=dj}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(di){ca=di};this.appendToTrackingUrl=function(di){cY=di
-};this.getRequest=function(di){return cs(di)};this.addPlugin=function(di,dj){b[di]=dj};this.setCustomDimension=function(di,dj){di=parseInt(di,10);if(di>0){if(!J(dj)){dj=""}if(!w(dj)){dj=String(dj)}bl[di]=dj}};this.getCustomDimension=function(di){di=parseInt(di,10);if(di>0&&Object.prototype.hasOwnProperty.call(bl,di)){return bl[di]}};this.deleteCustomDimension=function(di){di=parseInt(di,10);if(di>0){delete bl[di]}};this.setCustomVariable=function(dj,di,dm,dk){var dl;if(!J(dk)){dk="visit"}if(!J(di)){return}if(!J(dm)){dm=""}if(dj>0){di=!w(di)?String(di):di;dm=!w(dm)?String(dm):dm;dl=[di.slice(0,bs),dm.slice(0,bs)];if(dk==="visit"||dk===2){cC();aQ[dj]=dl}else{if(dk==="page"||dk===3){bV[dj]=dl}else{if(dk==="event"){cl[dj]=dl}}}}};this.getCustomVariable=function(dj,dk){var di;if(!J(dk)){dk="visit"}if(dk==="page"||dk===3){di=bV[dj]}else{if(dk==="event"){di=cl[dj]}else{if(dk==="visit"||dk===2){cC();di=aQ[dj]}}}if(!J(di)||(di&&di[0]==="")){return false}return di};this.deleteCustomVariable=function(di,dj){if(this.getCustomVariable(di,dj)){this.setCustomVariable(di,"","",dj)
-}};this.deleteCustomVariables=function(di){if(di==="page"||di===3){bV={}}else{if(di==="event"){cl={}}else{if(di==="visit"||di===2){aQ={}}}}};this.storeCustomVariablesInCookie=function(){bP=true};this.setLinkTrackingTimer=function(di){bI=di};this.getLinkTrackingTimer=function(){return bI};this.setDownloadExtensions=function(di){if(w(di)){di=di.split("|")}c5=di};this.addDownloadExtensions=function(dj){var di;if(w(dj)){dj=dj.split("|")}for(di=0;di<dj.length;di++){c5.push(dj[di])}};this.removeDownloadExtensions=function(dk){var dj,di=[];if(w(dk)){dk=dk.split("|")}for(dj=0;dj<c5.length;dj++){if(M(dk,c5[dj])===-1){di.push(c5[dj])}}c5=di};this.setDomains=function(di){ax=w(di)?[di]:di;var dm=false,dk=0,dj;for(dk;dk<ax.length;dk++){dj=String(ax[dk]);if(cE(cT,L(dj))){dm=true;break}var dl=ck(dj);if(dl&&dl!=="/"&&dl!=="/*"){dm=true;break}}if(!dm){ax.push(cT)}};this.enableCrossDomainLinking=function(){cL=true};this.disableCrossDomainLinking=function(){cL=false};this.isCrossDomainLinkingEnabled=function(){return cL
-};this.setCrossDomainLinkingTimeout=function(di){aZ=di};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bq())};this.setIgnoreClasses=function(di){by=w(di)?[di]:di};this.setRequestMethod=function(di){c9=di||ch};this.setRequestContentType=function(di){cw=di||aH};this.setReferrerUrl=function(di){bm=di};this.setCustomUrl=function(di){a4=bU(bM,di)};this.getCurrentUrl=function(){return a4||bM};this.setDocumentTitle=function(di){bi=di};this.setAPIUrl=function(di){bG=di};this.setDownloadClasses=function(di){bK=w(di)?[di]:di};this.setLinkClasses=function(di){a8=w(di)?[di]:di};this.setCampaignNameKey=function(di){cq=w(di)?[di]:di};this.setCampaignKeywordKey=function(di){bF=w(di)?[di]:di};this.discardHashTag=function(di){bO=di};this.setCookieNamePrefix=function(di){bj=di;aQ=bW()};this.setCookieDomain=function(di){var dj=L(di);if(bv(dj)){cW=dj;bh()}};this.getCookieDomain=function(){return cW};this.hasCookies=function(){return"1"===b4()};this.setSessionCookie=function(dk,dj,di){if(!dk){throw new Error("Missing cookie name")
-}if(!J(di)){di=co}bt.push(dk);dd(aT(dk),dj,di,bo,cW)};this.getCookie=function(dj){var di=aC(aT(dj));if(di===0){return null}return di};this.setCookiePath=function(di){bo=di;bh()};this.getCookiePath=function(di){return bo};this.setVisitorCookieTimeout=function(di){cH=di*1000};this.setSessionCookieTimeout=function(di){co=di*1000};this.getSessionCookieTimeout=function(){return co};this.setReferralCookieTimeout=function(di){c4=di*1000};this.setConversionAttributionFirstReferrer=function(di){bu=di};this.setSecureCookie=function(di){bR=di};this.disableCookies=function(){bk=true;c7.cookie="0";if(b5){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dj){var di=h.doNotTrack||h.msDoNotTrack;cO=dj&&(di==="yes"||di==="1");if(cO){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cV=true};this.addListener=function(dj,di){aq(dj,di)};this.enableLinkTracking=function(dj){c8=true;var di=this;cg(function(){q(function(){bC(dj,di)})})};this.enableJSErrorTracking=function(){if(cR){return
-}cR=true;var di=T.onerror;T.onerror=function(dn,dl,dk,dm,dj){cg(function(){var dp="JavaScript Errors";var dq=dl+":"+dk;if(dm){dq+=":"+dm}at(dp,dq,dn)});if(di){return di(dn,dl,dk,dm,dj)}return false}};this.disablePerformanceTracking=function(){a2=false};this.setGenerationTimeMs=function(di){cm=parseInt(di,10)};this.setVisitStandardLength=function(di){di=Math.max(di,5);c6=di};this.enableHeartBeatTimer=function(di){di=Math.max(di,5);a5=(di||15)*1000;if(cX!==null){df()}};this.disableHeartBeatTimer=function(){bJ();if(a5||aN){if(T.removeEventListener){T.removeEventListener("focus",ba);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",ba);T.detachEvent("onblur",ay)}}}a5=null;aN=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(di){if(T.location.protocol==="file:"){T.location=di}};this.setCountPreRendered=function(di){be=di};this.trackGoal=function(di,dl,dk,dj){cg(function(){cS(di,dl,dk,dj)})};this.trackLink=function(dj,di,dl,dk){cg(function(){c0(dj,di,dl,dk)
-})};this.getNumTrackedPageViews=function(){return cr};this.trackPageView=function(di,dk,dj){b9=[];cI=[];if(N(b5)){cg(function(){Z(aD,bG,b5)})}else{cg(function(){cr++;bZ(di,dk,dj)})}};this.trackAllContentImpressions=function(){if(N(b5)){return}cg(function(){q(function(){var di=v.findContentNodes();var dj=cy(di);de(dj,bI)})})};this.trackVisibleContentImpressions=function(di,dj){if(N(b5)){return}if(!J(di)){di=true}if(!J(dj)){dj=750}aS(di,dj,this);cg(function(){n(function(){var dk=v.findContentNodes();var dl=a9(dk);de(dl,bI)})})};this.trackContentImpression=function(dk,di,dj){if(N(b5)){return}dk=a(dk);di=a(di);dj=a(dj);if(!dk){return}di=di||"Unknown";cg(function(){var dl=aF(dk,di,dj);bE(dl,bI)})};this.trackContentImpressionsWithinNode=function(di){if(N(b5)||!di){return}cg(function(){if(ce){n(function(){var dj=v.findContentNodesWithinNode(di);var dk=a9(dj);de(dk,bI)})}else{q(function(){var dj=v.findContentNodesWithinNode(di);var dk=cy(dj);de(dk,bI)})}})};this.trackContentInteraction=function(dk,dl,di,dj){if(N(b5)){return
-}dk=a(dk);dl=a(dl);di=a(di);dj=a(dj);if(!dk||!dl){return}di=di||"Unknown";cg(function(){var dm=aP(dk,dl,di,dj);if(dm){bE(dm,bI)}})};this.trackContentInteractionNode=function(dj,di){if(N(b5)||!dj){return}cg(function(){var dk=da(dj,di);if(dk){bE(dk,bI)}})};this.logAllContentBlocksOnPage=function(){var dk=v.findContentNodes();var di=v.collectContent(dk);var dj=typeof console;if(dj!=="undefined"&&console&&console.log){console.log(di)}};this.trackEvent=function(dj,dl,di,dk,dn,dm){cg(function(){at(dj,dl,di,dk,dn,dm)})};this.trackSiteSearch=function(di,dk,dj,dl){b9=[];cg(function(){b7(di,dk,dj,dl)})};this.setEcommerceView=function(dl,di,dk,dj){if(Y(dk)){dk=String(dk)}if(!J(dk)||dk===null||dk===false||!dk.length){dk=""}else{if(dk instanceof Array){dk=JSON_PIWIK.stringify(dk)}}bV[5]=["_pkc",dk];if(J(dj)&&dj!==null&&dj!==false&&String(dj).length){bV[2]=["_pkp",dj]}if(!Y(dl)&&!Y(di)){return}if(Y(dl)){bV[3]=["_pks",dl]}if(!Y(di)){di=""}bV[4]=["_pkn",di]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(cZ))
-};this.addEcommerceItem=function(dm,di,dk,dj,dl){if(Y(dm)){cZ[dm]=[String(dm),di,dk,dj,dl]}};this.removeEcommerceItem=function(di){if(Y(di)){di=String(di);delete cZ[di]}};this.clearEcommerceCart=function(){cZ={}};this.trackEcommerceOrder=function(di,dm,dl,dk,dj,dn){bY(di,dm,dl,dk,dj,dn)};this.trackEcommerceCartUpdate=function(di){br(di)};this.trackRequest=function(dj,dl,dk,di){cg(function(){var dm=cs(dj,dl,di);bE(dm,bI,dk)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bB.enabled=false};this.setRequestQueueInterval=function(di){if(di<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bB.interval=di};this.queueRequest=function(di){cg(function(){var dj=cs(di);bB.push(dj)})};this.isConsentRequired=function(){return cz};this.getRememberedConsent=function(){var di=aC(bd);if(aC(cK)){if(di){bX(bd,bo,cW)}return null}if(!di||di===0){return null}return di};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
-};this.requireConsent=function(){cz=true;bA=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bA){aE()}}}};this.setConsentGiven=function(){bA=true;bX(cK,bo,cW);var dj,di;for(dj=0;dj<cI.length;dj++){di=typeof cI[dj];if(di==="string"){bE(cI[dj],bI)}else{if(di==="object"){de(cI[dj],bI)}}}cI=[]};this.rememberConsentGiven=function(dj){if(dj){dj=dj*60*60*1000}else{dj=30*365*24*60*60*1000}this.setConsentGiven();var di=new Date().getTime();dd(bd,di,dj,bo,cW,bR)};this.forgetConsentGiven=function(){var di=30*365*24*60*60*1000;bX(bd,bo,cW);dd(cK,new Date().getTime(),di,bo,cW,bR);this.requireConsent()};this.isUserOptedOut=function(){return !bA};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
+;if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Matomo=window.Piwik=(function(){var r,b={},y={},G=document,h=navigator,X=screen,T=window,i=T.performance||T.mozPerformance||T.msPerformance||T.webkitPerformance,t=T.encodeURIComponent,S=T.decodeURIComponent,l=unescape,I=[],E,e,ah=[],x=0,ab=0,U=0,m=false;function p(ao){try{return S(ao)}catch(ap){return unescape(ao)}}function J(ap){var ao=typeof ap;return ao!=="undefined"}function A(ao){return typeof ao==="function"}function W(ao){return typeof ao==="object"}function w(ao){return typeof ao==="string"||ao instanceof String}function ag(ao){return typeof ao==="number"||ao instanceof Number
+}function Y(ao){return J(ao)&&(ag(ao)||(w(ao)&&ao.length))}function B(ap){if(!ap){return true}var ao;var aq=true;for(ao in ap){if(Object.prototype.hasOwnProperty.call(ap,ao)){aq=false}}return aq}function ak(ao){var ap=typeof console;if(ap!=="undefined"&&console&&console.error){console.error(ao)}}function af(){var au,at,aw,ap,ao;for(au=0;au<arguments.length;au+=1){ao=null;if(arguments[au]&&arguments[au].slice){ao=arguments[au].slice()}ap=arguments[au];aw=ap.shift();var av,aq;var ar=w(aw)&&aw.indexOf("::")>0;if(ar){av=aw.split("::");aq=av[0];aw=av[1];if("object"===typeof e[aq]&&"function"===typeof e[aq][aw]){e[aq][aw].apply(e[aq],ap)}else{if(ao){ah.push(ao)}}}else{for(at=0;at<I.length;at++){if(w(aw)){aq=I[at];var ax=aw.indexOf(".")>0;if(ax){av=aw.split(".");if(aq&&"object"===typeof aq[av[0]]){aq=aq[av[0]];aw=av[1]}else{if(ao){ah.push(ao);break}}}if(aq[aw]){aq[aw].apply(aq,ap)}else{var ay="The method '"+aw+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: https://developer.piwik.org/api-reference/tracking-javascript';
+ak(ay);if(!ax){throw new TypeError(ay)}}if(aw==="addTracker"){break}if(aw==="setTrackerUrl"||aw==="setSiteId"){break}}else{aw.apply(I[at],ap)}}}}}function an(ar,aq,ap,ao){if(ar.addEventListener){ar.addEventListener(aq,ap,ao);return true}if(ar.attachEvent){return ar.attachEvent("on"+aq,ap)}ar["on"+aq]=ap}function n(ao){if(G.readyState==="complete"){ao()}else{if(T.addEventListener){T.addEventListener("load",ao,false)}else{if(T.attachEvent){T.attachEvent("onload",ao)}}}}function q(ar){var ao=false;if(G.attachEvent){ao=G.readyState==="complete"}else{ao=G.readyState!=="loading"}if(ao){ar();return}var aq;if(G.addEventListener){an(G,"DOMContentLoaded",function ap(){G.removeEventListener("DOMContentLoaded",ap,false);if(!ao){ao=true;ar()}})}else{if(G.attachEvent){G.attachEvent("onreadystatechange",function ap(){if(G.readyState==="complete"){G.detachEvent("onreadystatechange",ap);if(!ao){ao=true;ar()}}});if(G.documentElement.doScroll&&T===T.top){(function ap(){if(!ao){try{G.documentElement.doScroll("left")
+}catch(at){setTimeout(ap,0);return}ao=true;ar()}}())}}}an(T,"load",function(){if(!ao){ao=true;ar()}},false)}function ac(ap,av,aw){if(!ap){return""}var ao="",ar,aq,at,au;for(ar in b){if(Object.prototype.hasOwnProperty.call(b,ar)){au=b[ar]&&"function"===typeof b[ar][ap];if(au){aq=b[ar][ap];at=aq(av||{},aw);if(at){ao+=at}}}}return ao}function ai(){var ao;m=true;ac("unload");if(r){do{ao=new Date()}while(ao.getTimeAlias()<r)}}function o(aq,ap){var ao=G.createElement("script");ao.type="text/javascript";ao.src=aq;if(ao.readyState){ao.onreadystatechange=function(){var ar=this.readyState;if(ar==="loaded"||ar==="complete"){ao.onreadystatechange=null;ap()}}}else{ao.onload=ap}G.getElementsByTagName("head")[0].appendChild(ao)}function K(){var ao="";try{ao=T.top.document.referrer}catch(aq){if(T.parent){try{ao=T.parent.document.referrer}catch(ap){ao=""}}}if(ao===""){ao=G.referrer}return ao}function s(ao){var aq=new RegExp("^([a-z]+):"),ap=aq.exec(ao);return ap?ap[1]:null}function d(ao){var aq=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),ap=aq.exec(ao);
+return ap?ap[1]:ao}function aj(ap,ao){ap=String(ap);return ap.lastIndexOf(ao,0)===0}function R(ap,ao){ap=String(ap);return ap.indexOf(ao,ap.length-ao.length)!==-1}function z(ap,ao){ap=String(ap);return ap.indexOf(ao)!==-1}function g(ap,ao){ap=String(ap);return ap.substr(0,ap.length-ao)}function F(ar,aq,au){ar=String(ar);if(!au){au=""}var ao=ar.indexOf("#");var av=ar.length;if(ao===-1){ao=av}var at=ar.substr(0,ao);var ap=ar.substr(ao,av-ao);if(at.indexOf("?")===-1){at+="?"}else{if(!R(at,"?")){at+="&"}}return at+t(aq)+"="+t(au)+ap}function k(ap,aq){ap=String(ap);if(ap.indexOf("?"+aq+"=")===-1&&ap.indexOf("&"+aq+"=")===-1){return ap}var ar=ap.indexOf("?");if(ar===-1){return ap}var ao=ap.substr(ar+1);var aw=ap.substr(0,ar);if(ao){var ax="";var az=ao.indexOf("#");if(az!==-1){ax=ao.substr(az+1);ao=ao.substr(0,az)}var at;var av=ao.split("&");var au=av.length-1;for(au;au>=0;au--){at=av[au].split("=")[0];if(at===aq){av.splice(au,1)}}var ay=av.join("&");if(ay){aw=aw+"?"+ay}if(ax){aw+="#"+ax}}return aw
+}function f(aq,ap){var ao="[\\?&#]"+ap+"=([^&#]*)";var at=new RegExp(ao);var ar=at.exec(aq);return ar?S(ar[1]):""}function a(ao){if(ao&&String(ao)===ao){return ao.replace(/^\s+|\s+$/g,"")}return ao}function D(ao){return unescape(t(ao))}function am(aE){var aq=function(aK,aJ){return(aK<<aJ)|(aK>>>(32-aJ))},aF=function(aM){var aK="",aL,aJ;for(aL=7;aL>=0;aL--){aJ=(aM>>>(aL*4))&15;aK+=aJ.toString(16)}return aK},au,aH,aG,ap=[],ay=1732584193,aw=4023233417,av=2562383102,at=271733878,ar=3285377520,aD,aC,aB,aA,az,aI,ao,ax=[];aE=D(aE);ao=aE.length;for(aH=0;aH<ao-3;aH+=4){aG=aE.charCodeAt(aH)<<24|aE.charCodeAt(aH+1)<<16|aE.charCodeAt(aH+2)<<8|aE.charCodeAt(aH+3);ax.push(aG)}switch(ao&3){case 0:aH=2147483648;break;case 1:aH=aE.charCodeAt(ao-1)<<24|8388608;break;case 2:aH=aE.charCodeAt(ao-2)<<24|aE.charCodeAt(ao-1)<<16|32768;break;case 3:aH=aE.charCodeAt(ao-3)<<24|aE.charCodeAt(ao-2)<<16|aE.charCodeAt(ao-1)<<8|128;break}ax.push(aH);while((ax.length&15)!==14){ax.push(0)}ax.push(ao>>>29);ax.push((ao<<3)&4294967295);
+for(au=0;au<ax.length;au+=16){for(aH=0;aH<16;aH++){ap[aH]=ax[au+aH]}for(aH=16;aH<=79;aH++){ap[aH]=aq(ap[aH-3]^ap[aH-8]^ap[aH-14]^ap[aH-16],1)}aD=ay;aC=aw;aB=av;aA=at;az=ar;for(aH=0;aH<=19;aH++){aI=(aq(aD,5)+((aC&aB)|(~aC&aA))+az+ap[aH]+1518500249)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=20;aH<=39;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+1859775393)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=40;aH<=59;aH++){aI=(aq(aD,5)+((aC&aB)|(aC&aA)|(aB&aA))+az+ap[aH]+2400959708)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=60;aH<=79;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+3395469782)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}ay=(ay+aD)&4294967295;aw=(aw+aC)&4294967295;av=(av+aB)&4294967295;at=(at+aA)&4294967295;ar=(ar+az)&4294967295}aI=aF(ay)+aF(aw)+aF(av)+aF(at)+aF(ar);return aI.toLowerCase()}function aa(aq,ao,ap){if(!aq){aq=""}if(!ao){ao=""}if(aq==="translate.googleusercontent.com"){if(ap===""){ap=ao}ao=f(ao,"u");aq=d(ao)}else{if(aq==="cc.bingj.com"||aq==="webcache.googleusercontent.com"||aq.slice(0,5)==="74.6."){ao=G.links[0].href;
+aq=d(ao)}}return[aq,ao,ap]}function L(ap){var ao=ap.length;if(ap.charAt(--ao)==="."){ap=ap.slice(0,ao)}if(ap.slice(0,2)==="*."){ap=ap.slice(1)}if(ap.indexOf("/")!==-1){ap=ap.substr(0,ap.indexOf("/"))}return ap}function al(ap){ap=ap&&ap.text?ap.text:ap;if(!w(ap)){var ao=G.getElementsByTagName("title");if(ao&&J(ao[0])){ap=ao[0].text}}return ap}function P(ao){if(!ao){return[]}if(!J(ao.children)&&J(ao.childNodes)){return ao.children}if(J(ao.children)){return ao.children}return[]}function V(ap,ao){if(!ap||!ao){return false}if(ap.contains){return ap.contains(ao)}if(ap===ao){return true}if(ap.compareDocumentPosition){return !!(ap.compareDocumentPosition(ao)&16)}return false}function M(aq,ar){if(aq&&aq.indexOf){return aq.indexOf(ar)}if(!J(aq)||aq===null){return -1}if(!aq.length){return -1}var ao=aq.length;if(ao===0){return -1}var ap=0;while(ap<ao){if(aq[ap]===ar){return ap}ap++}return -1}function j(aq){if(!aq){return false}function ao(at,au){if(T.getComputedStyle){return G.defaultView.getComputedStyle(at,null)[au]
+}if(at.currentStyle){return at.currentStyle[au]}}function ar(at){at=at.parentNode;while(at){if(at===G){return true}at=at.parentNode}return false}function ap(av,aB,at,ay,aw,az,ax){var au=av.parentNode,aA=1;if(!ar(av)){return false}if(9===au.nodeType){return true}if("0"===ao(av,"opacity")||"none"===ao(av,"display")||"hidden"===ao(av,"visibility")){return false}if(!J(aB)||!J(at)||!J(ay)||!J(aw)||!J(az)||!J(ax)){aB=av.offsetTop;aw=av.offsetLeft;ay=aB+av.offsetHeight;at=aw+av.offsetWidth;az=av.offsetWidth;ax=av.offsetHeight}if(aq===av&&(0===ax||0===az)&&"hidden"===ao(av,"overflow")){return false}if(au){if(("hidden"===ao(au,"overflow")||"scroll"===ao(au,"overflow"))){if(aw+aA>au.offsetWidth+au.scrollLeft||aw+az-aA<au.scrollLeft||aB+aA>au.offsetHeight+au.scrollTop||aB+ax-aA<au.scrollTop){return false}}if(av.offsetParent===au){aw+=au.offsetLeft;aB+=au.offsetTop}return ap(au,aB,at,ay,aw,az,ax)}return true}return ap(aq)}var ae={htmlCollectionToArray:function(aq){var ao=[],ap;if(!aq||!aq.length){return ao
+}for(ap=0;ap<aq.length;ap++){ao.push(aq[ap])}return ao},find:function(ao){if(!document.querySelectorAll||!ao){return[]}var ap=document.querySelectorAll(ao);return this.htmlCollectionToArray(ap)},findMultiple:function(aq){if(!aq||!aq.length){return[]}var ap,ar;var ao=[];for(ap=0;ap<aq.length;ap++){ar=this.find(aq[ap]);ao=ao.concat(ar)}ao=this.makeNodesUnique(ao);return ao},findNodesByTagName:function(ap,ao){if(!ap||!ao||!ap.getElementsByTagName){return[]}var aq=ap.getElementsByTagName(ao);return this.htmlCollectionToArray(aq)},makeNodesUnique:function(ao){var au=[].concat(ao);ao.sort(function(aw,av){if(aw===av){return 0}var ay=M(au,aw);var ax=M(au,av);if(ay===ax){return 0}return ay>ax?-1:1});if(ao.length<=1){return ao}var ap=0;var ar=0;var at=[];var aq;aq=ao[ap++];while(aq){if(aq===ao[ap]){ar=at.push(ap)}aq=ao[ap++]||null}while(ar--){ao.splice(at[ar],1)}return ao},getAttributeValueFromNode:function(at,aq){if(!this.hasNodeAttribute(at,aq)){return}if(at&&at.getAttribute){return at.getAttribute(aq)
+}if(!at||!at.attributes){return}var ar=(typeof at.attributes[aq]);if("undefined"===ar){return}if(at.attributes[aq].value){return at.attributes[aq].value}if(at.attributes[aq].nodeValue){return at.attributes[aq].nodeValue}var ap;var ao=at.attributes;if(!ao){return}for(ap=0;ap<ao.length;ap++){if(ao[ap].nodeName===aq){return ao[ap].nodeValue}}return null},hasNodeAttributeWithValue:function(ap,ao){var aq=this.getAttributeValueFromNode(ap,ao);return !!aq},hasNodeAttribute:function(aq,ao){if(aq&&aq.hasAttribute){return aq.hasAttribute(ao)}if(aq&&aq.attributes){var ap=(typeof aq.attributes[ao]);return"undefined"!==ap}return false},hasNodeCssClass:function(aq,ao){if(aq&&ao&&aq.className){var ap=typeof aq.className==="string"?aq.className.split(" "):[];if(-1!==M(ap,ao)){return true}}return false},findNodesHavingAttribute:function(at,aq,ao){if(!ao){ao=[]}if(!at||!aq){return ao}var ar=P(at);if(!ar||!ar.length){return ao}var ap,au;for(ap=0;ap<ar.length;ap++){au=ar[ap];if(this.hasNodeAttribute(au,aq)){ao.push(au)
+}ao=this.findNodesHavingAttribute(au,aq,ao)}return ao},findFirstNodeHavingAttribute:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeAttribute(aq,ap)){return aq}var ao=this.findNodesHavingAttribute(aq,ap);if(ao&&ao.length){return ao[0]}},findFirstNodeHavingAttributeWithValue:function(ar,aq){if(!ar||!aq){return}if(this.hasNodeAttributeWithValue(ar,aq)){return ar}var ao=this.findNodesHavingAttribute(ar,aq);if(!ao||!ao.length){return}var ap;for(ap=0;ap<ao.length;ap++){if(this.getAttributeValueFromNode(ao[ap],aq)){return ao[ap]}}},findNodesHavingCssClass:function(at,ar,ao){if(!ao){ao=[]}if(!at||!ar){return ao}if(at.getElementsByClassName){var au=at.getElementsByClassName(ar);return this.htmlCollectionToArray(au)}var aq=P(at);if(!aq||!aq.length){return[]}var ap,av;for(ap=0;ap<aq.length;ap++){av=aq[ap];if(this.hasNodeCssClass(av,ar)){ao.push(av)}ao=this.findNodesHavingCssClass(av,ar,ao)}return ao},findFirstNodeHavingClass:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeCssClass(aq,ap)){return aq
+}var ao=this.findNodesHavingCssClass(aq,ap);if(ao&&ao.length){return ao[0]}},isLinkElement:function(ap){if(!ap){return false}var ao=String(ap.nodeName).toLowerCase();var ar=["a","area"];var aq=M(ar,ao);return aq!==-1},setAnyAttribute:function(ap,ao,aq){if(!ap||!ao){return}if(ap.setAttribute){ap.setAttribute(ao,aq)}else{ap[ao]=aq}}};var v={CONTENT_ATTR:"data-track-content",CONTENT_CLASS:"piwikTrackContent",CONTENT_NAME_ATTR:"data-content-name",CONTENT_PIECE_ATTR:"data-content-piece",CONTENT_PIECE_CLASS:"piwikContentPiece",CONTENT_TARGET_ATTR:"data-content-target",CONTENT_TARGET_CLASS:"piwikContentTarget",CONTENT_IGNOREINTERACTION_ATTR:"data-content-ignoreinteraction",CONTENT_IGNOREINTERACTION_CLASS:"piwikContentIgnoreInteraction",location:undefined,findContentNodes:function(){var ap="."+this.CONTENT_CLASS;var ao="["+this.CONTENT_ATTR+"]";var aq=ae.findMultiple([ap,ao]);return aq},findContentNodesWithinNode:function(ar){if(!ar){return[]}var ap=ae.findNodesHavingCssClass(ar,this.CONTENT_CLASS);
+var ao=ae.findNodesHavingAttribute(ar,this.CONTENT_ATTR);if(ao&&ao.length){var aq;for(aq=0;aq<ao.length;aq++){ap.push(ao[aq])}}if(ae.hasNodeAttribute(ar,this.CONTENT_ATTR)){ap.push(ar)}else{if(ae.hasNodeCssClass(ar,this.CONTENT_CLASS)){ap.push(ar)}}ap=ae.makeNodesUnique(ap);return ap},findParentContentNode:function(ap){if(!ap){return}var aq=ap;var ao=0;while(aq&&aq!==G&&aq.parentNode){if(ae.hasNodeAttribute(aq,this.CONTENT_ATTR)){return aq}if(ae.hasNodeCssClass(aq,this.CONTENT_CLASS)){return aq}aq=aq.parentNode;if(ao>1000){break}ao++}},findPieceNode:function(ap){var ao;ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.findFirstNodeHavingClass(ap,this.CONTENT_PIECE_CLASS)}if(ao){return ao}return ap},findTargetNodeNoDefault:function(ao){if(!ao){return}var ap=ae.findFirstNodeHavingAttributeWithValue(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingAttribute(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingClass(ao,this.CONTENT_TARGET_CLASS);
+if(ap){return ap}},findTargetNode:function(ao){var ap=this.findTargetNodeNoDefault(ao);if(ap){return ap}return ao},findContentName:function(ap){if(!ap){return}var at=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_NAME_ATTR);if(at){return ae.getAttributeValueFromNode(at,this.CONTENT_NAME_ATTR)}var ao=this.findContentPiece(ap);if(ao){return this.removeDomainIfIsInLink(ao)}if(ae.hasNodeAttributeWithValue(ap,"title")){return ae.getAttributeValueFromNode(ap,"title")}var aq=this.findPieceNode(ap);if(ae.hasNodeAttributeWithValue(aq,"title")){return ae.getAttributeValueFromNode(aq,"title")}var ar=this.findTargetNode(ap);if(ae.hasNodeAttributeWithValue(ar,"title")){return ae.getAttributeValueFromNode(ar,"title")}},findContentPiece:function(ap){if(!ap){return}var ar=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_PIECE_ATTR);if(ar){return ae.getAttributeValueFromNode(ar,this.CONTENT_PIECE_ATTR)}var ao=this.findPieceNode(ap);var aq=this.findMediaUrlInNode(ao);if(aq){return this.toAbsoluteUrl(aq)
+}},findContentTarget:function(aq){if(!aq){return}var ar=this.findTargetNode(aq);if(ae.hasNodeAttributeWithValue(ar,this.CONTENT_TARGET_ATTR)){return ae.getAttributeValueFromNode(ar,this.CONTENT_TARGET_ATTR)}var ap;if(ae.hasNodeAttributeWithValue(ar,"href")){ap=ae.getAttributeValueFromNode(ar,"href");return this.toAbsoluteUrl(ap)}var ao=this.findPieceNode(aq);if(ae.hasNodeAttributeWithValue(ao,"href")){ap=ae.getAttributeValueFromNode(ao,"href");return this.toAbsoluteUrl(ap)}},isSameDomain:function(ao){if(!ao||!ao.indexOf){return false}if(0===ao.indexOf(this.getLocation().origin)){return true}var ap=ao.indexOf(this.getLocation().host);if(8>=ap&&0<=ap){return true}return false},removeDomainIfIsInLink:function(aq){var ap="^https?://[^/]+";var ao="^.*//[^/]+";if(aq&&aq.search&&-1!==aq.search(new RegExp(ap))&&this.isSameDomain(aq)){aq=aq.replace(new RegExp(ao),"");if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq=["img","embed","video","audio"];var ao=at.nodeName.toLowerCase();
+if(-1!==M(aq,ao)&&ae.findFirstNodeHavingAttributeWithValue(at,"src")){var ar=ae.findFirstNodeHavingAttributeWithValue(at,"src");return ae.getAttributeValueFromNode(ar,"src")}if(ao==="object"&&ae.hasNodeAttributeWithValue(at,"data")){return ae.getAttributeValueFromNode(at,"data")}if(ao==="object"){var au=ae.findNodesByTagName(at,"param");if(au&&au.length){var ap;for(ap=0;ap<au.length;ap++){if("movie"===ae.getAttributeValueFromNode(au[ap],"name")&&ae.hasNodeAttributeWithValue(au[ap],"value")){return ae.getAttributeValueFromNode(au[ap],"value")}}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;
+if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao
+},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true
+}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)
+}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cb,b6){var bF=this,bc="mtm_consent",cH="mtm_consent_removed",b1=aa(G.domain,T.location.href,K()),cQ=L(b1[0]),bK=p(b1[1]),bl=p(b1[2]),cO=false,cf="GET",c6=cf,aH="application/x-www-form-urlencoded; charset=UTF-8",cu=aH,aD=cb||"",bE="",cV="",b3=b6||"",bw="",bL="",a3,bh="",c2=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cQ],bx=[],bI=[],a7=[],bG=500,cS=true,cE,a4,bO,c3=1800,bM,ao,co=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bD=["pk_kwd","piwik_kwd","utm_term"],bi="_pk_",av="pk_vid",aY=180,cT,bn,bP=false,bj=false,cL,bd,bt,cF=33955200000,cm=1800000,c1=15768000000,a1=true,ck=0,bN=false,aP=false,b8,bT={},cj={},bk={},br=200,cW={},c4={},b7=[],cc=false,cy=false,ap=false,c5=false,cI=false,aM=false,bb=u(),cN=null,cU=null,b9,aQ,by,b4=am,bm,aK,cp=0,bs=["id","ses","cvar","ref"],cx=false,bz=null,cG=[],aw=U++;
+try{bh=G.title}catch(cv){bh=""}function da(dl,dj,di,dk,dh,dg){if(bj){return}var df;if(di){df=new Date();df.setTime(df.getTime()+di)}G.cookie=dl+"="+t(dj)+(di?";expires="+df.toGMTString():"")+";path="+(dk||"/")+(dh?";domain="+dh:"")+(dg?";secure":"")+";SameSite=Lax"}function aC(dh){if(bj){return 0}var df=new RegExp("(^|;)[ ]*"+dh+"=([^;]*)"),dg=df.exec(G.cookie);return dg?S(dg[2]):0}bz=!aC(cH);function bZ(df){var dg;df=k(df,av);if(bM){dg=new RegExp("#.*");return df.replace(dg,"")}return df}function bS(dh,df){var di=s(df),dg;if(di){return df}if(df.slice(0,1)==="/"){return s(dh)+"://"+d(dh)+df}dh=bZ(dh);dg=dh.indexOf("?");if(dg>=0){dh=dh.slice(0,dg)}dg=dh.lastIndexOf("/");if(dg!==dh.length-1){dh=dh.slice(0,dg+1)}return dh+df}function cC(dh,df){var dg;dh=String(dh).toLowerCase();df=String(df).toLowerCase();if(dh===df){return true}if(df.slice(0,1)==="."){if(dh===df.slice(1)){return true}dg=dh.length-df.length;if((dg>0)&&(dh.slice(dg)===df)){return true}}return false}function ci(df){var dg=document.createElement("a");
+if(df.indexOf("//")!==0&&df.indexOf("http")!==0){if(df.indexOf("*")===0){df=df.substr(1)}if(df.indexOf(".")===0){df=df.substr(1)}df="http://"+df}dg.href=v.toAbsoluteUrl(df);if(dg.pathname){return dg.pathname}return""}function a2(dg,df){if(!aj(df,"/")){df="/"+df}if(!aj(dg,"/")){dg="/"+dg}var dh=(df==="/"||df==="/*");if(dh){return true}if(dg===df){return true}df=String(df).toLowerCase();dg=String(dg).toLowerCase();if(R(df,"*")){df=df.slice(0,-1);dh=(!df||df==="/");if(dh){return true}if(dg===df){return true}return dg.indexOf(df)===0}if(!R(dg,"/")){dg+="/"}if(!R(df,"/")){df+="/"}return dg.indexOf(df)===0}function ar(dj,dl){var dg,df,dh,di,dk;for(dg=0;dg<ax.length;dg++){di=L(ax[dg]);dk=ci(ax[dg]);if(cC(dj,di)&&a2(dl,dk)){return true}}return false}function aU(di){var dg,df,dh;for(dg=0;dg<ax.length;dg++){df=L(ax[dg].toLowerCase());if(di===df){return true}if(df.slice(0,1)==="."){if(di===df.slice(1)){return true}dh=di.length-df.length;if((dh>0)&&(di.slice(dh)===df)){return true}}}return false}function cn(df,dh){df=df.replace("send_image=0","send_image=1");
+var dg=new Image(1,1);dg.onload=function(){E=0;if(typeof dh==="function"){dh({request:df,trackerUrl:aD,success:true})}};dg.onerror=function(){if(typeof dh==="function"){dh({request:df,trackerUrl:aD,success:false})}};dg.src=aD+(aD.indexOf("?")<0?"?":"&")+df}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a5(di,dm){var dh=aJ();if(!dh){return false}var dl={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dk=false;var dg=aD;try{var df=new Blob([di],dl);if(di.length<=2000){df=new Blob([],dl);dg=dg+(dg.indexOf("?")<0?"?":"&")+di}dk=h.sendBeacon(dg,df)}catch(dj){return false}if(dk&&typeof dm==="function"){dm({request:di,trackerUrl:aD,success:true,isSendBeacon:true})}return dk}function c0(dg,dh,df){if(!J(df)||null===df){df=true}if(m&&a5(dg,dh)){return}setTimeout(function(){if(m&&a5(dg,dh)){return}var dk;try{var dj=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dj.open("POST",aD,true);
+dj.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dl=m&&a5(dg,dh);if(!dl&&df){cn(dg,dh)}else{if(typeof dh==="function"){dh({request:dg,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dh==="function")){dh({request:dg,trackerUrl:aD,success:true,xhr:this})}}};dj.setRequestHeader("Content-Type",cu);dj.withCredentials=true;dj.send(dg)}catch(di){dk=m&&a5(dg,dh);if(!dk&&df){cn(dg,dh)}else{if(typeof dh==="function"){dh({request:dg,trackerUrl:aD,success:false})}}}},50)}function cd(dg){var df=new Date();var dh=df.getTime()+dg;if(!r||dh>r){r=dh}}function cl(df){if(b9||!a4||!bz){return}b9=setTimeout(function dg(){b9=null;if(!bb){bb=(!G.hasFocus||G.hasFocus())}if(!bb){cl(a4);return}if(bO()){return}var dh=new Date(),di=a4-(dh.getTime()-cU);di=Math.min(a4,di);cl(di)},df||a4)}function bH(){if(!b9){return}clearTimeout(b9);b9=null}function a9(){bb=true;cN=new Date().getTime()}function c9(){var df=new Date().getTime();return !cN||(df-cN)>a4
+}function ay(){if(c9()){bO()}bH()}function dc(){if(aM||!a4){return}aM=true;an(T,"focus",a9);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aM&&c9()){bO()}}})}function cz(dj){var dg=new Date();var df=dg.getTime();cU=df;if(cy&&df<cy){var dh=cy-df;setTimeout(dj,dh);cd(dh+50);cy+=50;return}if(cy===false){var di=800;cy=df+di}dj()}function aN(){if(aC(cH)){bz=false}else{if(aC(bc)){bz=true}}}function bC(dg,df,dh){aN();if(!bz){cG.push(dg);return}if(!cL&&dg){if(cx&&bz){dg+="&consent=1"}cz(function(){if(cS&&a5(dg,dh)){cd(100);return}if(c6==="POST"||String(dg).length>2000){c0(dg,dh)}else{cn(dg,dh)}cd(df)})}if(!aM){dc()}}function ch(df){if(cL){return false}return(df&&df.length)}function cZ(df,dj){if(!dj||dj>=df.length){return[df]}var dg=0;var dh=df.length;var di=[];for(dg;dg<dh;dg+=dj){di.push(df.slice(dg,dg+dj))}return di}function db(dg,df){if(!ch(dg)){return}if(!bz){cG.push(dg);return}cz(function(){var dj=cZ(dg,50);var dh=0,di;for(dh;dh<dj.length;dh++){di='{"requests":["?'+dj[dh].join('","?')+'"]}';
+c0(di,null,false)}cd(df)})}function aS(df){return bi+df+"."+b3+"."+bm}function bV(dh,dg,df){da(dh,"",-86400,dg,df)}function b2(){if(bj){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var df=bi+"testcookie";da(df,"1",undefined,bn,cT,bP);var dg=aC(df)==="1"?"1":"0";bV(df);return dg}function bg(){bm=b4((cT||cQ)+(bn||"/")).slice(0,4)}function cD(){if(J(c4.res)){return c4}var dg,di,dj={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dg in dj){if(Object.prototype.hasOwnProperty.call(dj,dg)){di=h.mimeTypes[dj[dg]];c4[dg]=(di&&di.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c4.java="1"
+}if(A(T.GearsFactory)){c4.gears="1"}c4.cookie=b2()}var dh=parseInt(X.width,10);var df=parseInt(X.height,10);c4.res=parseInt(dh,10)+"x"+parseInt(df,10);return c4}function bU(){var dg=aS("cvar"),df=aC(dg);if(df.length){df=T.JSON.parse(df);if(W(df)){return df}}return{}}function cA(){if(aP===false){aP=bU()}}function cM(){var df=cD();return b4((h.userAgent||"")+(h.platform||"")+T.JSON.stringify(df)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var df=cD();return b4((h.userAgent||"")+(h.platform||"")+T.JSON.stringify(df)).slice(0,6)}function be(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dg=be();var dh=az();var df=String(dg)+dh;return df}function cY(dh){dh=String(dh);var dk=az();var di=dk.length;var dj=dh.substr(-1*di,di);var dg=parseInt(dh.substr(0,dh.length-di),10);if(dg&&dj&&dj===dk){var df=be();if(aY<=0){return true}if(df>=dg&&df<=(dg+aY)){return true}}return false}function dd(df){if(!cI){return""}var dj=f(df,av);if(!dj){return""}dj=String(dj);var dh=new RegExp("^[a-zA-Z0-9]+$");
+if(dj.length===32&&dh.test(dj)){var dg=dj.substr(16,32);if(cY(dg)){var di=dj.substr(0,16);return di}}return""}function cJ(){if(!bL){bL=dd(bK)}var dh=new Date(),df=Math.round(dh.getTime()/1000),dg=aS("id"),dk=aC(dg),dj,di;if(dk){dj=dk.split(".");dj.unshift("0");if(bL.length){dj[1]=bL}return dj}if(bL.length){di=bL}else{if("0"===b2()){di=""}else{di=cM()}}dj=["1",di,df,0,df,"",""];return dj}function aX(){var dm=cJ(),di=dm[0],dj=dm[1],dg=dm[2],df=dm[3],dk=dm[4],dh=dm[5];if(!J(dm[6])){dm[6]=""}var dl=dm[6];return{newVisitor:di,uuid:dj,createTs:dg,visitCount:df,currentVisitTs:dk,lastVisitTs:dh,lastEcommerceOrderTs:dl}}function aG(){var di=new Date(),dg=di.getTime(),dj=aX().createTs;var df=parseInt(dj,10);var dh=(df*1000)+cF-dg;return dh}function aL(df){if(!b3){return}var dh=new Date(),dg=Math.round(dh.getTime()/1000);if(!J(df)){df=aX()}var di=df.uuid+"."+df.createTs+"."+df.visitCount+"."+dg+"."+df.lastVisitTs+"."+df.lastEcommerceOrderTs;da(aS("id"),di,aG(),bn,cT,bP)}function bJ(){var df=aC(aS("ref"));
+if(df.length){try{df=T.JSON.parse(df);if(W(df)){return df}}catch(dg){}}return["","",0,""]}function bu(dg){var df="testvalue";da("test",df,10000,null,dg);if(aC("test")===df){bV("test",null,dg);return true}return false}function aE(){var dg=bj;bj=false;var df,dh;for(df=0;df<bs.length;df++){dh=aS(bs[df]);if(dh!==cH&&dh!==bc&&0!==aC(dh)){bV(dh,bn,cT)}}bj=dg}function b0(df){b3=df;aL()}function de(dj){if(!dj||!W(dj)){return}var di=[];var dh;for(dh in dj){if(Object.prototype.hasOwnProperty.call(dj,dh)){di.push(dh)}}var dk={};di.sort();var df=di.length;var dg;for(dg=0;dg<df;dg++){dk[di[dg]]=dj[di[dg]]}return dk}function ca(){da(aS("ses"),"1",cm,bn,cT,bP)}function bf(){var di="";var dg="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dh=dg.length;var df;for(df=0;df<6;df++){di+=dg.charAt(Math.floor(Math.random()*dh))}return di}function cq(dh,dD,dE,di){var dC,dg=new Date(),dq=Math.round(dg.getTime()/1000),dm,dB,dj=1024,dK,dr,dz=aP,dk=aS("ses"),dx=aS("ref"),du=aS("cvar"),dv=aC(dk),dA=bJ(),dG=a3||bK,dn,df;
+if(bj){aE()}if(cL){return""}var dw=aX();if(!J(di)){di=""}var dt=G.characterSet||G.charset;if(!dt||dt.toLowerCase()==="utf-8"){dt=null}dn=dA[0];df=dA[1];dm=dA[2];dB=dA[3];if(!dv){var dF=cm/1000;if(!dw.lastVisitTs||(dq-dw.lastVisitTs)>dF){dw.visitCount++;dw.lastVisitTs=dw.currentVisitTs}if(!bt||!dn.length){for(dC in co){if(Object.prototype.hasOwnProperty.call(co,dC)){dn=f(dG,co[dC]);if(dn.length){break}}}for(dC in bD){if(Object.prototype.hasOwnProperty.call(bD,dC)){df=f(dG,bD[dC]);if(df.length){break}}}}dK=d(bl);dr=dB.length?d(dB):"";if(dK.length&&!aU(dK)&&(!bt||!dr.length||aU(dr))){dB=bl}if(dB.length||dn.length){dm=dq;dA=[dn,df,dm,bZ(dB.slice(0,dj))];da(dx,T.JSON.stringify(dA),c1,bn,cT,bP)}}dh+="&idsite="+b3+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dg.getHours()+"&m="+dg.getMinutes()+"&s="+dg.getSeconds()+"&url="+t(bZ(dG))+(bl.length?"&urlref="+t(bZ(bl)):"")+((bw&&bw.length)?"&uid="+t(bw):"")+"&_id="+dw.uuid+"&_idts="+dw.createTs+"&_idvc="+dw.visitCount+"&_idn="+dw.newVisitor+(dn.length?"&_rcn="+t(dn):"")+(df.length?"&_rck="+t(df):"")+"&_refts="+dm+"&_viewts="+dw.lastVisitTs+(String(dw.lastEcommerceOrderTs).length?"&_ects="+dw.lastEcommerceOrderTs:"")+(String(dB).length?"&_ref="+t(bZ(dB.slice(0,dj))):"")+(dt?"&cs="+t(dt):"")+"&send_image=0";
+var dJ=cD();for(dC in dJ){if(Object.prototype.hasOwnProperty.call(dJ,dC)){dh+="&"+dC+"="+dJ[dC]}}var dI=[];if(dD){for(dC in dD){if(Object.prototype.hasOwnProperty.call(dD,dC)&&/^dimension\d+$/.test(dC)){var dl=dC.replace("dimension","");dI.push(parseInt(dl,10));dI.push(String(dl));dh+="&"+dC+"="+t(dD[dC]);delete dD[dC]}}}if(dD&&B(dD)){dD=null}for(dC in bk){if(Object.prototype.hasOwnProperty.call(bk,dC)){var ds=(-1===M(dI,dC));if(ds){dh+="&dimension"+dC+"="+t(bk[dC])}}}if(dD){dh+="&data="+t(T.JSON.stringify(dD))}else{if(ao){dh+="&data="+t(T.JSON.stringify(ao))}}function dp(dL,dM){var dN=T.JSON.stringify(dL);if(dN.length>2){return"&"+dM+"="+t(dN)}return""}var dH=de(bT);var dy=de(cj);dh+=dp(dH,"cvar");dh+=dp(dy,"e_cvar");if(aP){dh+=dp(aP,"_cvar");for(dC in dz){if(Object.prototype.hasOwnProperty.call(dz,dC)){if(aP[dC][0]===""||aP[dC][1]===""){delete aP[dC]}}}if(bN){da(du,T.JSON.stringify(aP),cm,bn,cT,bP)}}if(a1){if(ck){dh+="&gt_ms="+ck}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dh+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
+}}}if(aK){dh+="&pv_id="+aK}dw.lastEcommerceOrderTs=J(di)&&String(di).length?di:dw.lastEcommerceOrderTs;aL(dw);ca();dh+=ac(dE,{tracker:bF,request:dh});if(cV.length){dh+="&"+cV}if(A(b8)){dh=b8(dh)}return dh}bO=function a6(){var df=new Date();df=df.getTime();if(!cU){return false}if((cU+(1000*c3))<=df){return false}if(cU+a4<=df){bF.ping();return true}return false};function bo(di,dh,dn,dj,df,dr){var dl="idgoal=0",dm,dg=new Date(),dp=[],dq,dk=String(di).length;if(dk){dl+="&ec_id="+t(di);dm=Math.round(dg.getTime()/1000)}dl+="&revenue="+dh;if(String(dn).length){dl+="&ec_st="+dn}if(String(dj).length){dl+="&ec_tx="+dj}if(String(df).length){dl+="&ec_sh="+df}if(String(dr).length){dl+="&ec_dt="+dr}if(cW){for(dq in cW){if(Object.prototype.hasOwnProperty.call(cW,dq)){if(!J(cW[dq][1])){cW[dq][1]=""}if(!J(cW[dq][2])){cW[dq][2]=""}if(!J(cW[dq][3])||String(cW[dq][3]).length===0){cW[dq][3]=0}if(!J(cW[dq][4])||String(cW[dq][4]).length===0){cW[dq][4]=1}dp.push(cW[dq])}}dl+="&ec_items="+t(T.JSON.stringify(dp))
+}dl=cq(dl,ao,"ecommerce",dm);bC(dl,bG);if(dk){cW={}}}function bW(df,dj,di,dh,dg,dk){if(String(df).length&&J(dj)){bo(df,dj,di,dh,dg,dk)}}function bq(df){if(J(df)){bo("",df,"","","","")}}function bX(dg,di,dh){aK=bf();var df=cq("action_name="+t(al(dg||bh)),di,"log");bC(df,bG,dh)}function aZ(dh,dg){var di,df="(^| )(piwik[_-]"+dg;if(dh){for(di=0;di<dh.length;di++){df+="|"+dh[di]}}df+=")( |$)";return new RegExp(df)}function aT(df){return(aD&&df&&0===String(df).indexOf(aD))}function cs(dj,df,dk,dg){if(aT(df)){return 0}var di=aZ(bI,"download"),dh=aZ(a7,"link"),dl=new RegExp("\\.("+c2.join("|")+")([?&#]|$)","i");if(dh.test(dj)){return"link"}if(dg||di.test(dj)||dl.test(df)){return"download"}if(dk){return 0}return"link"}function au(dg){var df;df=dg.parentNode;while(df!==null&&J(df)){if(ae.isLinkElement(dg)){break}dg=df;df=dg.parentNode}return dg}function c8(dk){dk=au(dk);if(!ae.hasNodeAttribute(dk,"href")){return}if(!J(dk.href)){return}var dj=ae.getAttributeValueFromNode(dk,"href");var dg=dk.pathname||ci(dk.href);
+var dl=dk.hostname||d(dk.href);var dm=dl.toLowerCase();var dh=dk.href.replace(dl,dm);var di=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!di.test(dh)){var df=cs(dk.className,dh,ar(dm,dg),ae.hasNodeAttribute(dk,"download"));if(df){return{type:df,href:dh}}}}function aO(df,dg,dh,di){var dj=v.buildInteractionRequestParams(df,dg,dh,di);if(!dj){return}return cq(dj,null,"contentInteraction")}function ba(df,dg){if(!df||!dg){return false}var dh=v.findTargetNode(df);if(v.shouldIgnoreInteraction(dh)){return false}dh=v.findTargetNodeNoDefault(df);if(dh&&!V(dh,dg)){return false}return true}function cr(dh,dg,dj){if(!dh){return}var df=v.findParentContentNode(dh);if(!df){return}if(!ba(df,dh)){return}var di=v.buildContentBlock(df);if(!di){return}if(!di.target&&dj){di.target=dj}return v.buildInteractionRequestParams(dg,di.name,di.piece,di.target)}function aV(dg){if(!b7||!b7.length){return false}var df,dh;for(df=0;df<b7.length;df++){dh=b7[df];if(dh&&dh.name===dg.name&&dh.piece===dg.piece&&dh.target===dg.target){return true
+}}return false}function aW(df){return function(dj){if(!df){return}var dh=v.findParentContentNode(df);var dg;if(dj){dg=dj.target||dj.srcElement}if(!dg){dg=df}if(!ba(dh,dg)){return}if(!dh){return false}var dk=v.findTargetNode(dh);if(!dk||v.shouldIgnoreInteraction(dk)){return false}var di=c8(dk);if(c5&&di&&di.type){return di.type}return bF.trackContentInteractionNode(dg,"click")}}function bY(dh){if(!dh||!dh.length){return}var df,dg;for(df=0;df<dh.length;df++){dg=v.findTargetNode(dh[df]);if(dg&&!dg.contentInteractionTrackingSetupDone){dg.contentInteractionTrackingSetupDone=true;an(dg,"click",aW(dg))}}}function bv(dh,di){if(!dh||!dh.length){return[]}var df,dg;for(df=0;df<dh.length;df++){if(aV(dh[df])){dh.splice(df,1);df--}else{b7.push(dh[df])}}if(!dh||!dh.length){return[]}bY(di);var dj=[];for(df=0;df<dh.length;df++){dg=cq(v.buildImpressionRequestParams(dh[df].name,dh[df].piece,dh[df].target),undefined,"contentImpressions");if(dg){dj.push(dg)}}return dj}function cw(dg){var df=v.collectContent(dg);
+return bv(df,dg)}function a8(dg){if(!dg||!dg.length){return[]}var df;for(df=0;df<dg.length;df++){if(!v.isNodeVisible(dg[df])){dg.splice(df,1);df--}}if(!dg||!dg.length){return[]}return cw(dg)}function aF(dh,df,dg){var di=v.buildImpressionRequestParams(dh,df,dg);return cq(di,null,"contentImpression")}function c7(di,dg){if(!di){return}var df=v.findParentContentNode(di);var dh=v.buildContentBlock(df);if(!dh){return}if(!dg){dg="Unknown"}return aO(dg,dh.name,dh.piece,dh.target)}function cK(dg,di,df,dh){return"e_c="+t(dg)+"&e_a="+t(di)+(J(df)?"&e_n="+t(df):"")+(J(dh)?"&e_v="+t(dh):"")}function at(dh,dj,df,di,dl,dk){if(a(String(dh)).length===0||a(String(dj)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");return false}var dg=cq(cK(dh,dj,df,di),dl,"event");bC(dg,bG,dk)}function b5(df,di,dg,dj){var dh=cq("search="+t(df)+(di?"&search_cat="+t(di):"")+(J(dg)?"&search_count="+dg:""),dj,"sitesearch");bC(dh,bG)}function cP(df,dj,di,dh){var dg=cq("idgoal="+df+(dj?"&revenue="+dj:""),di,"goal");
+bC(dg,bG,dh)}function cX(di,df,dm,dl,dh){var dk=df+"="+t(bZ(di));var dg=cr(dh,"click",di);if(dg){dk+="&"+dg}var dj=cq(dk,dm,"link");bC(dj,bG,dl)}function bR(dg,df){if(dg!==""){return dg+df.charAt(0).toUpperCase()+df.slice(1)}return df}function ce(dk){var dj,df,di=["","webkit","ms","moz"],dh;if(!bd){for(df=0;df<di.length;df++){dh=di[df];if(Object.prototype.hasOwnProperty.call(G,bR(dh,"hidden"))){if(G[bR(dh,"visibilityState")]==="prerender"){dj=true}break}}}if(dj){an(G,dh+"visibilitychange",function dg(){G.removeEventListener(dh+"visibilitychange",dg,false);dk()});return}dk()}function bp(){var dg=aX().uuid;var df=aI();return dg+df}function cg(df){if(!df){return}if(!ae.hasNodeAttribute(df,"href")){return}var dg=ae.getAttributeValueFromNode(df,"href");if(!dg||aT(dg)){return}dg=k(dg,av);var dh=bp();dg=F(dg,av,dh);ae.setAnyAttribute(df,"href",dg)}function aA(di){var dj=ae.getAttributeValueFromNode(di,"href");if(!dj){return false}dj=String(dj);var dg=dj.indexOf("//")===0||dj.indexOf("http://")===0||dj.indexOf("https://")===0;
+if(!dg){return false}var df=di.pathname||ci(di.href);var dh=(di.hostname||d(di.href)).toLowerCase();if(ar(dh,df)){if(!cC(cQ,L(dh))){return true}return false}return false}function cB(df){var dg=c8(df);if(dg&&dg.type){dg.href=p(dg.href);cX(dg.href,dg.type,undefined,null,df);return}if(cI){df=au(df);if(aA(df)){cg(df)}}}function ct(){return G.all&&!G.addEventListener}function cR(df){var dh=df.which;var dg=(typeof df.button);if(!dh&&dg!=="undefined"){if(ct()){if(df.button&1){dh=1}else{if(df.button&2){dh=3}else{if(df.button&4){dh=2}}}}else{if(df.button===0||df.button==="0"){dh=1}else{if(df.button&1){dh=2}else{if(df.button&2){dh=3}}}}}return dh}function bQ(df){switch(cR(df)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function a0(df){return df.target||df.srcElement}function aB(df){return function(di){di=di||T.event;var dh=bQ(di);var dj=a0(di);if(di.type==="click"){var dg=false;if(df&&dh==="middle"){dg=true}if(dj&&!dg){cB(dj)}}else{if(di.type==="mousedown"){if(dh==="middle"&&dj){aQ=dh;
+by=dj}else{aQ=by=null}}else{if(di.type==="mouseup"){if(dh===aQ&&dj===by){cB(dj)}aQ=by=null}else{if(di.type==="contextmenu"){cB(dj)}}}}}}function aq(dh,dg){var df=typeof dg;if(df==="undefined"){dg=true}an(dh,"click",aB(dg),false);if(dg){an(dh,"mouseup",aB(dg),false);an(dh,"mousedown",aB(dg),false);an(dh,"contextmenu",aB(dg),false)}}function bB(dh,dj){ap=true;var di,dg=aZ(bx,"ignore"),dk=G.links,df=null,dl=null;if(dk){for(di=0;di<dk.length;di++){df=dk[di];if(!dg.test(df.className)){dl=typeof df.piwikTrackers;if("undefined"===dl){df.piwikTrackers=[]}if(-1===M(df.piwikTrackers,dj)){df.piwikTrackers.push(dj);aq(df,dh)}}}}}function aR(dg,dj,dk){if(cc){return true}cc=true;var dl=false;var di,dh;function df(){dl=true}n(function(){function dm(dp){setTimeout(function(){if(!cc){return}dl=false;dk.trackVisibleContentImpressions();dm(dp)},dp)}function dn(dp){setTimeout(function(){if(!cc){return}if(dl){dl=false;dk.trackVisibleContentImpressions()}dn(dp)},dp)}if(dg){di=["scroll","resize"];for(dh=0;dh<di.length;
+dh++){if(G.addEventListener){G.addEventListener(di[dh],df,false)}else{T.attachEvent("on"+di[dh],df)}}dn(100)}if(dj&&dj>0){dj=parseInt(dj,10);dm(dj)}})}var bA={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var df=this.requests;this.requests=[];if(df.length===1){bC(df[0],bG)}else{db(df,bG)}},push:function(df){if(!df){return}if(m||!this.enabled){bC(df,bG);return}bA.requests.push(df);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bA.timeout=null;bA.sendRequests()},bA.interval);var dg="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dg)){b[dg]={unload:function(){if(bA.timeout){clearTimeout(bA.timeout)}bA.sendRequests()}}}}};bg();aL();this.hasConsent=function(){return bz};this.getVisitorId=function(){return aX().uuid};this.getVisitorInfo=function(){return cJ()};this.getAttributionInfo=function(){return bJ()};this.getAttributionCampaignName=function(){return bJ()[0]};this.getAttributionCampaignKeyword=function(){return bJ()[1]
+};this.getAttributionReferrerTimestamp=function(){return bJ()[2]};this.getAttributionReferrerUrl=function(){return bJ()[3]};this.setTrackerUrl=function(df){aD=df};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bE)};this.addTracker=function(df,dh){if(!J(df)||null===df){df=this.getTrackerUrl()}var dg=new Q(df,dh);I.push(dg);e.trigger("TrackerAdded",[this]);return dg};this.getSiteId=function(){return b3};this.setSiteId=function(df){b0(df)};this.resetUserId=function(){bw=""};this.setUserId=function(df){if(Y(df)){bw=df}};this.getUserId=function(){return bw};this.setCustomData=function(df,dg){if(W(df)){ao=df}else{if(!ao){ao={}}ao[df]=dg}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(df){b8=df};this.appendToTrackingUrl=function(df){cV=df};this.getRequest=function(df){return cq(df)};this.addPlugin=function(df,dg){b[df]=dg};this.setCustomDimension=function(df,dg){df=parseInt(df,10);if(df>0){if(!J(dg)){dg=""}if(!w(dg)){dg=String(dg)
+}bk[df]=dg}};this.getCustomDimension=function(df){df=parseInt(df,10);if(df>0&&Object.prototype.hasOwnProperty.call(bk,df)){return bk[df]}};this.deleteCustomDimension=function(df){df=parseInt(df,10);if(df>0){delete bk[df]}};this.setCustomVariable=function(dg,df,dj,dh){var di;if(!J(dh)){dh="visit"}if(!J(df)){return}if(!J(dj)){dj=""}if(dg>0){df=!w(df)?String(df):df;dj=!w(dj)?String(dj):dj;di=[df.slice(0,br),dj.slice(0,br)];if(dh==="visit"||dh===2){cA();aP[dg]=di}else{if(dh==="page"||dh===3){bT[dg]=di}else{if(dh==="event"){cj[dg]=di}}}}};this.getCustomVariable=function(dg,dh){var df;if(!J(dh)){dh="visit"}if(dh==="page"||dh===3){df=bT[dg]}else{if(dh==="event"){df=cj[dg]}else{if(dh==="visit"||dh===2){cA();df=aP[dg]}}}if(!J(df)||(df&&df[0]==="")){return false}return df};this.deleteCustomVariable=function(df,dg){if(this.getCustomVariable(df,dg)){this.setCustomVariable(df,"","",dg)}};this.deleteCustomVariables=function(df){if(df==="page"||df===3){bT={}}else{if(df==="event"){cj={}}else{if(df==="visit"||df===2){aP={}
+}}}};this.storeCustomVariablesInCookie=function(){bN=true};this.setLinkTrackingTimer=function(df){bG=df};this.getLinkTrackingTimer=function(){return bG};this.setDownloadExtensions=function(df){if(w(df)){df=df.split("|")}c2=df};this.addDownloadExtensions=function(dg){var df;if(w(dg)){dg=dg.split("|")}for(df=0;df<dg.length;df++){c2.push(dg[df])}};this.removeDownloadExtensions=function(dh){var dg,df=[];if(w(dh)){dh=dh.split("|")}for(dg=0;dg<c2.length;dg++){if(M(dh,c2[dg])===-1){df.push(c2[dg])}}c2=df};this.setDomains=function(df){ax=w(df)?[df]:df;var dj=false,dh=0,dg;for(dh;dh<ax.length;dh++){dg=String(ax[dh]);if(cC(cQ,L(dg))){dj=true;break}var di=ci(dg);if(di&&di!=="/"&&di!=="/*"){dj=true;break}}if(!dj){ax.push(cQ)}};this.enableCrossDomainLinking=function(){cI=true};this.disableCrossDomainLinking=function(){cI=false};this.isCrossDomainLinkingEnabled=function(){return cI};this.setCrossDomainLinkingTimeout=function(df){aY=df};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bp())
+};this.setIgnoreClasses=function(df){bx=w(df)?[df]:df};this.setRequestMethod=function(df){c6=df||cf};this.setRequestContentType=function(df){cu=df||aH};this.setReferrerUrl=function(df){bl=df};this.setCustomUrl=function(df){a3=bS(bK,df)};this.getCurrentUrl=function(){return a3||bK};this.setDocumentTitle=function(df){bh=df};this.setAPIUrl=function(df){bE=df};this.setDownloadClasses=function(df){bI=w(df)?[df]:df};this.setLinkClasses=function(df){a7=w(df)?[df]:df};this.setCampaignNameKey=function(df){co=w(df)?[df]:df};this.setCampaignKeywordKey=function(df){bD=w(df)?[df]:df};this.discardHashTag=function(df){bM=df};this.setCookieNamePrefix=function(df){bi=df;aP=bU()};this.setCookieDomain=function(df){var dg=L(df);if(bu(dg)){cT=dg;bg()}};this.getCookieDomain=function(){return cT};this.hasCookies=function(){return"1"===b2()};this.setSessionCookie=function(dh,dg,df){if(!dh){throw new Error("Missing cookie name")}if(!J(df)){df=cm}bs.push(dh);da(aS(dh),dg,df,bn,cT)};this.getCookie=function(dg){var df=aC(aS(dg));
+if(df===0){return null}return df};this.setCookiePath=function(df){bn=df;bg()};this.getCookiePath=function(df){return bn};this.setVisitorCookieTimeout=function(df){cF=df*1000};this.setSessionCookieTimeout=function(df){cm=df*1000};this.getSessionCookieTimeout=function(){return cm};this.setReferralCookieTimeout=function(df){c1=df*1000};this.setConversionAttributionFirstReferrer=function(df){bt=df};this.setSecureCookie=function(df){bP=df};this.disableCookies=function(){bj=true;c4.cookie="0";if(b3){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dg){var df=h.doNotTrack||h.msDoNotTrack;cL=dg&&(df==="yes"||df==="1");if(cL){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cS=true};this.disableAlwaysUseSendBeacon=function(){cS=false};this.addListener=function(dg,df){aq(dg,df)};this.enableLinkTracking=function(dg){c5=true;var df=this;ce(function(){q(function(){bB(dg,df)})})};this.enableJSErrorTracking=function(){if(cO){return}cO=true;var df=T.onerror;T.onerror=function(dk,di,dh,dj,dg){ce(function(){var dl="JavaScript Errors";
+var dm=di+":"+dh;if(dj){dm+=":"+dj}at(dl,dm,dk)});if(df){return df(dk,di,dh,dj,dg)}return false}};this.disablePerformanceTracking=function(){a1=false};this.setGenerationTimeMs=function(df){ck=parseInt(df,10)};this.setVisitStandardLength=function(df){df=Math.max(df,5);c3=df};this.enableHeartBeatTimer=function(df){df=Math.max(df,5);a4=(df||15)*1000;if(cU!==null){dc()}};this.disableHeartBeatTimer=function(){bH();if(a4||aM){if(T.removeEventListener){T.removeEventListener("focus",a9);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",a9);T.detachEvent("onblur",ay)}}}a4=null;aM=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(df){if(T.location.protocol==="file:"){T.location=df}};this.setCountPreRendered=function(df){bd=df};this.trackGoal=function(df,di,dh,dg){ce(function(){cP(df,di,dh,dg)})};this.trackLink=function(dg,df,di,dh){ce(function(){cX(dg,df,di,dh)})};this.getNumTrackedPageViews=function(){return cp
+};this.trackPageView=function(df,dh,dg){b7=[];cG=[];if(N(b3)){ce(function(){Z(aD,bE,b3)})}else{ce(function(){cp++;bX(df,dh,dg)})}};this.trackAllContentImpressions=function(){if(N(b3)){return}ce(function(){q(function(){var df=v.findContentNodes();var dg=cw(df);db(dg,bG)})})};this.trackVisibleContentImpressions=function(df,dg){if(N(b3)){return}if(!J(df)){df=true}if(!J(dg)){dg=750}aR(df,dg,this);ce(function(){n(function(){var dh=v.findContentNodes();var di=a8(dh);db(di,bG)})})};this.trackContentImpression=function(dh,df,dg){if(N(b3)){return}dh=a(dh);df=a(df);dg=a(dg);if(!dh){return}df=df||"Unknown";ce(function(){var di=aF(dh,df,dg);bC(di,bG)})};this.trackContentImpressionsWithinNode=function(df){if(N(b3)||!df){return}ce(function(){if(cc){n(function(){var dg=v.findContentNodesWithinNode(df);var dh=a8(dg);db(dh,bG)})}else{q(function(){var dg=v.findContentNodesWithinNode(df);var dh=cw(dg);db(dh,bG)})}})};this.trackContentInteraction=function(dh,di,df,dg){if(N(b3)){return}dh=a(dh);di=a(di);df=a(df);
+dg=a(dg);if(!dh||!di){return}df=df||"Unknown";ce(function(){var dj=aO(dh,di,df,dg);if(dj){bC(dj,bG)}})};this.trackContentInteractionNode=function(dh,dg){if(N(b3)||!dh){return}var df=null;ce(function(){df=c7(dh,dg);if(df){bC(df,bG)}});return df};this.logAllContentBlocksOnPage=function(){var dh=v.findContentNodes();var df=v.collectContent(dh);var dg=typeof console;if(dg!=="undefined"&&console&&console.log){console.log(df)}};this.trackEvent=function(dg,di,df,dh,dk,dj){ce(function(){at(dg,di,df,dh,dk,dj)})};this.trackSiteSearch=function(df,dh,dg,di){b7=[];ce(function(){b5(df,dh,dg,di)})};this.setEcommerceView=function(di,df,dh,dg){if(Y(dh)){dh=String(dh)}if(!J(dh)||dh===null||dh===false||!dh.length){dh=""}else{if(dh instanceof Array){dh=T.JSON.stringify(dh)}}bT[5]=["_pkc",dh];if(J(dg)&&dg!==null&&dg!==false&&String(dg).length){bT[2]=["_pkp",dg]}if(!Y(di)&&!Y(df)){return}if(Y(di)){bT[3]=["_pks",di]}if(!Y(df)){df=""}bT[4]=["_pkn",df]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(cW))
+};this.addEcommerceItem=function(dj,df,dh,dg,di){if(Y(dj)){cW[dj]=[String(dj),df,dh,dg,di]}};this.removeEcommerceItem=function(df){if(Y(df)){df=String(df);delete cW[df]}};this.clearEcommerceCart=function(){cW={}};this.trackEcommerceOrder=function(df,dj,di,dh,dg,dk){bW(df,dj,di,dh,dg,dk)};this.trackEcommerceCartUpdate=function(df){bq(df)};this.trackRequest=function(dg,di,dh,df){ce(function(){var dj=cq(dg,di,df);bC(dj,bG,dh)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bA.enabled=false};this.setRequestQueueInterval=function(df){if(df<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bA.interval=df};this.queueRequest=function(df){ce(function(){var dg=cq(df);bA.push(dg)})};this.isConsentRequired=function(){return cx};this.getRememberedConsent=function(){var df=aC(bc);if(aC(cH)){if(df){bV(bc,bn,cT)}return null}if(!df||df===0){return null}return df};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
+};this.requireConsent=function(){cx=true;bz=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bz){aE()}}}};this.setConsentGiven=function(){bz=true;bV(cH,bn,cT);var dg,df;for(dg=0;dg<cG.length;dg++){df=typeof cG[dg];if(df==="string"){bC(cG[dg],bG)}else{if(df==="object"){db(cG[dg],bG)}}}cG=[]};this.rememberConsentGiven=function(dg){if(dg){dg=dg*60*60*1000}else{dg=30*365*24*60*60*1000}this.setConsentGiven();var df=new Date().getTime();da(bc,df,dg,bn,cT,bP)};this.forgetConsentGiven=function(){var df=30*365*24*60*60*1000;bV(bc,bn,cT);da(cH,new Date().getTime(),df,bn,cT,bP);this.requireConsent()};this.isUserOptedOut=function(){return !bz};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
if(av[ap]>1&&ap!=="addTracker"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ad(ao,aq){var ap=new Q(ao,aq);I.push(ap);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[ap]);return ap}an(T,"beforeunload",ai,false);an(T,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getPiwikUrl());
-if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
+if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:T.JSON,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
}y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||T,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ao,ap){if(!J(ap)){ap=this.getAsyncTracker().getSiteId()}if(!J(ao)){ao=this.getAsyncTracker().getTrackerUrl()}return new Q(ao,ap)},getAsyncTrackers:function(){return I},addTracker:function(ao,aq){var ap;if(!I.length){ap=ad(ao,aq)}else{ap=I[0].addTracker(ao,aq)}return ap},getAsyncTracker:function(ap,at){var ar;if(I&&I.length&&I[0]){ar=I[0]}else{return ad(ap,at)}if(!at&&!ap){return ar}if((!J(at)||null===at)&&ar){at=ar.getSiteId()}if((!J(ap)||null===ap)&&ar){ap=ar.getTrackerUrl()}var aq,ao=0;for(ao;ao<I.length;ao++){aq=I[ao];if(aq&&String(aq.getSiteId())===String(at)&&aq.getTrackerUrl()===ap){return aq}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])
}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return e});define("matomo",[],function(){return e})}return e}())}
/*!!! pluginTrackerHook */
diff --git a/misc/composer/build-xhprof.sh b/misc/composer/build-xhprof.sh
index fb9741d0ec..88864db8eb 100755
--- a/misc/composer/build-xhprof.sh
+++ b/misc/composer/build-xhprof.sh
@@ -2,7 +2,7 @@
if ! type phpize &> /dev/null; then
echo "phpize missing, skipping build"
- echo "If you installed PHP via Aptitude, you can install phpize w/ 'sudo apt-get install php5-dev'"
+ echo "If you installed PHP via Aptitude, you can install phpize w/ 'sudo apt-get install php7-dev'"
exit
fi
diff --git a/misc/others/ExampleMatomoTracker.php b/misc/others/ExampleMatomoTracker.php
new file mode 100644
index 0000000000..4f784b0159
--- /dev/null
+++ b/misc/others/ExampleMatomoTracker.php
@@ -0,0 +1,17 @@
+<?php
+// Example file to demonstrate MatomoTracker.php
+// See https://matomo.org/docs/tracking-api/
+require_once '../../vendor/matomo/matomo-php-tracker/MatomoTracker.php';
+MatomoTracker::$URL = 'http://localhost/trunk/';
+
+$matomoTracker = new MatomoTracker($idSite = 1);
+// You can manually set the Visitor details (resolution, time, plugins)
+// See all other ->set* functions available in the MatomoTracker class
+$matomoTracker->setResolution(1600, 1400);
+
+// Sends Tracker request via http
+$matomoTracker->doTrackPageView('Document title of current page view');
+// You can also track Goal conversions
+$matomoTracker->doTrackGoal($idGoal = 1, $revenue = 42);
+
+echo 'done'; \ No newline at end of file
diff --git a/misc/others/ExamplePiwikTracker.php b/misc/others/ExamplePiwikTracker.php
deleted file mode 100644
index 5daa2d7701..0000000000
--- a/misc/others/ExamplePiwikTracker.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-// Example file to demonstrate PiwikTracker.php
-// See http://piwik.org/docs/tracking-api/
-require_once '../../libs/PiwikTracker/PiwikTracker.php';
-PiwikTracker::$URL = 'http://localhost/trunk/';
-
-$piwikTracker = new PiwikTracker($idSite = 1);
-// You can manually set the Visitor details (resolution, time, plugins)
-// See all other ->set* functions available in the PiwikTracker class
-$piwikTracker->setResolution(1600, 1400);
-
-// Sends Tracker request via http
-$piwikTracker->doTrackPageView('Document title of current page view');
-// You can also track Goal conversions
-$piwikTracker->doTrackGoal($idGoal = 1, $revenue = 42);
-
-echo 'done'; \ No newline at end of file
diff --git a/misc/others/tracker_simpleImageTracker.php b/misc/others/tracker_simpleImageTracker.php
index bf4ac796c5..aa81319560 100644
--- a/misc/others/tracker_simpleImageTracker.php
+++ b/misc/others/tracker_simpleImageTracker.php
@@ -1,9 +1,9 @@
<?php
-// -- Piwik Tracking API init --
-require_once "../../libs/PiwikTracker/PiwikTracker.php";
-PiwikTracker::$URL = 'http://localhost/matomo-master/';
+// -- Matomo Tracking API init --
+require_once '../../vendor/matomo/matomo-php-tracker/MatomoTracker.php';
+MatomoTracker::$URL = 'http://localhost/matomo-master/';
// Example 1: Tracks a pageview for Website id = {$IDSITE}
-$trackingURL = Piwik_getUrlTrackPageView($idSite = 16, $customTitle = 'This title will appear in the report Actions > Page titles');
+$trackingURL = Matomo_getUrlTrackPageView($idSite = 16, $customTitle = 'This title will appear in the report Actions > Page titles');
?>
<html>
diff --git a/piwik.js b/piwik.js
index ce23fb3bcc..73dc8589eb 100644
--- a/piwik.js
+++ b/piwik.js
@@ -8,70 +8,59 @@
* @license https://piwik.org/free-software/bsd/ BSD-3 Clause (also in js/LICENSE.txt)
* @license magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt BSD-3-Clause
*/
-;if(typeof JSON_PIWIK!=="object"&&typeof window.JSON==="object"&&window.JSON.stringify&&window.JSON.parse){JSON_PIWIK=window.JSON}else{(function(){var a={};
-/*!! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
-(function(){var c=typeof define==="function"&&define.amd;var e={"function":true,object:true};var h=e[typeof a]&&a&&!a.nodeType&&a;var i=e[typeof window]&&window||this,b=h&&e[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(b&&(b.global===b||b.window===b||b.self===b)){i=b}function j(ab,V){ab||(ab=i.Object());V||(V=i.Object());
-var K=ab.Number||i.Number,R=ab.String||i.String,x=ab.Object||i.Object,S=ab.Date||i.Date,T=ab.SyntaxError||i.SyntaxError,aa=ab.TypeError||i.TypeError,J=ab.Math||i.Math,Y=ab.JSON||i.JSON;if(typeof Y=="object"&&Y){V.stringify=Y.stringify;V.parse=Y.parse}var n=x.prototype,u=n.toString,r,m,L;var B=new S(-3509827334573292);try{B=B.getUTCFullYear()==-109252&&B.getUTCMonth()===0&&B.getUTCDate()===1&&B.getUTCHours()==10&&B.getUTCMinutes()==37&&B.getUTCSeconds()==6&&B.getUTCMilliseconds()==708}catch(v){}function o(ac){if(o[ac]!==L){return o[ac]}var ad;if(ac=="bug-string-char-index"){ad="a"[0]!="a"}else{if(ac=="json"){ad=o("json-stringify")&&o("json-parse")}else{var ak,ah='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(ac=="json-stringify"){var ai=V.stringify,aj=typeof ai=="function"&&B;if(aj){(ak=function(){return 1}).toJSON=ak;try{aj=ai(0)==="0"&&ai(new K())==="0"&&ai(new R())=='""'&&ai(u)===L&&ai(L)===L&&ai()===L&&ai(ak)==="1"&&ai([ak])=="[1]"&&ai([L])=="[null]"&&ai(null)=="null"&&ai([L,u,null])=="[null,null,null]"&&ai({a:[ak,true,false,null,"\x00\b\n\f\r\t"]})==ah&&ai(null,ak)==="1"&&ai([1,2],null,1)=="[\n 1,\n 2\n]"&&ai(new S(-8640000000000000))=='"-271821-04-20T00:00:00.000Z"'&&ai(new S(8640000000000000))=='"+275760-09-13T00:00:00.000Z"'&&ai(new S(-62198755200000))=='"-000001-01-01T00:00:00.000Z"'&&ai(new S(-1))=='"1969-12-31T23:59:59.999Z"'
-}catch(ae){aj=false}}ad=aj}if(ac=="json-parse"){var ag=V.parse;if(typeof ag=="function"){try{if(ag("0")===0&&!ag(false)){ak=ag(ah);var af=ak.a.length==5&&ak.a[0]===1;if(af){try{af=!ag('"\t"')}catch(ae){}if(af){try{af=ag("01")!==1}catch(ae){}}if(af){try{af=ag("1.")!==1}catch(ae){}}}}}catch(ae){af=false}}ad=af}}}return o[ac]=!!ad}if(!o("json")){var U="[object Function]",Q="[object Date]",N="[object Number]",O="[object String]",E="[object Array]",A="[object Boolean]";var F=o("bug-string-char-index");if(!B){var s=J.floor;var Z=[0,31,59,90,120,151,181,212,243,273,304,334];var D=function(ac,ad){return Z[ad]+365*(ac-1970)+s((ac-1969+(ad=+(ad>1)))/4)-s((ac-1901+ad)/100)+s((ac-1601+ad)/400)}}if(!(r=n.hasOwnProperty)){r=function(ae){var ac={},ad;if((ac.__proto__=null,ac.__proto__={toString:1},ac).toString!=u){r=function(ah){var ag=this.__proto__,af=ah in (this.__proto__=null,this);this.__proto__=ag;return af}}else{ad=ac.constructor;r=function(ag){var af=(this.constructor||ad).prototype;return ag in this&&!(ag in af&&this[ag]===af[ag])
-}}ac=null;return r.call(this,ae)}}m=function(ae,ah){var af=0,ac,ad,ag;(ac=function(){this.valueOf=0}).prototype.valueOf=0;ad=new ac();for(ag in ad){if(r.call(ad,ag)){af++}}ac=ad=null;if(!af){ad=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];m=function(aj,an){var am=u.call(aj)==U,al,ak;var ai=!am&&typeof aj.constructor!="function"&&e[typeof aj.hasOwnProperty]&&aj.hasOwnProperty||r;for(al in aj){if(!(am&&al=="prototype")&&ai.call(aj,al)){an(al)}}for(ak=ad.length;al=ad[--ak];ai.call(aj,al)&&an(al)){}}}else{if(af==2){m=function(aj,am){var ai={},al=u.call(aj)==U,ak;for(ak in aj){if(!(al&&ak=="prototype")&&!r.call(ai,ak)&&(ai[ak]=1)&&r.call(aj,ak)){am(ak)}}}}else{m=function(aj,am){var al=u.call(aj)==U,ak,ai;for(ak in aj){if(!(al&&ak=="prototype")&&r.call(aj,ak)&&!(ai=ak==="constructor")){am(ak)}}if(ai||r.call(aj,(ak="constructor"))){am(ak)}}}}return m(ae,ah)};if(!o("json-stringify")){var q={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};
-var I="000000";var t=function(ac,ad){return(I+(ad||0)).slice(-ac)};var z="\\u00";var C=function(ai){var ad='"',ag=0,ah=ai.length,ac=!F||ah>10;var af=ac&&(F?ai.split(""):ai);for(;ag<ah;ag++){var ae=ai.charCodeAt(ag);switch(ae){case 8:case 9:case 10:case 12:case 13:case 34:case 92:ad+=q[ae];break;default:if(ae<32){ad+=z+t(2,ae.toString(16));break}ad+=ac?af[ag]:ai.charAt(ag)}}return ad+'"'};var p=function(ai,aA,ag,al,ax,ac,aj){var at,ae,ap,az,ay,ak,aw,au,aq,an,ar,ad,ah,af,av,ao;try{at=aA[ai]}catch(am){}if(typeof at=="object"&&at){ae=u.call(at);if(ae==Q&&!r.call(at,"toJSON")){if(at>-1/0&&at<1/0){if(D){ay=s(at/86400000);for(ap=s(ay/365.2425)+1970-1;D(ap+1,0)<=ay;ap++){}for(az=s((ay-D(ap,0))/30.42);D(ap,az+1)<=ay;az++){}ay=1+ay-D(ap,az);ak=(at%86400000+86400000)%86400000;aw=s(ak/3600000)%24;au=s(ak/60000)%60;aq=s(ak/1000)%60;an=ak%1000}else{ap=at.getUTCFullYear();az=at.getUTCMonth();ay=at.getUTCDate();aw=at.getUTCHours();au=at.getUTCMinutes();aq=at.getUTCSeconds();an=at.getUTCMilliseconds()}at=(ap<=0||ap>=10000?(ap<0?"-":"+")+t(6,ap<0?-ap:ap):t(4,ap))+"-"+t(2,az+1)+"-"+t(2,ay)+"T"+t(2,aw)+":"+t(2,au)+":"+t(2,aq)+"."+t(3,an)+"Z"
-}else{at=null}}else{if(typeof at.toJSON=="function"&&((ae!=N&&ae!=O&&ae!=E)||r.call(at,"toJSON"))){at=at.toJSON(ai)}}}if(ag){at=ag.call(aA,ai,at)}if(at===null){return"null"}ae=u.call(at);if(ae==A){return""+at}else{if(ae==N){return at>-1/0&&at<1/0?""+at:"null"}else{if(ae==O){return C(""+at)}}}if(typeof at=="object"){for(af=aj.length;af--;){if(aj[af]===at){throw aa()}}aj.push(at);ar=[];av=ac;ac+=ax;if(ae==E){for(ah=0,af=at.length;ah<af;ah++){ad=p(ah,at,ag,al,ax,ac,aj);ar.push(ad===L?"null":ad)}ao=ar.length?(ax?"[\n"+ac+ar.join(",\n"+ac)+"\n"+av+"]":("["+ar.join(",")+"]")):"[]"}else{m(al||at,function(aC){var aB=p(aC,at,ag,al,ax,ac,aj);if(aB!==L){ar.push(C(aC)+":"+(ax?" ":"")+aB)}});ao=ar.length?(ax?"{\n"+ac+ar.join(",\n"+ac)+"\n"+av+"}":("{"+ar.join(",")+"}")):"{}"}aj.pop();return ao}};V.stringify=function(ac,ae,af){var ad,al,aj,ai;if(e[typeof ae]&&ae){if((ai=u.call(ae))==U){al=ae}else{if(ai==E){aj={};for(var ah=0,ag=ae.length,ak;ah<ag;ak=ae[ah++],((ai=u.call(ak)),ai==O||ai==N)&&(aj[ak]=1)){}}}}if(af){if((ai=u.call(af))==N){if((af-=af%1)>0){for(ad="",af>10&&(af=10);
-ad.length<af;ad+=" "){}}}else{if(ai==O){ad=af.length<=10?af:af.slice(0,10)}}}return p("",(ak={},ak[""]=ac,ak),al,aj,ad,"",[])}}if(!o("json-parse")){var M=R.fromCharCode;var l={92:"\\",34:'"',47:"/",98:"\b",116:"\t",110:"\n",102:"\f",114:"\r"};var G,X;var H=function(){G=X=null;throw T()};var y=function(){var ah=X,af=ah.length,ag,ae,ac,ai,ad;while(G<af){ad=ah.charCodeAt(G);switch(ad){case 9:case 10:case 13:case 32:G++;break;case 123:case 125:case 91:case 93:case 58:case 44:ag=F?ah.charAt(G):ah[G];G++;return ag;case 34:for(ag="@",G++;G<af;){ad=ah.charCodeAt(G);if(ad<32){H()}else{if(ad==92){ad=ah.charCodeAt(++G);switch(ad){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:ag+=l[ad];G++;break;case 117:ae=++G;for(ac=G+4;G<ac;G++){ad=ah.charCodeAt(G);if(!(ad>=48&&ad<=57||ad>=97&&ad<=102||ad>=65&&ad<=70)){H()}}ag+=M("0x"+ah.slice(ae,G));break;default:H()}}else{if(ad==34){break}ad=ah.charCodeAt(G);ae=G;while(ad>=32&&ad!=92&&ad!=34){ad=ah.charCodeAt(++G)}ag+=ah.slice(ae,G)}}}if(ah.charCodeAt(G)==34){G++;
-return ag}H();default:ae=G;if(ad==45){ai=true;ad=ah.charCodeAt(++G)}if(ad>=48&&ad<=57){if(ad==48&&((ad=ah.charCodeAt(G+1)),ad>=48&&ad<=57)){H()}ai=false;for(;G<af&&((ad=ah.charCodeAt(G)),ad>=48&&ad<=57);G++){}if(ah.charCodeAt(G)==46){ac=++G;for(;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}ad=ah.charCodeAt(G);if(ad==101||ad==69){ad=ah.charCodeAt(++G);if(ad==43||ad==45){G++}for(ac=G;ac<af&&((ad=ah.charCodeAt(ac)),ad>=48&&ad<=57);ac++){}if(ac==G){H()}G=ac}return +ah.slice(ae,G)}if(ai){H()}if(ah.slice(G,G+4)=="true"){G+=4;return true}else{if(ah.slice(G,G+5)=="false"){G+=5;return false}else{if(ah.slice(G,G+4)=="null"){G+=4;return null}}}H()}}return"$"};var W=function(ad){var ac,ae;if(ad=="$"){H()}if(typeof ad=="string"){if((F?ad.charAt(0):ad[0])=="@"){return ad.slice(1)}if(ad=="["){ac=[];for(;;ae||(ae=true)){ad=y();if(ad=="]"){break}if(ae){if(ad==","){ad=y();if(ad=="]"){H()}}else{H()}}if(ad==","){H()}ac.push(W(ad))}return ac}else{if(ad=="{"){ac={};for(;;ae||(ae=true)){ad=y();
-if(ad=="}"){break}if(ae){if(ad==","){ad=y();if(ad=="}"){H()}}else{H()}}if(ad==","||typeof ad!="string"||(F?ad.charAt(0):ad[0])!="@"||y()!=":"){H()}ac[ad.slice(1)]=W(y())}return ac}}H()}return ad};var P=function(ae,ad,af){var ac=w(ae,ad,af);if(ac===L){delete ae[ad]}else{ae[ad]=ac}};var w=function(af,ae,ag){var ad=af[ae],ac;if(typeof ad=="object"&&ad){if(u.call(ad)==E){for(ac=ad.length;ac--;){P(ad,ac,ag)}}else{m(ad,function(ah){P(ad,ah,ag)})}}return ag.call(af,ae,ad)};V.parse=function(ae,af){var ac,ad;G=0;X=""+ae;ac=W(y());if(y()!="$"){H()}G=X=null;return af&&u.call(af)==U?w((ad={},ad[""]=ac,ad),"",af):ac}}}V.runInContext=j;return V}if(h&&!c){j(i,h)}else{var f=i.JSON,k=i.JSON3,d=false;var g=j(i,(i.JSON3={noConflict:function(){if(!d){d=true;i.JSON=f;i.JSON3=k;f=k=null}return g}}));i.JSON={parse:g.parse,stringify:g.stringify}}if(c){define(function(){return g})}}).call(this);JSON_PIWIK=a})()}if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Matomo=window.Piwik=(function(){var r,b={},y={},G=document,h=navigator,X=screen,T=window,i=T.performance||T.mozPerformance||T.msPerformance||T.webkitPerformance,t=T.encodeURIComponent,S=T.decodeURIComponent,l=unescape,I=[],E,e,ah=[],x=0,ab=0,U=0,m=false;
-function p(ao){try{return S(ao)}catch(ap){return unescape(ao)}}function J(ap){var ao=typeof ap;return ao!=="undefined"}function A(ao){return typeof ao==="function"}function W(ao){return typeof ao==="object"}function w(ao){return typeof ao==="string"||ao instanceof String}function ag(ao){return typeof ao==="number"||ao instanceof Number}function Y(ao){return J(ao)&&(ag(ao)||(w(ao)&&ao.length))}function B(ap){if(!ap){return true}var ao;var aq=true;for(ao in ap){if(Object.prototype.hasOwnProperty.call(ap,ao)){aq=false}}return aq}function ak(ao){var ap=typeof console;if(ap!=="undefined"&&console&&console.error){console.error(ao)}}function af(){var au,at,aw,ap,ao;for(au=0;au<arguments.length;au+=1){ao=null;if(arguments[au]&&arguments[au].slice){ao=arguments[au].slice()}ap=arguments[au];aw=ap.shift();var av,aq;var ar=w(aw)&&aw.indexOf("::")>0;if(ar){av=aw.split("::");aq=av[0];aw=av[1];if("object"===typeof e[aq]&&"function"===typeof e[aq][aw]){e[aq][aw].apply(e[aq],ap)}else{if(ao){ah.push(ao)}}}else{for(at=0;
-at<I.length;at++){if(w(aw)){aq=I[at];var ax=aw.indexOf(".")>0;if(ax){av=aw.split(".");if(aq&&"object"===typeof aq[av[0]]){aq=aq[av[0]];aw=av[1]}else{if(ao){ah.push(ao);break}}}if(aq[aw]){aq[aw].apply(aq,ap)}else{var ay="The method '"+aw+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: https://developer.piwik.org/api-reference/tracking-javascript';ak(ay);if(!ax){throw new TypeError(ay)}}if(aw==="addTracker"){break}if(aw==="setTrackerUrl"||aw==="setSiteId"){break}}else{aw.apply(I[at],ap)}}}}}function an(ar,aq,ap,ao){if(ar.addEventListener){ar.addEventListener(aq,ap,ao);return true}if(ar.attachEvent){return ar.attachEvent("on"+aq,ap)}ar["on"+aq]=ap}function n(ao){if(G.readyState==="complete"){ao()}else{if(T.addEventListener){T.addEventListener("load",ao,false)}else{if(T.attachEvent){T.attachEvent("onload",ao)}}}}function q(ar){var ao=false;if(G.attachEvent){ao=G.readyState==="complete"}else{ao=G.readyState!=="loading"}if(ao){ar();return}var aq;if(G.addEventListener){an(G,"DOMContentLoaded",function ap(){G.removeEventListener("DOMContentLoaded",ap,false);
-if(!ao){ao=true;ar()}})}else{if(G.attachEvent){G.attachEvent("onreadystatechange",function ap(){if(G.readyState==="complete"){G.detachEvent("onreadystatechange",ap);if(!ao){ao=true;ar()}}});if(G.documentElement.doScroll&&T===T.top){(function ap(){if(!ao){try{G.documentElement.doScroll("left")}catch(at){setTimeout(ap,0);return}ao=true;ar()}}())}}}an(T,"load",function(){if(!ao){ao=true;ar()}},false)}function ac(ap,av,aw){if(!ap){return""}var ao="",ar,aq,at,au;for(ar in b){if(Object.prototype.hasOwnProperty.call(b,ar)){au=b[ar]&&"function"===typeof b[ar][ap];if(au){aq=b[ar][ap];at=aq(av||{},aw);if(at){ao+=at}}}}return ao}function ai(){var ao;m=true;ac("unload");if(r){do{ao=new Date()}while(ao.getTimeAlias()<r)}}function o(aq,ap){var ao=G.createElement("script");ao.type="text/javascript";ao.src=aq;if(ao.readyState){ao.onreadystatechange=function(){var ar=this.readyState;if(ar==="loaded"||ar==="complete"){ao.onreadystatechange=null;ap()}}}else{ao.onload=ap}G.getElementsByTagName("head")[0].appendChild(ao)
-}function K(){var ao="";try{ao=T.top.document.referrer}catch(aq){if(T.parent){try{ao=T.parent.document.referrer}catch(ap){ao=""}}}if(ao===""){ao=G.referrer}return ao}function s(ao){var aq=new RegExp("^([a-z]+):"),ap=aq.exec(ao);return ap?ap[1]:null}function d(ao){var aq=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),ap=aq.exec(ao);return ap?ap[1]:ao}function aj(ap,ao){ap=String(ap);return ap.lastIndexOf(ao,0)===0}function R(ap,ao){ap=String(ap);return ap.indexOf(ao,ap.length-ao.length)!==-1}function z(ap,ao){ap=String(ap);return ap.indexOf(ao)!==-1}function g(ap,ao){ap=String(ap);return ap.substr(0,ap.length-ao)}function F(ar,aq,au){ar=String(ar);if(!au){au=""}var ao=ar.indexOf("#");var av=ar.length;if(ao===-1){ao=av}var at=ar.substr(0,ao);var ap=ar.substr(ao,av-ao);if(at.indexOf("?")===-1){at+="?"}else{if(!R(at,"?")){at+="&"}}return at+t(aq)+"="+t(au)+ap}function k(ap,aq){ap=String(ap);if(ap.indexOf("?"+aq+"=")===-1&&ap.indexOf("&"+aq+"=")===-1){return ap}var ar=ap.indexOf("?");
-if(ar===-1){return ap}var ao=ap.substr(ar+1);var aw=ap.substr(0,ar);if(ao){var ax="";var az=ao.indexOf("#");if(az!==-1){ax=ao.substr(az+1);ao=ao.substr(0,az)}var at;var av=ao.split("&");var au=av.length-1;for(au;au>=0;au--){at=av[au].split("=")[0];if(at===aq){av.splice(au,1)}}var ay=av.join("&");if(ay){aw=aw+"?"+ay}if(ax){aw+="#"+ax}}return aw}function f(aq,ap){var ao="[\\?&#]"+ap+"=([^&#]*)";var at=new RegExp(ao);var ar=at.exec(aq);return ar?S(ar[1]):""}function a(ao){if(ao&&String(ao)===ao){return ao.replace(/^\s+|\s+$/g,"")}return ao}function D(ao){return unescape(t(ao))}function am(aE){var aq=function(aK,aJ){return(aK<<aJ)|(aK>>>(32-aJ))},aF=function(aM){var aK="",aL,aJ;for(aL=7;aL>=0;aL--){aJ=(aM>>>(aL*4))&15;aK+=aJ.toString(16)}return aK},au,aH,aG,ap=[],ay=1732584193,aw=4023233417,av=2562383102,at=271733878,ar=3285377520,aD,aC,aB,aA,az,aI,ao,ax=[];aE=D(aE);ao=aE.length;for(aH=0;aH<ao-3;aH+=4){aG=aE.charCodeAt(aH)<<24|aE.charCodeAt(aH+1)<<16|aE.charCodeAt(aH+2)<<8|aE.charCodeAt(aH+3);
-ax.push(aG)}switch(ao&3){case 0:aH=2147483648;break;case 1:aH=aE.charCodeAt(ao-1)<<24|8388608;break;case 2:aH=aE.charCodeAt(ao-2)<<24|aE.charCodeAt(ao-1)<<16|32768;break;case 3:aH=aE.charCodeAt(ao-3)<<24|aE.charCodeAt(ao-2)<<16|aE.charCodeAt(ao-1)<<8|128;break}ax.push(aH);while((ax.length&15)!==14){ax.push(0)}ax.push(ao>>>29);ax.push((ao<<3)&4294967295);for(au=0;au<ax.length;au+=16){for(aH=0;aH<16;aH++){ap[aH]=ax[au+aH]}for(aH=16;aH<=79;aH++){ap[aH]=aq(ap[aH-3]^ap[aH-8]^ap[aH-14]^ap[aH-16],1)}aD=ay;aC=aw;aB=av;aA=at;az=ar;for(aH=0;aH<=19;aH++){aI=(aq(aD,5)+((aC&aB)|(~aC&aA))+az+ap[aH]+1518500249)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=20;aH<=39;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+1859775393)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=40;aH<=59;aH++){aI=(aq(aD,5)+((aC&aB)|(aC&aA)|(aB&aA))+az+ap[aH]+2400959708)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=60;aH<=79;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+3395469782)&4294967295;az=aA;aA=aB;aB=aq(aC,30);
-aC=aD;aD=aI}ay=(ay+aD)&4294967295;aw=(aw+aC)&4294967295;av=(av+aB)&4294967295;at=(at+aA)&4294967295;ar=(ar+az)&4294967295}aI=aF(ay)+aF(aw)+aF(av)+aF(at)+aF(ar);return aI.toLowerCase()}function aa(aq,ao,ap){if(!aq){aq=""}if(!ao){ao=""}if(aq==="translate.googleusercontent.com"){if(ap===""){ap=ao}ao=f(ao,"u");aq=d(ao)}else{if(aq==="cc.bingj.com"||aq==="webcache.googleusercontent.com"||aq.slice(0,5)==="74.6."){ao=G.links[0].href;aq=d(ao)}}return[aq,ao,ap]}function L(ap){var ao=ap.length;if(ap.charAt(--ao)==="."){ap=ap.slice(0,ao)}if(ap.slice(0,2)==="*."){ap=ap.slice(1)}if(ap.indexOf("/")!==-1){ap=ap.substr(0,ap.indexOf("/"))}return ap}function al(ap){ap=ap&&ap.text?ap.text:ap;if(!w(ap)){var ao=G.getElementsByTagName("title");if(ao&&J(ao[0])){ap=ao[0].text}}return ap}function P(ao){if(!ao){return[]}if(!J(ao.children)&&J(ao.childNodes)){return ao.children}if(J(ao.children)){return ao.children}return[]}function V(ap,ao){if(!ap||!ao){return false}if(ap.contains){return ap.contains(ao)}if(ap===ao){return true
-}if(ap.compareDocumentPosition){return !!(ap.compareDocumentPosition(ao)&16)}return false}function M(aq,ar){if(aq&&aq.indexOf){return aq.indexOf(ar)}if(!J(aq)||aq===null){return -1}if(!aq.length){return -1}var ao=aq.length;if(ao===0){return -1}var ap=0;while(ap<ao){if(aq[ap]===ar){return ap}ap++}return -1}function j(aq){if(!aq){return false}function ao(at,au){if(T.getComputedStyle){return G.defaultView.getComputedStyle(at,null)[au]}if(at.currentStyle){return at.currentStyle[au]}}function ar(at){at=at.parentNode;while(at){if(at===G){return true}at=at.parentNode}return false}function ap(av,aB,at,ay,aw,az,ax){var au=av.parentNode,aA=1;if(!ar(av)){return false}if(9===au.nodeType){return true}if("0"===ao(av,"opacity")||"none"===ao(av,"display")||"hidden"===ao(av,"visibility")){return false}if(!J(aB)||!J(at)||!J(ay)||!J(aw)||!J(az)||!J(ax)){aB=av.offsetTop;aw=av.offsetLeft;ay=aB+av.offsetHeight;at=aw+av.offsetWidth;az=av.offsetWidth;ax=av.offsetHeight}if(aq===av&&(0===ax||0===az)&&"hidden"===ao(av,"overflow")){return false
-}if(au){if(("hidden"===ao(au,"overflow")||"scroll"===ao(au,"overflow"))){if(aw+aA>au.offsetWidth+au.scrollLeft||aw+az-aA<au.scrollLeft||aB+aA>au.offsetHeight+au.scrollTop||aB+ax-aA<au.scrollTop){return false}}if(av.offsetParent===au){aw+=au.offsetLeft;aB+=au.offsetTop}return ap(au,aB,at,ay,aw,az,ax)}return true}return ap(aq)}var ae={htmlCollectionToArray:function(aq){var ao=[],ap;if(!aq||!aq.length){return ao}for(ap=0;ap<aq.length;ap++){ao.push(aq[ap])}return ao},find:function(ao){if(!document.querySelectorAll||!ao){return[]}var ap=document.querySelectorAll(ao);return this.htmlCollectionToArray(ap)},findMultiple:function(aq){if(!aq||!aq.length){return[]}var ap,ar;var ao=[];for(ap=0;ap<aq.length;ap++){ar=this.find(aq[ap]);ao=ao.concat(ar)}ao=this.makeNodesUnique(ao);return ao},findNodesByTagName:function(ap,ao){if(!ap||!ao||!ap.getElementsByTagName){return[]}var aq=ap.getElementsByTagName(ao);return this.htmlCollectionToArray(aq)},makeNodesUnique:function(ao){var au=[].concat(ao);ao.sort(function(aw,av){if(aw===av){return 0
-}var ay=M(au,aw);var ax=M(au,av);if(ay===ax){return 0}return ay>ax?-1:1});if(ao.length<=1){return ao}var ap=0;var ar=0;var at=[];var aq;aq=ao[ap++];while(aq){if(aq===ao[ap]){ar=at.push(ap)}aq=ao[ap++]||null}while(ar--){ao.splice(at[ar],1)}return ao},getAttributeValueFromNode:function(at,aq){if(!this.hasNodeAttribute(at,aq)){return}if(at&&at.getAttribute){return at.getAttribute(aq)}if(!at||!at.attributes){return}var ar=(typeof at.attributes[aq]);if("undefined"===ar){return}if(at.attributes[aq].value){return at.attributes[aq].value}if(at.attributes[aq].nodeValue){return at.attributes[aq].nodeValue}var ap;var ao=at.attributes;if(!ao){return}for(ap=0;ap<ao.length;ap++){if(ao[ap].nodeName===aq){return ao[ap].nodeValue}}return null},hasNodeAttributeWithValue:function(ap,ao){var aq=this.getAttributeValueFromNode(ap,ao);return !!aq},hasNodeAttribute:function(aq,ao){if(aq&&aq.hasAttribute){return aq.hasAttribute(ao)}if(aq&&aq.attributes){var ap=(typeof aq.attributes[ao]);return"undefined"!==ap}return false
-},hasNodeCssClass:function(aq,ao){if(aq&&ao&&aq.className){var ap=typeof aq.className==="string"?aq.className.split(" "):[];if(-1!==M(ap,ao)){return true}}return false},findNodesHavingAttribute:function(at,aq,ao){if(!ao){ao=[]}if(!at||!aq){return ao}var ar=P(at);if(!ar||!ar.length){return ao}var ap,au;for(ap=0;ap<ar.length;ap++){au=ar[ap];if(this.hasNodeAttribute(au,aq)){ao.push(au)}ao=this.findNodesHavingAttribute(au,aq,ao)}return ao},findFirstNodeHavingAttribute:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeAttribute(aq,ap)){return aq}var ao=this.findNodesHavingAttribute(aq,ap);if(ao&&ao.length){return ao[0]}},findFirstNodeHavingAttributeWithValue:function(ar,aq){if(!ar||!aq){return}if(this.hasNodeAttributeWithValue(ar,aq)){return ar}var ao=this.findNodesHavingAttribute(ar,aq);if(!ao||!ao.length){return}var ap;for(ap=0;ap<ao.length;ap++){if(this.getAttributeValueFromNode(ao[ap],aq)){return ao[ap]}}},findNodesHavingCssClass:function(at,ar,ao){if(!ao){ao=[]}if(!at||!ar){return ao}if(at.getElementsByClassName){var au=at.getElementsByClassName(ar);
-return this.htmlCollectionToArray(au)}var aq=P(at);if(!aq||!aq.length){return[]}var ap,av;for(ap=0;ap<aq.length;ap++){av=aq[ap];if(this.hasNodeCssClass(av,ar)){ao.push(av)}ao=this.findNodesHavingCssClass(av,ar,ao)}return ao},findFirstNodeHavingClass:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeCssClass(aq,ap)){return aq}var ao=this.findNodesHavingCssClass(aq,ap);if(ao&&ao.length){return ao[0]}},isLinkElement:function(ap){if(!ap){return false}var ao=String(ap.nodeName).toLowerCase();var ar=["a","area"];var aq=M(ar,ao);return aq!==-1},setAnyAttribute:function(ap,ao,aq){if(!ap||!ao){return}if(ap.setAttribute){ap.setAttribute(ao,aq)}else{ap[ao]=aq}}};var v={CONTENT_ATTR:"data-track-content",CONTENT_CLASS:"piwikTrackContent",CONTENT_NAME_ATTR:"data-content-name",CONTENT_PIECE_ATTR:"data-content-piece",CONTENT_PIECE_CLASS:"piwikContentPiece",CONTENT_TARGET_ATTR:"data-content-target",CONTENT_TARGET_CLASS:"piwikContentTarget",CONTENT_IGNOREINTERACTION_ATTR:"data-content-ignoreinteraction",CONTENT_IGNOREINTERACTION_CLASS:"piwikContentIgnoreInteraction",location:undefined,findContentNodes:function(){var ap="."+this.CONTENT_CLASS;
-var ao="["+this.CONTENT_ATTR+"]";var aq=ae.findMultiple([ap,ao]);return aq},findContentNodesWithinNode:function(ar){if(!ar){return[]}var ap=ae.findNodesHavingCssClass(ar,this.CONTENT_CLASS);var ao=ae.findNodesHavingAttribute(ar,this.CONTENT_ATTR);if(ao&&ao.length){var aq;for(aq=0;aq<ao.length;aq++){ap.push(ao[aq])}}if(ae.hasNodeAttribute(ar,this.CONTENT_ATTR)){ap.push(ar)}else{if(ae.hasNodeCssClass(ar,this.CONTENT_CLASS)){ap.push(ar)}}ap=ae.makeNodesUnique(ap);return ap},findParentContentNode:function(ap){if(!ap){return}var aq=ap;var ao=0;while(aq&&aq!==G&&aq.parentNode){if(ae.hasNodeAttribute(aq,this.CONTENT_ATTR)){return aq}if(ae.hasNodeCssClass(aq,this.CONTENT_CLASS)){return aq}aq=aq.parentNode;if(ao>1000){break}ao++}},findPieceNode:function(ap){var ao;ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.findFirstNodeHavingClass(ap,this.CONTENT_PIECE_CLASS)}if(ao){return ao}return ap},findTargetNodeNoDefault:function(ao){if(!ao){return}var ap=ae.findFirstNodeHavingAttributeWithValue(ao,this.CONTENT_TARGET_ATTR);
-if(ap){return ap}ap=ae.findFirstNodeHavingAttribute(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingClass(ao,this.CONTENT_TARGET_CLASS);if(ap){return ap}},findTargetNode:function(ao){var ap=this.findTargetNodeNoDefault(ao);if(ap){return ap}return ao},findContentName:function(ap){if(!ap){return}var at=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_NAME_ATTR);if(at){return ae.getAttributeValueFromNode(at,this.CONTENT_NAME_ATTR)}var ao=this.findContentPiece(ap);if(ao){return this.removeDomainIfIsInLink(ao)}if(ae.hasNodeAttributeWithValue(ap,"title")){return ae.getAttributeValueFromNode(ap,"title")}var aq=this.findPieceNode(ap);if(ae.hasNodeAttributeWithValue(aq,"title")){return ae.getAttributeValueFromNode(aq,"title")}var ar=this.findTargetNode(ap);if(ae.hasNodeAttributeWithValue(ar,"title")){return ae.getAttributeValueFromNode(ar,"title")}},findContentPiece:function(ap){if(!ap){return}var ar=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_PIECE_ATTR);
-if(ar){return ae.getAttributeValueFromNode(ar,this.CONTENT_PIECE_ATTR)}var ao=this.findPieceNode(ap);var aq=this.findMediaUrlInNode(ao);if(aq){return this.toAbsoluteUrl(aq)}},findContentTarget:function(aq){if(!aq){return}var ar=this.findTargetNode(aq);if(ae.hasNodeAttributeWithValue(ar,this.CONTENT_TARGET_ATTR)){return ae.getAttributeValueFromNode(ar,this.CONTENT_TARGET_ATTR)}var ap;if(ae.hasNodeAttributeWithValue(ar,"href")){ap=ae.getAttributeValueFromNode(ar,"href");return this.toAbsoluteUrl(ap)}var ao=this.findPieceNode(aq);if(ae.hasNodeAttributeWithValue(ao,"href")){ap=ae.getAttributeValueFromNode(ao,"href");return this.toAbsoluteUrl(ap)}},isSameDomain:function(ao){if(!ao||!ao.indexOf){return false}if(0===ao.indexOf(this.getLocation().origin)){return true}var ap=ao.indexOf(this.getLocation().host);if(8>=ap&&0<=ap){return true}return false},removeDomainIfIsInLink:function(aq){var ap="^https?://[^/]+";var ao="^.*//[^/]+";if(aq&&aq.search&&-1!==aq.search(new RegExp(ap))&&this.isSameDomain(aq)){aq=aq.replace(new RegExp(ao),"");
-if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq=["img","embed","video","audio"];var ao=at.nodeName.toLowerCase();if(-1!==M(aq,ao)&&ae.findFirstNodeHavingAttributeWithValue(at,"src")){var ar=ae.findFirstNodeHavingAttributeWithValue(at,"src");return ae.getAttributeValueFromNode(ar,"src")}if(ao==="object"&&ae.hasNodeAttributeWithValue(at,"data")){return ae.getAttributeValueFromNode(at,"data")}if(ao==="object"){var au=ae.findNodesByTagName(at,"param");if(au&&au.length){var ap;for(ap=0;ap<au.length;ap++){if("movie"===ae.getAttributeValueFromNode(au[ap],"name")&&ae.hasNodeAttributeWithValue(au[ap],"value")){return ae.getAttributeValueFromNode(au[ap],"value")}}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;
-if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]
-}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false
-}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];
-if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cd,b8){var bH=this,bd="mtm_consent",cK="mtm_consent_removed",b3=aa(G.domain,T.location.href,K()),cT=L(b3[0]),bM=p(b3[1]),bm=p(b3[2]),cR=false,ch="GET",c9=ch,aH="application/x-www-form-urlencoded; charset=UTF-8",cw=aH,aD=cd||"",bG="",cY="",b5=b8||"",bx="",bN="",a4,bi="",c5=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cT],by=[],bK=[],a8=[],bI=500,cV=false,cG,a5,bQ,c6=1800,bO,ao,cq=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bF=["pk_kwd","piwik_kwd","utm_term"],bj="_pk_",av="pk_vid",aZ=180,cW,bo,bR=false,bk=false,cO,be,bu,cH=33955200000,co=1800000,c4=15768000000,a2=true,cm=0,bP=false,aQ=false,ca,bV={},cl={},bl={},bs=200,cZ={},c7={},b9=[],ce=false,cA=false,ap=false,c8=false,cL=false,aN=false,bc=u(),cQ=null,cX=null,cb,aR,bz,b6=am,bn,aK,cr=0,bt=["id","ses","cvar","ref"],cz=false,bA=null,cI=[],aw=U++;
-try{bi=G.title}catch(cx){bi=""}function dd(dp,dm,dl,dn,dk,dj){if(bk){return}var di;if(dl){di=new Date();di.setTime(di.getTime()+dl)}G.cookie=dp+"="+t(dm)+(dl?";expires="+di.toGMTString():"")+";path="+(dn||"/")+(dk?";domain="+dk:"")+(dj?";secure":"")+";SameSite=Lax"}function aC(dk){if(bk){return 0}var di=new RegExp("(^|;)[ ]*"+dk+"=([^;]*)"),dj=di.exec(G.cookie);return dj?S(dj[2]):0}bA=!aC(cK);function b1(di){var dj;di=k(di,av);if(bO){dj=new RegExp("#.*");return di.replace(dj,"")}return di}function bU(dk,di){var dl=s(di),dj;if(dl){return di}if(di.slice(0,1)==="/"){return s(dk)+"://"+d(dk)+di}dk=b1(dk);dj=dk.indexOf("?");if(dj>=0){dk=dk.slice(0,dj)}dj=dk.lastIndexOf("/");if(dj!==dk.length-1){dk=dk.slice(0,dj+1)}return dk+di}function cE(dk,di){var dj;dk=String(dk).toLowerCase();di=String(di).toLowerCase();if(dk===di){return true}if(di.slice(0,1)==="."){if(dk===di.slice(1)){return true}dj=dk.length-di.length;if((dj>0)&&(dk.slice(dj)===di)){return true}}return false}function ck(di){var dj=document.createElement("a");
-if(di.indexOf("//")!==0&&di.indexOf("http")!==0){if(di.indexOf("*")===0){di=di.substr(1)}if(di.indexOf(".")===0){di=di.substr(1)}di="http://"+di}dj.href=v.toAbsoluteUrl(di);if(dj.pathname){return dj.pathname}return""}function a3(dj,di){if(!aj(di,"/")){di="/"+di}if(!aj(dj,"/")){dj="/"+dj}var dk=(di==="/"||di==="/*");if(dk){return true}if(dj===di){return true}di=String(di).toLowerCase();dj=String(dj).toLowerCase();if(R(di,"*")){di=di.slice(0,-1);dk=(!di||di==="/");if(dk){return true}if(dj===di){return true}return dj.indexOf(di)===0}if(!R(dj,"/")){dj+="/"}if(!R(di,"/")){di+="/"}return dj.indexOf(di)===0}function ar(dm,dp){var dj,di,dk,dl,dn;for(dj=0;dj<ax.length;dj++){dl=L(ax[dj]);dn=ck(ax[dj]);if(cE(dm,dl)&&a3(dp,dn)){return true}}return false}function aV(dl){var dj,di,dk;for(dj=0;dj<ax.length;dj++){di=L(ax[dj].toLowerCase());if(dl===di){return true}if(di.slice(0,1)==="."){if(dl===di.slice(1)){return true}dk=dl.length-di.length;if((dk>0)&&(dl.slice(dk)===di)){return true}}}return false}function cp(di,dk){di=di.replace("send_image=0","send_image=1");
-var dj=new Image(1,1);dj.onload=function(){E=0;if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:true})}};dj.onerror=function(){if(typeof dk==="function"){dk({request:di,trackerUrl:aD,success:false})}};dj.src=aD+(aD.indexOf("?")<0?"?":"&")+di}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a6(dl,dq){var dk=aJ();if(!dk){return false}var dp={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dn=false;var dj=aD;try{var di=new Blob([dl],dp);if(dl.length<=2000){di=new Blob([],dp);dj=dj+(dj.indexOf("?")<0?"?":"&")+dl}dn=h.sendBeacon(dj,di)}catch(dm){return false}if(dn&&typeof dq==="function"){dq({request:dl,trackerUrl:aD,success:true,isSendBeacon:true})}return dn}function c3(dj,dk,di){if(!J(di)||null===di){di=true}if(m&&a6(dj,dk)){return}setTimeout(function(){if(m&&a6(dj,dk)){return}var dn;try{var dm=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dm.open("POST",aD,true);
-dm.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dp=m&&a6(dj,dk);if(!dp&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dk==="function")){dk({request:dj,trackerUrl:aD,success:true,xhr:this})}}};dm.setRequestHeader("Content-Type",cw);dm.withCredentials=true;dm.send(dj)}catch(dl){dn=m&&a6(dj,dk);if(!dn&&di){cp(dj,dk)}else{if(typeof dk==="function"){dk({request:dj,trackerUrl:aD,success:false})}}}},50)}function cf(dj){var di=new Date();var dk=di.getTime()+dj;if(!r||dk>r){r=dk}}function cn(di){if(cb||!a5||!bA){return}cb=setTimeout(function dj(){cb=null;if(!bc){bc=(!G.hasFocus||G.hasFocus())}if(!bc){cn(a5);return}if(bQ()){return}var dk=new Date(),dl=a5-(dk.getTime()-cX);dl=Math.min(a5,dl);cn(dl)},di||a5)}function bJ(){if(!cb){return}clearTimeout(cb);cb=null}function ba(){bc=true;cQ=new Date().getTime()}function dc(){var di=new Date().getTime();return !cQ||(di-cQ)>a5
-}function ay(){if(dc()){bQ()}bJ()}function df(){if(aN||!a5){return}aN=true;an(T,"focus",ba);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aN&&dc()){bQ()}}})}function cB(dm){var dj=new Date();var di=dj.getTime();cX=di;if(cA&&di<cA){var dk=cA-di;setTimeout(dm,dk);cf(dk+50);cA+=50;return}if(cA===false){var dl=800;cA=di+dl}dm()}function aO(){if(aC(cK)){bA=false}else{if(aC(bd)){bA=true}}}function bE(dj,di,dk){aO();if(!bA){cI.push(dj);return}if(!cO&&dj){if(cz&&bA){dj+="&consent=1"}cB(function(){if(cV&&a6(dj,dk)){cf(100);return}if(c9==="POST"||String(dj).length>2000){c3(dj,dk)}else{cp(dj,dk)}cf(di)})}if(!aN){df()}}function cj(di){if(cO){return false}return(di&&di.length)}function c2(di,dm){if(!dm||dm>=di.length){return[di]}var dj=0;var dk=di.length;var dl=[];for(dj;dj<dk;dj+=dm){dl.push(di.slice(dj,dj+dm))}return dl}function de(dj,di){if(!cj(dj)){return}if(!bA){cI.push(dj);return}cB(function(){var dm=c2(dj,50);var dk=0,dl;for(dk;dk<dm.length;dk++){dl='{"requests":["?'+dm[dk].join('","?')+'"]}';
-c3(dl,null,false)}cf(di)})}function aT(di){return bj+di+"."+b5+"."+bn}function bX(dk,dj,di){dd(dk,"",-86400,dj,di)}function b4(){if(bk){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var di=bj+"testcookie";dd(di,"1",undefined,bo,cW,bR);var dj=aC(di)==="1"?"1":"0";bX(di);return dj}function bh(){bn=b6((cW||cT)+(bo||"/")).slice(0,4)}function cF(){if(J(c7.res)){return c7}var dj,dl,dm={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dj in dm){if(Object.prototype.hasOwnProperty.call(dm,dj)){dl=h.mimeTypes[dm[dj]];c7[dj]=(dl&&dl.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c7.java="1"
-}if(A(T.GearsFactory)){c7.gears="1"}c7.cookie=b4()}var dk=parseInt(X.width,10);var di=parseInt(X.height,10);c7.res=parseInt(dk,10)+"x"+parseInt(di,10);return c7}function bW(){var dj=aT("cvar"),di=aC(dj);if(di.length){di=JSON_PIWIK.parse(di);if(W(di)){return di}}return{}}function cC(){if(aQ===false){aQ=bW()}}function cP(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var di=cF();return b6((h.userAgent||"")+(h.platform||"")+JSON_PIWIK.stringify(di)).slice(0,6)}function bf(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dj=bf();var dk=az();var di=String(dj)+dk;return di}function c1(dk){dk=String(dk);var dn=az();var dl=dn.length;var dm=dk.substr(-1*dl,dl);var dj=parseInt(dk.substr(0,dk.length-dl),10);if(dj&&dm&&dm===dn){var di=bf();if(aZ<=0){return true}if(di>=dj&&di<=(dj+aZ)){return true}}return false}function dg(di){if(!cL){return""}var dm=f(di,av);if(!dm){return""}dm=String(dm);
-var dk=new RegExp("^[a-zA-Z0-9]+$");if(dm.length===32&&dk.test(dm)){var dj=dm.substr(16,32);if(c1(dj)){var dl=dm.substr(0,16);return dl}}return""}function cM(){if(!bN){bN=dg(bM)}var dk=new Date(),di=Math.round(dk.getTime()/1000),dj=aT("id"),dn=aC(dj),dm,dl;if(dn){dm=dn.split(".");dm.unshift("0");if(bN.length){dm[1]=bN}return dm}if(bN.length){dl=bN}else{if("0"===b4()){dl=""}else{dl=cP()}}dm=["1",dl,di,0,di,"",""];return dm}function aY(){var dq=cM(),dl=dq[0],dm=dq[1],dj=dq[2],di=dq[3],dn=dq[4],dk=dq[5];if(!J(dq[6])){dq[6]=""}var dp=dq[6];return{newVisitor:dl,uuid:dm,createTs:dj,visitCount:di,currentVisitTs:dn,lastVisitTs:dk,lastEcommerceOrderTs:dp}}function aG(){var dl=new Date(),dj=dl.getTime(),dm=aY().createTs;var di=parseInt(dm,10);var dk=(di*1000)+cH-dj;return dk}function aL(di){if(!b5){return}var dk=new Date(),dj=Math.round(dk.getTime()/1000);if(!J(di)){di=aY()}var dl=di.uuid+"."+di.createTs+"."+di.visitCount+"."+dj+"."+di.lastVisitTs+"."+di.lastEcommerceOrderTs;dd(aT("id"),dl,aG(),bo,cW,bR)
-}function bL(){var di=aC(aT("ref"));if(di.length){try{di=JSON_PIWIK.parse(di);if(W(di)){return di}}catch(dj){}}return["","",0,""]}function bv(dj){var di="testvalue";dd("test",di,10000,null,dj);if(aC("test")===di){bX("test",null,dj);return true}return false}function aE(){var dj=bk;bk=false;var di,dk;for(di=0;di<bt.length;di++){dk=aT(bt[di]);if(dk!==cK&&dk!==bd&&0!==aC(dk)){bX(dk,bo,cW)}}bk=dj}function b2(di){b5=di;aL()}function dh(dm){if(!dm||!W(dm)){return}var dl=[];var dk;for(dk in dm){if(Object.prototype.hasOwnProperty.call(dm,dk)){dl.push(dk)}}var dn={};dl.sort();var di=dl.length;var dj;for(dj=0;dj<di;dj++){dn[dl[dj]]=dm[dl[dj]]}return dn}function cc(){dd(aT("ses"),"1",co,bo,cW,bR)}function bg(){var dl="";var dj="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dk=dj.length;var di;for(di=0;di<6;di++){dl+=dj.charAt(Math.floor(Math.random()*dk))}return dl}function cs(dk,dG,dH,dl){var dF,dj=new Date(),dt=Math.round(dj.getTime()/1000),dq,dE,dm=1024,dN,du,dC=aQ,dn=aT("ses"),dA=aT("ref"),dx=aT("cvar"),dy=aC(dn),dD=bL(),dJ=a4||bM,dr,di;
-if(bk){aE()}if(cO){return""}var dz=aY();if(!J(dl)){dl=""}var dw=G.characterSet||G.charset;if(!dw||dw.toLowerCase()==="utf-8"){dw=null}dr=dD[0];di=dD[1];dq=dD[2];dE=dD[3];if(!dy){var dI=co/1000;if(!dz.lastVisitTs||(dt-dz.lastVisitTs)>dI){dz.visitCount++;dz.lastVisitTs=dz.currentVisitTs}if(!bu||!dr.length){for(dF in cq){if(Object.prototype.hasOwnProperty.call(cq,dF)){dr=f(dJ,cq[dF]);if(dr.length){break}}}for(dF in bF){if(Object.prototype.hasOwnProperty.call(bF,dF)){di=f(dJ,bF[dF]);if(di.length){break}}}}dN=d(bm);du=dE.length?d(dE):"";if(dN.length&&!aV(dN)&&(!bu||!du.length||aV(du))){dE=bm}if(dE.length||dr.length){dq=dt;dD=[dr,di,dq,b1(dE.slice(0,dm))];dd(dA,JSON_PIWIK.stringify(dD),c4,bo,cW)}}dk+="&idsite="+b5+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dj.getHours()+"&m="+dj.getMinutes()+"&s="+dj.getSeconds()+"&url="+t(b1(dJ))+(bm.length?"&urlref="+t(b1(bm)):"")+((bx&&bx.length)?"&uid="+t(bx):"")+"&_id="+dz.uuid+"&_idts="+dz.createTs+"&_idvc="+dz.visitCount+"&_idn="+dz.newVisitor+(dr.length?"&_rcn="+t(dr):"")+(di.length?"&_rck="+t(di):"")+"&_refts="+dq+"&_viewts="+dz.lastVisitTs+(String(dz.lastEcommerceOrderTs).length?"&_ects="+dz.lastEcommerceOrderTs:"")+(String(dE).length?"&_ref="+t(b1(dE.slice(0,dm))):"")+(dw?"&cs="+t(dw):"")+"&send_image=0";
-var dM=cF();for(dF in dM){if(Object.prototype.hasOwnProperty.call(dM,dF)){dk+="&"+dF+"="+dM[dF]}}var dL=[];if(dG){for(dF in dG){if(Object.prototype.hasOwnProperty.call(dG,dF)&&/^dimension\d+$/.test(dF)){var dp=dF.replace("dimension","");dL.push(parseInt(dp,10));dL.push(String(dp));dk+="&"+dF+"="+t(dG[dF]);delete dG[dF]}}}if(dG&&B(dG)){dG=null}for(dF in bl){if(Object.prototype.hasOwnProperty.call(bl,dF)){var dv=(-1===M(dL,dF));if(dv){dk+="&dimension"+dF+"="+t(bl[dF])}}}if(dG){dk+="&data="+t(JSON_PIWIK.stringify(dG))}else{if(ao){dk+="&data="+t(JSON_PIWIK.stringify(ao))}}function ds(dO,dP){var dQ=JSON_PIWIK.stringify(dO);if(dQ.length>2){return"&"+dP+"="+t(dQ)}return""}var dK=dh(bV);var dB=dh(cl);dk+=ds(dK,"cvar");dk+=ds(dB,"e_cvar");if(aQ){dk+=ds(aQ,"_cvar");for(dF in dC){if(Object.prototype.hasOwnProperty.call(dC,dF)){if(aQ[dF][0]===""||aQ[dF][1]===""){delete aQ[dF]}}}if(bP){dd(dx,JSON_PIWIK.stringify(aQ),co,bo,cW)}}if(a2){if(cm){dk+="&gt_ms="+cm}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dk+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
-}}}if(aK){dk+="&pv_id="+aK}dz.lastEcommerceOrderTs=J(dl)&&String(dl).length?dl:dz.lastEcommerceOrderTs;aL(dz);cc();dk+=ac(dH,{tracker:bH,request:dk});if(cY.length){dk+="&"+cY}if(A(ca)){dk=ca(dk)}return dk}bQ=function a7(){var di=new Date();di=di.getTime();if(!cX){return false}if((cX+(1000*c6))<=di){return false}if(cX+a5<=di){bH.ping();return true}return false};function bp(dl,dk,dr,dm,di,du){var dp="idgoal=0",dq,dj=new Date(),ds=[],dt,dn=String(dl).length;if(dn){dp+="&ec_id="+t(dl);dq=Math.round(dj.getTime()/1000)}dp+="&revenue="+dk;if(String(dr).length){dp+="&ec_st="+dr}if(String(dm).length){dp+="&ec_tx="+dm}if(String(di).length){dp+="&ec_sh="+di}if(String(du).length){dp+="&ec_dt="+du}if(cZ){for(dt in cZ){if(Object.prototype.hasOwnProperty.call(cZ,dt)){if(!J(cZ[dt][1])){cZ[dt][1]=""}if(!J(cZ[dt][2])){cZ[dt][2]=""}if(!J(cZ[dt][3])||String(cZ[dt][3]).length===0){cZ[dt][3]=0}if(!J(cZ[dt][4])||String(cZ[dt][4]).length===0){cZ[dt][4]=1}ds.push(cZ[dt])}}dp+="&ec_items="+t(JSON_PIWIK.stringify(ds))
-}dp=cs(dp,ao,"ecommerce",dq);bE(dp,bI);if(dn){cZ={}}}function bY(di,dm,dl,dk,dj,dn){if(String(di).length&&J(dm)){bp(di,dm,dl,dk,dj,dn)}}function br(di){if(J(di)){bp("",di,"","","","")}}function bZ(dj,dl,dk){aK=bg();var di=cs("action_name="+t(al(dj||bi)),dl,"log");bE(di,bI,dk)}function a0(dk,dj){var dl,di="(^| )(piwik[_-]"+dj;if(dk){for(dl=0;dl<dk.length;dl++){di+="|"+dk[dl]}}di+=")( |$)";return new RegExp(di)}function aU(di){return(aD&&di&&0===String(di).indexOf(aD))}function cu(dm,di,dn,dj){if(aU(di)){return 0}var dl=a0(bK,"download"),dk=a0(a8,"link"),dp=new RegExp("\\.("+c5.join("|")+")([?&#]|$)","i");if(dk.test(dm)){return"link"}if(dj||dl.test(dm)||dp.test(di)){return"download"}if(dn){return 0}return"link"}function au(dj){var di;di=dj.parentNode;while(di!==null&&J(di)){if(ae.isLinkElement(dj)){break}dj=di;di=dj.parentNode}return dj}function db(dn){dn=au(dn);if(!ae.hasNodeAttribute(dn,"href")){return}if(!J(dn.href)){return}var dm=ae.getAttributeValueFromNode(dn,"href");if(aU(dm)){return
-}var dj=dn.pathname||ck(dn.href);var dp=dn.hostname||d(dn.href);var dq=dp.toLowerCase();var dk=dn.href.replace(dp,dq);var dl=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!dl.test(dk)){var di=cu(dn.className,dk,ar(dq,dj),ae.hasNodeAttribute(dn,"download"));if(di){return{type:di,href:dk}}}}function aP(di,dj,dk,dl){var dm=v.buildInteractionRequestParams(di,dj,dk,dl);if(!dm){return}return cs(dm,null,"contentInteraction")}function cJ(dk,dl,dq,di,dj){if(!J(dk)){return}if(aU(dk)){return dk}var dn=v.toAbsoluteUrl(dk);var dm="redirecturl="+t(dn)+"&";dm+=aP(dl,dq,di,(dj||dk));var dp="&";if(aD.indexOf("?")<0){dp="?"}return aD+dp+dm}function bb(di,dj){if(!di||!dj){return false}var dk=v.findTargetNode(di);if(v.shouldIgnoreInteraction(dk)){return false}dk=v.findTargetNodeNoDefault(di);if(dk&&!V(dk,dj)){return false}return true}function ct(dk,dj,dm){if(!dk){return}var di=v.findParentContentNode(dk);if(!di){return}if(!bb(di,dk)){return}var dl=v.buildContentBlock(di);
-if(!dl){return}if(!dl.target&&dm){dl.target=dm}return v.buildInteractionRequestParams(dj,dl.name,dl.piece,dl.target)}function aW(dj){if(!b9||!b9.length){return false}var di,dk;for(di=0;di<b9.length;di++){dk=b9[di];if(dk&&dk.name===dj.name&&dk.piece===dj.piece&&dk.target===dj.target){return true}}return false}function bD(dl){if(!dl){return false}var dp=v.findTargetNode(dl);if(!dp||v.shouldIgnoreInteraction(dp)){return false}var dq=db(dp);if(c8&&dq&&dq.type){return false}if(ae.isLinkElement(dp)&&ae.hasNodeAttributeWithValue(dp,"href")){var di=String(ae.getAttributeValueFromNode(dp,"href"));if(0===di.indexOf("#")){return false}if(aU(di)){return true}if(!v.isUrlToCurrentDomain(di)){return false}var dm=v.buildContentBlock(dl);if(!dm){return}var dk=dm.name;var dr=dm.piece;var dn=dm.target;if(!ae.hasNodeAttributeWithValue(dp,v.CONTENT_TARGET_ATTR)||dp.wasContentTargetAttrReplaced){dp.wasContentTargetAttrReplaced=true;dn=v.toAbsoluteUrl(di);ae.setAnyAttribute(dp,v.CONTENT_TARGET_ATTR,dn)}var dj=cJ(di,"click",dk,dr,dn);
-v.setHrefAttribute(dp,dj);return true}return false}function aM(dj){if(!dj||!dj.length){return}var di;for(di=0;di<dj.length;di++){bD(dj[di])}}function aX(di){return function(dj){if(!di){return}var dm=v.findParentContentNode(di);var dn;if(dj){dn=dj.target||dj.srcElement}if(!dn){dn=di}if(!bb(dm,dn)){return}cf(bI);if(ae.isLinkElement(di)&&ae.hasNodeAttributeWithValue(di,"href")&&ae.hasNodeAttributeWithValue(di,v.CONTENT_TARGET_ATTR)){var dk=ae.getAttributeValueFromNode(di,"href");if(!aU(dk)&&di.wasContentTargetAttrReplaced){ae.setAnyAttribute(di,v.CONTENT_TARGET_ATTR,"")}}var ds=db(di);if(ap&&ds&&ds.type){return ds.type}if(bD(dm)){return"href"}var dp=v.buildContentBlock(dm);if(!dp){return}var dl=dp.name;var dt=dp.piece;var dr=dp.target;var dq=aP("click",dl,dt,dr);if(dq){bE(dq,bI)}return dq}}function b0(dk){if(!dk||!dk.length){return}var di,dj;for(di=0;di<dk.length;di++){dj=v.findTargetNode(dk[di]);if(dj&&!dj.contentInteractionTrackingSetupDone){dj.contentInteractionTrackingSetupDone=true;an(dj,"click",aX(dj))
-}}}function bw(dk,dl){if(!dk||!dk.length){return[]}var di,dj;for(di=0;di<dk.length;di++){if(aW(dk[di])){dk.splice(di,1);di--}else{b9.push(dk[di])}}if(!dk||!dk.length){return[]}aM(dl);b0(dl);var dm=[];for(di=0;di<dk.length;di++){dj=cs(v.buildImpressionRequestParams(dk[di].name,dk[di].piece,dk[di].target),undefined,"contentImpressions");if(dj){dm.push(dj)}}return dm}function cy(dj){var di=v.collectContent(dj);return bw(di,dj)}function a9(dj){if(!dj||!dj.length){return[]}var di;for(di=0;di<dj.length;di++){if(!v.isNodeVisible(dj[di])){dj.splice(di,1);di--}}if(!dj||!dj.length){return[]}return cy(dj)}function aF(dk,di,dj){var dl=v.buildImpressionRequestParams(dk,di,dj);return cs(dl,null,"contentImpression")}function da(dl,dj){if(!dl){return}var di=v.findParentContentNode(dl);var dk=v.buildContentBlock(di);if(!dk){return}if(!dj){dj="Unknown"}return aP(dj,dk.name,dk.piece,dk.target)}function cN(dj,dl,di,dk){return"e_c="+t(dj)+"&e_a="+t(dl)+(J(di)?"&e_n="+t(di):"")+(J(dk)?"&e_v="+t(dk):"")}function at(dk,dm,di,dl,dp,dn){if(a(String(dk)).length===0||a(String(dm)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");
-return false}var dj=cs(cN(dk,dm,di,dl),dp,"event");bE(dj,bI,dn)}function b7(di,dl,dj,dm){var dk=cs("search="+t(di)+(dl?"&search_cat="+t(dl):"")+(J(dj)?"&search_count="+dj:""),dm,"sitesearch");bE(dk,bI)}function cS(di,dm,dl,dk){var dj=cs("idgoal="+di+(dm?"&revenue="+dm:""),dl,"goal");bE(dj,bI,dk)}function c0(dl,di,dq,dp,dk){var dn=di+"="+t(b1(dl));var dj=ct(dk,"click",dl);if(dj){dn+="&"+dj}var dm=cs(dn,dq,"link");bE(dm,bI,dp)}function bT(dj,di){if(dj!==""){return dj+di.charAt(0).toUpperCase()+di.slice(1)}return di}function cg(dn){var dm,di,dl=["","webkit","ms","moz"],dk;if(!be){for(di=0;di<dl.length;di++){dk=dl[di];if(Object.prototype.hasOwnProperty.call(G,bT(dk,"hidden"))){if(G[bT(dk,"visibilityState")]==="prerender"){dm=true}break}}}if(dm){an(G,dk+"visibilitychange",function dj(){G.removeEventListener(dk+"visibilitychange",dj,false);dn()});return}dn()}function bq(){var dj=aY().uuid;var di=aI();return dj+di}function ci(di){if(!di){return}if(!ae.hasNodeAttribute(di,"href")){return}var dj=ae.getAttributeValueFromNode(di,"href");
-if(!dj||aU(dj)){return}dj=k(dj,av);var dk=bq();dj=F(dj,av,dk);ae.setAnyAttribute(di,"href",dj)}function aA(dl){var dm=ae.getAttributeValueFromNode(dl,"href");if(!dm){return false}dm=String(dm);var dj=dm.indexOf("//")===0||dm.indexOf("http://")===0||dm.indexOf("https://")===0;if(!dj){return false}var di=dl.pathname||ck(dl.href);var dk=(dl.hostname||d(dl.href)).toLowerCase();if(ar(dk,di)){if(!cE(cT,L(dk))){return true}return false}return false}function cD(di){var dj=db(di);if(dj&&dj.type){dj.href=p(dj.href);c0(dj.href,dj.type,undefined,null,di);return}if(cL){di=au(di);if(aA(di)){ci(di)}}}function cv(){return G.all&&!G.addEventListener}function cU(di){var dk=di.which;var dj=(typeof di.button);if(!dk&&dj!=="undefined"){if(cv()){if(di.button&1){dk=1}else{if(di.button&2){dk=3}else{if(di.button&4){dk=2}}}}else{if(di.button===0||di.button==="0"){dk=1}else{if(di.button&1){dk=2}else{if(di.button&2){dk=3}}}}}return dk}function bS(di){switch(cU(di)){case 1:return"left";case 2:return"middle";case 3:return"right"
-}}function a1(di){return di.target||di.srcElement}function aB(di){return function(dl){dl=dl||T.event;var dk=bS(dl);var dm=a1(dl);if(dl.type==="click"){var dj=false;if(di&&dk==="middle"){dj=true}if(dm&&!dj){cD(dm)}}else{if(dl.type==="mousedown"){if(dk==="middle"&&dm){aR=dk;bz=dm}else{aR=bz=null}}else{if(dl.type==="mouseup"){if(dk===aR&&dm===bz){cD(dm)}aR=bz=null}else{if(dl.type==="contextmenu"){cD(dm)}}}}}}function aq(dk,dj){var di=typeof dj;if(di==="undefined"){dj=true}an(dk,"click",aB(dj),false);if(dj){an(dk,"mouseup",aB(dj),false);an(dk,"mousedown",aB(dj),false);an(dk,"contextmenu",aB(dj),false)}}function bC(dk,dm){ap=true;var dl,dj=a0(by,"ignore"),dn=G.links,di=null,dp=null;if(dn){for(dl=0;dl<dn.length;dl++){di=dn[dl];if(!dj.test(di.className)){dp=typeof di.piwikTrackers;if("undefined"===dp){di.piwikTrackers=[]}if(-1===M(di.piwikTrackers,dm)){di.piwikTrackers.push(dm);aq(di,dk)}}}}}function aS(dj,dm,dn){if(ce){return true}ce=true;var dp=false;var dl,dk;function di(){dp=true}n(function(){function dq(ds){setTimeout(function(){if(!ce){return
-}dp=false;dn.trackVisibleContentImpressions();dq(ds)},ds)}function dr(ds){setTimeout(function(){if(!ce){return}if(dp){dp=false;dn.trackVisibleContentImpressions()}dr(ds)},ds)}if(dj){dl=["scroll","resize"];for(dk=0;dk<dl.length;dk++){if(G.addEventListener){G.addEventListener(dl[dk],di,false)}else{T.attachEvent("on"+dl[dk],di)}}dr(100)}if(dm&&dm>0){dm=parseInt(dm,10);dq(dm)}})}var bB={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var di=this.requests;this.requests=[];if(di.length===1){bE(di[0],bI)}else{de(di,bI)}},push:function(di){if(!di){return}if(m||!this.enabled){bE(di,bI);return}bB.requests.push(di);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bB.timeout=null;bB.sendRequests()},bB.interval);var dj="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dj)){b[dj]={unload:function(){if(bB.timeout){clearTimeout(bB.timeout)}bB.sendRequests()}}}}};bh();aL();this.hasConsent=function(){return bA};this.getVisitorId=function(){return aY().uuid
-};this.getVisitorInfo=function(){return cM()};this.getAttributionInfo=function(){return bL()};this.getAttributionCampaignName=function(){return bL()[0]};this.getAttributionCampaignKeyword=function(){return bL()[1]};this.getAttributionReferrerTimestamp=function(){return bL()[2]};this.getAttributionReferrerUrl=function(){return bL()[3]};this.setTrackerUrl=function(di){aD=di};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bG)};this.addTracker=function(di,dk){if(!J(di)||null===di){di=this.getTrackerUrl()}var dj=new Q(di,dk);I.push(dj);e.trigger("TrackerAdded",[this]);return dj};this.getSiteId=function(){return b5};this.setSiteId=function(di){b2(di)};this.resetUserId=function(){bx=""};this.setUserId=function(di){if(Y(di)){bx=di}};this.getUserId=function(){return bx};this.setCustomData=function(di,dj){if(W(di)){ao=di}else{if(!ao){ao={}}ao[di]=dj}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(di){ca=di};this.appendToTrackingUrl=function(di){cY=di
-};this.getRequest=function(di){return cs(di)};this.addPlugin=function(di,dj){b[di]=dj};this.setCustomDimension=function(di,dj){di=parseInt(di,10);if(di>0){if(!J(dj)){dj=""}if(!w(dj)){dj=String(dj)}bl[di]=dj}};this.getCustomDimension=function(di){di=parseInt(di,10);if(di>0&&Object.prototype.hasOwnProperty.call(bl,di)){return bl[di]}};this.deleteCustomDimension=function(di){di=parseInt(di,10);if(di>0){delete bl[di]}};this.setCustomVariable=function(dj,di,dm,dk){var dl;if(!J(dk)){dk="visit"}if(!J(di)){return}if(!J(dm)){dm=""}if(dj>0){di=!w(di)?String(di):di;dm=!w(dm)?String(dm):dm;dl=[di.slice(0,bs),dm.slice(0,bs)];if(dk==="visit"||dk===2){cC();aQ[dj]=dl}else{if(dk==="page"||dk===3){bV[dj]=dl}else{if(dk==="event"){cl[dj]=dl}}}}};this.getCustomVariable=function(dj,dk){var di;if(!J(dk)){dk="visit"}if(dk==="page"||dk===3){di=bV[dj]}else{if(dk==="event"){di=cl[dj]}else{if(dk==="visit"||dk===2){cC();di=aQ[dj]}}}if(!J(di)||(di&&di[0]==="")){return false}return di};this.deleteCustomVariable=function(di,dj){if(this.getCustomVariable(di,dj)){this.setCustomVariable(di,"","",dj)
-}};this.deleteCustomVariables=function(di){if(di==="page"||di===3){bV={}}else{if(di==="event"){cl={}}else{if(di==="visit"||di===2){aQ={}}}}};this.storeCustomVariablesInCookie=function(){bP=true};this.setLinkTrackingTimer=function(di){bI=di};this.getLinkTrackingTimer=function(){return bI};this.setDownloadExtensions=function(di){if(w(di)){di=di.split("|")}c5=di};this.addDownloadExtensions=function(dj){var di;if(w(dj)){dj=dj.split("|")}for(di=0;di<dj.length;di++){c5.push(dj[di])}};this.removeDownloadExtensions=function(dk){var dj,di=[];if(w(dk)){dk=dk.split("|")}for(dj=0;dj<c5.length;dj++){if(M(dk,c5[dj])===-1){di.push(c5[dj])}}c5=di};this.setDomains=function(di){ax=w(di)?[di]:di;var dm=false,dk=0,dj;for(dk;dk<ax.length;dk++){dj=String(ax[dk]);if(cE(cT,L(dj))){dm=true;break}var dl=ck(dj);if(dl&&dl!=="/"&&dl!=="/*"){dm=true;break}}if(!dm){ax.push(cT)}};this.enableCrossDomainLinking=function(){cL=true};this.disableCrossDomainLinking=function(){cL=false};this.isCrossDomainLinkingEnabled=function(){return cL
-};this.setCrossDomainLinkingTimeout=function(di){aZ=di};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bq())};this.setIgnoreClasses=function(di){by=w(di)?[di]:di};this.setRequestMethod=function(di){c9=di||ch};this.setRequestContentType=function(di){cw=di||aH};this.setReferrerUrl=function(di){bm=di};this.setCustomUrl=function(di){a4=bU(bM,di)};this.getCurrentUrl=function(){return a4||bM};this.setDocumentTitle=function(di){bi=di};this.setAPIUrl=function(di){bG=di};this.setDownloadClasses=function(di){bK=w(di)?[di]:di};this.setLinkClasses=function(di){a8=w(di)?[di]:di};this.setCampaignNameKey=function(di){cq=w(di)?[di]:di};this.setCampaignKeywordKey=function(di){bF=w(di)?[di]:di};this.discardHashTag=function(di){bO=di};this.setCookieNamePrefix=function(di){bj=di;aQ=bW()};this.setCookieDomain=function(di){var dj=L(di);if(bv(dj)){cW=dj;bh()}};this.getCookieDomain=function(){return cW};this.hasCookies=function(){return"1"===b4()};this.setSessionCookie=function(dk,dj,di){if(!dk){throw new Error("Missing cookie name")
-}if(!J(di)){di=co}bt.push(dk);dd(aT(dk),dj,di,bo,cW)};this.getCookie=function(dj){var di=aC(aT(dj));if(di===0){return null}return di};this.setCookiePath=function(di){bo=di;bh()};this.getCookiePath=function(di){return bo};this.setVisitorCookieTimeout=function(di){cH=di*1000};this.setSessionCookieTimeout=function(di){co=di*1000};this.getSessionCookieTimeout=function(){return co};this.setReferralCookieTimeout=function(di){c4=di*1000};this.setConversionAttributionFirstReferrer=function(di){bu=di};this.setSecureCookie=function(di){bR=di};this.disableCookies=function(){bk=true;c7.cookie="0";if(b5){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dj){var di=h.doNotTrack||h.msDoNotTrack;cO=dj&&(di==="yes"||di==="1");if(cO){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cV=true};this.addListener=function(dj,di){aq(dj,di)};this.enableLinkTracking=function(dj){c8=true;var di=this;cg(function(){q(function(){bC(dj,di)})})};this.enableJSErrorTracking=function(){if(cR){return
-}cR=true;var di=T.onerror;T.onerror=function(dn,dl,dk,dm,dj){cg(function(){var dp="JavaScript Errors";var dq=dl+":"+dk;if(dm){dq+=":"+dm}at(dp,dq,dn)});if(di){return di(dn,dl,dk,dm,dj)}return false}};this.disablePerformanceTracking=function(){a2=false};this.setGenerationTimeMs=function(di){cm=parseInt(di,10)};this.setVisitStandardLength=function(di){di=Math.max(di,5);c6=di};this.enableHeartBeatTimer=function(di){di=Math.max(di,5);a5=(di||15)*1000;if(cX!==null){df()}};this.disableHeartBeatTimer=function(){bJ();if(a5||aN){if(T.removeEventListener){T.removeEventListener("focus",ba);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",ba);T.detachEvent("onblur",ay)}}}a5=null;aN=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(di){if(T.location.protocol==="file:"){T.location=di}};this.setCountPreRendered=function(di){be=di};this.trackGoal=function(di,dl,dk,dj){cg(function(){cS(di,dl,dk,dj)})};this.trackLink=function(dj,di,dl,dk){cg(function(){c0(dj,di,dl,dk)
-})};this.getNumTrackedPageViews=function(){return cr};this.trackPageView=function(di,dk,dj){b9=[];cI=[];if(N(b5)){cg(function(){Z(aD,bG,b5)})}else{cg(function(){cr++;bZ(di,dk,dj)})}};this.trackAllContentImpressions=function(){if(N(b5)){return}cg(function(){q(function(){var di=v.findContentNodes();var dj=cy(di);de(dj,bI)})})};this.trackVisibleContentImpressions=function(di,dj){if(N(b5)){return}if(!J(di)){di=true}if(!J(dj)){dj=750}aS(di,dj,this);cg(function(){n(function(){var dk=v.findContentNodes();var dl=a9(dk);de(dl,bI)})})};this.trackContentImpression=function(dk,di,dj){if(N(b5)){return}dk=a(dk);di=a(di);dj=a(dj);if(!dk){return}di=di||"Unknown";cg(function(){var dl=aF(dk,di,dj);bE(dl,bI)})};this.trackContentImpressionsWithinNode=function(di){if(N(b5)||!di){return}cg(function(){if(ce){n(function(){var dj=v.findContentNodesWithinNode(di);var dk=a9(dj);de(dk,bI)})}else{q(function(){var dj=v.findContentNodesWithinNode(di);var dk=cy(dj);de(dk,bI)})}})};this.trackContentInteraction=function(dk,dl,di,dj){if(N(b5)){return
-}dk=a(dk);dl=a(dl);di=a(di);dj=a(dj);if(!dk||!dl){return}di=di||"Unknown";cg(function(){var dm=aP(dk,dl,di,dj);if(dm){bE(dm,bI)}})};this.trackContentInteractionNode=function(dj,di){if(N(b5)||!dj){return}cg(function(){var dk=da(dj,di);if(dk){bE(dk,bI)}})};this.logAllContentBlocksOnPage=function(){var dk=v.findContentNodes();var di=v.collectContent(dk);var dj=typeof console;if(dj!=="undefined"&&console&&console.log){console.log(di)}};this.trackEvent=function(dj,dl,di,dk,dn,dm){cg(function(){at(dj,dl,di,dk,dn,dm)})};this.trackSiteSearch=function(di,dk,dj,dl){b9=[];cg(function(){b7(di,dk,dj,dl)})};this.setEcommerceView=function(dl,di,dk,dj){if(Y(dk)){dk=String(dk)}if(!J(dk)||dk===null||dk===false||!dk.length){dk=""}else{if(dk instanceof Array){dk=JSON_PIWIK.stringify(dk)}}bV[5]=["_pkc",dk];if(J(dj)&&dj!==null&&dj!==false&&String(dj).length){bV[2]=["_pkp",dj]}if(!Y(dl)&&!Y(di)){return}if(Y(dl)){bV[3]=["_pks",dl]}if(!Y(di)){di=""}bV[4]=["_pkn",di]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(cZ))
-};this.addEcommerceItem=function(dm,di,dk,dj,dl){if(Y(dm)){cZ[dm]=[String(dm),di,dk,dj,dl]}};this.removeEcommerceItem=function(di){if(Y(di)){di=String(di);delete cZ[di]}};this.clearEcommerceCart=function(){cZ={}};this.trackEcommerceOrder=function(di,dm,dl,dk,dj,dn){bY(di,dm,dl,dk,dj,dn)};this.trackEcommerceCartUpdate=function(di){br(di)};this.trackRequest=function(dj,dl,dk,di){cg(function(){var dm=cs(dj,dl,di);bE(dm,bI,dk)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bB.enabled=false};this.setRequestQueueInterval=function(di){if(di<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bB.interval=di};this.queueRequest=function(di){cg(function(){var dj=cs(di);bB.push(dj)})};this.isConsentRequired=function(){return cz};this.getRememberedConsent=function(){var di=aC(bd);if(aC(cK)){if(di){bX(bd,bo,cW)}return null}if(!di||di===0){return null}return di};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
-};this.requireConsent=function(){cz=true;bA=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bA){aE()}}}};this.setConsentGiven=function(){bA=true;bX(cK,bo,cW);var dj,di;for(dj=0;dj<cI.length;dj++){di=typeof cI[dj];if(di==="string"){bE(cI[dj],bI)}else{if(di==="object"){de(cI[dj],bI)}}}cI=[]};this.rememberConsentGiven=function(dj){if(dj){dj=dj*60*60*1000}else{dj=30*365*24*60*60*1000}this.setConsentGiven();var di=new Date().getTime();dd(bd,di,dj,bo,cW,bR)};this.forgetConsentGiven=function(){var di=30*365*24*60*60*1000;bX(bd,bo,cW);dd(cK,new Date().getTime(),di,bo,cW,bR);this.requireConsent()};this.isUserOptedOut=function(){return !bA};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
+;if(typeof _paq!=="object"){_paq=[]}if(typeof window.Piwik!=="object"){window.Matomo=window.Piwik=(function(){var r,b={},y={},G=document,h=navigator,X=screen,T=window,i=T.performance||T.mozPerformance||T.msPerformance||T.webkitPerformance,t=T.encodeURIComponent,S=T.decodeURIComponent,l=unescape,I=[],E,e,ah=[],x=0,ab=0,U=0,m=false;function p(ao){try{return S(ao)}catch(ap){return unescape(ao)}}function J(ap){var ao=typeof ap;return ao!=="undefined"}function A(ao){return typeof ao==="function"}function W(ao){return typeof ao==="object"}function w(ao){return typeof ao==="string"||ao instanceof String}function ag(ao){return typeof ao==="number"||ao instanceof Number
+}function Y(ao){return J(ao)&&(ag(ao)||(w(ao)&&ao.length))}function B(ap){if(!ap){return true}var ao;var aq=true;for(ao in ap){if(Object.prototype.hasOwnProperty.call(ap,ao)){aq=false}}return aq}function ak(ao){var ap=typeof console;if(ap!=="undefined"&&console&&console.error){console.error(ao)}}function af(){var au,at,aw,ap,ao;for(au=0;au<arguments.length;au+=1){ao=null;if(arguments[au]&&arguments[au].slice){ao=arguments[au].slice()}ap=arguments[au];aw=ap.shift();var av,aq;var ar=w(aw)&&aw.indexOf("::")>0;if(ar){av=aw.split("::");aq=av[0];aw=av[1];if("object"===typeof e[aq]&&"function"===typeof e[aq][aw]){e[aq][aw].apply(e[aq],ap)}else{if(ao){ah.push(ao)}}}else{for(at=0;at<I.length;at++){if(w(aw)){aq=I[at];var ax=aw.indexOf(".")>0;if(ax){av=aw.split(".");if(aq&&"object"===typeof aq[av[0]]){aq=aq[av[0]];aw=av[1]}else{if(ao){ah.push(ao);break}}}if(aq[aw]){aq[aw].apply(aq,ap)}else{var ay="The method '"+aw+'\' was not found in "_paq" variable. Please have a look at the Piwik tracker documentation: https://developer.piwik.org/api-reference/tracking-javascript';
+ak(ay);if(!ax){throw new TypeError(ay)}}if(aw==="addTracker"){break}if(aw==="setTrackerUrl"||aw==="setSiteId"){break}}else{aw.apply(I[at],ap)}}}}}function an(ar,aq,ap,ao){if(ar.addEventListener){ar.addEventListener(aq,ap,ao);return true}if(ar.attachEvent){return ar.attachEvent("on"+aq,ap)}ar["on"+aq]=ap}function n(ao){if(G.readyState==="complete"){ao()}else{if(T.addEventListener){T.addEventListener("load",ao,false)}else{if(T.attachEvent){T.attachEvent("onload",ao)}}}}function q(ar){var ao=false;if(G.attachEvent){ao=G.readyState==="complete"}else{ao=G.readyState!=="loading"}if(ao){ar();return}var aq;if(G.addEventListener){an(G,"DOMContentLoaded",function ap(){G.removeEventListener("DOMContentLoaded",ap,false);if(!ao){ao=true;ar()}})}else{if(G.attachEvent){G.attachEvent("onreadystatechange",function ap(){if(G.readyState==="complete"){G.detachEvent("onreadystatechange",ap);if(!ao){ao=true;ar()}}});if(G.documentElement.doScroll&&T===T.top){(function ap(){if(!ao){try{G.documentElement.doScroll("left")
+}catch(at){setTimeout(ap,0);return}ao=true;ar()}}())}}}an(T,"load",function(){if(!ao){ao=true;ar()}},false)}function ac(ap,av,aw){if(!ap){return""}var ao="",ar,aq,at,au;for(ar in b){if(Object.prototype.hasOwnProperty.call(b,ar)){au=b[ar]&&"function"===typeof b[ar][ap];if(au){aq=b[ar][ap];at=aq(av||{},aw);if(at){ao+=at}}}}return ao}function ai(){var ao;m=true;ac("unload");if(r){do{ao=new Date()}while(ao.getTimeAlias()<r)}}function o(aq,ap){var ao=G.createElement("script");ao.type="text/javascript";ao.src=aq;if(ao.readyState){ao.onreadystatechange=function(){var ar=this.readyState;if(ar==="loaded"||ar==="complete"){ao.onreadystatechange=null;ap()}}}else{ao.onload=ap}G.getElementsByTagName("head")[0].appendChild(ao)}function K(){var ao="";try{ao=T.top.document.referrer}catch(aq){if(T.parent){try{ao=T.parent.document.referrer}catch(ap){ao=""}}}if(ao===""){ao=G.referrer}return ao}function s(ao){var aq=new RegExp("^([a-z]+):"),ap=aq.exec(ao);return ap?ap[1]:null}function d(ao){var aq=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),ap=aq.exec(ao);
+return ap?ap[1]:ao}function aj(ap,ao){ap=String(ap);return ap.lastIndexOf(ao,0)===0}function R(ap,ao){ap=String(ap);return ap.indexOf(ao,ap.length-ao.length)!==-1}function z(ap,ao){ap=String(ap);return ap.indexOf(ao)!==-1}function g(ap,ao){ap=String(ap);return ap.substr(0,ap.length-ao)}function F(ar,aq,au){ar=String(ar);if(!au){au=""}var ao=ar.indexOf("#");var av=ar.length;if(ao===-1){ao=av}var at=ar.substr(0,ao);var ap=ar.substr(ao,av-ao);if(at.indexOf("?")===-1){at+="?"}else{if(!R(at,"?")){at+="&"}}return at+t(aq)+"="+t(au)+ap}function k(ap,aq){ap=String(ap);if(ap.indexOf("?"+aq+"=")===-1&&ap.indexOf("&"+aq+"=")===-1){return ap}var ar=ap.indexOf("?");if(ar===-1){return ap}var ao=ap.substr(ar+1);var aw=ap.substr(0,ar);if(ao){var ax="";var az=ao.indexOf("#");if(az!==-1){ax=ao.substr(az+1);ao=ao.substr(0,az)}var at;var av=ao.split("&");var au=av.length-1;for(au;au>=0;au--){at=av[au].split("=")[0];if(at===aq){av.splice(au,1)}}var ay=av.join("&");if(ay){aw=aw+"?"+ay}if(ax){aw+="#"+ax}}return aw
+}function f(aq,ap){var ao="[\\?&#]"+ap+"=([^&#]*)";var at=new RegExp(ao);var ar=at.exec(aq);return ar?S(ar[1]):""}function a(ao){if(ao&&String(ao)===ao){return ao.replace(/^\s+|\s+$/g,"")}return ao}function D(ao){return unescape(t(ao))}function am(aE){var aq=function(aK,aJ){return(aK<<aJ)|(aK>>>(32-aJ))},aF=function(aM){var aK="",aL,aJ;for(aL=7;aL>=0;aL--){aJ=(aM>>>(aL*4))&15;aK+=aJ.toString(16)}return aK},au,aH,aG,ap=[],ay=1732584193,aw=4023233417,av=2562383102,at=271733878,ar=3285377520,aD,aC,aB,aA,az,aI,ao,ax=[];aE=D(aE);ao=aE.length;for(aH=0;aH<ao-3;aH+=4){aG=aE.charCodeAt(aH)<<24|aE.charCodeAt(aH+1)<<16|aE.charCodeAt(aH+2)<<8|aE.charCodeAt(aH+3);ax.push(aG)}switch(ao&3){case 0:aH=2147483648;break;case 1:aH=aE.charCodeAt(ao-1)<<24|8388608;break;case 2:aH=aE.charCodeAt(ao-2)<<24|aE.charCodeAt(ao-1)<<16|32768;break;case 3:aH=aE.charCodeAt(ao-3)<<24|aE.charCodeAt(ao-2)<<16|aE.charCodeAt(ao-1)<<8|128;break}ax.push(aH);while((ax.length&15)!==14){ax.push(0)}ax.push(ao>>>29);ax.push((ao<<3)&4294967295);
+for(au=0;au<ax.length;au+=16){for(aH=0;aH<16;aH++){ap[aH]=ax[au+aH]}for(aH=16;aH<=79;aH++){ap[aH]=aq(ap[aH-3]^ap[aH-8]^ap[aH-14]^ap[aH-16],1)}aD=ay;aC=aw;aB=av;aA=at;az=ar;for(aH=0;aH<=19;aH++){aI=(aq(aD,5)+((aC&aB)|(~aC&aA))+az+ap[aH]+1518500249)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=20;aH<=39;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+1859775393)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=40;aH<=59;aH++){aI=(aq(aD,5)+((aC&aB)|(aC&aA)|(aB&aA))+az+ap[aH]+2400959708)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}for(aH=60;aH<=79;aH++){aI=(aq(aD,5)+(aC^aB^aA)+az+ap[aH]+3395469782)&4294967295;az=aA;aA=aB;aB=aq(aC,30);aC=aD;aD=aI}ay=(ay+aD)&4294967295;aw=(aw+aC)&4294967295;av=(av+aB)&4294967295;at=(at+aA)&4294967295;ar=(ar+az)&4294967295}aI=aF(ay)+aF(aw)+aF(av)+aF(at)+aF(ar);return aI.toLowerCase()}function aa(aq,ao,ap){if(!aq){aq=""}if(!ao){ao=""}if(aq==="translate.googleusercontent.com"){if(ap===""){ap=ao}ao=f(ao,"u");aq=d(ao)}else{if(aq==="cc.bingj.com"||aq==="webcache.googleusercontent.com"||aq.slice(0,5)==="74.6."){ao=G.links[0].href;
+aq=d(ao)}}return[aq,ao,ap]}function L(ap){var ao=ap.length;if(ap.charAt(--ao)==="."){ap=ap.slice(0,ao)}if(ap.slice(0,2)==="*."){ap=ap.slice(1)}if(ap.indexOf("/")!==-1){ap=ap.substr(0,ap.indexOf("/"))}return ap}function al(ap){ap=ap&&ap.text?ap.text:ap;if(!w(ap)){var ao=G.getElementsByTagName("title");if(ao&&J(ao[0])){ap=ao[0].text}}return ap}function P(ao){if(!ao){return[]}if(!J(ao.children)&&J(ao.childNodes)){return ao.children}if(J(ao.children)){return ao.children}return[]}function V(ap,ao){if(!ap||!ao){return false}if(ap.contains){return ap.contains(ao)}if(ap===ao){return true}if(ap.compareDocumentPosition){return !!(ap.compareDocumentPosition(ao)&16)}return false}function M(aq,ar){if(aq&&aq.indexOf){return aq.indexOf(ar)}if(!J(aq)||aq===null){return -1}if(!aq.length){return -1}var ao=aq.length;if(ao===0){return -1}var ap=0;while(ap<ao){if(aq[ap]===ar){return ap}ap++}return -1}function j(aq){if(!aq){return false}function ao(at,au){if(T.getComputedStyle){return G.defaultView.getComputedStyle(at,null)[au]
+}if(at.currentStyle){return at.currentStyle[au]}}function ar(at){at=at.parentNode;while(at){if(at===G){return true}at=at.parentNode}return false}function ap(av,aB,at,ay,aw,az,ax){var au=av.parentNode,aA=1;if(!ar(av)){return false}if(9===au.nodeType){return true}if("0"===ao(av,"opacity")||"none"===ao(av,"display")||"hidden"===ao(av,"visibility")){return false}if(!J(aB)||!J(at)||!J(ay)||!J(aw)||!J(az)||!J(ax)){aB=av.offsetTop;aw=av.offsetLeft;ay=aB+av.offsetHeight;at=aw+av.offsetWidth;az=av.offsetWidth;ax=av.offsetHeight}if(aq===av&&(0===ax||0===az)&&"hidden"===ao(av,"overflow")){return false}if(au){if(("hidden"===ao(au,"overflow")||"scroll"===ao(au,"overflow"))){if(aw+aA>au.offsetWidth+au.scrollLeft||aw+az-aA<au.scrollLeft||aB+aA>au.offsetHeight+au.scrollTop||aB+ax-aA<au.scrollTop){return false}}if(av.offsetParent===au){aw+=au.offsetLeft;aB+=au.offsetTop}return ap(au,aB,at,ay,aw,az,ax)}return true}return ap(aq)}var ae={htmlCollectionToArray:function(aq){var ao=[],ap;if(!aq||!aq.length){return ao
+}for(ap=0;ap<aq.length;ap++){ao.push(aq[ap])}return ao},find:function(ao){if(!document.querySelectorAll||!ao){return[]}var ap=document.querySelectorAll(ao);return this.htmlCollectionToArray(ap)},findMultiple:function(aq){if(!aq||!aq.length){return[]}var ap,ar;var ao=[];for(ap=0;ap<aq.length;ap++){ar=this.find(aq[ap]);ao=ao.concat(ar)}ao=this.makeNodesUnique(ao);return ao},findNodesByTagName:function(ap,ao){if(!ap||!ao||!ap.getElementsByTagName){return[]}var aq=ap.getElementsByTagName(ao);return this.htmlCollectionToArray(aq)},makeNodesUnique:function(ao){var au=[].concat(ao);ao.sort(function(aw,av){if(aw===av){return 0}var ay=M(au,aw);var ax=M(au,av);if(ay===ax){return 0}return ay>ax?-1:1});if(ao.length<=1){return ao}var ap=0;var ar=0;var at=[];var aq;aq=ao[ap++];while(aq){if(aq===ao[ap]){ar=at.push(ap)}aq=ao[ap++]||null}while(ar--){ao.splice(at[ar],1)}return ao},getAttributeValueFromNode:function(at,aq){if(!this.hasNodeAttribute(at,aq)){return}if(at&&at.getAttribute){return at.getAttribute(aq)
+}if(!at||!at.attributes){return}var ar=(typeof at.attributes[aq]);if("undefined"===ar){return}if(at.attributes[aq].value){return at.attributes[aq].value}if(at.attributes[aq].nodeValue){return at.attributes[aq].nodeValue}var ap;var ao=at.attributes;if(!ao){return}for(ap=0;ap<ao.length;ap++){if(ao[ap].nodeName===aq){return ao[ap].nodeValue}}return null},hasNodeAttributeWithValue:function(ap,ao){var aq=this.getAttributeValueFromNode(ap,ao);return !!aq},hasNodeAttribute:function(aq,ao){if(aq&&aq.hasAttribute){return aq.hasAttribute(ao)}if(aq&&aq.attributes){var ap=(typeof aq.attributes[ao]);return"undefined"!==ap}return false},hasNodeCssClass:function(aq,ao){if(aq&&ao&&aq.className){var ap=typeof aq.className==="string"?aq.className.split(" "):[];if(-1!==M(ap,ao)){return true}}return false},findNodesHavingAttribute:function(at,aq,ao){if(!ao){ao=[]}if(!at||!aq){return ao}var ar=P(at);if(!ar||!ar.length){return ao}var ap,au;for(ap=0;ap<ar.length;ap++){au=ar[ap];if(this.hasNodeAttribute(au,aq)){ao.push(au)
+}ao=this.findNodesHavingAttribute(au,aq,ao)}return ao},findFirstNodeHavingAttribute:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeAttribute(aq,ap)){return aq}var ao=this.findNodesHavingAttribute(aq,ap);if(ao&&ao.length){return ao[0]}},findFirstNodeHavingAttributeWithValue:function(ar,aq){if(!ar||!aq){return}if(this.hasNodeAttributeWithValue(ar,aq)){return ar}var ao=this.findNodesHavingAttribute(ar,aq);if(!ao||!ao.length){return}var ap;for(ap=0;ap<ao.length;ap++){if(this.getAttributeValueFromNode(ao[ap],aq)){return ao[ap]}}},findNodesHavingCssClass:function(at,ar,ao){if(!ao){ao=[]}if(!at||!ar){return ao}if(at.getElementsByClassName){var au=at.getElementsByClassName(ar);return this.htmlCollectionToArray(au)}var aq=P(at);if(!aq||!aq.length){return[]}var ap,av;for(ap=0;ap<aq.length;ap++){av=aq[ap];if(this.hasNodeCssClass(av,ar)){ao.push(av)}ao=this.findNodesHavingCssClass(av,ar,ao)}return ao},findFirstNodeHavingClass:function(aq,ap){if(!aq||!ap){return}if(this.hasNodeCssClass(aq,ap)){return aq
+}var ao=this.findNodesHavingCssClass(aq,ap);if(ao&&ao.length){return ao[0]}},isLinkElement:function(ap){if(!ap){return false}var ao=String(ap.nodeName).toLowerCase();var ar=["a","area"];var aq=M(ar,ao);return aq!==-1},setAnyAttribute:function(ap,ao,aq){if(!ap||!ao){return}if(ap.setAttribute){ap.setAttribute(ao,aq)}else{ap[ao]=aq}}};var v={CONTENT_ATTR:"data-track-content",CONTENT_CLASS:"piwikTrackContent",CONTENT_NAME_ATTR:"data-content-name",CONTENT_PIECE_ATTR:"data-content-piece",CONTENT_PIECE_CLASS:"piwikContentPiece",CONTENT_TARGET_ATTR:"data-content-target",CONTENT_TARGET_CLASS:"piwikContentTarget",CONTENT_IGNOREINTERACTION_ATTR:"data-content-ignoreinteraction",CONTENT_IGNOREINTERACTION_CLASS:"piwikContentIgnoreInteraction",location:undefined,findContentNodes:function(){var ap="."+this.CONTENT_CLASS;var ao="["+this.CONTENT_ATTR+"]";var aq=ae.findMultiple([ap,ao]);return aq},findContentNodesWithinNode:function(ar){if(!ar){return[]}var ap=ae.findNodesHavingCssClass(ar,this.CONTENT_CLASS);
+var ao=ae.findNodesHavingAttribute(ar,this.CONTENT_ATTR);if(ao&&ao.length){var aq;for(aq=0;aq<ao.length;aq++){ap.push(ao[aq])}}if(ae.hasNodeAttribute(ar,this.CONTENT_ATTR)){ap.push(ar)}else{if(ae.hasNodeCssClass(ar,this.CONTENT_CLASS)){ap.push(ar)}}ap=ae.makeNodesUnique(ap);return ap},findParentContentNode:function(ap){if(!ap){return}var aq=ap;var ao=0;while(aq&&aq!==G&&aq.parentNode){if(ae.hasNodeAttribute(aq,this.CONTENT_ATTR)){return aq}if(ae.hasNodeCssClass(aq,this.CONTENT_CLASS)){return aq}aq=aq.parentNode;if(ao>1000){break}ao++}},findPieceNode:function(ap){var ao;ao=ae.findFirstNodeHavingAttribute(ap,this.CONTENT_PIECE_ATTR);if(!ao){ao=ae.findFirstNodeHavingClass(ap,this.CONTENT_PIECE_CLASS)}if(ao){return ao}return ap},findTargetNodeNoDefault:function(ao){if(!ao){return}var ap=ae.findFirstNodeHavingAttributeWithValue(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingAttribute(ao,this.CONTENT_TARGET_ATTR);if(ap){return ap}ap=ae.findFirstNodeHavingClass(ao,this.CONTENT_TARGET_CLASS);
+if(ap){return ap}},findTargetNode:function(ao){var ap=this.findTargetNodeNoDefault(ao);if(ap){return ap}return ao},findContentName:function(ap){if(!ap){return}var at=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_NAME_ATTR);if(at){return ae.getAttributeValueFromNode(at,this.CONTENT_NAME_ATTR)}var ao=this.findContentPiece(ap);if(ao){return this.removeDomainIfIsInLink(ao)}if(ae.hasNodeAttributeWithValue(ap,"title")){return ae.getAttributeValueFromNode(ap,"title")}var aq=this.findPieceNode(ap);if(ae.hasNodeAttributeWithValue(aq,"title")){return ae.getAttributeValueFromNode(aq,"title")}var ar=this.findTargetNode(ap);if(ae.hasNodeAttributeWithValue(ar,"title")){return ae.getAttributeValueFromNode(ar,"title")}},findContentPiece:function(ap){if(!ap){return}var ar=ae.findFirstNodeHavingAttributeWithValue(ap,this.CONTENT_PIECE_ATTR);if(ar){return ae.getAttributeValueFromNode(ar,this.CONTENT_PIECE_ATTR)}var ao=this.findPieceNode(ap);var aq=this.findMediaUrlInNode(ao);if(aq){return this.toAbsoluteUrl(aq)
+}},findContentTarget:function(aq){if(!aq){return}var ar=this.findTargetNode(aq);if(ae.hasNodeAttributeWithValue(ar,this.CONTENT_TARGET_ATTR)){return ae.getAttributeValueFromNode(ar,this.CONTENT_TARGET_ATTR)}var ap;if(ae.hasNodeAttributeWithValue(ar,"href")){ap=ae.getAttributeValueFromNode(ar,"href");return this.toAbsoluteUrl(ap)}var ao=this.findPieceNode(aq);if(ae.hasNodeAttributeWithValue(ao,"href")){ap=ae.getAttributeValueFromNode(ao,"href");return this.toAbsoluteUrl(ap)}},isSameDomain:function(ao){if(!ao||!ao.indexOf){return false}if(0===ao.indexOf(this.getLocation().origin)){return true}var ap=ao.indexOf(this.getLocation().host);if(8>=ap&&0<=ap){return true}return false},removeDomainIfIsInLink:function(aq){var ap="^https?://[^/]+";var ao="^.*//[^/]+";if(aq&&aq.search&&-1!==aq.search(new RegExp(ap))&&this.isSameDomain(aq)){aq=aq.replace(new RegExp(ao),"");if(!aq){aq="/"}}return aq},findMediaUrlInNode:function(at){if(!at){return}var aq=["img","embed","video","audio"];var ao=at.nodeName.toLowerCase();
+if(-1!==M(aq,ao)&&ae.findFirstNodeHavingAttributeWithValue(at,"src")){var ar=ae.findFirstNodeHavingAttributeWithValue(at,"src");return ae.getAttributeValueFromNode(ar,"src")}if(ao==="object"&&ae.hasNodeAttributeWithValue(at,"data")){return ae.getAttributeValueFromNode(at,"data")}if(ao==="object"){var au=ae.findNodesByTagName(at,"param");if(au&&au.length){var ap;for(ap=0;ap<au.length;ap++){if("movie"===ae.getAttributeValueFromNode(au[ap],"name")&&ae.hasNodeAttributeWithValue(au[ap],"value")){return ae.getAttributeValueFromNode(au[ap],"value")}}}var av=ae.findNodesByTagName(at,"embed");if(av&&av.length){return this.findMediaUrlInNode(av[0])}}},trim:function(ao){return a(ao)},isOrWasNodeInViewport:function(au){if(!au||!au.getBoundingClientRect||au.nodeType!==1){return true}var at=au.getBoundingClientRect();var ar=G.documentElement||{};var aq=at.top<0;if(aq&&au.offsetTop){aq=(au.offsetTop+at.height)>0}var ap=ar.clientWidth;if(T.innerWidth&&ap>T.innerWidth){ap=T.innerWidth}var ao=ar.clientHeight;
+if(T.innerHeight&&ao>T.innerHeight){ao=T.innerHeight}return((at.bottom>0||aq)&&at.right>0&&at.left<ap&&((at.top<ao)||aq))},isNodeVisible:function(ap){var ao=j(ap);var aq=this.isOrWasNodeInViewport(ap);return ao&&aq},buildInteractionRequestParams:function(ao,ap,aq,ar){var at="";if(ao){at+="c_i="+t(ao)}if(ap){if(at){at+="&"}at+="c_n="+t(ap)}if(aq){if(at){at+="&"}at+="c_p="+t(aq)}if(ar){if(at){at+="&"}at+="c_t="+t(ar)}return at},buildImpressionRequestParams:function(ao,ap,aq){var ar="c_n="+t(ao)+"&c_p="+t(ap);if(aq){ar+="&c_t="+t(aq)}return ar},buildContentBlock:function(aq){if(!aq){return}var ao=this.findContentName(aq);var ap=this.findContentPiece(aq);var ar=this.findContentTarget(aq);ao=this.trim(ao);ap=this.trim(ap);ar=this.trim(ar);return{name:ao||"Unknown",piece:ap||"Unknown",target:ar||""}},collectContent:function(ar){if(!ar||!ar.length){return[]}var aq=[];var ao,ap;for(ao=0;ao<ar.length;ao++){ap=this.buildContentBlock(ar[ao]);if(J(ap)){aq.push(ap)}}return aq},setLocation:function(ao){this.location=ao
+},getLocation:function(){var ao=this.location||T.location;if(!ao.origin){ao.origin=ao.protocol+"//"+ao.hostname+(ao.port?":"+ao.port:"")}return ao},toAbsoluteUrl:function(ap){if((!ap||String(ap)!==ap)&&ap!==""){return ap}if(""===ap){return this.getLocation().href}if(ap.search(/^\/\//)!==-1){return this.getLocation().protocol+ap}if(ap.search(/:\/\//)!==-1){return ap}if(0===ap.indexOf("#")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.indexOf("?")){return this.getLocation().origin+this.getLocation().pathname+ap}if(0===ap.search("^[a-zA-Z]{2,11}:")){return ap}if(ap.search(/^\//)!==-1){return this.getLocation().origin+ap}var ao="(.*/)";var aq=this.getLocation().origin+this.getLocation().pathname.match(new RegExp(ao))[0];return aq+ap},isUrlToCurrentDomain:function(ap){var aq=this.toAbsoluteUrl(ap);if(!aq){return false}var ao=this.getLocation().origin;if(ao===aq){return true}if(0===String(aq).indexOf(ao)){if(":"===String(aq).substr(ao.length,1)){return false}return true
+}return false},setHrefAttribute:function(ap,ao){if(!ap||!ao){return}ae.setAnyAttribute(ap,"href",ao)},shouldIgnoreInteraction:function(aq){var ap=ae.hasNodeAttribute(aq,this.CONTENT_IGNOREINTERACTION_ATTR);var ao=ae.hasNodeCssClass(aq,this.CONTENT_IGNOREINTERACTION_CLASS);return ap||ao}};function O(ap,at){if(at){return at}ap=v.toAbsoluteUrl(ap);if(z(ap,"?")){var ar=ap.indexOf("?");ap=ap.slice(0,ar)}if(R(ap,"matomo.php")){ap=g(ap,"matomo.php".length)}else{if(R(ap,"piwik.php")){ap=g(ap,"piwik.php".length)}else{if(R(ap,".php")){var ao=ap.lastIndexOf("/");var aq=1;ap=ap.slice(0,ao+aq)}}}if(R(ap,"/js/")){ap=g(ap,"js/".length)}return ap}function N(av){var ax="Piwik_Overlay";var ap=new RegExp("index\\.php\\?module=Overlay&action=startOverlaySession&idSite=([0-9]+)&period=([^&]+)&date=([^&]+)(&segment=.*)?$");var aq=ap.exec(G.referrer);if(aq){var at=aq[1];if(at!==String(av)){return false}var au=aq[2],ao=aq[3],ar=aq[4];if(!ar){ar=""}else{if(ar.indexOf("&segment=")===0){ar=ar.substr("&segment=".length)
+}}T.name=ax+"###"+au+"###"+ao+"###"+ar}var aw=T.name.split("###");return aw.length===4&&aw[0]===ax}function Z(ap,aw,ar){var av=T.name.split("###"),au=av[1],ao=av[2],at=av[3],aq=O(ap,aw);o(aq+"plugins/Overlay/client/client.js?v=1",function(){Piwik_Overlay_Client.initialize(aq,ar,au,ao,at)})}function u(){var aq;try{aq=T.frameElement}catch(ap){return true}if(J(aq)){return(aq&&String(aq.nodeName).toLowerCase()==="iframe")?true:false}try{return T.self!==T.top}catch(ao){return true}}function Q(cb,b6){var bF=this,bc="mtm_consent",cH="mtm_consent_removed",b1=aa(G.domain,T.location.href,K()),cQ=L(b1[0]),bK=p(b1[1]),bl=p(b1[2]),cO=false,cf="GET",c6=cf,aH="application/x-www-form-urlencoded; charset=UTF-8",cu=aH,aD=cb||"",bE="",cV="",b3=b6||"",bw="",bL="",a3,bh="",c2=["7z","aac","apk","arc","arj","asf","asx","avi","azw3","bin","csv","deb","dmg","doc","docx","epub","exe","flv","gif","gz","gzip","hqx","ibooks","jar","jpg","jpeg","js","mobi","mp2","mp3","mp4","mpg","mpeg","mov","movie","msi","msp","odb","odf","odg","ods","odt","ogg","ogv","pdf","phps","png","ppt","pptx","qt","qtm","ra","ram","rar","rpm","sea","sit","tar","tbz","tbz2","bz","bz2","tgz","torrent","txt","wav","wma","wmv","wpd","xls","xlsx","xml","z","zip"],ax=[cQ],bx=[],bI=[],a7=[],bG=500,cS=true,cE,a4,bO,c3=1800,bM,ao,co=["pk_campaign","piwik_campaign","utm_campaign","utm_source","utm_medium"],bD=["pk_kwd","piwik_kwd","utm_term"],bi="_pk_",av="pk_vid",aY=180,cT,bn,bP=false,bj=false,cL,bd,bt,cF=33955200000,cm=1800000,c1=15768000000,a1=true,ck=0,bN=false,aP=false,b8,bT={},cj={},bk={},br=200,cW={},c4={},b7=[],cc=false,cy=false,ap=false,c5=false,cI=false,aM=false,bb=u(),cN=null,cU=null,b9,aQ,by,b4=am,bm,aK,cp=0,bs=["id","ses","cvar","ref"],cx=false,bz=null,cG=[],aw=U++;
+try{bh=G.title}catch(cv){bh=""}function da(dl,dj,di,dk,dh,dg){if(bj){return}var df;if(di){df=new Date();df.setTime(df.getTime()+di)}G.cookie=dl+"="+t(dj)+(di?";expires="+df.toGMTString():"")+";path="+(dk||"/")+(dh?";domain="+dh:"")+(dg?";secure":"")+";SameSite=Lax"}function aC(dh){if(bj){return 0}var df=new RegExp("(^|;)[ ]*"+dh+"=([^;]*)"),dg=df.exec(G.cookie);return dg?S(dg[2]):0}bz=!aC(cH);function bZ(df){var dg;df=k(df,av);if(bM){dg=new RegExp("#.*");return df.replace(dg,"")}return df}function bS(dh,df){var di=s(df),dg;if(di){return df}if(df.slice(0,1)==="/"){return s(dh)+"://"+d(dh)+df}dh=bZ(dh);dg=dh.indexOf("?");if(dg>=0){dh=dh.slice(0,dg)}dg=dh.lastIndexOf("/");if(dg!==dh.length-1){dh=dh.slice(0,dg+1)}return dh+df}function cC(dh,df){var dg;dh=String(dh).toLowerCase();df=String(df).toLowerCase();if(dh===df){return true}if(df.slice(0,1)==="."){if(dh===df.slice(1)){return true}dg=dh.length-df.length;if((dg>0)&&(dh.slice(dg)===df)){return true}}return false}function ci(df){var dg=document.createElement("a");
+if(df.indexOf("//")!==0&&df.indexOf("http")!==0){if(df.indexOf("*")===0){df=df.substr(1)}if(df.indexOf(".")===0){df=df.substr(1)}df="http://"+df}dg.href=v.toAbsoluteUrl(df);if(dg.pathname){return dg.pathname}return""}function a2(dg,df){if(!aj(df,"/")){df="/"+df}if(!aj(dg,"/")){dg="/"+dg}var dh=(df==="/"||df==="/*");if(dh){return true}if(dg===df){return true}df=String(df).toLowerCase();dg=String(dg).toLowerCase();if(R(df,"*")){df=df.slice(0,-1);dh=(!df||df==="/");if(dh){return true}if(dg===df){return true}return dg.indexOf(df)===0}if(!R(dg,"/")){dg+="/"}if(!R(df,"/")){df+="/"}return dg.indexOf(df)===0}function ar(dj,dl){var dg,df,dh,di,dk;for(dg=0;dg<ax.length;dg++){di=L(ax[dg]);dk=ci(ax[dg]);if(cC(dj,di)&&a2(dl,dk)){return true}}return false}function aU(di){var dg,df,dh;for(dg=0;dg<ax.length;dg++){df=L(ax[dg].toLowerCase());if(di===df){return true}if(df.slice(0,1)==="."){if(di===df.slice(1)){return true}dh=di.length-df.length;if((dh>0)&&(di.slice(dh)===df)){return true}}}return false}function cn(df,dh){df=df.replace("send_image=0","send_image=1");
+var dg=new Image(1,1);dg.onload=function(){E=0;if(typeof dh==="function"){dh({request:df,trackerUrl:aD,success:true})}};dg.onerror=function(){if(typeof dh==="function"){dh({request:df,trackerUrl:aD,success:false})}};dg.src=aD+(aD.indexOf("?")<0?"?":"&")+df}function aJ(){return"object"===typeof h&&"function"===typeof h.sendBeacon&&"function"===typeof Blob}function a5(di,dm){var dh=aJ();if(!dh){return false}var dl={type:"application/x-www-form-urlencoded; charset=UTF-8"};var dk=false;var dg=aD;try{var df=new Blob([di],dl);if(di.length<=2000){df=new Blob([],dl);dg=dg+(dg.indexOf("?")<0?"?":"&")+di}dk=h.sendBeacon(dg,df)}catch(dj){return false}if(dk&&typeof dm==="function"){dm({request:di,trackerUrl:aD,success:true,isSendBeacon:true})}return dk}function c0(dg,dh,df){if(!J(df)||null===df){df=true}if(m&&a5(dg,dh)){return}setTimeout(function(){if(m&&a5(dg,dh)){return}var dk;try{var dj=T.XMLHttpRequest?new T.XMLHttpRequest():T.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):null;dj.open("POST",aD,true);
+dj.onreadystatechange=function(){if(this.readyState===4&&!(this.status>=200&&this.status<300)){var dl=m&&a5(dg,dh);if(!dl&&df){cn(dg,dh)}else{if(typeof dh==="function"){dh({request:dg,trackerUrl:aD,success:false,xhr:this})}}}else{if(this.readyState===4&&(typeof dh==="function")){dh({request:dg,trackerUrl:aD,success:true,xhr:this})}}};dj.setRequestHeader("Content-Type",cu);dj.withCredentials=true;dj.send(dg)}catch(di){dk=m&&a5(dg,dh);if(!dk&&df){cn(dg,dh)}else{if(typeof dh==="function"){dh({request:dg,trackerUrl:aD,success:false})}}}},50)}function cd(dg){var df=new Date();var dh=df.getTime()+dg;if(!r||dh>r){r=dh}}function cl(df){if(b9||!a4||!bz){return}b9=setTimeout(function dg(){b9=null;if(!bb){bb=(!G.hasFocus||G.hasFocus())}if(!bb){cl(a4);return}if(bO()){return}var dh=new Date(),di=a4-(dh.getTime()-cU);di=Math.min(a4,di);cl(di)},df||a4)}function bH(){if(!b9){return}clearTimeout(b9);b9=null}function a9(){bb=true;cN=new Date().getTime()}function c9(){var df=new Date().getTime();return !cN||(df-cN)>a4
+}function ay(){if(c9()){bO()}bH()}function dc(){if(aM||!a4){return}aM=true;an(T,"focus",a9);an(T,"blur",ay);ab++;e.addPlugin("HeartBeat"+ab,{unload:function(){if(aM&&c9()){bO()}}})}function cz(dj){var dg=new Date();var df=dg.getTime();cU=df;if(cy&&df<cy){var dh=cy-df;setTimeout(dj,dh);cd(dh+50);cy+=50;return}if(cy===false){var di=800;cy=df+di}dj()}function aN(){if(aC(cH)){bz=false}else{if(aC(bc)){bz=true}}}function bC(dg,df,dh){aN();if(!bz){cG.push(dg);return}if(!cL&&dg){if(cx&&bz){dg+="&consent=1"}cz(function(){if(cS&&a5(dg,dh)){cd(100);return}if(c6==="POST"||String(dg).length>2000){c0(dg,dh)}else{cn(dg,dh)}cd(df)})}if(!aM){dc()}}function ch(df){if(cL){return false}return(df&&df.length)}function cZ(df,dj){if(!dj||dj>=df.length){return[df]}var dg=0;var dh=df.length;var di=[];for(dg;dg<dh;dg+=dj){di.push(df.slice(dg,dg+dj))}return di}function db(dg,df){if(!ch(dg)){return}if(!bz){cG.push(dg);return}cz(function(){var dj=cZ(dg,50);var dh=0,di;for(dh;dh<dj.length;dh++){di='{"requests":["?'+dj[dh].join('","?')+'"]}';
+c0(di,null,false)}cd(df)})}function aS(df){return bi+df+"."+b3+"."+bm}function bV(dh,dg,df){da(dh,"",-86400,dg,df)}function b2(){if(bj){return"0"}if(!J(T.showModalDialog)&&J(h.cookieEnabled)){return h.cookieEnabled?"1":"0"}var df=bi+"testcookie";da(df,"1",undefined,bn,cT,bP);var dg=aC(df)==="1"?"1":"0";bV(df);return dg}function bg(){bm=b4((cT||cQ)+(bn||"/")).slice(0,4)}function cD(){if(J(c4.res)){return c4}var dg,di,dj={pdf:"application/pdf",qt:"video/quicktime",realp:"audio/x-pn-realaudio-plugin",wma:"application/x-mplayer2",dir:"application/x-director",fla:"application/x-shockwave-flash",java:"application/x-java-vm",gears:"application/x-googlegears",ag:"application/x-silverlight"};if(!((new RegExp("MSIE")).test(h.userAgent))){if(h.mimeTypes&&h.mimeTypes.length){for(dg in dj){if(Object.prototype.hasOwnProperty.call(dj,dg)){di=h.mimeTypes[dj[dg]];c4[dg]=(di&&di.enabledPlugin)?"1":"0"}}}if(!((new RegExp("Edge[ /](\\d+[\\.\\d]+)")).test(h.userAgent))&&typeof navigator.javaEnabled!=="unknown"&&J(h.javaEnabled)&&h.javaEnabled()){c4.java="1"
+}if(A(T.GearsFactory)){c4.gears="1"}c4.cookie=b2()}var dh=parseInt(X.width,10);var df=parseInt(X.height,10);c4.res=parseInt(dh,10)+"x"+parseInt(df,10);return c4}function bU(){var dg=aS("cvar"),df=aC(dg);if(df.length){df=T.JSON.parse(df);if(W(df)){return df}}return{}}function cA(){if(aP===false){aP=bU()}}function cM(){var df=cD();return b4((h.userAgent||"")+(h.platform||"")+T.JSON.stringify(df)+(new Date()).getTime()+Math.random()).slice(0,16)}function az(){var df=cD();return b4((h.userAgent||"")+(h.platform||"")+T.JSON.stringify(df)).slice(0,6)}function be(){return Math.floor((new Date()).getTime()/1000)}function aI(){var dg=be();var dh=az();var df=String(dg)+dh;return df}function cY(dh){dh=String(dh);var dk=az();var di=dk.length;var dj=dh.substr(-1*di,di);var dg=parseInt(dh.substr(0,dh.length-di),10);if(dg&&dj&&dj===dk){var df=be();if(aY<=0){return true}if(df>=dg&&df<=(dg+aY)){return true}}return false}function dd(df){if(!cI){return""}var dj=f(df,av);if(!dj){return""}dj=String(dj);var dh=new RegExp("^[a-zA-Z0-9]+$");
+if(dj.length===32&&dh.test(dj)){var dg=dj.substr(16,32);if(cY(dg)){var di=dj.substr(0,16);return di}}return""}function cJ(){if(!bL){bL=dd(bK)}var dh=new Date(),df=Math.round(dh.getTime()/1000),dg=aS("id"),dk=aC(dg),dj,di;if(dk){dj=dk.split(".");dj.unshift("0");if(bL.length){dj[1]=bL}return dj}if(bL.length){di=bL}else{if("0"===b2()){di=""}else{di=cM()}}dj=["1",di,df,0,df,"",""];return dj}function aX(){var dm=cJ(),di=dm[0],dj=dm[1],dg=dm[2],df=dm[3],dk=dm[4],dh=dm[5];if(!J(dm[6])){dm[6]=""}var dl=dm[6];return{newVisitor:di,uuid:dj,createTs:dg,visitCount:df,currentVisitTs:dk,lastVisitTs:dh,lastEcommerceOrderTs:dl}}function aG(){var di=new Date(),dg=di.getTime(),dj=aX().createTs;var df=parseInt(dj,10);var dh=(df*1000)+cF-dg;return dh}function aL(df){if(!b3){return}var dh=new Date(),dg=Math.round(dh.getTime()/1000);if(!J(df)){df=aX()}var di=df.uuid+"."+df.createTs+"."+df.visitCount+"."+dg+"."+df.lastVisitTs+"."+df.lastEcommerceOrderTs;da(aS("id"),di,aG(),bn,cT,bP)}function bJ(){var df=aC(aS("ref"));
+if(df.length){try{df=T.JSON.parse(df);if(W(df)){return df}}catch(dg){}}return["","",0,""]}function bu(dg){var df="testvalue";da("test",df,10000,null,dg);if(aC("test")===df){bV("test",null,dg);return true}return false}function aE(){var dg=bj;bj=false;var df,dh;for(df=0;df<bs.length;df++){dh=aS(bs[df]);if(dh!==cH&&dh!==bc&&0!==aC(dh)){bV(dh,bn,cT)}}bj=dg}function b0(df){b3=df;aL()}function de(dj){if(!dj||!W(dj)){return}var di=[];var dh;for(dh in dj){if(Object.prototype.hasOwnProperty.call(dj,dh)){di.push(dh)}}var dk={};di.sort();var df=di.length;var dg;for(dg=0;dg<df;dg++){dk[di[dg]]=dj[di[dg]]}return dk}function ca(){da(aS("ses"),"1",cm,bn,cT,bP)}function bf(){var di="";var dg="abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";var dh=dg.length;var df;for(df=0;df<6;df++){di+=dg.charAt(Math.floor(Math.random()*dh))}return di}function cq(dh,dD,dE,di){var dC,dg=new Date(),dq=Math.round(dg.getTime()/1000),dm,dB,dj=1024,dK,dr,dz=aP,dk=aS("ses"),dx=aS("ref"),du=aS("cvar"),dv=aC(dk),dA=bJ(),dG=a3||bK,dn,df;
+if(bj){aE()}if(cL){return""}var dw=aX();if(!J(di)){di=""}var dt=G.characterSet||G.charset;if(!dt||dt.toLowerCase()==="utf-8"){dt=null}dn=dA[0];df=dA[1];dm=dA[2];dB=dA[3];if(!dv){var dF=cm/1000;if(!dw.lastVisitTs||(dq-dw.lastVisitTs)>dF){dw.visitCount++;dw.lastVisitTs=dw.currentVisitTs}if(!bt||!dn.length){for(dC in co){if(Object.prototype.hasOwnProperty.call(co,dC)){dn=f(dG,co[dC]);if(dn.length){break}}}for(dC in bD){if(Object.prototype.hasOwnProperty.call(bD,dC)){df=f(dG,bD[dC]);if(df.length){break}}}}dK=d(bl);dr=dB.length?d(dB):"";if(dK.length&&!aU(dK)&&(!bt||!dr.length||aU(dr))){dB=bl}if(dB.length||dn.length){dm=dq;dA=[dn,df,dm,bZ(dB.slice(0,dj))];da(dx,T.JSON.stringify(dA),c1,bn,cT,bP)}}dh+="&idsite="+b3+"&rec=1&r="+String(Math.random()).slice(2,8)+"&h="+dg.getHours()+"&m="+dg.getMinutes()+"&s="+dg.getSeconds()+"&url="+t(bZ(dG))+(bl.length?"&urlref="+t(bZ(bl)):"")+((bw&&bw.length)?"&uid="+t(bw):"")+"&_id="+dw.uuid+"&_idts="+dw.createTs+"&_idvc="+dw.visitCount+"&_idn="+dw.newVisitor+(dn.length?"&_rcn="+t(dn):"")+(df.length?"&_rck="+t(df):"")+"&_refts="+dm+"&_viewts="+dw.lastVisitTs+(String(dw.lastEcommerceOrderTs).length?"&_ects="+dw.lastEcommerceOrderTs:"")+(String(dB).length?"&_ref="+t(bZ(dB.slice(0,dj))):"")+(dt?"&cs="+t(dt):"")+"&send_image=0";
+var dJ=cD();for(dC in dJ){if(Object.prototype.hasOwnProperty.call(dJ,dC)){dh+="&"+dC+"="+dJ[dC]}}var dI=[];if(dD){for(dC in dD){if(Object.prototype.hasOwnProperty.call(dD,dC)&&/^dimension\d+$/.test(dC)){var dl=dC.replace("dimension","");dI.push(parseInt(dl,10));dI.push(String(dl));dh+="&"+dC+"="+t(dD[dC]);delete dD[dC]}}}if(dD&&B(dD)){dD=null}for(dC in bk){if(Object.prototype.hasOwnProperty.call(bk,dC)){var ds=(-1===M(dI,dC));if(ds){dh+="&dimension"+dC+"="+t(bk[dC])}}}if(dD){dh+="&data="+t(T.JSON.stringify(dD))}else{if(ao){dh+="&data="+t(T.JSON.stringify(ao))}}function dp(dL,dM){var dN=T.JSON.stringify(dL);if(dN.length>2){return"&"+dM+"="+t(dN)}return""}var dH=de(bT);var dy=de(cj);dh+=dp(dH,"cvar");dh+=dp(dy,"e_cvar");if(aP){dh+=dp(aP,"_cvar");for(dC in dz){if(Object.prototype.hasOwnProperty.call(dz,dC)){if(aP[dC][0]===""||aP[dC][1]===""){delete aP[dC]}}}if(bN){da(du,T.JSON.stringify(aP),cm,bn,cT,bP)}}if(a1){if(ck){dh+="&gt_ms="+ck}else{if(i&&i.timing&&i.timing.requestStart&&i.timing.responseEnd){dh+="&gt_ms="+(i.timing.responseEnd-i.timing.requestStart)
+}}}if(aK){dh+="&pv_id="+aK}dw.lastEcommerceOrderTs=J(di)&&String(di).length?di:dw.lastEcommerceOrderTs;aL(dw);ca();dh+=ac(dE,{tracker:bF,request:dh});if(cV.length){dh+="&"+cV}if(A(b8)){dh=b8(dh)}return dh}bO=function a6(){var df=new Date();df=df.getTime();if(!cU){return false}if((cU+(1000*c3))<=df){return false}if(cU+a4<=df){bF.ping();return true}return false};function bo(di,dh,dn,dj,df,dr){var dl="idgoal=0",dm,dg=new Date(),dp=[],dq,dk=String(di).length;if(dk){dl+="&ec_id="+t(di);dm=Math.round(dg.getTime()/1000)}dl+="&revenue="+dh;if(String(dn).length){dl+="&ec_st="+dn}if(String(dj).length){dl+="&ec_tx="+dj}if(String(df).length){dl+="&ec_sh="+df}if(String(dr).length){dl+="&ec_dt="+dr}if(cW){for(dq in cW){if(Object.prototype.hasOwnProperty.call(cW,dq)){if(!J(cW[dq][1])){cW[dq][1]=""}if(!J(cW[dq][2])){cW[dq][2]=""}if(!J(cW[dq][3])||String(cW[dq][3]).length===0){cW[dq][3]=0}if(!J(cW[dq][4])||String(cW[dq][4]).length===0){cW[dq][4]=1}dp.push(cW[dq])}}dl+="&ec_items="+t(T.JSON.stringify(dp))
+}dl=cq(dl,ao,"ecommerce",dm);bC(dl,bG);if(dk){cW={}}}function bW(df,dj,di,dh,dg,dk){if(String(df).length&&J(dj)){bo(df,dj,di,dh,dg,dk)}}function bq(df){if(J(df)){bo("",df,"","","","")}}function bX(dg,di,dh){aK=bf();var df=cq("action_name="+t(al(dg||bh)),di,"log");bC(df,bG,dh)}function aZ(dh,dg){var di,df="(^| )(piwik[_-]"+dg;if(dh){for(di=0;di<dh.length;di++){df+="|"+dh[di]}}df+=")( |$)";return new RegExp(df)}function aT(df){return(aD&&df&&0===String(df).indexOf(aD))}function cs(dj,df,dk,dg){if(aT(df)){return 0}var di=aZ(bI,"download"),dh=aZ(a7,"link"),dl=new RegExp("\\.("+c2.join("|")+")([?&#]|$)","i");if(dh.test(dj)){return"link"}if(dg||di.test(dj)||dl.test(df)){return"download"}if(dk){return 0}return"link"}function au(dg){var df;df=dg.parentNode;while(df!==null&&J(df)){if(ae.isLinkElement(dg)){break}dg=df;df=dg.parentNode}return dg}function c8(dk){dk=au(dk);if(!ae.hasNodeAttribute(dk,"href")){return}if(!J(dk.href)){return}var dj=ae.getAttributeValueFromNode(dk,"href");var dg=dk.pathname||ci(dk.href);
+var dl=dk.hostname||d(dk.href);var dm=dl.toLowerCase();var dh=dk.href.replace(dl,dm);var di=new RegExp("^(javascript|vbscript|jscript|mocha|livescript|ecmascript|mailto|tel):","i");if(!di.test(dh)){var df=cs(dk.className,dh,ar(dm,dg),ae.hasNodeAttribute(dk,"download"));if(df){return{type:df,href:dh}}}}function aO(df,dg,dh,di){var dj=v.buildInteractionRequestParams(df,dg,dh,di);if(!dj){return}return cq(dj,null,"contentInteraction")}function ba(df,dg){if(!df||!dg){return false}var dh=v.findTargetNode(df);if(v.shouldIgnoreInteraction(dh)){return false}dh=v.findTargetNodeNoDefault(df);if(dh&&!V(dh,dg)){return false}return true}function cr(dh,dg,dj){if(!dh){return}var df=v.findParentContentNode(dh);if(!df){return}if(!ba(df,dh)){return}var di=v.buildContentBlock(df);if(!di){return}if(!di.target&&dj){di.target=dj}return v.buildInteractionRequestParams(dg,di.name,di.piece,di.target)}function aV(dg){if(!b7||!b7.length){return false}var df,dh;for(df=0;df<b7.length;df++){dh=b7[df];if(dh&&dh.name===dg.name&&dh.piece===dg.piece&&dh.target===dg.target){return true
+}}return false}function aW(df){return function(dj){if(!df){return}var dh=v.findParentContentNode(df);var dg;if(dj){dg=dj.target||dj.srcElement}if(!dg){dg=df}if(!ba(dh,dg)){return}if(!dh){return false}var dk=v.findTargetNode(dh);if(!dk||v.shouldIgnoreInteraction(dk)){return false}var di=c8(dk);if(c5&&di&&di.type){return di.type}return bF.trackContentInteractionNode(dg,"click")}}function bY(dh){if(!dh||!dh.length){return}var df,dg;for(df=0;df<dh.length;df++){dg=v.findTargetNode(dh[df]);if(dg&&!dg.contentInteractionTrackingSetupDone){dg.contentInteractionTrackingSetupDone=true;an(dg,"click",aW(dg))}}}function bv(dh,di){if(!dh||!dh.length){return[]}var df,dg;for(df=0;df<dh.length;df++){if(aV(dh[df])){dh.splice(df,1);df--}else{b7.push(dh[df])}}if(!dh||!dh.length){return[]}bY(di);var dj=[];for(df=0;df<dh.length;df++){dg=cq(v.buildImpressionRequestParams(dh[df].name,dh[df].piece,dh[df].target),undefined,"contentImpressions");if(dg){dj.push(dg)}}return dj}function cw(dg){var df=v.collectContent(dg);
+return bv(df,dg)}function a8(dg){if(!dg||!dg.length){return[]}var df;for(df=0;df<dg.length;df++){if(!v.isNodeVisible(dg[df])){dg.splice(df,1);df--}}if(!dg||!dg.length){return[]}return cw(dg)}function aF(dh,df,dg){var di=v.buildImpressionRequestParams(dh,df,dg);return cq(di,null,"contentImpression")}function c7(di,dg){if(!di){return}var df=v.findParentContentNode(di);var dh=v.buildContentBlock(df);if(!dh){return}if(!dg){dg="Unknown"}return aO(dg,dh.name,dh.piece,dh.target)}function cK(dg,di,df,dh){return"e_c="+t(dg)+"&e_a="+t(di)+(J(df)?"&e_n="+t(df):"")+(J(dh)?"&e_v="+t(dh):"")}function at(dh,dj,df,di,dl,dk){if(a(String(dh)).length===0||a(String(dj)).length===0){ak("Error while logging event: Parameters `category` and `action` must not be empty or filled with whitespaces");return false}var dg=cq(cK(dh,dj,df,di),dl,"event");bC(dg,bG,dk)}function b5(df,di,dg,dj){var dh=cq("search="+t(df)+(di?"&search_cat="+t(di):"")+(J(dg)?"&search_count="+dg:""),dj,"sitesearch");bC(dh,bG)}function cP(df,dj,di,dh){var dg=cq("idgoal="+df+(dj?"&revenue="+dj:""),di,"goal");
+bC(dg,bG,dh)}function cX(di,df,dm,dl,dh){var dk=df+"="+t(bZ(di));var dg=cr(dh,"click",di);if(dg){dk+="&"+dg}var dj=cq(dk,dm,"link");bC(dj,bG,dl)}function bR(dg,df){if(dg!==""){return dg+df.charAt(0).toUpperCase()+df.slice(1)}return df}function ce(dk){var dj,df,di=["","webkit","ms","moz"],dh;if(!bd){for(df=0;df<di.length;df++){dh=di[df];if(Object.prototype.hasOwnProperty.call(G,bR(dh,"hidden"))){if(G[bR(dh,"visibilityState")]==="prerender"){dj=true}break}}}if(dj){an(G,dh+"visibilitychange",function dg(){G.removeEventListener(dh+"visibilitychange",dg,false);dk()});return}dk()}function bp(){var dg=aX().uuid;var df=aI();return dg+df}function cg(df){if(!df){return}if(!ae.hasNodeAttribute(df,"href")){return}var dg=ae.getAttributeValueFromNode(df,"href");if(!dg||aT(dg)){return}dg=k(dg,av);var dh=bp();dg=F(dg,av,dh);ae.setAnyAttribute(df,"href",dg)}function aA(di){var dj=ae.getAttributeValueFromNode(di,"href");if(!dj){return false}dj=String(dj);var dg=dj.indexOf("//")===0||dj.indexOf("http://")===0||dj.indexOf("https://")===0;
+if(!dg){return false}var df=di.pathname||ci(di.href);var dh=(di.hostname||d(di.href)).toLowerCase();if(ar(dh,df)){if(!cC(cQ,L(dh))){return true}return false}return false}function cB(df){var dg=c8(df);if(dg&&dg.type){dg.href=p(dg.href);cX(dg.href,dg.type,undefined,null,df);return}if(cI){df=au(df);if(aA(df)){cg(df)}}}function ct(){return G.all&&!G.addEventListener}function cR(df){var dh=df.which;var dg=(typeof df.button);if(!dh&&dg!=="undefined"){if(ct()){if(df.button&1){dh=1}else{if(df.button&2){dh=3}else{if(df.button&4){dh=2}}}}else{if(df.button===0||df.button==="0"){dh=1}else{if(df.button&1){dh=2}else{if(df.button&2){dh=3}}}}}return dh}function bQ(df){switch(cR(df)){case 1:return"left";case 2:return"middle";case 3:return"right"}}function a0(df){return df.target||df.srcElement}function aB(df){return function(di){di=di||T.event;var dh=bQ(di);var dj=a0(di);if(di.type==="click"){var dg=false;if(df&&dh==="middle"){dg=true}if(dj&&!dg){cB(dj)}}else{if(di.type==="mousedown"){if(dh==="middle"&&dj){aQ=dh;
+by=dj}else{aQ=by=null}}else{if(di.type==="mouseup"){if(dh===aQ&&dj===by){cB(dj)}aQ=by=null}else{if(di.type==="contextmenu"){cB(dj)}}}}}}function aq(dh,dg){var df=typeof dg;if(df==="undefined"){dg=true}an(dh,"click",aB(dg),false);if(dg){an(dh,"mouseup",aB(dg),false);an(dh,"mousedown",aB(dg),false);an(dh,"contextmenu",aB(dg),false)}}function bB(dh,dj){ap=true;var di,dg=aZ(bx,"ignore"),dk=G.links,df=null,dl=null;if(dk){for(di=0;di<dk.length;di++){df=dk[di];if(!dg.test(df.className)){dl=typeof df.piwikTrackers;if("undefined"===dl){df.piwikTrackers=[]}if(-1===M(df.piwikTrackers,dj)){df.piwikTrackers.push(dj);aq(df,dh)}}}}}function aR(dg,dj,dk){if(cc){return true}cc=true;var dl=false;var di,dh;function df(){dl=true}n(function(){function dm(dp){setTimeout(function(){if(!cc){return}dl=false;dk.trackVisibleContentImpressions();dm(dp)},dp)}function dn(dp){setTimeout(function(){if(!cc){return}if(dl){dl=false;dk.trackVisibleContentImpressions()}dn(dp)},dp)}if(dg){di=["scroll","resize"];for(dh=0;dh<di.length;
+dh++){if(G.addEventListener){G.addEventListener(di[dh],df,false)}else{T.attachEvent("on"+di[dh],df)}}dn(100)}if(dj&&dj>0){dj=parseInt(dj,10);dm(dj)}})}var bA={enabled:true,requests:[],timeout:null,interval:2500,sendRequests:function(){var df=this.requests;this.requests=[];if(df.length===1){bC(df[0],bG)}else{db(df,bG)}},push:function(df){if(!df){return}if(m||!this.enabled){bC(df,bG);return}bA.requests.push(df);if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.timeout=setTimeout(function(){bA.timeout=null;bA.sendRequests()},bA.interval);var dg="RequestQueue"+aw;if(!Object.prototype.hasOwnProperty.call(b,dg)){b[dg]={unload:function(){if(bA.timeout){clearTimeout(bA.timeout)}bA.sendRequests()}}}}};bg();aL();this.hasConsent=function(){return bz};this.getVisitorId=function(){return aX().uuid};this.getVisitorInfo=function(){return cJ()};this.getAttributionInfo=function(){return bJ()};this.getAttributionCampaignName=function(){return bJ()[0]};this.getAttributionCampaignKeyword=function(){return bJ()[1]
+};this.getAttributionReferrerTimestamp=function(){return bJ()[2]};this.getAttributionReferrerUrl=function(){return bJ()[3]};this.setTrackerUrl=function(df){aD=df};this.getTrackerUrl=function(){return aD};this.getPiwikUrl=function(){return O(this.getTrackerUrl(),bE)};this.addTracker=function(df,dh){if(!J(df)||null===df){df=this.getTrackerUrl()}var dg=new Q(df,dh);I.push(dg);e.trigger("TrackerAdded",[this]);return dg};this.getSiteId=function(){return b3};this.setSiteId=function(df){b0(df)};this.resetUserId=function(){bw=""};this.setUserId=function(df){if(Y(df)){bw=df}};this.getUserId=function(){return bw};this.setCustomData=function(df,dg){if(W(df)){ao=df}else{if(!ao){ao={}}ao[df]=dg}};this.getCustomData=function(){return ao};this.setCustomRequestProcessing=function(df){b8=df};this.appendToTrackingUrl=function(df){cV=df};this.getRequest=function(df){return cq(df)};this.addPlugin=function(df,dg){b[df]=dg};this.setCustomDimension=function(df,dg){df=parseInt(df,10);if(df>0){if(!J(dg)){dg=""}if(!w(dg)){dg=String(dg)
+}bk[df]=dg}};this.getCustomDimension=function(df){df=parseInt(df,10);if(df>0&&Object.prototype.hasOwnProperty.call(bk,df)){return bk[df]}};this.deleteCustomDimension=function(df){df=parseInt(df,10);if(df>0){delete bk[df]}};this.setCustomVariable=function(dg,df,dj,dh){var di;if(!J(dh)){dh="visit"}if(!J(df)){return}if(!J(dj)){dj=""}if(dg>0){df=!w(df)?String(df):df;dj=!w(dj)?String(dj):dj;di=[df.slice(0,br),dj.slice(0,br)];if(dh==="visit"||dh===2){cA();aP[dg]=di}else{if(dh==="page"||dh===3){bT[dg]=di}else{if(dh==="event"){cj[dg]=di}}}}};this.getCustomVariable=function(dg,dh){var df;if(!J(dh)){dh="visit"}if(dh==="page"||dh===3){df=bT[dg]}else{if(dh==="event"){df=cj[dg]}else{if(dh==="visit"||dh===2){cA();df=aP[dg]}}}if(!J(df)||(df&&df[0]==="")){return false}return df};this.deleteCustomVariable=function(df,dg){if(this.getCustomVariable(df,dg)){this.setCustomVariable(df,"","",dg)}};this.deleteCustomVariables=function(df){if(df==="page"||df===3){bT={}}else{if(df==="event"){cj={}}else{if(df==="visit"||df===2){aP={}
+}}}};this.storeCustomVariablesInCookie=function(){bN=true};this.setLinkTrackingTimer=function(df){bG=df};this.getLinkTrackingTimer=function(){return bG};this.setDownloadExtensions=function(df){if(w(df)){df=df.split("|")}c2=df};this.addDownloadExtensions=function(dg){var df;if(w(dg)){dg=dg.split("|")}for(df=0;df<dg.length;df++){c2.push(dg[df])}};this.removeDownloadExtensions=function(dh){var dg,df=[];if(w(dh)){dh=dh.split("|")}for(dg=0;dg<c2.length;dg++){if(M(dh,c2[dg])===-1){df.push(c2[dg])}}c2=df};this.setDomains=function(df){ax=w(df)?[df]:df;var dj=false,dh=0,dg;for(dh;dh<ax.length;dh++){dg=String(ax[dh]);if(cC(cQ,L(dg))){dj=true;break}var di=ci(dg);if(di&&di!=="/"&&di!=="/*"){dj=true;break}}if(!dj){ax.push(cQ)}};this.enableCrossDomainLinking=function(){cI=true};this.disableCrossDomainLinking=function(){cI=false};this.isCrossDomainLinkingEnabled=function(){return cI};this.setCrossDomainLinkingTimeout=function(df){aY=df};this.getCrossDomainLinkingUrlParameter=function(){return t(av)+"="+t(bp())
+};this.setIgnoreClasses=function(df){bx=w(df)?[df]:df};this.setRequestMethod=function(df){c6=df||cf};this.setRequestContentType=function(df){cu=df||aH};this.setReferrerUrl=function(df){bl=df};this.setCustomUrl=function(df){a3=bS(bK,df)};this.getCurrentUrl=function(){return a3||bK};this.setDocumentTitle=function(df){bh=df};this.setAPIUrl=function(df){bE=df};this.setDownloadClasses=function(df){bI=w(df)?[df]:df};this.setLinkClasses=function(df){a7=w(df)?[df]:df};this.setCampaignNameKey=function(df){co=w(df)?[df]:df};this.setCampaignKeywordKey=function(df){bD=w(df)?[df]:df};this.discardHashTag=function(df){bM=df};this.setCookieNamePrefix=function(df){bi=df;aP=bU()};this.setCookieDomain=function(df){var dg=L(df);if(bu(dg)){cT=dg;bg()}};this.getCookieDomain=function(){return cT};this.hasCookies=function(){return"1"===b2()};this.setSessionCookie=function(dh,dg,df){if(!dh){throw new Error("Missing cookie name")}if(!J(df)){df=cm}bs.push(dh);da(aS(dh),dg,df,bn,cT)};this.getCookie=function(dg){var df=aC(aS(dg));
+if(df===0){return null}return df};this.setCookiePath=function(df){bn=df;bg()};this.getCookiePath=function(df){return bn};this.setVisitorCookieTimeout=function(df){cF=df*1000};this.setSessionCookieTimeout=function(df){cm=df*1000};this.getSessionCookieTimeout=function(){return cm};this.setReferralCookieTimeout=function(df){c1=df*1000};this.setConversionAttributionFirstReferrer=function(df){bt=df};this.setSecureCookie=function(df){bP=df};this.disableCookies=function(){bj=true;c4.cookie="0";if(b3){aE()}};this.deleteCookies=function(){aE()};this.setDoNotTrack=function(dg){var df=h.doNotTrack||h.msDoNotTrack;cL=dg&&(df==="yes"||df==="1");if(cL){this.disableCookies()}};this.alwaysUseSendBeacon=function(){cS=true};this.disableAlwaysUseSendBeacon=function(){cS=false};this.addListener=function(dg,df){aq(dg,df)};this.enableLinkTracking=function(dg){c5=true;var df=this;ce(function(){q(function(){bB(dg,df)})})};this.enableJSErrorTracking=function(){if(cO){return}cO=true;var df=T.onerror;T.onerror=function(dk,di,dh,dj,dg){ce(function(){var dl="JavaScript Errors";
+var dm=di+":"+dh;if(dj){dm+=":"+dj}at(dl,dm,dk)});if(df){return df(dk,di,dh,dj,dg)}return false}};this.disablePerformanceTracking=function(){a1=false};this.setGenerationTimeMs=function(df){ck=parseInt(df,10)};this.setVisitStandardLength=function(df){df=Math.max(df,5);c3=df};this.enableHeartBeatTimer=function(df){df=Math.max(df,5);a4=(df||15)*1000;if(cU!==null){dc()}};this.disableHeartBeatTimer=function(){bH();if(a4||aM){if(T.removeEventListener){T.removeEventListener("focus",a9);T.removeEventListener("blur",ay)}else{if(T.detachEvent){T.detachEvent("onfocus",a9);T.detachEvent("onblur",ay)}}}a4=null;aM=false};this.killFrame=function(){if(T.location!==T.top.location){T.top.location=T.location}};this.redirectFile=function(df){if(T.location.protocol==="file:"){T.location=df}};this.setCountPreRendered=function(df){bd=df};this.trackGoal=function(df,di,dh,dg){ce(function(){cP(df,di,dh,dg)})};this.trackLink=function(dg,df,di,dh){ce(function(){cX(dg,df,di,dh)})};this.getNumTrackedPageViews=function(){return cp
+};this.trackPageView=function(df,dh,dg){b7=[];cG=[];if(N(b3)){ce(function(){Z(aD,bE,b3)})}else{ce(function(){cp++;bX(df,dh,dg)})}};this.trackAllContentImpressions=function(){if(N(b3)){return}ce(function(){q(function(){var df=v.findContentNodes();var dg=cw(df);db(dg,bG)})})};this.trackVisibleContentImpressions=function(df,dg){if(N(b3)){return}if(!J(df)){df=true}if(!J(dg)){dg=750}aR(df,dg,this);ce(function(){n(function(){var dh=v.findContentNodes();var di=a8(dh);db(di,bG)})})};this.trackContentImpression=function(dh,df,dg){if(N(b3)){return}dh=a(dh);df=a(df);dg=a(dg);if(!dh){return}df=df||"Unknown";ce(function(){var di=aF(dh,df,dg);bC(di,bG)})};this.trackContentImpressionsWithinNode=function(df){if(N(b3)||!df){return}ce(function(){if(cc){n(function(){var dg=v.findContentNodesWithinNode(df);var dh=a8(dg);db(dh,bG)})}else{q(function(){var dg=v.findContentNodesWithinNode(df);var dh=cw(dg);db(dh,bG)})}})};this.trackContentInteraction=function(dh,di,df,dg){if(N(b3)){return}dh=a(dh);di=a(di);df=a(df);
+dg=a(dg);if(!dh||!di){return}df=df||"Unknown";ce(function(){var dj=aO(dh,di,df,dg);if(dj){bC(dj,bG)}})};this.trackContentInteractionNode=function(dh,dg){if(N(b3)||!dh){return}var df=null;ce(function(){df=c7(dh,dg);if(df){bC(df,bG)}});return df};this.logAllContentBlocksOnPage=function(){var dh=v.findContentNodes();var df=v.collectContent(dh);var dg=typeof console;if(dg!=="undefined"&&console&&console.log){console.log(df)}};this.trackEvent=function(dg,di,df,dh,dk,dj){ce(function(){at(dg,di,df,dh,dk,dj)})};this.trackSiteSearch=function(df,dh,dg,di){b7=[];ce(function(){b5(df,dh,dg,di)})};this.setEcommerceView=function(di,df,dh,dg){if(Y(dh)){dh=String(dh)}if(!J(dh)||dh===null||dh===false||!dh.length){dh=""}else{if(dh instanceof Array){dh=T.JSON.stringify(dh)}}bT[5]=["_pkc",dh];if(J(dg)&&dg!==null&&dg!==false&&String(dg).length){bT[2]=["_pkp",dg]}if(!Y(di)&&!Y(df)){return}if(Y(di)){bT[3]=["_pks",di]}if(!Y(df)){df=""}bT[4]=["_pkn",df]};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(cW))
+};this.addEcommerceItem=function(dj,df,dh,dg,di){if(Y(dj)){cW[dj]=[String(dj),df,dh,dg,di]}};this.removeEcommerceItem=function(df){if(Y(df)){df=String(df);delete cW[df]}};this.clearEcommerceCart=function(){cW={}};this.trackEcommerceOrder=function(df,dj,di,dh,dg,dk){bW(df,dj,di,dh,dg,dk)};this.trackEcommerceCartUpdate=function(df){bq(df)};this.trackRequest=function(dg,di,dh,df){ce(function(){var dj=cq(dg,di,df);bC(dj,bG,dh)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bA.enabled=false};this.setRequestQueueInterval=function(df){if(df<1000){throw new Error("Request queue interval needs to be at least 1000ms")}bA.interval=df};this.queueRequest=function(df){ce(function(){var dg=cq(df);bA.push(dg)})};this.isConsentRequired=function(){return cx};this.getRememberedConsent=function(){var df=aC(bc);if(aC(cH)){if(df){bV(bc,bn,cT)}return null}if(!df||df===0){return null}return df};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()
+};this.requireConsent=function(){cx=true;bz=this.hasRememberedConsent();x++;b["CoreConsent"+x]={unload:function(){if(!bz){aE()}}}};this.setConsentGiven=function(){bz=true;bV(cH,bn,cT);var dg,df;for(dg=0;dg<cG.length;dg++){df=typeof cG[dg];if(df==="string"){bC(cG[dg],bG)}else{if(df==="object"){db(cG[dg],bG)}}}cG=[]};this.rememberConsentGiven=function(dg){if(dg){dg=dg*60*60*1000}else{dg=30*365*24*60*60*1000}this.setConsentGiven();var df=new Date().getTime();da(bc,df,dg,bn,cT,bP)};this.forgetConsentGiven=function(){var df=30*365*24*60*60*1000;bV(bc,bn,cT);da(cH,new Date().getTime(),df,bn,cT,bP);this.requireConsent()};this.isUserOptedOut=function(){return !bz};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=this.rememberConsentGiven;e.trigger("TrackerSetup",[this])}function H(){return{push:af}}function c(au,at){var av={};var aq,ar;for(aq=0;aq<at.length;aq++){var ao=at[aq];av[ao]=1;for(ar=0;ar<au.length;ar++){if(au[ar]&&au[ar][0]){var ap=au[ar][0];if(ao===ap){af(au[ar]);delete au[ar];
if(av[ap]>1&&ap!=="addTracker"){ak("The method "+ap+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Piwik trackers documentation: https://developer.piwik.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}av[ap]++}}}}return au}var C=["addTracker","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setSiteId","alwaysUseSendBeacon","enableLinkTracking","requireConsent","setConsentGiven"];function ad(ao,aq){var ap=new Q(ao,aq);I.push(ap);_paq=c(_paq,C);for(E=0;E<_paq.length;E++){if(_paq[E]){af(_paq[E])}}_paq=new H();e.trigger("TrackerAdded",[ap]);return ap}an(T,"beforeunload",ai,false);an(T,"message",function(au){if(!au||!au.origin){return}var aw,ar,ap;var ax=d(au.origin);var at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){ap=d(at[ar].getPiwikUrl());
-if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:JSON_PIWIK,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
+if(ap===ax){aw=at[ar];break}}if(!aw){return}var aq=null;try{aq=JSON.parse(au.data)}catch(av){return}if(!aq){return}function ao(aA){var aC=G.getElementsByTagName("iframe");for(ar=0;ar<aC.length;ar++){var aB=aC[ar];var ay=d(aB.src);if(aB.contentWindow&&J(aB.contentWindow.postMessage)&&ay===ax){var az=JSON.stringify(aA);aB.contentWindow.postMessage(az,"*")}}}if(J(aq.maq_initial_value)){ao({maq_opted_in:aq.maq_initial_value&&aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}else{if(J(aq.maq_opted_in)){at=e.getAsyncTrackers();for(ar=0;ar<at.length;ar++){aw=at[ar];if(aq.maq_opted_in){aw.rememberConsentGiven()}else{aw.forgetConsentGiven()}}ao({maq_confirm_opted_in:aw.hasConsent(),maq_url:aw.getPiwikUrl(),maq_optout_by_default:aw.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;e={initialized:false,JSON:T.JSON,DOM:{addEventListener:function(ar,aq,ap,ao){var at=typeof ao;if(at==="undefined"){ao=false}an(ar,aq,ap,ao)},onLoad:n,onReady:q,isNodeVisible:j,isOrWasNodeVisible:v.isNodeVisible},on:function(ap,ao){if(!y[ap]){y[ap]=[]
}y[ap].push(ao)},off:function(aq,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){if(y[aq][ao]===ap){y[aq].splice(ao,1)}}},trigger:function(aq,ar,ap){if(!y[aq]){return}var ao=0;for(ao;ao<y[aq].length;ao++){y[aq][ao].apply(ap||T,ar)}},addPlugin:function(ao,ap){b[ao]=ap},getTracker:function(ao,ap){if(!J(ap)){ap=this.getAsyncTracker().getSiteId()}if(!J(ao)){ao=this.getAsyncTracker().getTrackerUrl()}return new Q(ao,ap)},getAsyncTrackers:function(){return I},addTracker:function(ao,aq){var ap;if(!I.length){ap=ad(ao,aq)}else{ap=I[0].addTracker(ao,aq)}return ap},getAsyncTracker:function(ap,at){var ar;if(I&&I.length&&I[0]){ar=I[0]}else{return ad(ap,at)}if(!at&&!ap){return ar}if((!J(at)||null===at)&&ar){at=ar.getSiteId()}if((!J(ap)||null===ap)&&ar){ap=ar.getTrackerUrl()}var aq,ao=0;for(ao;ao<I.length;ao++){aq=I[ao];if(aq&&String(aq.getSiteId())===String(at)&&aq.getTrackerUrl()===ap){return aq}}},retryMissedPluginCalls:function(){var ap=ah;ah=[];var ao=0;for(ao;ao<ap.length;ao++){af(ap[ao])
}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return e});define("matomo",[],function(){return e})}return e}())}
/*!!! pluginTrackerHook */
diff --git a/piwik.php b/piwik.php
index 90c4412fb1..8cd415c0cd 100644
--- a/piwik.php
+++ b/piwik.php
@@ -46,7 +46,6 @@ require_once PIWIK_INCLUDE_PATH . '/core/SettingsPiwik.php';
require_once PIWIK_INCLUDE_PATH . '/core/SettingsServer.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker.php';
require_once PIWIK_INCLUDE_PATH . '/core/Config.php';
-require_once PIWIK_INCLUDE_PATH . '/core/Translate.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/Cache.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/Request.php';
require_once PIWIK_INCLUDE_PATH . '/core/Cookie.php';
diff --git a/plugins/API/API.php b/plugins/API/API.php
index f84c95f443..299bfc2a50 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -748,7 +748,7 @@ class API extends \Piwik\Plugin\API
{
// If you update this, also update flattenVisitorDetailsArray
$segmentsNeedActionsInfo = array('visitConvertedGoalId',
- 'pageUrl', 'pageTitle', 'siteSearchKeyword',
+ 'pageUrl', 'pageTitle', 'siteSearchKeyword', 'siteSearchCategory', 'siteSearchCount',
'entryPageTitle', 'entryPageUrl', 'exitPageTitle', 'exitPageUrl',
'outlinkUrl', 'downloadUrl', 'eventUrl', 'orderId'
);
diff --git a/plugins/API/Renderer/Console.php b/plugins/API/Renderer/Console.php
index d86907295e..bd4a24fbf4 100644
--- a/plugins/API/Renderer/Console.php
+++ b/plugins/API/Renderer/Console.php
@@ -16,7 +16,7 @@ class Console extends ApiRenderer
/**
* @param $message
- * @param Exception|\Throwable $exception
+ * @param \Exception|\Throwable $exception
* @return string
*/
public function renderException($message, $exception)
diff --git a/plugins/API/Renderer/Csv.php b/plugins/API/Renderer/Csv.php
index e2d7baa0dc..34c81b31d4 100644
--- a/plugins/API/Renderer/Csv.php
+++ b/plugins/API/Renderer/Csv.php
@@ -23,7 +23,7 @@ class Csv extends ApiRenderer
/**
* @param $message
- * @param Exception|\Throwable $exception
+ * @param \Exception|\Throwable $exception
* @return string
*/
public function renderException($message, $exception)
@@ -35,7 +35,11 @@ class Csv extends ApiRenderer
public function renderDataTable($dataTable)
{
$convertToUnicode = Common::getRequestVar('convertToUnicode', true, 'int', $this->request);
- $idSite = Common::getRequestVar('idSite', false, 'int', $this->request);
+ $idSite = Common::getRequestVar('idSite', 0, 'int', $this->request);
+
+ if (empty($idSite)) {
+ $idSite = 'all';
+ }
/** @var \Piwik\DataTable\Renderer\Csv $tableRenderer */
$tableRenderer = $this->buildDataTableRenderer($dataTable);
diff --git a/plugins/API/Renderer/Html.php b/plugins/API/Renderer/Html.php
index eb45b0cfda..289d89a65f 100644
--- a/plugins/API/Renderer/Html.php
+++ b/plugins/API/Renderer/Html.php
@@ -20,7 +20,7 @@ class Html extends ApiRenderer
/**
* @param $message
- * @param Exception|\Throwable $exception
+ * @param \Exception|\Throwable $exception
* @return string
*/
public function renderException($message, $exception)
diff --git a/plugins/API/Renderer/Json.php b/plugins/API/Renderer/Json.php
index d3c3a9ab42..d2baf4cdc2 100644
--- a/plugins/API/Renderer/Json.php
+++ b/plugins/API/Renderer/Json.php
@@ -31,7 +31,6 @@ class Json extends ApiRenderer
/**
* @param $message
- * @param Exception|\Throwable $exception
* @param \Exception|\Throwable $exception
* @return string
*/
diff --git a/plugins/API/tests/Integration/APITest.php b/plugins/API/tests/Integration/APITest.php
index 3b3d235ac5..e8f4e050b6 100644
--- a/plugins/API/tests/Integration/APITest.php
+++ b/plugins/API/tests/Integration/APITest.php
@@ -30,7 +30,7 @@ class APITest extends IntegrationTestCase
private $hasSuperUserAccess = false;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -45,7 +45,7 @@ class APITest extends IntegrationTestCase
$this->makeSureTestRunsInContextOfAnonymousUser();
}
- public function tearDown()
+ public function tearDown(): void
{
Access::getInstance()->hasSuperUserAccess($this->hasSuperUserAccess);
parent::tearDown();
diff --git a/plugins/API/tests/Integration/RowEvolutionTest.php b/plugins/API/tests/Integration/RowEvolutionTest.php
index d7354a3d8d..1b50214131 100644
--- a/plugins/API/tests/Integration/RowEvolutionTest.php
+++ b/plugins/API/tests/Integration/RowEvolutionTest.php
@@ -20,18 +20,16 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
class RowEvolutionTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Fixture::createWebsite('2014-01-01 00:00:00');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Reports like VisitsSummary.get which do not have a dimension are not supported by row evolution
- */
public function test_getRowEvolution_shouldTriggerAnException_IfReportHasNoDimension()
{
+ $this->expectException(\Exception::class);
+ $this->expectDeprecationMessage("Reports like VisitsSummary.get which do not have a dimension are not supported by row evolution");
$rowEvolution = new RowEvolution();
$rowEvolution->getRowEvolution(1, 'day', 'last7', 'VisitsSummary', 'get');
}
@@ -42,11 +40,4 @@ class RowEvolutionTest extends IntegrationTestCase
$table = $rowEvolution->getRowEvolution(1, 'day', 'last7', 'Actions', 'getPageUrls');
$this->assertNotEmpty($table);
}
-
- public function test_getRowEvolution_shouldReturnEmptyArray_IfNoData()
- {
- $rowEvolution = new RowEvolution();
- $table = $rowEvolution->getRowEvolution(1, 'day', 'last7', 'Actions', 'getSiteSearchCategories');
- $this->assertEquals(array(), $table);
- }
}
diff --git a/plugins/API/tests/Integration/RssRendererTest.php b/plugins/API/tests/Integration/RssRendererTest.php
index 8210919118..850a63226f 100644
--- a/plugins/API/tests/Integration/RssRendererTest.php
+++ b/plugins/API/tests/Integration/RssRendererTest.php
@@ -25,7 +25,7 @@ class RssRendererTest extends IntegrationTestCase
*/
private $builder;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -64,51 +64,42 @@ class RssRendererTest extends IntegrationTestCase
$this->assertEquals('Error: The API cannot handle this data structure.', $response);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage RSS feeds can be generated for one specific website
- */
public function test_renderScalar_shouldFailForBooleanScalar()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('RSS feeds can be generated for one specific website');
$this->builder->renderScalar(true);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage RSS feeds can be generated for one specific website
- */
public function test_renderScalar_shouldFailForIntegerScalar()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('RSS feeds can be generated for one specific website');
$this->builder->renderScalar(5);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage RSS feeds can be generated for one specific website
- */
public function test_renderScalar_shouldFailForStringScalar()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('RSS feeds can be generated for one specific website');
$this->builder->renderScalar('string');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage RSS feeds can be generated for one specific website
- */
public function test_renderDataTable_shouldFailForDataTable()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('RSS feeds can be generated for one specific website');
$dataTable = new DataTable();
$dataTable->addRowFromSimpleArray(array('nb_visits' => 5, 'nb_random' => 10));
$this->builder->renderDataTable($dataTable);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage RSS feeds can be generated for one specific website
- */
public function test_renderDataTable_shouldFailForSubtables()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('RSS feeds can be generated for one specific website');
+
$subtable = new DataTable();
$subtable->addRowFromSimpleArray(array('nb_visits' => 2, 'nb_random' => 6));
@@ -119,12 +110,11 @@ class RssRendererTest extends IntegrationTestCase
$this->builder->renderDataTable($dataTable);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage RSS feeds can be generated for one specific website
- */
public function test_renderDataTable_shouldFail_IfKeynameIsNotDate()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('RSS feeds can be generated for one specific website');
+
$map = new DataTable\Map();
$dataTable = new DataTable();
@@ -161,24 +151,22 @@ class RssRendererTest extends IntegrationTestCase
</rss>', $response);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage RSS feeds can be generated for one specific website
- */
public function test_renderDataTable_shouldFailForSimpleDataTable()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('RSS feeds can be generated for one specific website');
+
$dataTable = new DataTable\Simple();
$dataTable->addRowsFromArray(array('nb_visits' => 3, 'nb_random' => 6));
$this->builder->renderDataTable($dataTable);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage RSS feeds can be generated for one specific website
- */
public function test_renderArray_ShouldFailForArrays()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('RSS feeds can be generated for one specific website');
+
$input = array(1, 2, 5, 'string', 10);
$this->builder->renderArray($input);
diff --git a/plugins/API/tests/System/AutoSuggestAPITest.php b/plugins/API/tests/System/AutoSuggestAPITest.php
index 006f780424..a84b020368 100644
--- a/plugins/API/tests/System/AutoSuggestAPITest.php
+++ b/plugins/API/tests/System/AutoSuggestAPITest.php
@@ -51,14 +51,14 @@ class AutoSuggestAPITest extends SystemTestCase
protected static $processed = 0;
protected static $skipped = array();
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
API::setSingletonInstance(CachedAPI::getInstance());
}
- public static function tearDownAfterClass()
+ public static function tearDownAfterClass(): void
{
parent::tearDownAfterClass();
@@ -196,7 +196,7 @@ class AutoSuggestAPITest extends SystemTestCase
public function testCheckOtherTestsWereComplete()
{
// Check that only a few haven't been tested specifically (these are all custom variables slots since we only test slot 1, 2, 5 (see the fixture) and example dimension slots and bandwidth)
- $maximumSegmentsToSkip = 21;
+ $maximumSegmentsToSkip = 23;
$this->assertLessThan($maximumSegmentsToSkip, count(self::$skipped), 'SKIPPED ' . count(self::$skipped) . ' segments --> some segments had no "auto-suggested values"
but we should try and test the autosuggest for all new segments. Segments skipped were: ' . implode(', ', self::$skipped));
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest__Live.getLastVisitsDetails_range.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest__Live.getLastVisitsDetails_range.xml
index 88cb9a1057..c63cf7a08d 100644
--- a/plugins/API/tests/System/expected/test_AutoSuggestAPITest__Live.getLastVisitsDetails_range.xml
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest__Live.getLastVisitsDetails_range.xml
@@ -189,18 +189,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>48</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 48</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -271,7 +267,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
+ <subtitle>Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
<eventName>Name8</eventName>
<eventValue>353.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -646,7 +642,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
+ <subtitle>Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
<eventName>Name7</eventName>
<eventValue>352.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -718,13 +714,13 @@
<events>1</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
@@ -873,13 +869,13 @@
<events>0</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
@@ -964,18 +960,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>36</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 36</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -1075,7 +1067,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
+ <subtitle>Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
<eventName>Name6</eventName>
<eventValue>351.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -1450,7 +1442,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat5', Action: &quot;Action5&quot;</subtitle>
+ <subtitle>Category: &quot;Cat5', Action: &quot;Action5&quot;</subtitle>
<eventName>Name5</eventName>
<eventValue>350.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -1768,18 +1760,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>24</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 24</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -1850,7 +1838,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat4', Action: &quot;Action4&quot;</subtitle>
+ <subtitle>Category: &quot;Cat4', Action: &quot;Action4&quot;</subtitle>
<eventName>Name4</eventName>
<eventValue>349.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -2254,7 +2242,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat3', Action: &quot;Action3&quot;</subtitle>
+ <subtitle>Category: &quot;Cat3', Action: &quot;Action3&quot;</subtitle>
<eventName>Name3</eventName>
<eventValue>348.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -2503,7 +2491,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat3', Action: &quot;Action3&quot;</subtitle>
+ <subtitle>Category: &quot;Cat3', Action: &quot;Action3&quot;</subtitle>
<eventName>Name3</eventName>
<eventValue>348.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -2968,18 +2956,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>12</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 12</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -3050,7 +3034,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat2', Action: &quot;Action2&quot;</subtitle>
+ <subtitle>Category: &quot;Cat2', Action: &quot;Action2&quot;</subtitle>
<eventName>Name2</eventName>
<eventValue>347.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -3213,18 +3197,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>12</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 12</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -3295,7 +3275,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat2', Action: &quot;Action2&quot;</subtitle>
+ <subtitle>Category: &quot;Cat2', Action: &quot;Action2&quot;</subtitle>
<eventName>Name2</eventName>
<eventValue>347.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -3817,7 +3797,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat1', Action: &quot;Action1&quot;</subtitle>
+ <subtitle>Category: &quot;Cat1', Action: &quot;Action1&quot;</subtitle>
<eventName>Name1</eventName>
<eventValue>346.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -4037,7 +4017,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat1', Action: &quot;Action1&quot;</subtitle>
+ <subtitle>Category: &quot;Cat1', Action: &quot;Action1&quot;</subtitle>
<eventName>Name1</eventName>
<eventValue>346.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -4257,7 +4237,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat1', Action: &quot;Action1&quot;</subtitle>
+ <subtitle>Category: &quot;Cat1', Action: &quot;Action1&quot;</subtitle>
<eventName>Name1</eventName>
<eventValue>346.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -4469,7 +4449,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat1', Action: &quot;Action1&quot;</subtitle>
+ <subtitle>Category: &quot;Cat1', Action: &quot;Action1&quot;</subtitle>
<eventName>Name1</eventName>
<eventValue>346.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5252,18 +5232,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>0</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -5363,7 +5339,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat0', Action: &quot;Action0&quot;</subtitle>
+ <subtitle>Category: &quot;Cat0', Action: &quot;Action0&quot;</subtitle>
<eventName>Name0</eventName>
<eventValue>345.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5526,18 +5502,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>0</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -5637,7 +5609,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat0', Action: &quot;Action0&quot;</subtitle>
+ <subtitle>Category: &quot;Cat0', Action: &quot;Action0&quot;</subtitle>
<eventName>Name0</eventName>
<eventValue>345.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5800,18 +5772,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>0</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -5911,7 +5879,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat0', Action: &quot;Action0&quot;</subtitle>
+ <subtitle>Category: &quot;Cat0', Action: &quot;Action0&quot;</subtitle>
<eventName>Name0</eventName>
<eventValue>345.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -6066,18 +6034,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>0</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -6177,7 +6141,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat0', Action: &quot;Action0&quot;</subtitle>
+ <subtitle>Category: &quot;Cat0', Action: &quot;Action0&quot;</subtitle>
<eventName>Name0</eventName>
<eventValue>345.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_countryName__API.getSuggestedValuesForSegment.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_countryName__API.getSuggestedValuesForSegment.xml
index da4e9c8b1e..ecb2da7eb5 100644
--- a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_countryName__API.getSuggestedValuesForSegment.xml
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_countryName__API.getSuggestedValuesForSegment.xml
@@ -143,11 +143,11 @@
<row>St. Martin</row>
<row>Madagascar</row>
<row>Marshall Islands</row>
- <row>Macedonia</row>
+ <row>North Macedonia</row>
<row>Mali</row>
<row>Myanmar (Burma)</row>
<row>Mongolia</row>
- <row>Macau SAR China</row>
+ <row>Macao SAR China</row>
<row>Northern Mariana Islands</row>
<row>Martinique</row>
<row>Mauritania</row>
@@ -212,7 +212,7 @@
<row>El Salvador</row>
<row>Sint Maarten</row>
<row>Syria</row>
- <row>Swaziland</row>
+ <row>Eswatini</row>
<row>Turks &amp; Caicos Islands</row>
<row>Chad</row>
<row>French Southern Territories</row>
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName4__API.getSuggestedValuesForSegment.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName4__API.getSuggestedValuesForSegment.xml
index 522fc54866..c234bed59e 100644
--- a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName4__API.getSuggestedValuesForSegment.xml
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName4__API.getSuggestedValuesForSegment.xml
@@ -1,4 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
-<result>
- <row>Search Category</row>
-</result> \ No newline at end of file
+<result /> \ No newline at end of file
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName__API.getSuggestedValuesForSegment.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName__API.getSuggestedValuesForSegment.xml
index c26e714a25..769a3cf046 100644
--- a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName__API.getSuggestedValuesForSegment.xml
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageName__API.getSuggestedValuesForSegment.xml
@@ -2,5 +2,4 @@
<result>
<row>Cvar 2 PAGE name</row>
<row>Cvar 5 PAGE name</row>
- <row>Search Category</row>
</result> \ No newline at end of file
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue4__API.getSuggestedValuesForSegment.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue4__API.getSuggestedValuesForSegment.xml
index f7624776eb..c234bed59e 100644
--- a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue4__API.getSuggestedValuesForSegment.xml
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue4__API.getSuggestedValuesForSegment.xml
@@ -1,4 +1,2 @@
<?xml version="1.0" encoding="utf-8" ?>
-<result>
- <row>CAT</row>
-</result> \ No newline at end of file
+<result /> \ No newline at end of file
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__API.getSuggestedValuesForSegment.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__API.getSuggestedValuesForSegment.xml
index e20cde6740..eb1502c2fe 100644
--- a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__API.getSuggestedValuesForSegment.xml
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__API.getSuggestedValuesForSegment.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <row>CAT</row>
<row>Cvar2 PAGE value is 0</row>
<row>Cvar2 PAGE value is 1</row>
<row>Cvar5 PAGE value is 0</row>
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__VisitsSummary.get_range.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__VisitsSummary.get_range.xml
index 4be0b7b205..88dae8fd6c 100644
--- a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__VisitsSummary.get_range.xml
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_customVariablePageValue__VisitsSummary.get_range.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_visits>9</nb_visits>
- <nb_actions>45</nb_actions>
- <nb_visits_converted>9</nb_visits_converted>
- <bounce_count>0</bounce_count>
- <sum_visit_length>14599</sum_visit_length>
- <max_actions>5</max_actions>
- <bounce_rate>0%</bounce_rate>
- <nb_actions_per_visit>5</nb_actions_per_visit>
- <avg_time_on_site>1622</avg_time_on_site>
+ <nb_visits>4</nb_visits>
+ <nb_actions>4</nb_actions>
+ <nb_visits_converted>4</nb_visits_converted>
+ <bounce_count>4</bounce_count>
+ <sum_visit_length>0</sum_visit_length>
+ <max_actions>1</max_actions>
+ <bounce_rate>100%</bounce_rate>
+ <nb_actions_per_visit>1</nb_actions_per_visit>
+ <avg_time_on_site>0</avg_time_on_site>
</result> \ No newline at end of file
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_eventValue__VisitsSummary.get_range.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_eventValue__VisitsSummary.get_range.xml
index d8bcdace18..a582e4fc8e 100644
--- a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_eventValue__VisitsSummary.get_range.xml
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_eventValue__VisitsSummary.get_range.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_visits>0</nb_visits>
- <nb_actions>0</nb_actions>
- <nb_visits_converted>0</nb_visits_converted>
+ <nb_visits>4</nb_visits>
+ <nb_actions>20</nb_actions>
+ <nb_visits_converted>4</nb_visits_converted>
<bounce_count>0</bounce_count>
- <sum_visit_length>0</sum_visit_length>
- <max_actions>0</max_actions>
+ <sum_visit_length>6492</sum_visit_length>
+ <max_actions>5</max_actions>
<bounce_rate>0%</bounce_rate>
- <nb_actions_per_visit>0</nb_actions_per_visit>
- <avg_time_on_site>0</avg_time_on_site>
+ <nb_actions_per_visit>5</nb_actions_per_visit>
+ <avg_time_on_site>1623</avg_time_on_site>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_NotLastNPeriods__CustomVariables.getCustomVariables_day.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCategory__API.getSuggestedValuesForSegment.xml
index c234bed59e..f7624776eb 100644
--- a/tests/PHPUnit/System/expected/test_SiteSearch_NotLastNPeriods__CustomVariables.getCustomVariables_day.xml
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCategory__API.getSuggestedValuesForSegment.xml
@@ -1,2 +1,4 @@
<?xml version="1.0" encoding="utf-8" ?>
-<result /> \ No newline at end of file
+<result>
+ <row>CAT</row>
+</result> \ No newline at end of file
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCategory__VisitsSummary.get_range.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCategory__VisitsSummary.get_range.xml
new file mode 100644
index 0000000000..4be0b7b205
--- /dev/null
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCategory__VisitsSummary.get_range.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <nb_visits>9</nb_visits>
+ <nb_actions>45</nb_actions>
+ <nb_visits_converted>9</nb_visits_converted>
+ <bounce_count>0</bounce_count>
+ <sum_visit_length>14599</sum_visit_length>
+ <max_actions>5</max_actions>
+ <bounce_rate>0%</bounce_rate>
+ <nb_actions_per_visit>5</nb_actions_per_visit>
+ <avg_time_on_site>1622</avg_time_on_site>
+</result> \ No newline at end of file
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCount__API.getSuggestedValuesForSegment.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCount__API.getSuggestedValuesForSegment.xml
new file mode 100644
index 0000000000..aad5e66529
--- /dev/null
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCount__API.getSuggestedValuesForSegment.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>12</row>
+ <row>24</row>
+ <row>36</row>
+ <row>48</row>
+</result> \ No newline at end of file
diff --git a/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCount__VisitsSummary.get_range.xml b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCount__VisitsSummary.get_range.xml
new file mode 100644
index 0000000000..4fcc0a92d6
--- /dev/null
+++ b/plugins/API/tests/System/expected/test_AutoSuggestAPITest_siteSearchCount__VisitsSummary.get_range.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <nb_visits>2</nb_visits>
+ <nb_actions>10</nb_actions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <bounce_count>0</bounce_count>
+ <sum_visit_length>3242</sum_visit_length>
+ <max_actions>5</max_actions>
+ <bounce_rate>0%</bounce_rate>
+ <nb_actions_per_visit>5</nb_actions_per_visit>
+ <avg_time_on_site>1621</avg_time_on_site>
+</result> \ No newline at end of file
diff --git a/plugins/API/tests/Unit/ConsoleRendererTest.php b/plugins/API/tests/Unit/ConsoleRendererTest.php
index 70e3a2113b..9aae115b56 100644
--- a/plugins/API/tests/Unit/ConsoleRendererTest.php
+++ b/plugins/API/tests/Unit/ConsoleRendererTest.php
@@ -17,14 +17,14 @@ use Piwik\Plugins\CoreHome\Columns\Metrics\AverageTimeOnSite;
* @group Plugin
* @group API
*/
-class ConsoleRendererTest extends \PHPUnit_Framework_TestCase
+class ConsoleRendererTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Console
*/
private $builder;
- public function setUp()
+ public function setUp(): void
{
$this->builder = $this->makeBuilder(array());
DataTable\Manager::getInstance()->deleteAll();
@@ -114,12 +114,11 @@ class ConsoleRendererTest extends \PHPUnit_Framework_TestCase
", $response);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Data structure returned is not convertible in the requested format
- */
public function test_renderArray_ShouldConvertMultiDimensionalAssociativeArrayToJson()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Data structure returned is not convertible in the requested format');
+
$input = array(
"firstElement" => "isFirst",
"secondElement" => array(
diff --git a/plugins/API/tests/Unit/CsvRendererTest.php b/plugins/API/tests/Unit/CsvRendererTest.php
index 548de5c083..1ecc7d314f 100644
--- a/plugins/API/tests/Unit/CsvRendererTest.php
+++ b/plugins/API/tests/Unit/CsvRendererTest.php
@@ -15,14 +15,14 @@ use Piwik\Plugins\API\Renderer\Csv;
* @group Plugin
* @group API
*/
-class CsvRendererTest extends \PHPUnit_Framework_TestCase
+class CsvRendererTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Csv
*/
private $builder;
- public function setUp()
+ public function setUp(): void
{
$this->builder = $this->makeBuilder(array('method' => 'MultiSites_getAll', 'convertToUnicode' => 0));
}
@@ -285,12 +285,11 @@ firstElement,secondElement,
,,thirdElement', $actual);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Data structure returned is not convertible in the requested format
- */
public function test_renderArray_ShouldConvertMultiDimensionalAssociativeArrayToJson()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Data structure returned is not convertible in the requested format');
+
$input = array(
"firstElement" => "isFirst",
"secondElement" => array(
@@ -302,12 +301,11 @@ firstElement,secondElement,
$this->builder->renderArray($input);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Data structure returned is not convertible in the requested format
- */
public function test_renderArray_ShouldConvertMultiDimensionalIndexArrayToJson()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Data structure returned is not convertible in the requested format');
+
$input = array(array("firstElement",
array(
"firstElement",
@@ -318,12 +316,11 @@ firstElement,secondElement,
$this->builder->renderArray($input);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Data structure returned is not convertible in the requested format
- */
public function test_renderArray_ShouldConvertMultiDimensionalMixedArrayToJson()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Data structure returned is not convertible in the requested format');
+
$input = array(
"firstElement" => "isFirst",
array(
diff --git a/plugins/API/tests/Unit/DataTable/MergeDataTablesTest.php b/plugins/API/tests/Unit/DataTable/MergeDataTablesTest.php
index d1b5028a0f..3e5bc6e5c8 100644
--- a/plugins/API/tests/Unit/DataTable/MergeDataTablesTest.php
+++ b/plugins/API/tests/Unit/DataTable/MergeDataTablesTest.php
@@ -13,14 +13,14 @@ namespace Piwik\Plugins\API\tests\Unit\DataTable;
use Piwik\DataTable;
use Piwik\Plugins\API\DataTable\MergeDataTables;
-class MergeDataTablesTest extends \PHPUnit_Framework_TestCase
+class MergeDataTablesTest extends \PHPUnit\Framework\TestCase
{
/**
* @var MergeDataTables
*/
private $instance;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->instance = new MergeDataTables();
diff --git a/plugins/API/tests/Unit/HtmlRendererTest.php b/plugins/API/tests/Unit/HtmlRendererTest.php
index 76af70b894..3f1dc480c2 100644
--- a/plugins/API/tests/Unit/HtmlRendererTest.php
+++ b/plugins/API/tests/Unit/HtmlRendererTest.php
@@ -17,14 +17,14 @@ use Piwik\Plugins\CoreHome\Columns\Metrics\AverageTimeOnSite;
* @group Plugin
* @group API
*/
-class HtmlRendererTest extends \PHPUnit_Framework_TestCase
+class HtmlRendererTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Html
*/
private $builder;
- public function setUp()
+ public function setUp(): void
{
$this->builder = $this->makeBuilder(array('method' => 'MultiSites_getAll'));
DataTable\Manager::getInstance()->deleteAll();
@@ -449,12 +449,11 @@ message', $response);
', $actual);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Data structure returned is not convertible in the requested format
- */
public function test_renderArray_ShouldConvertMultiDimensionalAssociativeArrayToJson()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Data structure returned is not convertible in the requested format');
+
$input = array(
"firstElement" => "isFirst",
"secondElement" => array(
@@ -466,12 +465,11 @@ message', $response);
$this->builder->renderArray($input);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Data structure returned is not convertible in the requested format
- */
public function test_renderArray_ShouldConvertMultiDimensionalIndexArrayToJson()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Data structure returned is not convertible in the requested format');
+
$input = array(array("firstElement",
array(
"firstElement",
@@ -482,12 +480,11 @@ message', $response);
$this->builder->renderArray($input);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Data structure returned is not convertible in the requested format
- */
public function test_renderArray_ShouldConvertMultiDimensionalMixedArrayToJson()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Data structure returned is not convertible in the requested format');
+
$input = array(
"firstElement" => "isFirst",
array(
diff --git a/plugins/API/tests/Unit/JsonRendererTest.php b/plugins/API/tests/Unit/JsonRendererTest.php
index f7e0063c07..34fbed0364 100644
--- a/plugins/API/tests/Unit/JsonRendererTest.php
+++ b/plugins/API/tests/Unit/JsonRendererTest.php
@@ -18,14 +18,14 @@ use Piwik\Plugins\API\Renderer\Json2;
* @group API_JsonRendererTest
* @group JsonRenderer
*/
-class JsonRendererTest extends \PHPUnit_Framework_TestCase
+class JsonRendererTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Json
*/
private $jsonBuilder;
- public function setUp()
+ public function setUp(): void
{
$this->jsonBuilder = $this->makeBuilder(array());
DataTable\Manager::getInstance()->deleteAll();
diff --git a/plugins/API/tests/Unit/OriginalRendererTest.php b/plugins/API/tests/Unit/OriginalRendererTest.php
index f21161305e..4543836f07 100644
--- a/plugins/API/tests/Unit/OriginalRendererTest.php
+++ b/plugins/API/tests/Unit/OriginalRendererTest.php
@@ -15,14 +15,14 @@ use Piwik\Plugins\API\Renderer\Original;
* @group Plugin
* @group API
*/
-class OriginalRendererTest extends \PHPUnit_Framework_TestCase
+class OriginalRendererTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Original
*/
private $builder;
- public function setUp()
+ public function setUp(): void
{
$this->builder = $this->makeBuilder(array());
}
@@ -34,12 +34,11 @@ class OriginalRendererTest extends \PHPUnit_Framework_TestCase
$this->assertTrue($response);
}
- /**
- * @expectedException \BadMethodCallException
- * @expectedExceptionMessage The other message
- */
public function test_renderException_shouldThrowTheException()
{
+ $this->expectException(\BadMethodCallException::class);
+ $this->expectExceptionMessage('The other message');
+
$this->builder->renderException('This message should be ignored', new \BadMethodCallException('The other message'));
}
diff --git a/plugins/API/tests/Unit/PhpRendererTest.php b/plugins/API/tests/Unit/PhpRendererTest.php
index 81d89cf7f2..64d2d4cde9 100644
--- a/plugins/API/tests/Unit/PhpRendererTest.php
+++ b/plugins/API/tests/Unit/PhpRendererTest.php
@@ -16,14 +16,14 @@ use Piwik\Plugins\API\Renderer\Php;
* @group API
* @group PhpRendererTest
*/
-class PhpRendererTest extends \PHPUnit_Framework_TestCase
+class PhpRendererTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Php
*/
private $builder;
- public function setUp()
+ public function setUp(): void
{
$this->builder = $this->makeBuilder(array('serialize' => 0));
DataTable\Manager::getInstance()->deleteAll();
diff --git a/plugins/API/tests/Unit/WidgetMetadataTest.php b/plugins/API/tests/Unit/WidgetMetadataTest.php
index d9c57c5547..1e4cb40adc 100644
--- a/plugins/API/tests/Unit/WidgetMetadataTest.php
+++ b/plugins/API/tests/Unit/WidgetMetadataTest.php
@@ -25,14 +25,14 @@ use Piwik\Widget\WidgetContainerConfig;
* @group WidgetMetadata
* @group WidgetMetadataTest
*/
-class WidgetMetadataTest extends \PHPUnit_Framework_TestCase
+class WidgetMetadataTest extends \PHPUnit\Framework\TestCase
{
/**
* @var WidgetMetadata
*/
private $metadata;
- public function setUp()
+ public function setUp(): void
{
$this->metadata = new WidgetMetadata();
}
diff --git a/plugins/API/tests/Unit/XmlRendererTest.php b/plugins/API/tests/Unit/XmlRendererTest.php
index a026f7778a..f6d72513f3 100644
--- a/plugins/API/tests/Unit/XmlRendererTest.php
+++ b/plugins/API/tests/Unit/XmlRendererTest.php
@@ -15,20 +15,20 @@ use Piwik\Plugins\API\Renderer\Xml;
* @group Plugin
* @group API
*/
-class XmlRendererTest extends \PHPUnit_Framework_TestCase
+class XmlRendererTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Xml
*/
private $builder;
- public function setUp()
+ public function setUp(): void
{
$this->builder = $this->makeBuilder(array());
DataTable\Manager::getInstance()->deleteAll();
}
- public function tearDown()
+ public function tearDown(): void
{
DataTable\Manager::getInstance()->deleteAll();
}
diff --git a/plugins/Actions/API.php b/plugins/Actions/API.php
index c0f107b954..d9b98c6cfb 100644
--- a/plugins/Actions/API.php
+++ b/plugins/Actions/API.php
@@ -20,8 +20,6 @@ use Piwik\Plugins\Actions\Columns\Metrics\AveragePageGenerationTime;
use Piwik\Plugins\Actions\Columns\Metrics\AverageTimeOnPage;
use Piwik\Plugins\Actions\Columns\Metrics\BounceRate;
use Piwik\Plugins\Actions\Columns\Metrics\ExitRate;
-use Piwik\Plugins\CustomVariables\API as APICustomVariables;
-use Piwik\Plugins\Actions\Actions\ActionSiteSearch;
use Piwik\Plugin\ReportsProvider;
use Piwik\Tracker\Action;
use Piwik\Tracker\PageUrl;
@@ -352,42 +350,13 @@ class API extends \Piwik\Plugin\API
{
Piwik::checkUserHasViewAccess($idSite);
- Actions::checkCustomVariablesPluginEnabled();
- $customVariables = APICustomVariables::getInstance()->getCustomVariables($idSite, $period, $date, $segment, $expanded = false, $_leavePiwikCoreVariables = true);
-
- $customVarNameToLookFor = ActionSiteSearch::CVAR_KEY_SEARCH_CATEGORY;
-
- $dataTable = new DataTable();
- // Handle case where date=last30&period=day
- // FIXMEA: this logic should really be refactored somewhere, this is ugly!
- if ($customVariables instanceof DataTable\Map) {
- $dataTable = $customVariables->getEmptyClone();
-
- $customVariableDatatables = $customVariables->getDataTables();
- foreach ($customVariableDatatables as $key => $customVariableTableForDate) {
- // we do not enter the IF, in the case idSite=1,3 AND period=day&date=datefrom,dateto,
- if ($customVariableTableForDate instanceof DataTable
- && $customVariableTableForDate->getMetadata(Archive\DataTableFactory::TABLE_METADATA_PERIOD_INDEX)
- ) {
- $row = $customVariableTableForDate->getRowFromLabel($customVarNameToLookFor);
- if ($row) {
- $dateRewrite = $customVariableTableForDate->getMetadata(Archive\DataTableFactory::TABLE_METADATA_PERIOD_INDEX)->getDateStart()->toString();
- $idSubtable = $row->getIdSubDataTable();
- $categories = APICustomVariables::getInstance()->getCustomVariablesValuesFromNameId($idSite, $period, $dateRewrite, $idSubtable, $segment);
- $dataTable->addTable($categories, $key);
- }
- }
- }
- } elseif ($customVariables instanceof DataTable) {
- $row = $customVariables->getRowFromLabel($customVarNameToLookFor);
- if ($row) {
- $idSubtable = $row->getIdSubDataTable();
- $dataTable = APICustomVariables::getInstance()->getCustomVariablesValuesFromNameId($idSite, $period, $date, $idSubtable, $segment);
- }
- }
+ $dataTable = Archive::createDataTableFromArchive('Actions_SiteSearchCategories', $idSite, $period, $date, $segment);
+
+ $dataTable->queueFilter('ColumnDelete', 'nb_uniq_visitors');
$this->filterActionsDataTable($dataTable, $isPageTitleType = false);
$dataTable->filter('ReplaceColumnNames');
$this->addPagesPerSearchColumn($dataTable, $columnToRead = 'nb_actions');
+
return $dataTable;
}
diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php
index 62c0755849..bdaa1e973b 100644
--- a/plugins/Actions/Actions.php
+++ b/plugins/Actions/Actions.php
@@ -142,17 +142,6 @@ class Actions extends \Piwik\Plugin
return true;
}
- public static function checkCustomVariablesPluginEnabled()
- {
- if (!self::isCustomVariablesPluginsEnabled()) {
- throw new \Exception("To Track Site Search Categories, please ask the Piwik Administrator to enable the 'Custom Variables' plugin in Settings > Plugins.");
- }
- }
-
- public static function isCustomVariablesPluginsEnabled()
- {
- return \Piwik\Plugin\Manager::getInstance()->isPluginActivated('CustomVariables');
- }
public function configureViewDataTable(ViewDataTable $view)
{
diff --git a/plugins/Actions/Actions/ActionSiteSearch.php b/plugins/Actions/Actions/ActionSiteSearch.php
index 811f6f8996..e04d06db0c 100644
--- a/plugins/Actions/Actions/ActionSiteSearch.php
+++ b/plugins/Actions/Actions/ActionSiteSearch.php
@@ -28,11 +28,6 @@ class ActionSiteSearch extends Action
private $searchCategory = false;
private $searchCount = false;
- const CVAR_KEY_SEARCH_CATEGORY = '_pk_scat';
- const CVAR_KEY_SEARCH_COUNT = '_pk_scount';
- const CVAR_INDEX_SEARCH_CATEGORY = '4';
- const CVAR_INDEX_SEARCH_COUNT = '5';
-
public function __construct(Request $request, $detect = true)
{
parent::__construct(Action::TYPE_SITE_SEARCH, $request);
@@ -101,26 +96,22 @@ class ActionSiteSearch extends Action
return true;
}
- public function getCustomVariables()
+ public function getSearchCategory()
{
- $customVariables = parent::getCustomVariables();
-
- // Enrich Site Search actions with Custom Variables, overwriting existing values
- if (!empty($this->searchCategory)) {
- if (!empty($customVariables['custom_var_k' . self::CVAR_INDEX_SEARCH_CATEGORY])) {
- Common::printDebug("WARNING: Overwriting existing Custom Variable in slot " . self::CVAR_INDEX_SEARCH_CATEGORY . " for this page view");
- }
- $customVariables['custom_var_k' . self::CVAR_INDEX_SEARCH_CATEGORY] = self::CVAR_KEY_SEARCH_CATEGORY;
- $customVariables['custom_var_v' . self::CVAR_INDEX_SEARCH_CATEGORY] = Request::truncateCustomVariable($this->searchCategory);
+ $searchCategory = trim($this->searchCategory);
+ if (!empty($searchCategory)) {
+ // Max length of DB field = 200
+ $searchCategory = substr($this->searchCategory, 0, 200);
}
+ return $searchCategory;
+ }
+
+ public function getSearchCount()
+ {
if ($this->searchCount !== false) {
- if (!empty($customVariables['custom_var_k' . self::CVAR_INDEX_SEARCH_COUNT])) {
- Common::printDebug("WARNING: Overwriting existing Custom Variable in slot " . self::CVAR_INDEX_SEARCH_COUNT . " for this page view");
- }
- $customVariables['custom_var_k' . self::CVAR_INDEX_SEARCH_COUNT] = self::CVAR_KEY_SEARCH_COUNT;
- $customVariables['custom_var_v' . self::CVAR_INDEX_SEARCH_COUNT] = (int)$this->searchCount;
+ $this->searchCount = (int)$this->searchCount;
}
- return $customVariables;
+ return $this->searchCount;
}
public static function detectSiteSearchFromUrl($website, $parsedUrl, $pageEncoding = null)
@@ -295,5 +286,4 @@ class ActionSiteSearch extends Action
$count
);
}
-
}
diff --git a/plugins/Actions/Archiver.php b/plugins/Actions/Archiver.php
index 35ecf41230..df02b099c2 100644
--- a/plugins/Actions/Archiver.php
+++ b/plugins/Actions/Archiver.php
@@ -9,11 +9,11 @@
namespace Piwik\Plugins\Actions;
use Piwik\Config;
+use Piwik\DataArray;
use Piwik\DataTable;
use Piwik\Metrics as PiwikMetrics;
use Piwik\RankingQuery;
use Piwik\Tracker\Action;
-use Piwik\Plugins\Actions\Actions\ActionSiteSearch;
/**
* Class encapsulating logic to process Day/Period Archiving for the Actions reports
@@ -25,6 +25,7 @@ class Archiver extends \Piwik\Plugin\Archiver
const OUTLINKS_RECORD_NAME = 'Actions_outlink';
const PAGE_TITLES_RECORD_NAME = 'Actions_actions';
const SITE_SEARCH_RECORD_NAME = 'Actions_sitesearch';
+ const SITE_SEARCH_CATEGORY_RECORD_NAME = 'Actions_SiteSearchCategories';
const PAGE_URLS_RECORD_NAME = 'Actions_actions_url';
const METRIC_PAGEVIEWS_RECORD_NAME = 'Actions_nb_pageviews';
@@ -61,6 +62,7 @@ class Archiver extends \Piwik\Plugin\Archiver
$this->archiveDayPageActions($rankingQueryLimit);
$this->archiveDaySiteSearchActions($rankingQueryLimit);
+ $this->archiveDaySearchCategoryActions();
$this->archiveDayEntryActions($rankingQueryLimit);
$this->archiveDayExitActions($rankingQueryLimit);
$this->archiveDayActionsTime($rankingQueryLimit);
@@ -103,8 +105,7 @@ class Archiver extends \Piwik\Plugin\Archiver
protected function updateQuerySelectFromForSiteSearch(&$select, &$from)
{
$selectFlagNoResultKeywords = ",
- CASE WHEN (MAX(log_link_visit_action.custom_var_v" . ActionSiteSearch::CVAR_INDEX_SEARCH_COUNT . ") = 0
- AND log_link_visit_action.custom_var_k" . ActionSiteSearch::CVAR_INDEX_SEARCH_COUNT . " = '" . ActionSiteSearch::CVAR_KEY_SEARCH_COUNT . "')
+ CASE WHEN (MAX(log_link_visit_action.search_count) = 0)
THEN 1 ELSE 0 END
AS `" . PiwikMetrics::INDEX_SITE_SEARCH_HAS_NO_RESULT . "`";
@@ -165,6 +166,25 @@ class Archiver extends \Piwik\Plugin\Archiver
}
}
+ protected function archiveDaySearchCategoryActions()
+ {
+ $where = "%s.search_cat != '' AND %s.search_cat IS NOT NULL";
+ $dimensions = array('search_cat');
+ $query = $this->getLogAggregator()->queryActionsByDimension(
+ $dimensions,
+ $where
+ );
+
+ $dataArray = new DataArray();
+ while ($row = $query->fetch()) {
+ $dataArray->sumMetricsActions($row['search_cat'], $row);
+ }
+
+ $dataTable = $dataArray->asDataTable();
+ $report = $dataTable->getSerialized();
+ $this->getProcessor()->insertBlobRecord(self::SITE_SEARCH_CATEGORY_RECORD_NAME, $report);
+ }
+
protected function archiveDayActions($rankingQueryLimit, array $actionTypes, $includePageNotDefined)
{
$metricsConfig = Metrics::getActionMetrics();
@@ -529,6 +549,7 @@ class Archiver extends \Piwik\Plugin\Archiver
self::DOWNLOADS_RECORD_NAME,
self::OUTLINKS_RECORD_NAME,
self::SITE_SEARCH_RECORD_NAME,
+ self::SITE_SEARCH_CATEGORY_RECORD_NAME,
);
$aggregation = null;
$nameToCount = $this->getProcessor()->aggregateDataTableRecords($dataTableToSum,
diff --git a/plugins/Actions/ArchivingHelper.php b/plugins/Actions/ArchivingHelper.php
index e5c315d0b1..afd92e0171 100644
--- a/plugins/Actions/ArchivingHelper.php
+++ b/plugins/Actions/ArchivingHelper.php
@@ -542,7 +542,7 @@ class ArchivingHelper
*
* @param int $idAction
* @param int $actionType
- * @param \DataTable\Row
+ * @param \Piwik\DataTable\Row
*/
private static function setCachedActionRow($idAction, $actionType, $actionRow)
{
diff --git a/plugins/Actions/Columns/InteractionPosition.php b/plugins/Actions/Columns/InteractionPosition.php
index ab4b8b0fa8..f4d5124aad 100644
--- a/plugins/Actions/Columns/InteractionPosition.php
+++ b/plugins/Actions/Columns/InteractionPosition.php
@@ -18,7 +18,7 @@ use Piwik\Plugin\Dimension\ActionDimension;
class InteractionPosition extends ActionDimension
{
protected $columnName = 'interaction_position';
- protected $columnType = 'SMALLINT UNSIGNED DEFAULT NULL';
+ protected $columnType = 'MEDIUMINT UNSIGNED DEFAULT NULL';
protected $nameSingular = 'Actions_ColumnInteractionPosition';
protected $type = self::TYPE_NUMBER;
diff --git a/plugins/Actions/Columns/SearchCategory.php b/plugins/Actions/Columns/SearchCategory.php
index 09b6a836b0..d5a2f433a6 100644
--- a/plugins/Actions/Columns/SearchCategory.php
+++ b/plugins/Actions/Columns/SearchCategory.php
@@ -8,11 +8,35 @@
*/
namespace Piwik\Plugins\Actions\Columns;
-use Piwik\Columns\Dimension;
-use Piwik\Piwik;
+use Piwik\Plugin\Dimension\ActionDimension;
+use Piwik\Plugin\Segment;
+use Piwik\Plugins\Actions\Actions\ActionSiteSearch;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
-class SearchCategory extends Dimension
+class SearchCategory extends ActionDimension
{
protected $type = self::TYPE_TEXT;
protected $nameSingular = 'Actions_ColumnSearchCategory';
+ protected $namePlural = 'Actions_SiteSearchCategories';
+ protected $segmentName = 'siteSearchCategory';
+ protected $columnName = 'search_cat';
+ protected $columnType = 'VARCHAR(200) NULL';
+
+ public function onNewAction(Request $request, Visitor $visitor, Action $action)
+ {
+ if ($action instanceof ActionSiteSearch) {
+ return $action->getSearchCategory();
+ }
+
+ return parent::onNewAction($request, $visitor, $action);
+ }
+
+ protected function addSegment(Segment $segment)
+ {
+ $segment->setName('Actions_SiteSearchCategory'); // use another name for segment
+
+ parent::addSegment($segment);
+ }
} \ No newline at end of file
diff --git a/plugins/Actions/Columns/SearchCount.php b/plugins/Actions/Columns/SearchCount.php
new file mode 100644
index 0000000000..bf1f155c14
--- /dev/null
+++ b/plugins/Actions/Columns/SearchCount.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\Actions\Columns;
+
+use Piwik\Plugin\Dimension\ActionDimension;
+use Piwik\Plugins\Actions\Actions\ActionSiteSearch;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+
+class SearchCount extends ActionDimension
+{
+ protected $type = self::TYPE_TEXT;
+ protected $nameSingular = 'Actions_SiteSearchKeywordCount';
+ protected $namePlural = 'Actions_SiteSearchKeywordCounts';
+ protected $columnName = 'search_count';
+ protected $segmentName = 'siteSearchCount';
+ protected $columnType = 'INTEGER(10) UNSIGNED NULL';
+
+ public function onNewAction(Request $request, Visitor $visitor, Action $action)
+ {
+ if ($action instanceof ActionSiteSearch) {
+ return $action->getSearchCount();
+ }
+
+ return parent::onNewAction($request, $visitor, $action);
+ }
+} \ No newline at end of file
diff --git a/plugins/Actions/Columns/VisitTotalInteractions.php b/plugins/Actions/Columns/VisitTotalInteractions.php
index 566e30951c..cdeacf7c8c 100644
--- a/plugins/Actions/Columns/VisitTotalInteractions.php
+++ b/plugins/Actions/Columns/VisitTotalInteractions.php
@@ -17,7 +17,7 @@ use Piwik\Tracker\Visitor;
class VisitTotalInteractions extends VisitDimension
{
protected $columnName = 'visit_total_interactions';
- protected $columnType = 'SMALLINT UNSIGNED DEFAULT 0';
+ protected $columnType = 'MEDIUMINT UNSIGNED DEFAULT 0';
protected $type = self::TYPE_NUMBER;
protected $segmentName = 'interactions';
protected $nameSingular = 'General_NbInteractions';
diff --git a/plugins/Actions/Reports/GetSiteSearchCategories.php b/plugins/Actions/Reports/GetSiteSearchCategories.php
index 7115f725d0..be323b92ad 100644
--- a/plugins/Actions/Reports/GetSiteSearchCategories.php
+++ b/plugins/Actions/Reports/GetSiteSearchCategories.php
@@ -10,7 +10,6 @@ namespace Piwik\Plugins\Actions\Reports;
use Piwik\Piwik;
use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\Actions\Actions;
use Piwik\Plugins\Actions\Columns\SearchCategory;
use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
@@ -30,7 +29,7 @@ class GetSiteSearchCategories extends SiteSearchBase
protected function isEnabledForIdSites($idSites, $idSite)
{
- return parent::isEnabledForIdSites($idSites, $idSite) && Actions::isCustomVariablesPluginsEnabled();
+ return parent::isEnabledForIdSites($idSites, $idSite);
}
public function getMetrics()
diff --git a/plugins/Actions/VisitorDetails.php b/plugins/Actions/VisitorDetails.php
index 61ceff342e..940735b938 100644
--- a/plugins/Actions/VisitorDetails.php
+++ b/plugins/Actions/VisitorDetails.php
@@ -117,9 +117,14 @@ class VisitorDetails extends VisitorDetailsAbstract
if ($action['type'] == Action::TYPE_SITE_SEARCH) {
// Handle Site Search
$action['siteSearchKeyword'] = $action['pageTitle'];
+ $action['siteSearchCategory'] = $action['search_cat'];
+ $action['siteSearchCount'] = $action['search_count'];
unset($action['pageTitle']);
}
+ unset($action['search_cat']);
+ unset($action['search_count']);
+
// Generation time
if ($this->shouldHandleAction($action) && empty($action['eventType']) && isset($action['custom_float']) && $action['custom_float'] > 0) {
$action['generationTimeMilliseconds'] = $action['custom_float'];
@@ -207,6 +212,15 @@ class VisitorDetails extends VisitorDetailsAbstract
$action['iconSVG'] = 'plugins/Morpheus/images/search.svg';
$action['title'] = Piwik::translate('Actions_SubmenuSitesearch');
$action['subtitle'] = $action['siteSearchKeyword'];
+
+ if (!empty($action['siteSearchCategory'])) {
+ $action['subtitle'] .= ' - ' . Piwik::translate('Actions_ColumnSearchCategory') . ': ' . $action['siteSearchCategory'];
+ }
+
+ if (!empty($action['siteSearchCount'])) {
+ $action['subtitle'] .= ' - ' . Piwik::translate('Actions_ColumnSearchResultsCount') . ': ' . $action['siteSearchCount'];
+ }
+
break;
case Action::TYPE_PAGE_URL:
case Action::TYPE_PAGE_TITLE:
@@ -262,7 +276,9 @@ class VisitorDetails extends VisitorDetailsAbstract
log_link_visit_action.time_spent_ref_action as timeSpentRef,
log_link_visit_action.idlink_va AS pageId,
log_link_visit_action.custom_float,
- log_link_visit_action.interaction_position
+ log_link_visit_action.interaction_position,
+ log_link_visit_action.search_cat,
+ log_link_visit_action.search_count
" . $customActionDimensionFields . "
FROM " . Common::prefixTable('log_link_visit_action') . " AS log_link_visit_action
LEFT JOIN " . Common::prefixTable('log_action') . " AS log_action
diff --git a/plugins/Actions/javascripts/rowactions.js b/plugins/Actions/javascripts/rowactions.js
index 422036aecc..71b2be6885 100644
--- a/plugins/Actions/javascripts/rowactions.js
+++ b/plugins/Actions/javascripts/rowactions.js
@@ -23,6 +23,9 @@ $(function () {
tr = getRealRowIfComparisonRow(tr);
var link = tr.find('> td:first > a').attr('href');
+ // replace all &, that are not part of a named character reference with a tailing semicolon, with a &amp;
+ // otherwise named character references without a tailing , (like &reg) would be replaced
+ link = link.replace(/&([a-z]+[^a-z;])/, '&amp;$1');
link = $('<textarea>').html(link).val(); // remove html entities
return link;
}
diff --git a/plugins/Actions/lang/cs.json b/plugins/Actions/lang/cs.json
index 34b660f9ae..d407792896 100644
--- a/plugins/Actions/lang/cs.json
+++ b/plugins/Actions/lang/cs.json
@@ -1,6 +1,8 @@
{
"Actions": {
"AvgGenerationTimeTooltip": "Průměr dle %1$s přístupů %2$s mezi %3$s a %4$s",
+ "ColumnClickedURL": "Kliknutý externí odkaz",
+ "ColumnClickedURLs": "Kliknuté externí odkazy",
"ColumnActionURL": "URL akce",
"ColumnClicks": "Prokliků",
"ColumnClicksDocumentation": "Počet kliknutí na odkaz v závislosti na čase.",
diff --git a/plugins/Actions/lang/el.json b/plugins/Actions/lang/el.json
index 72622c33b3..d968798c82 100644
--- a/plugins/Actions/lang/el.json
+++ b/plugins/Actions/lang/el.json
@@ -57,6 +57,8 @@
"SiteSearchCategories": "Κατηγορίες (Αναζήτηση ιστοτόπου)",
"SiteSearchKeyword": "Λέξη κλειδί (Αναζήτηση ιστοτόπου)",
"SiteSearchKeywords": "Λέξεις κλειδιά (Αναζήτηση ιστοτόπου)",
+ "SiteSearchKeywordCount": "Εμφάνιση λέξης κλειδιού (Αναζήτηση ιστοτόπου)",
+ "SiteSearchKeywordCounts": "Εμφανίσεις λέξεων κλειδιών (Αναζήτηση ιστοτόπου)",
"SiteSearchKeywordsDocumentation": "Η παρούσα αναφορά απαριθμεί τις λέξεις-κλειδιά αναζήτησης που έψαξαν οι επισκέπτες στην εσωτερική μηχανή αναζήτησης σας.",
"SiteSearchKeywordsNoResultDocumentation": "Η παρούσα αναφορά παραθέτει τις λέξεις-κλειδιά αναζήτησης που δεν επιστρέψαν κανένα αποτέλεσμα αναζήτησης: ίσως ο αλγόριθμος της μηχανής αναζήτησης μπορεί να βελτιωθεί ή ίσως οι επισκέπτες σας ψάχνουν για περιεχόμενο που δεν είναι (ακόμη) στην ιστοσελίδα σας;",
"SubmenuPagesEntry": "Σελίδες εισόδου",
diff --git a/plugins/Actions/lang/en.json b/plugins/Actions/lang/en.json
index 218e51486d..5baab108f8 100644
--- a/plugins/Actions/lang/en.json
+++ b/plugins/Actions/lang/en.json
@@ -57,6 +57,8 @@
"SiteSearchCategories": "Categories (Site Search)",
"SiteSearchKeyword": "Keyword (Site Search)",
"SiteSearchKeywords": "Keywords (Site Search)",
+ "SiteSearchKeywordCount": "Keyword count (Site Search)",
+ "SiteSearchKeywordCounts": "Keyword counts (Site Search)",
"SiteSearchKeywordsDocumentation": "This report lists the Search Keywords that visitors searched for on your internal Search Engine.",
"SiteSearchKeywordsNoResultDocumentation": "This report lists the Search Keywords that did not return any Search result: maybe the search engine algorithm can be improved, or maybe your visitors are looking for content that is not (yet) on your website?",
"SubmenuPagesEntry": "Entry pages",
diff --git a/plugins/Actions/lang/sq.json b/plugins/Actions/lang/sq.json
index 4988202948..e2faea3240 100644
--- a/plugins/Actions/lang/sq.json
+++ b/plugins/Actions/lang/sq.json
@@ -57,6 +57,8 @@
"SiteSearchCategories": "Kategori (Kërkim Në Sajt)",
"SiteSearchKeyword": "Fjalëkyç (Kërkim te Sajti)",
"SiteSearchKeywords": "Fjalëkyça (Kërkim Në Sajt)",
+ "SiteSearchKeywordCount": "Numër fjalëkyçesh (Kërkim Në Sajt)",
+ "SiteSearchKeywordCounts": "Numër fjalëkyçesh (Kërkim Në Sajt)",
"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",
diff --git a/plugins/Actions/lang/zh-cn.json b/plugins/Actions/lang/zh-cn.json
index fdbee29c52..50bea1ffd7 100644
--- a/plugins/Actions/lang/zh-cn.json
+++ b/plugins/Actions/lang/zh-cn.json
@@ -1,6 +1,8 @@
{
"Actions": {
"AvgGenerationTimeTooltip": "平均值基于 %1$s 次访问 %2$s,介于 %3$s 和 %4$s 之间",
+ "ColumnClickedURL": "点击的外部链接",
+ "ColumnClickedURLs": "点击的链接",
"ColumnActionURL": "活动网址",
"ColumnClicks": "点击次数",
"ColumnClicksDocumentation": "链接被点击的次数",
@@ -55,6 +57,8 @@
"SiteSearchCategories": "所有分类(站内搜索)",
"SiteSearchKeyword": "关键词(站内搜索)",
"SiteSearchKeywords": "关键词(站内搜索)",
+ "SiteSearchKeywordCount": "关键词计数(网站搜索)",
+ "SiteSearchKeywordCounts": "关键词计数(网站搜索)",
"SiteSearchKeywordsDocumentation": "此报表显示访客使用站内搜索时用到的搜索关键词。",
"SiteSearchKeywordsNoResultDocumentation": "此报表列出没有任何搜索结果的关键词:或许搜索算法需要改进,或是访客要找的内容在您的网站上还没有?",
"SubmenuPagesEntry": "进入页面",
diff --git a/plugins/Actions/lang/zh-tw.json b/plugins/Actions/lang/zh-tw.json
index 937b259b7b..02efb01893 100644
--- a/plugins/Actions/lang/zh-tw.json
+++ b/plugins/Actions/lang/zh-tw.json
@@ -1,6 +1,8 @@
{
"Actions": {
"AvgGenerationTimeTooltip": "基於 %1$s 次點擊%2$s介於 %3$s 到 %4$s",
+ "ColumnClickedURL": "點擊的離開連結",
+ "ColumnClickedURLs": "點擊的離開連結",
"ColumnActionURL": "活動網址",
"ColumnClicks": "點擊數",
"ColumnClicksDocumentation": "此連結被點擊的次數。",
diff --git a/plugins/Actions/tests/Integration/ActionSiteSearchTest.php b/plugins/Actions/tests/Integration/ActionSiteSearchTest.php
index 27011a30cd..0c22da0643 100644
--- a/plugins/Actions/tests/Integration/ActionSiteSearchTest.php
+++ b/plugins/Actions/tests/Integration/ActionSiteSearchTest.php
@@ -20,7 +20,7 @@ use Piwik\Tracker\Request;
*/
class ActionSiteSearchTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Actions/tests/UI/expected-screenshots/ActionsDataTable_segmented_visitor_log.png b/plugins/Actions/tests/UI/expected-screenshots/ActionsDataTable_segmented_visitor_log.png
index b5f6435e31..5594398ca2 100644
--- a/plugins/Actions/tests/UI/expected-screenshots/ActionsDataTable_segmented_visitor_log.png
+++ b/plugins/Actions/tests/UI/expected-screenshots/ActionsDataTable_segmented_visitor_log.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ec03e7044b738a214e3d44608ac3e3d6e170276939b5820adde2d0e842e43629
-size 381812
+oid sha256:401ff0f9327b2e2800ed3e79a18d3a91b1697f8f7be3d10a0a028821635fed19
+size 381984
diff --git a/plugins/Actions/tests/Unit/ArchiverTest.php b/plugins/Actions/tests/Unit/ArchiverTest.php
index 8098e5fe0f..79d61a016c 100644
--- a/plugins/Actions/tests/Unit/ArchiverTest.php
+++ b/plugins/Actions/tests/Unit/ArchiverTest.php
@@ -9,8 +9,8 @@
namespace Piwik\Plugins\Actions\tests\Unit;
use Piwik\Plugins\Actions\ArchivingHelper;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tracker\Action;
-use Piwik\Translate;
require_once PIWIK_INCLUDE_PATH . '/plugins/Actions/Actions.php';
@@ -19,16 +19,16 @@ require_once PIWIK_INCLUDE_PATH . '/plugins/Actions/Actions.php';
* @group ArchiverTest
* @group Plugins
*/
-class ArchiverTests extends \PHPUnit_Framework_TestCase
+class ArchiverTests extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::reset();
+ Fixture::resetTranslations();
}
public function getActionNameTestData()
diff --git a/plugins/Annotations/Annotations.php b/plugins/Annotations/Annotations.php
index 228761de2f..791a4939cd 100644
--- a/plugins/Annotations/Annotations.php
+++ b/plugins/Annotations/Annotations.php
@@ -16,7 +16,7 @@ namespace Piwik\Plugins\Annotations;
class Annotations extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/Annotations/lang/de.json b/plugins/Annotations/lang/de.json
index 8eb1dbdcb0..fd3b20ee0f 100644
--- a/plugins/Annotations/lang/de.json
+++ b/plugins/Annotations/lang/de.json
@@ -15,7 +15,7 @@
"InlineQuickHelp": "Sie können Anmerkungen erstellen um spezielle Ereignisse (wie einen Blog-Eintrag oder eine Neugestaltung der Website) zu markieren, Stichtage für die Datenanalyse zu speichern oder einfach alles zu speichern was Ihnen wichtig erscheint.",
"LoginToAnnotate": "Sie müssen sich einloggen um eine Anmerkung hinzufügen zu können.",
"NoAnnotations": "Für diesen Zeitraum sind keine Anmerkungen vorhanden.",
- "PluginDescription": "Erlaubt Ihnen Hinweise zu verschiedenen Tagen hinzuzufügen, um Änderungen zu markieren, die an der Website gemacht wurden, Analysen zu speichern, die bezüglich Ihrer Daten gemacht wurden und um Ihre Gedanken mit Ihren Kollegen zu teilen. Durch das Hinzufügen von Hinweisen stellen Sie sicher, dass Sie sich daran erinnern warum die Daten so sind, wie sie sind.",
+ "PluginDescription": "Erlaubt Ihnen Anmerkungen zu verschiedenen Tagen hinzuzufügen, um Änderungen zu markieren, die an der Website gemacht wurden, Analysen zu speichern, die bezüglich Ihrer Daten gemacht wurden und um Ihre Gedanken mit Ihren Kollegen zu teilen. Durch das Hinzufügen von Anmerkungen stellen Sie sicher, dass Sie sich daran erinnern warum die Daten so sind, wie sie sind.",
"ViewAndAddAnnotations": "Anmerkungen zu %s ansehen und hinzufügen …",
"YouCannotModifyThisNote": "Sie können diese Anmerkung nicht ändern, da Sie sie weder erstellt haben noch administrativen Zugang für diese Seite besitzen."
}
diff --git a/plugins/AnonymousPiwikUsageMeasurement b/plugins/AnonymousPiwikUsageMeasurement
-Subproject 3adf91824dec83ecb4b5f8cf9dc534995f82010
+Subproject f261ba1f8e89e059a1942f1281ec884608f507c
diff --git a/plugins/Bandwidth b/plugins/Bandwidth
-Subproject 30676cdf0fc30521b39bb46ac39c6253796ef31
+Subproject 8967357a2fbe708648518ffbc9aa16b03626b80
diff --git a/plugins/BulkTracking/BulkTracking.php b/plugins/BulkTracking/BulkTracking.php
index 89379e38f5..7cd3af44b8 100644
--- a/plugins/BulkTracking/BulkTracking.php
+++ b/plugins/BulkTracking/BulkTracking.php
@@ -19,7 +19,7 @@ class BulkTracking extends \Piwik\Plugin
private $requests;
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/BulkTracking/tests/Fixtures/SimpleFixtureTrackFewVisits.php b/plugins/BulkTracking/tests/Fixtures/SimpleFixtureTrackFewVisits.php
index aac9c14a2a..b5545269a6 100644
--- a/plugins/BulkTracking/tests/Fixtures/SimpleFixtureTrackFewVisits.php
+++ b/plugins/BulkTracking/tests/Fixtures/SimpleFixtureTrackFewVisits.php
@@ -20,14 +20,14 @@ class SimpleFixtureTrackFewVisits extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
$this->trackFirstVisit();
$this->trackSecondVisit();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/BulkTracking/tests/Framework/TestCase/BulkTrackingTestCase.php b/plugins/BulkTracking/tests/Framework/TestCase/BulkTrackingTestCase.php
index 54eec6e57d..262efd7026 100644
--- a/plugins/BulkTracking/tests/Framework/TestCase/BulkTrackingTestCase.php
+++ b/plugins/BulkTracking/tests/Framework/TestCase/BulkTrackingTestCase.php
@@ -31,7 +31,7 @@ class BulkTrackingTestCase extends IntegrationTestCase
private $pluginBackup;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -41,7 +41,7 @@ class BulkTrackingTestCase extends IntegrationTestCase
Plugin\Manager::getInstance()->addLoadedPlugin('BulkTracking', $this->bulk);
}
- public function tearDown()
+ public function tearDown(): void
{
Plugin\Manager::getInstance()->addLoadedPlugin('BulkTracking', $this->pluginBackup);
parent::tearDown();
diff --git a/plugins/BulkTracking/tests/Integration/BulkTrackingTest.php b/plugins/BulkTracking/tests/Integration/BulkTrackingTest.php
index 58c1e0e89e..af265ba63a 100644
--- a/plugins/BulkTracking/tests/Integration/BulkTrackingTest.php
+++ b/plugins/BulkTracking/tests/Integration/BulkTrackingTest.php
@@ -74,12 +74,11 @@ class BulkTrackingTest extends BulkTrackingTestCase
$this->assertCount(2, $requests);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage token_auth must be specified when using Bulk Tracking Import
- */
public function test_initRequestSet_shouldTriggerException_InCaseNoValidTokenProvidedAndAuthenticationIsRequired()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('token_auth must be specified when using Bulk Tracking Import');
+
$request = $this->getDummyRequest(false);
$this->initRequestSet($request, true);
diff --git a/plugins/BulkTracking/tests/Integration/HandlerTest.php b/plugins/BulkTracking/tests/Integration/HandlerTest.php
index 69aed7a910..0a963e8672 100644
--- a/plugins/BulkTracking/tests/Integration/HandlerTest.php
+++ b/plugins/BulkTracking/tests/Integration/HandlerTest.php
@@ -46,7 +46,7 @@ class HandlerTest extends IntegrationTestCase
*/
private $requestSet;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/BulkTracking/tests/Integration/RequestsTest.php b/plugins/BulkTracking/tests/Integration/RequestsTest.php
index 3f7e9672c1..3e4e0fbc7e 100644
--- a/plugins/BulkTracking/tests/Integration/RequestsTest.php
+++ b/plugins/BulkTracking/tests/Integration/RequestsTest.php
@@ -29,7 +29,7 @@ class RequestsTest extends IntegrationTestCase
*/
private $requests;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -38,7 +38,7 @@ class RequestsTest extends IntegrationTestCase
$this->requests = new Requests();
}
- public function tearDown()
+ public function tearDown(): void
{
// clean up your test here if needed
@@ -65,32 +65,29 @@ class RequestsTest extends IntegrationTestCase
TrackerConfig::setConfigValue('bulk_requests_require_authentication', $oldConfig);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage token_auth must be specified when using Bulk Tracking Import
- */
public function test_authenticateRequests_shouldThrowAnException_IfTokenAuthIsEmpty()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('token_auth must be specified when using Bulk Tracking Import');
+
$requests = array($this->buildDummyRequest());
$this->requests->authenticateRequests($requests);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage token_auth must be specified when using Bulk Tracking Import
- */
public function test_authenticateRequests_shouldThrowAnException_IfAnyTokenAuthIsEmpty()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('token_auth must be specified when using Bulk Tracking Import');
+
$requests = array($this->buildDummyRequest($this->getSuperUserToken()), $this->buildDummyRequest());
$this->requests->authenticateRequests($requests);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage token_auth specified does not have Admin permission for idsite=1
- */
public function test_authenticateRequests_shouldThrowAnException_IfTokenIsNotValid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('token_auth specified does not have Admin permission for idsite=1');
+
$dummyToken = API::getInstance()->createTokenAuth('test');
$superUserToken = $this->getSuperUserToken();
diff --git a/plugins/BulkTracking/tests/Integration/TrackerTest.php b/plugins/BulkTracking/tests/Integration/TrackerTest.php
index 1f2b25a0b4..4eaafa7088 100644
--- a/plugins/BulkTracking/tests/Integration/TrackerTest.php
+++ b/plugins/BulkTracking/tests/Integration/TrackerTest.php
@@ -36,7 +36,7 @@ class TrackerTest extends BulkTrackingTestCase
*/
private $tracker;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/BulkTracking/tests/System/TrackerTest.php b/plugins/BulkTracking/tests/System/TrackerTest.php
index 4c3be14816..83365c86b5 100644
--- a/plugins/BulkTracking/tests/System/TrackerTest.php
+++ b/plugins/BulkTracking/tests/System/TrackerTest.php
@@ -22,11 +22,11 @@ class TrackerTest extends SystemTestCase
public static $fixture = null;
/**
- * @var \PiwikTracker
+ * @var \MatomoTracker
*/
private $tracker;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/BulkTracking/tests/Unit/RequestsTest.php b/plugins/BulkTracking/tests/Unit/RequestsTest.php
index 78a6b93ffb..1fbc9c793d 100644
--- a/plugins/BulkTracking/tests/Unit/RequestsTest.php
+++ b/plugins/BulkTracking/tests/Unit/RequestsTest.php
@@ -16,14 +16,14 @@ use Piwik\Tracker\Request;
* @group RequestsTest
* @group Plugins
*/
-class RequestsTest extends \PHPUnit_Framework_TestCase
+class RequestsTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Requests
*/
private $requests;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->requests = new Requests();
diff --git a/plugins/BulkTracking/tests/Unit/ResponseTest.php b/plugins/BulkTracking/tests/Unit/ResponseTest.php
index 5cf26225b6..f6f182b740 100644
--- a/plugins/BulkTracking/tests/Unit/ResponseTest.php
+++ b/plugins/BulkTracking/tests/Unit/ResponseTest.php
@@ -33,7 +33,7 @@ class ResponseTest extends UnitTestCase
*/
private $response;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Contents/VisitorDetails.php b/plugins/Contents/VisitorDetails.php
index acf3363d38..110966f986 100644
--- a/plugins/Contents/VisitorDetails.php
+++ b/plugins/Contents/VisitorDetails.php
@@ -31,6 +31,7 @@ class VisitorDetails extends VisitorDetailsAbstract
}
$view = new View('@Contents/_actionContent.twig');
+ $view->sendHeadersWhenRendering = false;
$view->action = $action;
$view->previousAction = $previousAction;
$view->visitInfo = $visitorDetails;
@@ -44,6 +45,7 @@ class VisitorDetails extends VisitorDetailsAbstract
}
$view = new View('@Contents/_actionTooltip');
+ $view->sendHeadersWhenRendering = false;
$view->action = $action;
return [[ 10, $view->render() ]];
}
diff --git a/plugins/Contents/tests/Fixtures/TwoVisitsWithContents.php b/plugins/Contents/tests/Fixtures/TwoVisitsWithContents.php
index 4285d3ee08..0898578b18 100644
--- a/plugins/Contents/tests/Fixtures/TwoVisitsWithContents.php
+++ b/plugins/Contents/tests/Fixtures/TwoVisitsWithContents.php
@@ -10,7 +10,7 @@ namespace Piwik\Plugins\Contents\tests\Fixtures;
use Piwik\Date;
use Piwik\Plugins\Goals\API as APIGoals;
use Piwik\Tests\Framework\Fixture;
-use PiwikTracker;
+use MatomoTracker;
/**
* Tracks contents
@@ -21,7 +21,7 @@ class TwoVisitsWithContents extends Fixture
public $idSite = 1;
public $idGoal1 = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
@@ -56,13 +56,13 @@ class TwoVisitsWithContents extends Fixture
$this->trackContentImpressionsAndInteractions($vis2);
}
- private function moveTimeForward(PiwikTracker $vis, $minutes)
+ private function moveTimeForward(MatomoTracker $vis, $minutes)
{
$hour = $minutes / 60;
$vis->setForceVisitDateTime(Date::factory($this->dateTime)->addHour($hour)->getDatetime());
}
- protected function trackContentImpressionsAndInteractions(PiwikTracker $vis)
+ protected function trackContentImpressionsAndInteractions(MatomoTracker $vis)
{
$vis->setUrl('http://www.example.org/page');
$vis->setGenerationTime(333);
@@ -91,7 +91,7 @@ class TwoVisitsWithContents extends Fixture
self::checkResponse($vis->doTrackContentImpression('Video Ad', 'movie.mov'));
}
- public function tearDown()
+ public function tearDown(): void
{
}
} \ No newline at end of file
diff --git a/plugins/Contents/tests/System/ContentsTest.php b/plugins/Contents/tests/System/ContentsTest.php
index 06061fe605..d7a4b350a7 100644
--- a/plugins/Contents/tests/System/ContentsTest.php
+++ b/plugins/Contents/tests/System/ContentsTest.php
@@ -7,9 +7,9 @@
*/
namespace Piwik\Plugins\Contents\tests\System;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
use Piwik\Plugins\Contents\tests\Fixtures\TwoVisitsWithContents;
-use Piwik\Translate;
/**
* Testing Contents
@@ -45,16 +45,16 @@ class ContentsTest extends SystemTestCase
);
}
- protected function setup()
+ public function setUp(): void
{
- parent::setup();
- Translate::loadAllTranslations();
+ parent::setUp();
+ Fixture::loadAllTranslations();
}
- protected function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
- Translate::reset();
+ Fixture::resetTranslations();
}
public function getApiForTesting()
diff --git a/plugins/CoreAdminHome/CustomLogo.php b/plugins/CoreAdminHome/CustomLogo.php
index e8dfffe3e6..97f384e3b6 100644
--- a/plugins/CoreAdminHome/CustomLogo.php
+++ b/plugins/CoreAdminHome/CustomLogo.php
@@ -108,7 +108,7 @@ class CustomLogo
$directoryWritable = is_writable($directoryWritingTo);
$logoFilesWriteable = is_writeable(PIWIK_DOCUMENT_ROOT . '/' . $pathUserLogo)
&& is_writeable(PIWIK_DOCUMENT_ROOT . '/' . $this->getPathUserSvgLogo())
- && is_writeable(PIWIK_DOCUMENT_ROOT . '/' . $this->getPathUserLogoSmall());;
+ && is_writeable(PIWIK_DOCUMENT_ROOT . '/' . $this->getPathUserLogoSmall());
$isCustomLogoWritable = ($logoFilesWriteable || $directoryWritable) && $this->isFileUploadEnabled();
diff --git a/plugins/CoreAdminHome/lang/cs.json b/plugins/CoreAdminHome/lang/cs.json
index 75a626bed5..a719a8ef7f 100644
--- a/plugins/CoreAdminHome/lang/cs.json
+++ b/plugins/CoreAdminHome/lang/cs.json
@@ -4,6 +4,7 @@
"Administration": "Administrace",
"ArchivingSettings": "Archivování nastavení",
"BrandingSettings": "Nastavení označení",
+ "ErrorEmailFromAddressNotValid": "SMTP adresa odesílatele není platná",
"ReleaseChannel": "Kanál vydání",
"ClickHereToOptIn": "Klikněte zde pro přihlášení.",
"ClickHereToOptOut": "Klikněte zde pro vyloučení.",
diff --git a/plugins/CoreAdminHome/lang/da.json b/plugins/CoreAdminHome/lang/da.json
index 3793e9cda5..a66c10b78d 100644
--- a/plugins/CoreAdminHome/lang/da.json
+++ b/plugins/CoreAdminHome/lang/da.json
@@ -113,6 +113,7 @@
"YouMayOptOut3": "Hvis du gør det, beskytter du dit privatliv, men du forhindrer også ejeren af websitet fra at lære af dine handlinger, og dermed blive i stand til at forbedre brugeroplevelsen for dig og andre brugere.",
"UncheckToOptOut": "Fjern markering for at vælge.",
"CheckToOptIn": "Sæt markering for at vælge.",
+ "OptOutErrorNoCookies": "Tracking tilvalgs-feature kræver, at cookies er aktiveret",
"MissingTrackingCodeEmailSubject": "Ingen trafik for %s er registreret i Matomo Analytics. Kom i gang nu",
"JsTrackingCodeMissingEmail1": "For få dage siden tilføjede du websitet '%s' til din Matomo Analytics. Vi tjekkede lige og det ser ikke ud til at din Matomo registrerer nogen trafik fra dette website.",
"JsTrackingCodeMissingEmail2": "For at påbegynde tracking og få indsigt i dine brugere, er det nødvendigt at tilslutte tracking til dit website eller mobil-app. For websites skal du blot tilføje trackingkoden lige før %s-taggen.",
diff --git a/plugins/CoreAdminHome/lang/fr.json b/plugins/CoreAdminHome/lang/fr.json
index 7a5427a719..28080c59a8 100644
--- a/plugins/CoreAdminHome/lang/fr.json
+++ b/plugins/CoreAdminHome/lang/fr.json
@@ -113,6 +113,9 @@
"YouMayOptOut3": "Cela protégera votre vie privée, mais empêchera également le propriétaire d'apprendre de vos actions et de créer une meilleure expérience pour vous et les autres utilisateurs.",
"UncheckToOptOut": "Décochez cette case pour être exclu(e).",
"CheckToOptIn": "Cochez cette case pour ne plus être exclu(e).",
+ "OptOutErrorNoCookies": "La fonctionnalité de désactivation du suivi nécessite que les cookies soient autorisés.",
+ "OptOutErrorNotHttps": "La fonctionnalité de désactivation du suivi pourrait ne pas fonctionner car ce site n'a pas été chargé en HTTPS. Veuillez recharger la page pour vérifier que le statut de ce suivi a bien été changé.",
+ "OptOutErrorWindowOpen": "La fonctionnalité de désactivation du suivi pourrait ne pas marcher car il semble que la popup de désactivation a été bloquée. Veuillez recharger la page pour vérifier que le statut a bien été changé.",
"MissingTrackingCodeEmailSubject": "Aucun trafic enregistré dans les statistiques Matomo pour %s, démarrez maintenant",
"JsTrackingCodeMissingEmail1": "Il y a quelques jours vous avez ajouté le site web '%s' à votre Matomo. Nous venons de vérifier et il semble que votre Matomo n'aie pas enregistré de trafic pour ce site web.",
"JsTrackingCodeMissingEmail2": "Pour commencer à suivre les données et obtenir des informations sur vos utilisateurs, vous devez configurer le suivi sur votre site Web ou votre application mobile. Pour les sites Web, intégrez simplement le code de suivi juste avant la balise %s.",
diff --git a/plugins/CoreAdminHome/lang/nl.json b/plugins/CoreAdminHome/lang/nl.json
index e140d510b0..dc356e9308 100644
--- a/plugins/CoreAdminHome/lang/nl.json
+++ b/plugins/CoreAdminHome/lang/nl.json
@@ -70,7 +70,7 @@
"MenuSystem": "Systeem",
"MenuDevelopment": "Ontwikkeling",
"MenuMeasurables": "Meetbaar",
- "OptOutComplete": "Opt-out ingesteld; Uw bezoeken aan deze website zullen niet worden opgeslagen voor analyse.",
+ "OptOutComplete": "Opt-out ingesteld; uw bezoeken aan deze website zullen niet worden opgeslagen voor analyse.",
"OptOutCompleteBis": "Als u uw cookies wist, de opt-out cookie verwijdert of wisselt van computer of webbrowser, zult u deze opt-out procedure opnieuw moeten uitvoeren.",
"OptOutDntFound": "Je bezoek wordt niet gemeten omdat je browser aangeeft dat je dat niet wil. Dit is een instelling van je browser, dus je kunt geen gebruik maken van opt-in totdat je de 'Volg mij Niet'-functie uitschakelt.",
"OptOutExplanation": "Matomo is ingericht om privacy op internet te respecteren. U kunt uw bezoekers de opt-out optie van Matomo Web Analytics aanbieden. Daartoe kunt u de volgende HTML-code toevoegen aan uw website, bijvoorbeeld op een pagina met een Privacybeleid.",
diff --git a/plugins/CoreAdminHome/lang/pt.json b/plugins/CoreAdminHome/lang/pt.json
index a0fb27786a..156b5c347b 100644
--- a/plugins/CoreAdminHome/lang/pt.json
+++ b/plugins/CoreAdminHome/lang/pt.json
@@ -113,6 +113,9 @@
"YouMayOptOut3": "Ao fazer isto irá proteger a sua privacidade, mas irá também impedir o proprietário do site de aprender com as suas ações e de criar uma melhor experiência para si e para outros utilizadores.",
"UncheckToOptOut": "Desmarque esta caixa para deixar de participar.",
"CheckToOptIn": "Marque esta caixa para participar.",
+ "OptOutErrorNoCookies": "A funcionalidade de exclusão do acompanhamento necessita de cookies para ser ativada.",
+ "OptOutErrorNotHttps": "A funcionalidade de exclusão do acompanhamento poderá não funcionar porque este site não foi carregado sobre HTTPS. Por favor, recarregue a página para verificar se o seu estado de exclusão foi alterado.",
+ "OptOutErrorWindowOpen": "A funcionalidade de exclusão do acompanhamento poderá não funcionar porque parece que o pop-up de exclusão foi bloqueado. Por favor, recarregue a página para verificar se o seu estado de exclusão foi alterado.",
"MissingTrackingCodeEmailSubject": "Sem tráfego registado no Matomo Analytics para %s. Comece agora",
"JsTrackingCodeMissingEmail1": "Já passaram alguns dias desde que adicionou o site '%s' ao seu Matomo Analytics. Acabámos de confirmar e parece que o seu Matomo não tem qualquer tráfego registado para este site.",
"JsTrackingCodeMissingEmail2": "Para iniciar o acompanhamento de dados e obter conhecimentos sobre os seus utilizadores, é necessário configurar o processo de acompanhamento no seu site ou aplicação móvel. Para sites, basta incorporar o código de acompanhamento imediatamente antes da tag %s.",
diff --git a/plugins/CoreAdminHome/lang/zh-cn.json b/plugins/CoreAdminHome/lang/zh-cn.json
index c653825d19..3ae13d07ba 100644
--- a/plugins/CoreAdminHome/lang/zh-cn.json
+++ b/plugins/CoreAdminHome/lang/zh-cn.json
@@ -113,6 +113,9 @@
"YouMayOptOut3": "这样做可以保护您的隐私,但也会阻止所有者从您的行为中学习,并为您和其他用户创造更好的体验。",
"UncheckToOptOut": "取消勾选此复选框以防止数据追踪",
"CheckToOptIn": "勾选此复选框以接受数据追踪",
+ "OptOutErrorNoCookies": "跟踪退出功能需要启用Cookie。",
+ "OptOutErrorNotHttps": "跟踪退出功能可能无法使用,因为此站点未通过HTTPS加载。 请重新加载页面以检查您的退出状态是否已更改。",
+ "OptOutErrorWindowOpen": "跟踪退出功能可能无法正常运行,因为它似乎阻止了退出弹出窗口。 请重新加载页面以检查您的退出状态是否已更改。",
"MissingTrackingCodeEmailSubject": "Matomo Analytics中没有记录%s的流量,现在开始使用",
"JsTrackingCodeMissingEmail1": "几天前,您将网站“%s”添加到您的Matomo Analytics。 我们刚检查过,您的Matomo似乎没有任何此网站的流量记录。",
"JsTrackingCodeMissingEmail2": "要开始跟踪数据并深入了解用户,您需要在自己的网站或移动应用中设置跟踪功能。 对于网站,只需在%s标记之前嵌入跟踪代码。",
diff --git a/plugins/CoreAdminHome/stylesheets/generalSettings.less b/plugins/CoreAdminHome/stylesheets/generalSettings.less
index bedda0f80c..869804124b 100644
--- a/plugins/CoreAdminHome/stylesheets/generalSettings.less
+++ b/plugins/CoreAdminHome/stylesheets/generalSettings.less
@@ -52,4 +52,8 @@
.fieldArray {
margin-top: 0!important;
}
-} \ No newline at end of file
+}
+
+#currentLogo {
+ background: @theme-color-header-background;
+}
diff --git a/plugins/CoreAdminHome/tests/Fixture/DuplicateActions.php b/plugins/CoreAdminHome/tests/Fixture/DuplicateActions.php
index be2bcf4ca9..1038c90f34 100644
--- a/plugins/CoreAdminHome/tests/Fixture/DuplicateActions.php
+++ b/plugins/CoreAdminHome/tests/Fixture/DuplicateActions.php
@@ -142,7 +142,7 @@ class DuplicateActions extends Fixture
)
);
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/CoreAdminHome/tests/Fixture/TrackingFailures.php b/plugins/CoreAdminHome/tests/Fixture/TrackingFailures.php
index f8ab0cb808..39b7dc683a 100644
--- a/plugins/CoreAdminHome/tests/Fixture/TrackingFailures.php
+++ b/plugins/CoreAdminHome/tests/Fixture/TrackingFailures.php
@@ -15,7 +15,7 @@ class TrackingFailures extends Fixture
public $idSite = 1;
public $dateTime = '2013-01-02 03:04:05';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/CoreAdminHome/tests/Fixtures/SimpleFixtureTrackFewVisits.php b/plugins/CoreAdminHome/tests/Fixtures/SimpleFixtureTrackFewVisits.php
index b5c7fcf711..71324f6303 100644
--- a/plugins/CoreAdminHome/tests/Fixtures/SimpleFixtureTrackFewVisits.php
+++ b/plugins/CoreAdminHome/tests/Fixtures/SimpleFixtureTrackFewVisits.php
@@ -20,14 +20,14 @@ class SimpleFixtureTrackFewVisits extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
$this->trackFirstVisit();
$this->trackSecondVisit();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/CoreAdminHome/tests/Integration/APITest.php b/plugins/CoreAdminHome/tests/Integration/APITest.php
index a3ddf2a182..ba7e246349 100644
--- a/plugins/CoreAdminHome/tests/Integration/APITest.php
+++ b/plugins/CoreAdminHome/tests/Integration/APITest.php
@@ -30,7 +30,7 @@ class APITest extends \Piwik\Tests\Framework\TestCase\IntegrationTestCase
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->api = API::getInstance();
@@ -39,12 +39,11 @@ class APITest extends \Piwik\Tests\Framework\TestCase\IntegrationTestCase
}
}
- /**
- * @expectedException \Piwik\NoAccessException
- * @expectedExceptionMessage checkUserHasSomeAdminAccess
- */
public function test_getTrackingFailures_failsForViewUser()
{
+ $this->expectException(\Piwik\NoAccessException::class);
+ $this->expectExceptionMessage('checkUserHasSomeAdminAccess');
+
$this->setUser();
$this->api->getTrackingFailures();
}
@@ -58,12 +57,11 @@ class APITest extends \Piwik\Tests\Framework\TestCase\IntegrationTestCase
$this->assertSame(array(), $this->api->getTrackingFailures());
}
- /**
- * @expectedException \Piwik\NoAccessException
- * @expectedExceptionMessage checkUserHasSomeAdminAccess
- */
public function test_deleteAllTrackingFailures_failsForViewUser()
{
+ $this->expectException(\Piwik\NoAccessException::class);
+ $this->expectExceptionMessage('checkUserHasSomeAdminAccess');
+
$this->setUser();
$this->api->deleteAllTrackingFailures();
}
@@ -76,22 +74,20 @@ class APITest extends \Piwik\Tests\Framework\TestCase\IntegrationTestCase
$this->api->deleteAllTrackingFailures();
}
- /**
- * @expectedException \Piwik\NoAccessException
- * @expectedExceptionMessage checkUserHasAdminAccess
- */
public function test_deleteTrackingFailure_failsForViewUser()
{
+ $this->expectException(\Piwik\NoAccessException::class);
+ $this->expectExceptionMessage('checkUserHasAdminAccess');
+
$this->setUser();
$this->api->deleteTrackingFailure(1, 2);
}
- /**
- * @expectedException \Piwik\NoAccessException
- * @expectedExceptionMessage checkUserHasAdminAccess
- */
public function test_deleteTrackingFailure_failsForAdminUserIfNotAdminAccessToThatSite()
{
+ $this->expectException(\Piwik\NoAccessException::class);
+ $this->expectExceptionMessage('checkUserHasAdminAccess');
+
$this->setAdminUser();
$this->api->deleteTrackingFailure(2, 2);
}
diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php
index 452b20c036..aeb4071324 100644
--- a/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/Commands/DeleteLogsDataTest.php
@@ -38,7 +38,7 @@ class DeleteLogsDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $result, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains('Invalid date range supplied', $this->applicationTester->getDisplay());
+ self::assertStringContainsString('Invalid date range supplied', $this->applicationTester->getDisplay());
}
public function getTestDataForInvalidDateRangeTest()
@@ -64,7 +64,7 @@ class DeleteLogsDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $result, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains('Invalid site ID', $this->applicationTester->getDisplay());
+ self::assertStringContainsString('Invalid site ID', $this->applicationTester->getDisplay());
}
/**
@@ -83,7 +83,7 @@ class DeleteLogsDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $result, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains('Invalid row limit supplied', $this->applicationTester->getDisplay());
+ self::assertStringContainsString('Invalid row limit supplied', $this->applicationTester->getDisplay());
}
public function getTestDataForInvalidIterationStepTest()
@@ -128,7 +128,7 @@ class DeleteLogsDataTest extends ConsoleCommandTestCase
), $options);
$this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("Successfully deleted 19 visits", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Successfully deleted 19 visits", $this->applicationTester->getDisplay());
}
private function setCommandInput($value)
diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php
index ccbbba8d4d..8b4fefe46c 100644
--- a/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php
@@ -17,7 +17,7 @@ use Piwik\Tests\Framework\TestCase\ConsoleCommandTestCase;
*/
class InvalidateReportDataTest extends ConsoleCommandTestCase
{
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
@@ -41,7 +41,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("Invalid date or date range specifier", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalid date or date range specifier", $this->applicationTester->getDisplay());
}
public function getInvalidDateRanges()
@@ -67,7 +67,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("Invalid period type", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalid period type", $this->applicationTester->getDisplay());
}
public function getInvalidPeriodTypes()
@@ -92,7 +92,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("Invalid --sites value", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalid --sites value", $this->applicationTester->getDisplay());
}
public function getInvalidSiteLists()
@@ -117,7 +117,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("The segment condition 'ablksdjfdslkjf' is not valid", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("The segment condition 'ablksdjfdslkjf' is not valid", $this->applicationTester->getDisplay());
}
/**
@@ -139,7 +139,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
$this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
foreach ($expectedOutputs as $output) {
- $this->assertContains($output, $this->applicationTester->getDisplay());
+ self::assertStringContainsString($output, $this->applicationTester->getDisplay());
}
}
@@ -155,7 +155,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("Invalidating range periods overlapping 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
}
public function test_Command_InvalidateDateRange_invalidDate()
@@ -170,7 +170,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("The date '2019-01-01,2019-01--09' is not a correct date range", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("The date '2019-01-01,2019-01--09' is not a correct date range", $this->applicationTester->getDisplay());
}
public function test_Command_InvalidateDateRange_onlyOneDate()
@@ -185,7 +185,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("The date '2019-01-01' is not a correct date range", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("The date '2019-01-01' is not a correct date range", $this->applicationTester->getDisplay());
}
public function test_Command_InvalidateDateRange_tooManyDatesInRange()
@@ -200,7 +200,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("The date '2019-01-01,2019-01-09,2019-01-12,2019-01-15' is not a correct date range", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("The date '2019-01-01,2019-01-09,2019-01-12,2019-01-15' is not a correct date range", $this->applicationTester->getDisplay());
}
public function test_Command_InvalidateDateRange_multipleDateRanges()
@@ -215,7 +215,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-15", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-15", $this->applicationTester->getDisplay());
}
public function test_Command_InvalidateDateRange_invalidateAllPeriodTypesSkipsRangeWhenNotRangeDAte()
@@ -230,8 +230,8 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertNotContains("range", $this->applicationTester->getDisplay());
- $this->assertNotContains("Range", $this->applicationTester->getDisplay());
+ self::assertStringNotContainsString("range", $this->applicationTester->getDisplay());
+ self::assertStringNotContainsString("Range", $this->applicationTester->getDisplay());
}
public function test_Command_InvalidateDateRange_invalidateAllPeriodTypes()
@@ -246,11 +246,11 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("Invalidating day periods in 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
- $this->assertContains("Invalidating week periods in 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
- $this->assertContains("Invalidating month periods in 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
- $this->assertContains("Invalidating year periods in 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
- $this->assertContains("Invalidating range periods overlapping 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalidating day periods in 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalidating week periods in 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalidating month periods in 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalidating year periods in 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09 [segment = ]", $this->applicationTester->getDisplay());
}
public function test_Command_InvalidateAll_multipleDateRanges()
@@ -265,7 +265,7 @@ class InvalidateReportDataTest extends ConsoleCommandTestCase
));
$this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-13 [segment = ]", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Invalidating range periods overlapping 2019-01-01,2019-01-09;2019-01-12,2019-01-13 [segment = ]", $this->applicationTester->getDisplay());
}
public function getTestDataForSuccessTests()
diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/OptimizeArchiveTablesTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/OptimizeArchiveTablesTest.php
index e6eca03727..cac3f180af 100644
--- a/plugins/CoreAdminHome/tests/Integration/Commands/OptimizeArchiveTablesTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/Commands/OptimizeArchiveTablesTest.php
@@ -18,7 +18,7 @@ use Piwik\Tests\Framework\TestCase\ConsoleCommandTestCase;
*/
class OptimizeArchiveTablesTest extends ConsoleCommandTestCase
{
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/PurgeOldArchiveDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/PurgeOldArchiveDataTest.php
index 63d8bfa527..2d5d29c127 100644
--- a/plugins/CoreAdminHome/tests/Integration/Commands/PurgeOldArchiveDataTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/Commands/PurgeOldArchiveDataTest.php
@@ -35,7 +35,7 @@ class PurgeOldArchiveDataTest extends IntegrationTestCase
*/
protected $application;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -57,7 +57,7 @@ class PurgeOldArchiveDataTest extends IntegrationTestCase
self::$fixture->assertInvalidatedArchivesNotPurged(self::$fixture->february);
}
- public function tearDown()
+ public function tearDown(): void
{
PurgeOldArchiveData::$todayOverride = null;
@@ -138,9 +138,9 @@ class PurgeOldArchiveDataTest extends IntegrationTestCase
self::$fixture->assertTemporaryArchivesNotPurged(self::$fixture->january);
self::$fixture->assertCustomRangesNotPurged(self::$fixture->january);
- $this->assertContains("Skipping purge outdated archive data.", $this->applicationTester->getDisplay());
- $this->assertContains("Skipping purge invalidated archive data.", $this->applicationTester->getDisplay());
- $this->assertContains("Skipping OPTIMIZE TABLES.", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Skipping purge outdated archive data.", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Skipping purge invalidated archive data.", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Skipping OPTIMIZE TABLES.", $this->applicationTester->getDisplay());
}
protected function getCommandDisplayOutputErrorMessage()
diff --git a/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php b/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php
index a17b709f03..6e16c7d867 100644
--- a/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/FixDuplicateActionsTest.php
@@ -29,7 +29,7 @@ class FixDuplicateActionsTest extends IntegrationTestCase
*/
protected $applicationTester = null;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -54,7 +54,7 @@ class FixDuplicateActionsTest extends IntegrationTestCase
$this->assertDuplicatesFixedInLogConversionTable();
$this->assertDuplicatesFixedInLogConversionItemTable();
- $this->assertContains("Found and deleted 7 duplicate action entries", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Found and deleted 7 duplicate action entries", $this->applicationTester->getDisplay());
$expectedAffectedArchives = array(
array('idsite' => '1', 'server_time' => '2012-01-01'),
@@ -64,7 +64,7 @@ class FixDuplicateActionsTest extends IntegrationTestCase
array('idsite' => '2', 'server_time' => '2012-03-01'),
);
foreach ($expectedAffectedArchives as $archive) {
- $this->assertContains("[ idSite = {$archive['idsite']}, date = {$archive['server_time']} ]", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("[ idSite = {$archive['idsite']}, date = {$archive['server_time']} ]", $this->applicationTester->getDisplay());
}
}
diff --git a/plugins/CoreAdminHome/tests/Integration/Model/DuplicateActionRemoverTest.php b/plugins/CoreAdminHome/tests/Integration/Model/DuplicateActionRemoverTest.php
index 0c3a89c6a4..7add6d6247 100644
--- a/plugins/CoreAdminHome/tests/Integration/Model/DuplicateActionRemoverTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/Model/DuplicateActionRemoverTest.php
@@ -28,7 +28,7 @@ class DuplicateActionRemoverTest extends IntegrationTestCase
*/
private $duplicateActionRemover;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/CoreAdminHome/tests/Integration/SetConfigTest.php b/plugins/CoreAdminHome/tests/Integration/SetConfigTest.php
index e849ddafa3..5f5d1c3a02 100644
--- a/plugins/CoreAdminHome/tests/Integration/SetConfigTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/SetConfigTest.php
@@ -22,21 +22,21 @@ class SetConfigTest extends ConsoleCommandTestCase
{
const TEST_CONFIG_PATH = '/tmp/test.config.ini.php';
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
self::removeTestConfigFile();
parent::setUpBeforeClass();
}
- public function setUp()
+ public function setUp(): void
{
self::removeTestConfigFile();
parent::setUp();
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
$this->makeLocalConfigWritable();
@@ -57,7 +57,7 @@ class SetConfigTest extends ConsoleCommandTestCase
$config = $this->makeNewConfig();
$this->assertEquals(array('setting' => 'myvalue'), $config->MySection);
- $this->assertContains('Setting [MySection] setting = "myvalue"', $this->applicationTester->getDisplay());
+ self::assertStringContainsString('Setting [MySection] setting = "myvalue"', $this->applicationTester->getDisplay());
}
/**
@@ -72,7 +72,7 @@ class SetConfigTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains('Invalid assignment string', $this->applicationTester->getDisplay());
+ self::assertStringContainsString('Invalid assignment string', $this->applicationTester->getDisplay());
}
public function getInvalidArgumentsForTest()
@@ -99,7 +99,7 @@ class SetConfigTest extends ConsoleCommandTestCase
));
$this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains('[Piwik\Exception\MissingFilePermissionException]', $this->applicationTester->getDisplay());
+ self::assertStringContainsString('[Piwik\Exception\MissingFilePermissionException]', $this->applicationTester->getDisplay());
}
public function test_Command_SucceedsWhenArgumentsUsed()
@@ -131,7 +131,7 @@ class SetConfigTest extends ConsoleCommandTestCase
$this->assertEquals(array('def'), $config->MySection['object_value']);
$this->assertArrayNotHasKey('other_array_value', $config->MySection);
- $this->assertContains("done.", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("done.", $this->applicationTester->getDisplay());
}
/**
@@ -150,7 +150,7 @@ class SetConfigTest extends ConsoleCommandTestCase
$config = self::makeNewConfig();
$this->assertEquals(0, $config->Tracker['debug']);
- $this->assertContains("done.", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("done.", $this->applicationTester->getDisplay());
}
public function getOptionsForSettingValueToZeroTests()
diff --git a/plugins/CoreAdminHome/tests/Integration/TasksTest.php b/plugins/CoreAdminHome/tests/Integration/TasksTest.php
index 89c62252d5..7449222454 100644
--- a/plugins/CoreAdminHome/tests/Integration/TasksTest.php
+++ b/plugins/CoreAdminHome/tests/Integration/TasksTest.php
@@ -58,7 +58,7 @@ class TasksTest extends IntegrationTestCase
*/
private $mail;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -77,7 +77,7 @@ class TasksTest extends IntegrationTestCase
$this->mail = null;
}
- public function tearDown()
+ public function tearDown(): void
{
unset($_GET['trigger']);
diff --git a/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php b/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php
index df5b7fd080..b382ec39d8 100644
--- a/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php
+++ b/plugins/CoreAdminHome/tests/Unit/SetConfig/ConfigSettingManipulationTest.php
@@ -44,14 +44,14 @@ class DumbMockConfig extends \Piwik\Config
* @group CoreAdminHome
* @group CoreAdminHome_Unit
*/
-class ConfigSettingManipulationTest extends \PHPUnit_Framework_TestCase
+class ConfigSettingManipulationTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Config
*/
private $mockConfig;
- protected function setUp()
+ public function setUp(): void
{
$this->mockConfig = new DumbMockConfig();
$this->mockConfigData = array();
@@ -94,11 +94,12 @@ class ConfigSettingManipulationTest extends \PHPUnit_Framework_TestCase
/**
* @dataProvider getFailureTestDataForMake
- * @expectedException \InvalidArgumentException
- * @expectedExceptionMessage Invalid assignment string
*/
public function test_make_ThrowsWhenInvalidAssignmentStringSupplied($assignmentString)
{
+ $this->expectException(\InvalidArgumentException::class);
+ $this->expectExceptionMessage('Invalid assignment string');
+
ConfigSettingManipulation::make($assignmentString);
}
@@ -113,24 +114,22 @@ class ConfigSettingManipulationTest extends \PHPUnit_Framework_TestCase
);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Trying to append to non-array setting value
- */
public function test_manipulate_ThrowsIfAppendingNonArraySetting()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Trying to append to non-array setting value');
+
$this->mockConfig->mockConfigData['General']['config'] = "5";
$manipulation = new ConfigSettingManipulation("General", "config", "10", true);
$manipulation->manipulate($this->mockConfig);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Trying to set non-array value to array setting
- */
public function test_manipulate_ThrowsIfAssigningNonArrayValue_ToArraySetting()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Trying to set non-array value to array setting');
+
$this->mockConfig->mockConfigData['General']['config'] = array("5");
$manipulation = new ConfigSettingManipulation("General", "config", "10", false);
diff --git a/plugins/CoreConsole/Commands/DevelopmentSyncProcessedSystemTests.php b/plugins/CoreConsole/Commands/DevelopmentSyncProcessedSystemTests.php
index cd777e6e97..2daa351f77 100644
--- a/plugins/CoreConsole/Commands/DevelopmentSyncProcessedSystemTests.php
+++ b/plugins/CoreConsole/Commands/DevelopmentSyncProcessedSystemTests.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\CoreConsole\Commands;
use Piwik\Common;
use Piwik\Container\StaticContainer;
-use Piwik\Decompress\Tar;
+use Matomo\Decompress\Tar;
use Piwik\Development;
use Piwik\Filesystem;
use Piwik\Http;
diff --git a/plugins/CoreConsole/Commands/GenerateReport.php b/plugins/CoreConsole/Commands/GenerateReport.php
index a7e3af28d0..d9bad9f209 100644
--- a/plugins/CoreConsole/Commands/GenerateReport.php
+++ b/plugins/CoreConsole/Commands/GenerateReport.php
@@ -10,11 +10,10 @@
namespace Piwik\Plugins\CoreConsole\Commands;
use Piwik\Columns\Dimension;
+use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Plugin\Manager;
-use Piwik\Plugin\Report;
use Piwik\Plugin\ReportsProvider;
-use Piwik\Translate;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
@@ -210,7 +209,7 @@ class GenerateReport extends GeneratePluginBase
$validate($category);
}
- $translationKey = Translate::findTranslationKeyForTranslation($category);
+ $translationKey = StaticContainer::get('Piwik\Translation\Translator')->findTranslationKeyForTranslation($category);
if (!empty($translationKey)) {
return $translationKey;
}
diff --git a/plugins/CoreConsole/Commands/GenerateWidget.php b/plugins/CoreConsole/Commands/GenerateWidget.php
index 5968ea8a04..20624b3ba0 100644
--- a/plugins/CoreConsole/Commands/GenerateWidget.php
+++ b/plugins/CoreConsole/Commands/GenerateWidget.php
@@ -9,9 +9,9 @@
namespace Piwik\Plugins\CoreConsole\Commands;
+use Piwik\Container\StaticContainer;
use Piwik\Piwik;
use Piwik\Plugin\Manager;
-use Piwik\Translate;
use Piwik\Widget\WidgetsList;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
@@ -125,7 +125,7 @@ class GenerateWidget extends GeneratePluginBase
/**
* @param InputInterface $input
* @param OutputInterface $output
- * @return array
+ * @return string
* @throws \RuntimeException
*/
protected function getCategory(InputInterface $input, OutputInterface $output)
@@ -148,7 +148,7 @@ class GenerateWidget extends GeneratePluginBase
$validate($category);
}
- $translationKey = Translate::findTranslationKeyForTranslation($category);
+ $translationKey = StaticContainer::get('Piwik\Translation\Translator')->findTranslationKeyForTranslation($category);
if (!empty($translationKey)) {
return $translationKey;
}
@@ -161,7 +161,7 @@ class GenerateWidget extends GeneratePluginBase
/**
* @param InputInterface $input
* @param OutputInterface $output
- * @return array
+ * @return string
* @throws \RuntimeException
*/
protected function getPluginName(InputInterface $input, OutputInterface $output)
diff --git a/plugins/CoreConsole/tests/System/ArchiveCronTest.php b/plugins/CoreConsole/tests/System/ArchiveCronTest.php
index a40218b669..9cfd47fabb 100644
--- a/plugins/CoreConsole/tests/System/ArchiveCronTest.php
+++ b/plugins/CoreConsole/tests/System/ArchiveCronTest.php
@@ -142,7 +142,7 @@ class ArchiveCronTest extends SystemTestCase
$output = implode("\n", $output);
$this->assertRegExp('/Usage:\s*core:archive/', $output);
- $this->assertNotContains("Starting Piwik reports archiving...", $output);
+ self::assertStringNotContainsString("Starting Piwik reports archiving...", $output);
}
private function setLastRunArchiveOptions()
diff --git a/plugins/CoreHome/Columns/VisitIp.php b/plugins/CoreHome/Columns/VisitIp.php
index 8875cd2149..f7f09e56f4 100644
--- a/plugins/CoreHome/Columns/VisitIp.php
+++ b/plugins/CoreHome/Columns/VisitIp.php
@@ -10,7 +10,7 @@ namespace Piwik\Plugins\CoreHome\Columns;
use Piwik\Common;
use Piwik\Metrics\Formatter;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Segment;
@@ -27,7 +27,7 @@ class VisitIp extends VisitDimension
protected $nameSingular = 'General_VisitorIP';
protected $namePlural = 'General_VisitorIPs';
protected $acceptValues = '13.54.122.1. </code>Select IP ranges with notation: <code>visitIp>13.54.122.0;visitIp<13.54.122.255';
- protected $sqlFilterValue = array('Piwik\Network\IPUtils', 'stringToBinaryIP');
+ protected $sqlFilterValue = array('Matomo\Network\IPUtils', 'stringToBinaryIP');
public function formatValue($value, $idSite, Formatter $formatter)
{
diff --git a/plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php b/plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php
index 38fd48fa24..28141fc3c5 100644
--- a/plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php
+++ b/plugins/CoreHome/DataTableRowAction/MultiRowEvolution.php
@@ -56,7 +56,7 @@ class MultiRowEvolution extends RowEvolution
/**
* Render the popover
* @param \Piwik\Plugins\CoreHome\Controller $controller
- * @param View (the popover_rowevolution template)
+ * @param \Piwik\View (the popover_rowevolution template)
*/
public function renderPopover($controller, $view)
{
diff --git a/plugins/CoreHome/DataTableRowAction/RowEvolution.php b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
index 1da36555dc..bb73f9bb87 100644
--- a/plugins/CoreHome/DataTableRowAction/RowEvolution.php
+++ b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
@@ -120,7 +120,7 @@ class RowEvolution
/**
* Render the popover
* @param \Piwik\Plugins\CoreHome\Controller $controller
- * @param View (the popover_rowevolution template)
+ * @param \Piwik\View (the popover_rowevolution template)
*/
public function renderPopover($controller, $view)
{
@@ -284,8 +284,8 @@ class RowEvolution
$fractionDigits = max($this->getFractionDigits($first), $this->getFractionDigits($last));
$details = Piwik::translate('RowEvolution_MetricBetweenText', array(
- NumberFormatter::getInstance()->format($first, $fractionDigits, $fractionDigits) . $unit,
- NumberFormatter::getInstance()->format($last, $fractionDigits, $fractionDigits) . $unit,
+ NumberFormatter::getInstance()->format($first, $fractionDigits) . $unit,
+ NumberFormatter::getInstance()->format($last, $fractionDigits) . $unit,
));
if ($change !== false) {
diff --git a/plugins/CoreHome/LoginWhitelist.php b/plugins/CoreHome/LoginWhitelist.php
index 677736a3c5..b4e7f1eac1 100644
--- a/plugins/CoreHome/LoginWhitelist.php
+++ b/plugins/CoreHome/LoginWhitelist.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\CoreHome;
use Piwik\Common;
use Piwik\Config;
use Piwik\Container\StaticContainer;
-use Piwik\Network\IP as NetworkIp;
+use Matomo\Network\IP as NetworkIp;
use Piwik\NoAccessException;
use Piwik\Piwik;
use Piwik\SettingsServer;
diff --git a/plugins/CoreHome/angularjs/common/services/periods.js b/plugins/CoreHome/angularjs/common/services/periods.js
index 9e6ba80f03..95f6f0c3dd 100644
--- a/plugins/CoreHome/angularjs/common/services/periods.js
+++ b/plugins/CoreHome/angularjs/common/services/periods.js
@@ -63,7 +63,7 @@
},
getDateRange: function () {
- return [this.dateInPeriod, this.dateInPeriod];
+ return [new Date(this.dateInPeriod.getTime()), new Date(this.dateInPeriod.getTime())];
}
};
diff --git a/plugins/CoreHome/angularjs/multipairfield/multipairfield.controller.js b/plugins/CoreHome/angularjs/multipairfield/multipairfield.controller.js
index ea3324be36..5d2a0a0ab2 100644
--- a/plugins/CoreHome/angularjs/multipairfield/multipairfield.controller.js
+++ b/plugins/CoreHome/angularjs/multipairfield/multipairfield.controller.js
@@ -34,6 +34,14 @@
$scope.field2.templateFile = getTemplate($scope.field2);
}
+ if ($scope.field3 && !$scope.field3.templateFile) {
+ $scope.field3.templateFile = getTemplate($scope.field3);
+ }
+
+ if ($scope.field4 && !$scope.field4.templateFile) {
+ $scope.field4.templateFile = getTemplate($scope.field4);
+ }
+
var self = this;
$scope.$watch('formValue', function () {
if (!$scope.formValue || !$scope.formValue.length) {
@@ -50,19 +58,38 @@
hasAny = false;
return;
}
- if ($scope.field1 && $scope.field2) {
- if (!table[$scope.field1.key] && !table[$scope.field2.key]) {
+
+ var fieldCount = 0;
+ if ($scope.field1 && $scope.field2 && $scope.field3 && $scope.field4) {
+ fieldCount = 4;
+ } else if ($scope.field1 && $scope.field2 && $scope.field3) {
+ fieldCount = 3;
+ } else if ($scope.field1 && $scope.field2) {
+ fieldCount = 2;
+ } else if ($scope.field1) {
+ fieldCount = 1;
+ }
+ table.fieldCount = fieldCount;
+
+ if (fieldCount === 4) {
+ if (!table[$scope.field1.key] && !table[$scope.field2.key] && !table[$scope.field3.key] && !table[$scope.field4.key]) {
hasAny = false;
}
- } else if ($scope.field1) {
- if (!table[$scope.field1.key]) {
+ } else if (fieldCount === 3) {
+ if (!table[$scope.field1.key] && !table[$scope.field2.key] && !table[$scope.field3.key]) {
hasAny = false;
}
- } else if ($scope.field2) {
- if (!table[$scope.field2.key]) {
+ } else if (fieldCount === 2) {
+ if (!table[$scope.field1.key] && !table[$scope.field2.key]) {
+ hasAny = false;
+ }
+ } else if (fieldCount === 1) {
+ if (!table[$scope.field1.key]) {
hasAny = false;
}
}
+
+
});
if (hasAny) {
this.addEntry();
@@ -78,6 +105,12 @@
if ($scope.field2 && $scope.field2.key) {
obj[$scope.field2.key] = '';
}
+ if ($scope.field3 && $scope.field3.key) {
+ obj[$scope.field3.key] = '';
+ }
+ if ($scope.field4 && $scope.field4.key) {
+ obj[$scope.field4.key] = '';
+ }
$scope.formValue.push(obj);
}
};
diff --git a/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.html b/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.html
index 0510830f92..2eea7d959b 100644
--- a/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.html
+++ b/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.html
@@ -1,13 +1,13 @@
<div class="multiPairField form-group">
<div ng-repeat="(index, item) in formValue"
- class="multiPairFieldTable multiPairFieldTable{{ index }} multiple valign-wrapper">
+ class="multiPairFieldTable multiPairFieldTable{{ index }} has{{ item.fieldCount }}Fields multiple valign-wrapper">
<div piwik-field uicontrol="{{ field1.uiControl }}"
data-title="{{ field1.title }}"
full-width="true"
ng-if="field1.templateFile"
template-file="{{ field1.templateFile }}"
- class="fieldUiControl1"
+ class="fieldUiControl fieldUiControl1"
ng-class="{'hasMultiFields': (field1.templateFile && field2.templateFile)}"
ng-model="formValue[index][field1.key]"
options="field1.availableValues"
@@ -19,7 +19,7 @@
data-title="{{ field2.title }}"
full-width="true"
ng-if="field2.templateFile"
- class="fieldUiControl2"
+ class="fieldUiControl fieldUiControl2"
template-file="{{ field2.templateFile }}"
options="field2.availableValues"
ng-change="multiPairField.onEntryChange()"
@@ -27,6 +27,30 @@
placeholder=" ">
</div>
+ <div piwik-field uicontrol="{{ field3.uiControl }}"
+ data-title="{{ field3.title }}"
+ full-width="true"
+ ng-if="field3.templateFile"
+ class="fieldUiControl fieldUiControl3"
+ template-file="{{ field3.templateFile }}"
+ options="field3.availableValues"
+ ng-change="multiPairField.onEntryChange()"
+ ng-model="formValue[index][field3.key]"
+ placeholder=" ">
+ </div>
+
+ <div piwik-field uicontrol="{{ field4.uiControl }}"
+ data-title="{{ field4.title }}"
+ full-width="true"
+ ng-if="field4.templateFile"
+ class="fieldUiControl fieldUiControl4"
+ template-file="{{ field4.templateFile }}"
+ options="field4.availableValues"
+ ng-change="multiPairField.onEntryChange()"
+ ng-model="formValue[index][field4.key]"
+ placeholder=" ">
+ </div>
+
<span ng-click="multiPairField.removeEntry(index)"
title="{{ 'General_Remove'|translate }}"
ng-hide="(index + 1) == (formValue|length)"
diff --git a/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.js b/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.js
index 81d9eb913e..58accd4d1e 100644
--- a/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.js
+++ b/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.js
@@ -19,7 +19,9 @@
restrict: 'A',
scope: {
field1: '=',
- field2: '='
+ field2: '=',
+ field3: '=',
+ field4: '='
},
require: "?ngModel",
templateUrl: 'plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.html?cb=' + piwik.cacheBuster,
diff --git a/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.less b/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.less
index 78a9ca4577..3a2f34c736 100644
--- a/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.less
+++ b/plugins/CoreHome/angularjs/multipairfield/multipairfield.directive.less
@@ -6,21 +6,54 @@
margin-bottom: 2px;
}
- .fieldUiControl1.hasMultiFields {
- width: 160px;
- display: inline-block;
- }
+ .multiPairFieldTable {
+
+ &.has1Fields {
+ .fieldUiControl1{
+ width: ~"calc(100% - 60px)";
+ padding-right: 0.75rem;
+ }
+ }
+
+ &:not(.has1Fields) {
+ .fieldUiControl {
+ display: inline-block;
+ padding-right: 0.75rem;
+ }
+ }
- .fieldUiControl1:not(.hasMultiFields) {
- width: ~"calc(100% - 60px)";
- padding-right: 0.75rem;
+ &.has2Fields {
+ .fieldUiControl1 {
+ width: 160px;
+ }
+ .fieldUiControl2 {
+ width: ~"calc(100% - 190px)";
+ padding: 0.75rem;
+ }
+ }
+
+ &.has3Fields {
+ .fieldUiControl1 {
+ width: 120px;
+ }
+ .fieldUiControl2,
+ .fieldUiControl3 {
+ width: 220px;
+ }
+ }
+
+ &.has4Fields {
+ .fieldUiControl1 {
+ width: 120px;
+ }
+ .fieldUiControl2,
+ .fieldUiControl3,
+ .fieldUiControl4 {
+ width: 148px;
+ }
+ }
}
- .fieldUiControl2 {
- width: ~"calc(100% - 190px)";
- padding: 0.75rem;
- display: inline-block;
- }
.icon-minus {
cursor: pointer;
}
diff --git a/plugins/CoreHome/angularjs/period-selector/period-selector.controller.js b/plugins/CoreHome/angularjs/period-selector/period-selector.controller.js
index 58ed8295e3..83e100947e 100644
--- a/plugins/CoreHome/angularjs/period-selector/period-selector.controller.js
+++ b/plugins/CoreHome/angularjs/period-selector/period-selector.controller.js
@@ -257,9 +257,16 @@
currentDateRange[0].setFullYear(currentDateRange[0].getFullYear() - 1);
currentDateRange[1].setFullYear(currentDateRange[1].getFullYear() - 1);
+ if (vm.selectedPeriod === 'range') {
+ return {
+ comparePeriods: ['range'],
+ compareDates: [piwikPeriods.format(currentDateRange[0]) + ',' + piwikPeriods.format(currentDateRange[1])],
+ };
+ }
+
return {
- comparePeriods: ['range'],
- compareDates: [piwikPeriods.format(currentDateRange[0]) + ',' + piwikPeriods.format(currentDateRange[1])],
+ comparePeriods: [vm.selectedPeriod],
+ compareDates: [piwikPeriods.format(currentDateRange[0])],
};
} else {
console.warn("Unknown compare period type: " + vm.comparePeriodType);
diff --git a/plugins/CoreHome/javascripts/popover.js b/plugins/CoreHome/javascripts/popover.js
index 19590d5b86..989de673a1 100644
--- a/plugins/CoreHome/javascripts/popover.js
+++ b/plugins/CoreHome/javascripts/popover.js
@@ -35,6 +35,8 @@ var Piwik_Popover = (function () {
}
$('.ui-widget-overlay').on('click.popover', function () {
+ // if clicking outside of the dialog, close entire stack
+ broadcast.resetPopoverStack();
container.dialog('close');
});
@@ -47,11 +49,6 @@ var Piwik_Popover = (function () {
}, 0);
},
close: function (event, ui) {
- // if clicking outside of the dialog, close entire stack
- if (!event.currentTarget && !$(event.currentTarget).is('button')) {
- broadcast.resetPopoverStack();
- }
-
container.find('div.jqplot-target').trigger('piwikDestroyPlot');
container[0].innerHTML = '';
container.dialog('destroy').remove();
@@ -70,7 +67,7 @@ var Piwik_Popover = (function () {
// if we were not called by Piwik_Popover.close(), then the user clicked the close button or clicked
// the overlay, in which case we want to handle the popover URL as well as the actual modal.
- if (!isProgrammaticClose) {
+ if (!isProgrammaticClose || isEscapeKey(event)) {
broadcast.propagateNewPopoverParameter(false);
}
}
diff --git a/plugins/CoreHome/lang/cs.json b/plugins/CoreHome/lang/cs.json
index 89412ce699..0a41f4c38a 100644
--- a/plugins/CoreHome/lang/cs.json
+++ b/plugins/CoreHome/lang/cs.json
@@ -106,6 +106,7 @@
"StandardReport": "Standartní report",
"FlattenReport": "Srovnat report",
"ReportWithMetadata": "Report s metadaty",
+ "ReadMoreOnlineGuide": "Další informace o tomto tématu naleznete v online příručce.",
"SeeAvailableVersions": "Prohlédnout dostupné verze",
"QuickLinks": "Rychlé odkazy"
}
diff --git a/plugins/CoreHome/lang/fr.json b/plugins/CoreHome/lang/fr.json
index 8ff87ff063..9bd43a303a 100644
--- a/plugins/CoreHome/lang/fr.json
+++ b/plugins/CoreHome/lang/fr.json
@@ -95,7 +95,7 @@
"JsDidntLoad": "Votre navigateur n'a pas été en mesure de charger les scripts de la page.",
"AdblockIsMaybeUsed": "Dans le cas où vous utiliseriez un bloqueur de publicités, veuillez le désactiver pour ce site afin de vous assurer que Matomo fonctionne correctement.",
"ChangeCurrentWebsite": "Choisir un site web, site couramment sélectionné : %s",
- "LeadingAnalyticsPlatformRespectsYourPrivacy": "La première plateforme d'analyse statique libre respecte votre vie privée.",
+ "LeadingAnalyticsPlatformRespectsYourPrivacy": "La première plateforme d'analyses statistiques libre qui respecte votre vie privée.",
"MacPageUp": "Fn + flèche gauche",
"MacPageDown": "Fn + flèche Droite",
"ReportType": "Type de rapport",
diff --git a/plugins/CoreHome/lang/zh-cn.json b/plugins/CoreHome/lang/zh-cn.json
index f95f93cd11..4aacbd32fa 100644
--- a/plugins/CoreHome/lang/zh-cn.json
+++ b/plugins/CoreHome/lang/zh-cn.json
@@ -106,6 +106,7 @@
"StandardReport": "标准报告",
"FlattenReport": "展平报告",
"ReportWithMetadata": "报告元数据",
+ "ReadMoreOnlineGuide": "在线指南中阅读有关此主题的更多信息。",
"SeeAvailableVersions": "请参阅可用版本",
"QuickLinks": "快速链接"
}
diff --git a/plugins/CoreHome/lang/zh-tw.json b/plugins/CoreHome/lang/zh-tw.json
index 64d92e6885..a85494d183 100644
--- a/plugins/CoreHome/lang/zh-tw.json
+++ b/plugins/CoreHome/lang/zh-tw.json
@@ -14,6 +14,8 @@
"DataTableExcludeAggregateRows": "合計列已顯示 %s 點擊隱藏",
"DataTableIncludeAggregateRows": "合計列已隱藏 %s 點擊顯示",
"DataTableHowToSearch": "按下 Enter 鍵或點擊搜尋圖示來搜尋",
+ "DataTableShowDimensions": "目前顯示綜合的維度 %s 分別顯示各個維度",
+ "DataTableCombineDimensions": "目前顯示個別的維度 %s 顯示綜合的維度",
"Default": "預設",
"DonateCall1": "使用 Matomo 永遠不花你任何一毛錢,但那不表示我們開發不需要花到半毛錢。",
"DonateCall2": "Matomo 需要你的持續支持以成長茁壯。",
diff --git a/plugins/CoreHome/templates/_headerMessage.twig b/plugins/CoreHome/templates/_headerMessage.twig
index 46ecd55c18..8de5bed016 100644
--- a/plugins/CoreHome/templates/_headerMessage.twig
+++ b/plugins/CoreHome/templates/_headerMessage.twig
@@ -17,10 +17,17 @@
>
{% if latest_version_available and not isPiwikDemo %}
- <a class="title" href="?module=CoreUpdater&action=newVersionAvailable" style="cursor:pointer;">
- {{ 'General_NewUpdatePiwikX'|translate(latest_version_available) }}
- <span class="icon-warning"></span>
- </a>
+ {% if isMultiServerEnvironment %}
+ <span class="title" style="cursor:pointer;">
+ {{ 'General_NewUpdatePiwikX'|translate(latest_version_available) }}
+ <span class="icon-warning"></span>
+ </span>
+ {% else %}
+ <a class="title" href="?module=CoreUpdater&action=newVersionAvailable" style="cursor:pointer;">
+ {{ 'General_NewUpdatePiwikX'|translate(latest_version_available) }}
+ <span class="icon-warning"></span>
+ </a>
+ {% endif %}
{% elseif isSuperUser and isAdminArea is defined and isAdminArea %}
{% if isInternetEnabled %}
<a class="title">{{ updateCheck|raw }}</a>
diff --git a/plugins/CoreHome/tests/Integration/Column/UserIdTest.php b/plugins/CoreHome/tests/Integration/Column/UserIdTest.php
index 115fd76314..a2141bdf84 100644
--- a/plugins/CoreHome/tests/Integration/Column/UserIdTest.php
+++ b/plugins/CoreHome/tests/Integration/Column/UserIdTest.php
@@ -33,7 +33,7 @@ class UserIdTest extends IntegrationTestCase
protected $date = '2014-04-04';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->userId = new UserId();
@@ -45,7 +45,7 @@ class UserIdTest extends IntegrationTestCase
Fixture::createWebsite('2014-01-01 00:00:00');
}
- public function tearDown()
+ public function tearDown(): void
{
// clean up your test here if needed
$tables = ArchiveTableCreator::getTablesArchivesInstalled();
@@ -244,7 +244,7 @@ class UserIdTest extends IntegrationTestCase
}
}
- private function trackPageview(\PiwikTracker $tracker, $userId, $url = null)
+ private function trackPageview(\MatomoTracker $tracker, $userId, $url = null)
{
if (null !== $url) {
$tracker->setUrl('http://www.example.org' . $url);
diff --git a/plugins/CoreHome/tests/Integration/LoginWhitelistTest.php b/plugins/CoreHome/tests/Integration/LoginWhitelistTest.php
index 0d394fa84f..84bbfe15fd 100644
--- a/plugins/CoreHome/tests/Integration/LoginWhitelistTest.php
+++ b/plugins/CoreHome/tests/Integration/LoginWhitelistTest.php
@@ -42,7 +42,7 @@ class LoginWhitelistTest extends IntegrationTestCase
private $cliMode;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -52,7 +52,7 @@ class LoginWhitelistTest extends IntegrationTestCase
$this->whitelist = new CustomLoginWhitelist();
}
- public function tearDown()
+ public function tearDown(): void
{
Common::$isCliMode = $this->cliMode;
parent::tearDown();
diff --git a/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php b/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php
index 3883904a2b..93eb87b1d4 100644
--- a/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php
+++ b/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php
@@ -11,6 +11,7 @@ namespace Piwik\Plugins\CoreHome\tests\Integration\Tracker;
use Piwik\Cache;
use Piwik\CacheId;
use Piwik\Date;
+use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugins\CoreHome\Tracker\VisitRequestProcessor;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Piwik\Plugins\SitesManager\API;
@@ -140,8 +141,8 @@ class VisitRequestProcessorTest extends IntegrationTestCase
{
$dimensions = array();
foreach ($dimensionOnNewVisitResults as $onNewVisitResult) {
- $dim = $this->getMockBuilder('Piwik\\Plugin\\Dimension')
- ->setMethods(array('shouldForceNewVisit', 'getColumnName'))
+ $dim = $this->getMockBuilder(VisitDimension::class)
+ ->onlyMethods(array('shouldForceNewVisit', 'getColumnName'))
->getMock();
$dim->expects($this->any())->method('shouldForceNewVisit')->will($this->returnValue($onNewVisitResult));
$dimensions[] = $dim;
diff --git a/plugins/CoreHome/tests/Unit/CoreHomeTest.php b/plugins/CoreHome/tests/Unit/CoreHomeTest.php
index 32ecbc2423..11a14c8155 100644
--- a/plugins/CoreHome/tests/Unit/CoreHomeTest.php
+++ b/plugins/CoreHome/tests/Unit/CoreHomeTest.php
@@ -15,14 +15,14 @@ use Piwik\Plugins\CoreHome\CoreHome;
* @group CoreHomeTest
* @group Plugins
*/
-class CoreHomeTest extends \PHPUnit_Framework_TestCase
+class CoreHomeTest extends \PHPUnit\Framework\TestCase
{
/**
* @var CoreHome
*/
private $coreHome;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/CorePluginsAdmin/Commands/DeactivatePlugin.php b/plugins/CorePluginsAdmin/Commands/DeactivatePlugin.php
index 08e35d1b62..2adb85684a 100644
--- a/plugins/CorePluginsAdmin/Commands/DeactivatePlugin.php
+++ b/plugins/CorePluginsAdmin/Commands/DeactivatePlugin.php
@@ -23,7 +23,7 @@ class DeactivatePlugin extends ConsoleCommand
{
$this->setName('plugin:deactivate');
$this->setDescription('Deactivate a plugin.');
- $this->addArgument('plugin', InputArgument::IS_ARRAY, 'The plugin name you want to activate. Multiple plugin names can be specified separated by a space.');
+ $this->addArgument('plugin', InputArgument::IS_ARRAY, 'The plugin name you want to deactivate. Multiple plugin names can be specified separated by a space.');
}
protected function execute(InputInterface $input, OutputInterface $output)
diff --git a/plugins/CorePluginsAdmin/Commands/UninstallPlugin.php b/plugins/CorePluginsAdmin/Commands/UninstallPlugin.php
new file mode 100644
index 0000000000..8ccf2e2c0a
--- /dev/null
+++ b/plugins/CorePluginsAdmin/Commands/UninstallPlugin.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\CorePluginsAdmin\Commands;
+
+use Piwik\Plugin\ConsoleCommand;
+use Piwik\Plugin\Manager;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * plugin:deactivate console command.
+ */
+class UninstallPlugin extends ConsoleCommand
+{
+ protected function configure()
+ {
+ $this->setName('plugin:uninstall');
+ $this->setDescription('Uninstall a plugin.');
+ $this->addArgument('plugin', InputArgument::IS_ARRAY, 'The plugin name you want to uninstall. Multiple plugin names can be specified separated by a space.');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $pluginManager = Manager::getInstance();
+
+ $plugins = $input->getArgument('plugin');
+
+ foreach ($plugins as $plugin) {
+ if ($pluginManager->isPluginLoaded($plugin)) {
+ $output->writeln(sprintf('<comment>The plugin %s is still active.</comment>', $plugin));
+ continue;
+ }
+
+ $pluginManager->uninstallPlugin($plugin);
+
+ $output->writeln("Uninstalled plugin <info>$plugin</info>");
+ }
+ }
+}
diff --git a/plugins/CorePluginsAdmin/Controller.php b/plugins/CorePluginsAdmin/Controller.php
index 4d8c4a0e16..9d5db72985 100644
--- a/plugins/CorePluginsAdmin/Controller.php
+++ b/plugins/CorePluginsAdmin/Controller.php
@@ -9,6 +9,7 @@
namespace Piwik\Plugins\CorePluginsAdmin;
use Exception;
+use Piwik\Access;
use Piwik\API\Request;
use Piwik\Common;
use Piwik\Container\StaticContainer;
@@ -483,7 +484,7 @@ class Controller extends Plugin\ControllerAdmin
public function deactivate($redirectAfter = true)
{
if($this->isAllowedToTroubleshootAsSuperUser()) {
- Piwik::doAsSuperUser(function() use ($redirectAfter) {
+ Access::doAsSuperUser(function() use ($redirectAfter) {
$this->doDeactivatePlugin($redirectAfter);
});
} else {
diff --git a/plugins/CorePluginsAdmin/angularjs/form-field/field-multituple.html b/plugins/CorePluginsAdmin/angularjs/form-field/field-multituple.html
index a7bac2e02c..ad99e5ffba 100644
--- a/plugins/CorePluginsAdmin/angularjs/form-field/field-multituple.html
+++ b/plugins/CorePluginsAdmin/angularjs/form-field/field-multituple.html
@@ -3,7 +3,9 @@
name="{{ formField.name }}"
ng-model="formField.value"
field1="formField.uiControlAttributes.field1"
- field2="formField.uiControlAttributes.field2">
+ field2="formField.uiControlAttributes.field2"
+ field3="formField.uiControlAttributes.field3"
+ field4="formField.uiControlAttributes.field4">
</div>
<label for="{{ formField.name }}" ng-bind-html="formField.title"></label>
</div> \ No newline at end of file
diff --git a/plugins/CorePluginsAdmin/lang/tr.json b/plugins/CorePluginsAdmin/lang/tr.json
index ebefd30efe..d937bbf59e 100644
--- a/plugins/CorePluginsAdmin/lang/tr.json
+++ b/plugins/CorePluginsAdmin/lang/tr.json
@@ -20,7 +20,7 @@
"InfoPluginUpdateIsRecommended": "Son gelişmelerden yararlanmak için uygulama eklerinizi güncelleyin.",
"InfoThemeIsUsedByOtherUsersAsWell": "Not: Bu Matomo uygulaması üzerinde %1$s kullanıcı daha %2$s temasını kullanıyor.",
"InfoThemeUpdateIsRecommended": "Temanızı güncelleyerek son sürümün tadını çıkarın.",
- "InstallNewPlugins": "Yeni eklenti kur",
+ "InstallNewPlugins": "Yeni uygulama eki kur",
"InstallNewThemes": "Yeni tema kur",
"LicenseHomepage": "Lisans Sayfası",
"LikeThisPlugin": "Bu uygulama ekini beğendiniz mi?",
diff --git a/plugins/CorePluginsAdmin/lang/zh-cn.json b/plugins/CorePluginsAdmin/lang/zh-cn.json
index 6a62f8235f..42423f8f7b 100644
--- a/plugins/CorePluginsAdmin/lang/zh-cn.json
+++ b/plugins/CorePluginsAdmin/lang/zh-cn.json
@@ -65,8 +65,15 @@
"TagManagerTeaserHideNonSuperUser": "不感兴趣,不再显示此页面",
"TagManagerTeaserEmailSuperUserBody": "嗨,%1$sMatomo标签管理器现在在Matomo中可用,我很想使用此新功能。 拥有超级管理员访问权限后,您可以通过顶部菜单中的标签管理器页面激活此功能吗?%2$sMatomo URL是%3$s。%4$s谢谢!",
"WhatIsTagManager": "什么是标签管理器?",
+ "WhatIsTagManagerDetails1": "与内容管理系统(CMS)一样,您无需具备HTML \/ CSS的技术知识即可灵活地为网站发布内容,标签管理系统(TMS)是简化简化先嵌入和后嵌入过程的最佳选择。 网站上的第三方应用程序跟踪标记(也称为代码段或像素)。",
+ "WhatIsTagManagerDetails2": "假设您想查看转换\/目标,实时通讯注册,社交小部件,退出弹出窗口和再营销广告系列的结果; 曾经是高度技术和费时的过程,现在可以在TMS中轻松完成,只需单击几下即可实现。",
+ "TagManagerLearnMoreInUserGuide": "在标签管理器用户指南中了解更多信息",
"WhyUsingATagManager": "为什么要使用标签管理器?",
+ "WhyUsingATagManagerDetails1": "标记管理器使您的生活更轻松! 您不再需要等待开发人员修改网站上的任何第一方或第三方摘要,因为标签管理器可为您带来轻松无忧的体验,以进行这些更改并自行部署您的网站。",
+ "WhyUsingATagManagerDetails2": "它再方便不过了,它不仅可以让您更快地将更改引入市场,还可以降低成本。",
+ "WhyUsingATagManagerDetails3": "这使营销团队,数字团队和IT人士感到高兴……这对每个人都是双赢!",
"AreThereAnyRisks": "是否有任何风险?",
+ "AreThereAnyRisksDetails1": "激活标签管理器后,具有管理员访问权限的用户将能够创建自定义HTML标签,触发器和变量,这些HTML,触发器和变量可能会在您的网站上执行JavaScript。 这些自定义模板可能被滥用,例如从您的网站访问者那里窃取敏感信息(称为%1$s,称为XSS%2$s)。",
"AreThereAnyRisksDetails2": "在您激活标签管理器后,可以在“管理=>常规设置”下禁用这些自定义模块。 或者,您也可以将这些模板的使用限制为仅特定用户或超级管理员用户。",
"Theme": "主题",
"Themes": "主题",
diff --git a/plugins/CorePluginsAdmin/tests/Integration/TagManagerTeaserTest.php b/plugins/CorePluginsAdmin/tests/Integration/TagManagerTeaserTest.php
index 7b28bf339e..6103a23b80 100644
--- a/plugins/CorePluginsAdmin/tests/Integration/TagManagerTeaserTest.php
+++ b/plugins/CorePluginsAdmin/tests/Integration/TagManagerTeaserTest.php
@@ -25,7 +25,7 @@ class TagManagerTeaserTest extends IntegrationTestCase
*/
private $teaser;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/CorePluginsAdmin/tests/UI/expected-screenshots/TagManagerTeaser_admin_page_disable.png b/plugins/CorePluginsAdmin/tests/UI/expected-screenshots/TagManagerTeaser_admin_page_disable.png
index 5c798816e7..6ce75aabc9 100644
--- a/plugins/CorePluginsAdmin/tests/UI/expected-screenshots/TagManagerTeaser_admin_page_disable.png
+++ b/plugins/CorePluginsAdmin/tests/UI/expected-screenshots/TagManagerTeaser_admin_page_disable.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1d561093a3d75de90996f2cc2e46ba72c181cfa7186f307267e08a3ea3055432
-size 183405
+oid sha256:70fa580ddfa5f39ef368a4650ad3a757f7ee8ec342dcafde8da40d3d1bd82ddb
+size 184451
diff --git a/plugins/CoreUpdater/CoreUpdater.php b/plugins/CoreUpdater/CoreUpdater.php
index 6d9696ac6a..2265793b3e 100644
--- a/plugins/CoreUpdater/CoreUpdater.php
+++ b/plugins/CoreUpdater/CoreUpdater.php
@@ -25,7 +25,7 @@ use Piwik\Version;
class CoreUpdater extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
@@ -65,6 +65,8 @@ class CoreUpdater extends \Piwik\Plugin
|| $module == 'Proxy'
// Do not show update page during installation.
|| $module == 'Installation'
+ || ($module == 'CorePluginsAdmin' && $action == 'deactivate')
+ || ($module == 'CorePluginsAdmin' && $action == 'uninstall')
|| ($module == 'LanguagesManager' && $action == 'saveLanguage')) {
return;
}
diff --git a/plugins/CoreUpdater/ReleaseChannel/Latest3XBeta.php b/plugins/CoreUpdater/ReleaseChannel/LatestCurrentBeta.php
index e9f635f90f..93767a12f8 100644
--- a/plugins/CoreUpdater/ReleaseChannel/Latest3XBeta.php
+++ b/plugins/CoreUpdater/ReleaseChannel/LatestCurrentBeta.php
@@ -10,17 +10,18 @@ namespace Piwik\Plugins\CoreUpdater\ReleaseChannel;
use Piwik\Piwik;
use Piwik\Plugins\CoreUpdater\ReleaseChannel;
+use Piwik\Version;
-class Latest3XBeta extends ReleaseChannel
+class LatestCurrentBeta extends ReleaseChannel
{
public function getId()
{
- return 'latest_3x_beta';
+ return 'latest_'. Version::MAJOR_VERSION . 'x_beta';
}
public function getName()
{
- return Piwik::translate('CoreUpdater_LatestXBetaRelease', '3.X');
+ return Piwik::translate('CoreUpdater_LatestXBetaRelease', Version::MAJOR_VERSION . '.X');
}
public function getDescription()
diff --git a/plugins/CoreUpdater/ReleaseChannel/Latest3XStable.php b/plugins/CoreUpdater/ReleaseChannel/LatestCurrentStable.php
index b11710dbb2..acbd9014ed 100644
--- a/plugins/CoreUpdater/ReleaseChannel/Latest3XStable.php
+++ b/plugins/CoreUpdater/ReleaseChannel/LatestCurrentStable.php
@@ -10,17 +10,18 @@ namespace Piwik\Plugins\CoreUpdater\ReleaseChannel;
use Piwik\Piwik;
use Piwik\Plugins\CoreUpdater\ReleaseChannel;
+use Piwik\Version;
-class Latest3XStable extends ReleaseChannel
+class LatestCurrentStable extends ReleaseChannel
{
public function getId()
{
- return 'latest_3x_stable';
+ return 'latest_'.Version::MAJOR_VERSION.'x_stable';
}
public function getName()
{
- return Piwik::translate('CoreUpdater_LatestXStableRelease', '3.X');
+ return Piwik::translate('CoreUpdater_LatestXStableRelease', Version::MAJOR_VERSION . '.X');
}
public function getDescription()
diff --git a/plugins/CoreUpdater/SystemSettings.php b/plugins/CoreUpdater/SystemSettings.php
index ba769ca3ac..b42ae603b1 100644
--- a/plugins/CoreUpdater/SystemSettings.php
+++ b/plugins/CoreUpdater/SystemSettings.php
@@ -80,7 +80,7 @@ class SystemSettings extends \Piwik\Settings\Plugin\SystemSettings
$field->validate = function ($channel) use ($releaseChannels) {
if (!$releaseChannels->isValidReleaseChannelId($channel)) {
throw new \Exception('Release channel is not valid');
- };
+ }
};
$field->inlineHelp = Piwik::translate('CoreAdminHome_DevelopmentProcess')
diff --git a/plugins/CoreUpdater/lang/pt.json b/plugins/CoreUpdater/lang/pt.json
index bcd7d93acc..e2f5bb1f61 100644
--- a/plugins/CoreUpdater/lang/pt.json
+++ b/plugins/CoreUpdater/lang/pt.json
@@ -28,6 +28,8 @@
"InstallingTheLatestVersion": "A instalar a versão mais recente",
"LatestBetaRelease": "Último lançamento beta",
"LatestStableRelease": "Último lançamento estável",
+ "LatestXStableRelease": "Última versão estável %s",
+ "LatestXBetaRelease": "Última versão beta %s",
"LtsSupportVersion": "Versão de suporte de longo termo",
"ListOfSqlQueriesFYI": "Para sua informação: estas são as instruções SQL e os comandos da consola que serão executados para a atualização da sua base de dados do Matomo %s",
"TheseSqlQueriesWillBeExecuted": "Serão executadas as seguintes instruções SQL:",
diff --git a/plugins/CoreUpdater/lang/zh-cn.json b/plugins/CoreUpdater/lang/zh-cn.json
index 900393c481..2d9d7cea98 100644
--- a/plugins/CoreUpdater/lang/zh-cn.json
+++ b/plugins/CoreUpdater/lang/zh-cn.json
@@ -1,6 +1,7 @@
{
"CoreUpdater": {
"CheckingForPluginUpdates": "检查插件更新",
+ "ClickHereToViewSqlQueries": "单击此处查看并复制将执行的SQL查询和控制台命令的列表",
"CriticalErrorDuringTheUpgradeProcess": "在升级过程中发生严重的错误:",
"DatabaseUpgradeRequired": "数据库需要升级",
"DisablingIncompatiblePlugins": "正在停用不兼容的插件:%s",
@@ -23,10 +24,16 @@
"HelpMessageIntroductionWhenError": "以上是核心的错误讯息。它应有助于解释原因,但如果您需要进一步的说明,请:",
"HelpMessageIntroductionWhenWarning": "此次升级成功完成,但在过程中有发生一些问题,请仔细阅读上面的详细说明。如需更进一步的说明:",
"HighTrafficPiwikServerEnableMaintenance": "如果你管理一个高流量的Matomo服务器,我们建议您%1$s暂时禁止访问者跟踪,并设置Matomo用户界面为维护模式%2$s。",
+ "IncompatbilePluginsWillBeDisabledInfo": "注意:某些插件与Matomo %s不兼容。如果Marketplace上有更新,我们将对其进行更新,否则,在升级时我们将禁用它们:",
"InstallingTheLatestVersion": "正在安装最新版本",
"LatestBetaRelease": "最新测试版本",
"LatestStableRelease": "最新稳定版本",
+ "LatestXStableRelease": "最新稳定版%s",
+ "LatestXBetaRelease": "最新测试版%s",
"LtsSupportVersion": "长期支持版本",
+ "ListOfSqlQueriesFYI": "仅供参考:这些是将数据库升级到Matomo %s所执行的SQL查询和控制台命令",
+ "TheseSqlQueriesWillBeExecuted": "这些SQL查询将被执行:",
+ "TheseCommandsWillBeExecuted": "这些控制台命令将运行:",
"MajorUpdateWarning1": "这是全面升级!会比平时多花些时间。",
"MajorUpdateWarning2": "下面的建议对大型网站格外重要。",
"NeedHelpUpgrading": "升级 Matomo 时需要帮助?",
@@ -66,10 +73,22 @@
"UsingHttp": "使用不安全的HTTP连接",
"UpgradeComplete": "升级完成!",
"UpgradePiwik": "升级 Matomo",
+ "ConsoleStartingDbUpgrade": "现在开始数据库升级过程。 这可能需要一段时间,因此请耐心等待。",
+ "DbUpgradeNotExecuted": "数据库升级未执行。",
+ "ConsoleUpdateUnexpectedUserWarning": "看来您已经使用用户%1$s执行了此更新,而Matomo文件归%2$s所有。\n\n为确保正确的用户可以读取Matomo文件,您可能需要运行以下命令(或类似的命令,具体取决于您的服务器配置):\n\n%3$s美元",
+ "ConsoleUpdateFailure": "Matomo无法更新! 有关更多信息,请参见上文。",
+ "ConsoleUpdateNoSqlQueries": "注意:没有要执行的SQL查询或控制台命令。",
+ "AlreadyUpToDate": "一切都已经是最新的了。",
+ "ExecuteDbUpgrade": "需要数据库升级。 执行更新?",
+ "DryRun": "注意:这是空转",
+ "DryRunEnd": "空转结束",
+ "ConsoleCommandDescription": "触发升级。 Matomo core或任何插件文件已更新后,请使用它。 附加-是,无需确认即可升级。",
+ "ConsoleParameterDescription": "直接执行更新而无需确认",
"VerifyingUnpackedFiles": "正在验证解压后的文件",
"WarningMessages": "警告信息:",
"WeAutomaticallyDeactivatedTheFollowingPlugins": "我们自动停用了以下插件: %s",
"YouCanUpgradeAutomaticallyOrDownloadPackage": "您可以自动升级到版本%s,或者下载软件包并手动安装:",
+ "YouMustDownloadPackageOrFixPermissions": "Matomo无法覆盖您当前的安装。 您可以修复目录\/文件权限,也可以下载软件包并手动安装版本%s:",
"YourDatabaseIsOutOfDate": "您的 Matomo 数据库版本太旧了,必须先升级才能继续。",
"ViewVersionChangelog": "查看该版本的更新日志:",
"ReceiveEmailBecauseIsSuperUser": "您会收到本邮件是源于您是 Matomo %s 的管理员"
diff --git a/plugins/CoreUpdater/lang/zh-tw.json b/plugins/CoreUpdater/lang/zh-tw.json
index 69e9042016..8b06a963ae 100644
--- a/plugins/CoreUpdater/lang/zh-tw.json
+++ b/plugins/CoreUpdater/lang/zh-tw.json
@@ -27,6 +27,8 @@
"InstallingTheLatestVersion": "正在安裝最新版本中",
"LatestBetaRelease": "最新 Beta 版本",
"LatestStableRelease": "最新穩定版本",
+ "LatestXStableRelease": "最新穩定版 %s",
+ "LatestXBetaRelease": "最新 Beta 版 %s",
"LtsSupportVersion": "長期支援版本",
"ListOfSqlQueriesFYI": "備註:這些 SQL 指令和主控台指令將會在你的資料庫升級至 Matomo %s 時執行。",
"TheseSqlQueriesWillBeExecuted": "這些 SQL 指令將被執行:",
diff --git a/plugins/CoreUpdater/templates/updateSuccess.twig b/plugins/CoreUpdater/templates/updateSuccess.twig
index 7a1c118e79..aec26a1343 100644
--- a/plugins/CoreUpdater/templates/updateSuccess.twig
+++ b/plugins/CoreUpdater/templates/updateSuccess.twig
@@ -7,13 +7,6 @@
</div>
<div class="content">
- <h2>Piwik is now Matomo</h2>
- <p>
- <a target='_blank' rel='noreferrer noopener' href='https://matomo.org/blog/2018/01/piwik-is-now-matomo/'>
- <img src='https://matomo.org/wp-content/uploads/2018/01/banner_piwik_is_now_matomo.jpg' width='70%'>
- </a>
- </p>
-
<h2>
{{ 'CoreUpdater_ThankYouUpdatePiwik'|translate }}
</h2>
diff --git a/plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php b/plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php
index 08cba25cb4..4a2b5faa02 100644
--- a/plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php
+++ b/plugins/CoreUpdater/tests/Integration/Commands/UpdateTest.php
@@ -30,7 +30,7 @@ class UpdateTest extends ConsoleCommandTestCase
private $oldScriptName = null;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -44,7 +44,7 @@ class UpdateTest extends ConsoleCommandTestCase
Updates_2_10_0_b5::$archiveBlobTables = null;
}
- public function tearDown()
+ public function tearDown(): void
{
$_SERVER['SCRIPT_NAME'] = $this->oldScriptName;
@@ -96,7 +96,7 @@ class UpdateTest extends ConsoleCommandTestCase
$this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage());
// check no update occurred
- $this->assertContains("Everything is already up to date.", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Everything is already up to date.", $this->applicationTester->getDisplay());
$this->assertEquals(Version::VERSION, Option::get('version_core'));
}
@@ -112,12 +112,12 @@ class UpdateTest extends ConsoleCommandTestCase
));
$this->assertEquals(1, $result, $this->getCommandDisplayOutputErrorMessage());
- $this->assertContains("Matomo could not be updated! See above for more information.", $this->applicationTester->getDisplay());
+ self::assertStringContainsString("Matomo could not be updated! See above for more information.", $this->applicationTester->getDisplay());
}
private function assertDryRunExecuted($output)
{
- $this->assertContains("Note: this is a Dry Run", $output);
- $this->assertContains(self::EXPECTED_SQL_FROM_2_10, $output);
+ self::assertStringContainsString("Note: this is a Dry Run", $output);
+ self::assertStringContainsString(self::EXPECTED_SQL_FROM_2_10, $output);
}
}
diff --git a/plugins/CoreUpdater/tests/Integration/ReleaseChannelTest.php b/plugins/CoreUpdater/tests/Integration/ReleaseChannelTest.php
index 4e89187926..b133831099 100644
--- a/plugins/CoreUpdater/tests/Integration/ReleaseChannelTest.php
+++ b/plugins/CoreUpdater/tests/Integration/ReleaseChannelTest.php
@@ -41,7 +41,7 @@ class ReleaseChannelTest extends IntegrationTestCase
*/
private $channel;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/CoreUpdater/tests/Integration/UpdateCommunicationTest.php b/plugins/CoreUpdater/tests/Integration/UpdateCommunicationTest.php
index 2e2b883982..a65473414f 100644
--- a/plugins/CoreUpdater/tests/Integration/UpdateCommunicationTest.php
+++ b/plugins/CoreUpdater/tests/Integration/UpdateCommunicationTest.php
@@ -22,7 +22,7 @@ use Piwik\View;
*/
class UpdateCommunicationTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
}
diff --git a/plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main.png b/plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main.png
index 6de386308b..863003169e 100644
--- a/plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main.png
+++ b/plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:70c4d0a2cec3a858fa041a2277ed0eb1c606aadcacd21ee3b56779309fd62202
-size 310402
+oid sha256:88049ef31d5a0f0f719bbc20a4a2567b26ad3374e7b8aa5e8e5db4cb6c286ff5
+size 316346
diff --git a/plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main_instance.png b/plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main_instance.png
index 9212b78fa7..4858b47542 100644
--- a/plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main_instance.png
+++ b/plugins/CoreUpdater/tests/UI/expected-screenshots/CoreUpdaterDb_main_instance.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:080274c922016e79e7adb8b163d40994b3693166850430c645cd31e14bf2ef87
-size 312234
+oid sha256:95b82476fd7b987eaaa4c87cd8b727720fc1d4a981fb5be5bd83d25a4ce4352f
+size 317870
diff --git a/plugins/CoreUpdater/tests/Unit/ModelTest.php b/plugins/CoreUpdater/tests/Unit/ModelTest.php
index dd499b083b..d14beb7399 100644
--- a/plugins/CoreUpdater/tests/Unit/ModelTest.php
+++ b/plugins/CoreUpdater/tests/Unit/ModelTest.php
@@ -16,14 +16,14 @@ use Piwik\Plugins\CoreUpdater\Model;
* @group Unit
* @group Plugins
*/
-class ModelTest extends \PHPUnit_Framework_TestCase
+class ModelTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Model
*/
private $model;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -42,14 +42,14 @@ class ModelTest extends \PHPUnit_Framework_TestCase
$plugins = $this->model->getPluginsFromDirectoy(PIWIK_INCLUDE_PATH);
$this->assertGreaterThan(40, count($plugins));
- $this->assertContains('/plugins/API', $plugins);
- $this->assertContains('/plugins/Actions', $plugins);
- $this->assertContains('/plugins/Annotations', $plugins);
-
- $this->assertNotContains('/plugins/.', $plugins);
- $this->assertNotContains('/plugins/..', $plugins);
- $this->assertNotContains('/plugins', $plugins);
- $this->assertNotContains('/plugins/', $plugins);
+ self::assertTrue(in_array('/plugins/API', $plugins));
+ self::assertTrue(in_array('/plugins/Actions', $plugins));
+ self::assertTrue(in_array('/plugins/Annotations', $plugins));
+
+ self::assertTrue(!in_array('/plugins/.', $plugins));
+ self::assertTrue(!in_array('/plugins/..', $plugins));
+ self::assertTrue(!in_array('/plugins', $plugins));
+ self::assertTrue(!in_array('/plugins/', $plugins));
foreach ($plugins as $plugin) {
$this->assertTrue(is_dir(PIWIK_INCLUDE_PATH . $plugin));
diff --git a/plugins/CoreVisualizations/Visualizations/Sparklines.php b/plugins/CoreVisualizations/Visualizations/Sparklines.php
index 02e29a716d..942defc1c2 100644
--- a/plugins/CoreVisualizations/Visualizations/Sparklines.php
+++ b/plugins/CoreVisualizations/Visualizations/Sparklines.php
@@ -132,7 +132,7 @@ class Sparklines extends ViewDataTable
foreach ($comparisons->getRows() as $comparisonRow) {
$segment = $comparisonRow->getMetadata('compareSegment');
if ($segment === false) {
- $segment = Request::getRawSegmentFromRequest() ?: '';;
+ $segment = Request::getRawSegmentFromRequest() ?: '';
}
$date = $comparisonRow->getMetadata('compareDate');
diff --git a/plugins/CoreVisualizations/Visualizations/Sparklines/Config.php b/plugins/CoreVisualizations/Visualizations/Sparklines/Config.php
index e5fe3da1c0..dd59f2e8b3 100644
--- a/plugins/CoreVisualizations/Visualizations/Sparklines/Config.php
+++ b/plugins/CoreVisualizations/Visualizations/Sparklines/Config.php
@@ -140,7 +140,7 @@ class Config extends \Piwik\ViewDataTable\Config
* It will show a sparkline image, the value of the resolved metric name and a descrption. Optionally, multiple
* values can be shown after a sparkline image by passing multiple metric names
* (eg array('nb_visits', 'nb_actions')). The data will be requested from the configured api method see
- * {@link Piwik\ViewDataTable\RequestConfig::$apiMethodToRequestDataTable}.
+ * {@link \Piwik\ViewDataTable\RequestConfig::$apiMethodToRequestDataTable}.
*
* Example:
* $config->addSparklineMetric('nb_visits');
diff --git a/plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php b/plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php
index 6847ac7b2c..cbcef4b43e 100644
--- a/plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php
+++ b/plugins/CoreVisualizations/tests/Integration/SparklinesConfigTest.php
@@ -12,7 +12,6 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines\Config;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\Mock\FakeAccess;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
/**
* @group CoreVisualizations
@@ -26,7 +25,7 @@ class SparklinesConfigTest extends IntegrationTestCase
*/
private $config;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
FakeAccess::$superUser = true;
@@ -37,12 +36,12 @@ class SparklinesConfigTest extends IntegrationTestCase
$this->config = new Config();
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::reset();
+ Fixture::resetTranslations();
parent::tearDown();
}
@@ -119,12 +118,11 @@ class SparklinesConfigTest extends IntegrationTestCase
$this->assertSame($expectedSparkline, $sparklines[''][0]['metrics']['']);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Values: 10, 20, 30 Descriptions: Visits, Actions
- */
public function test_addSparkline_shouldThrowAnException_IfValuesDoesNotMatchAmountOfDescriptions()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Values: 10, 20, 30 Descriptions: Visits, Actions');
+
$this->config->addSparkline($this->sparklineParams(), $values = array(10, 20, 30), $description = array('Visits', 'Actions'));
}
diff --git a/plugins/CoreVisualizations/tests/Unit/GraphTest.php b/plugins/CoreVisualizations/tests/Unit/GraphTest.php
index 285960ae61..2d61fa7f8d 100644
--- a/plugins/CoreVisualizations/tests/Unit/GraphTest.php
+++ b/plugins/CoreVisualizations/tests/Unit/GraphTest.php
@@ -16,7 +16,7 @@ use Piwik\DataTable;
* @group Sparklines
* @group Plugins
*/
-class GraphTest extends \PHPUnit_Framework_TestCase
+class GraphTest extends \PHPUnit\Framework\TestCase
{
public function testSelectableColumnsAlreadySet()
{
@@ -139,10 +139,10 @@ class GraphTest extends \PHPUnit_Framework_TestCase
$dataTable = new DataTable();
$dataTable->setRows(array($row));
- $bar = $this->getMock('Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Bar',
- array('getDataTable'),
- array('', '')
- );
+ $bar = $this->getMockBuilder('Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Bar')
+ ->setMethods(['getDataTable'])
+ ->setConstructorArgs(['', ''])
+ ->getMock();
$bar->expects($this->any())
->method('getDataTable')
->will($this->returnValue($dataTable));
diff --git a/plugins/CoreVisualizations/tests/Unit/SparklinesConfigTest.php b/plugins/CoreVisualizations/tests/Unit/SparklinesConfigTest.php
index e4759845fa..ff709a7fd0 100644
--- a/plugins/CoreVisualizations/tests/Unit/SparklinesConfigTest.php
+++ b/plugins/CoreVisualizations/tests/Unit/SparklinesConfigTest.php
@@ -15,14 +15,14 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines\Config;
* @group Sparklines
* @group Plugins
*/
-class SparklinesConfigTest extends \PHPUnit_Framework_TestCase
+class SparklinesConfigTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Config
*/
private $config;
- public function setUp()
+ public function setUp(): void
{
$this->config = new Config();
}
diff --git a/plugins/CustomAlerts b/plugins/CustomAlerts
-Subproject 6e6ad410f27b9cb2a77dd85e3ed41663889d9de
+Subproject f38df2f6bf44b5cefceede2b8af610ef241ae7a
diff --git a/plugins/CustomDimensions b/plugins/CustomDimensions
-Subproject d4c6f7998ec1d227ea9871174dd956c431ff09e
+Subproject bdc988a16f5b604a3f882c366585467eb1bd54e
diff --git a/plugins/CustomPiwikJs/.gitignore b/plugins/CustomJsTracker/.gitignore
index 8f30992923..8f30992923 100644
--- a/plugins/CustomPiwikJs/.gitignore
+++ b/plugins/CustomJsTracker/.gitignore
diff --git a/plugins/CustomPiwikJs/API.php b/plugins/CustomJsTracker/API.php
index 54cc728a79..c8349efe2e 100644
--- a/plugins/CustomPiwikJs/API.php
+++ b/plugins/CustomJsTracker/API.php
@@ -6,16 +6,16 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs;
+namespace Piwik\Plugins\CustomJsTracker;
use Piwik\Container\StaticContainer;
use Piwik\Piwik;
-use Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException;
+use Piwik\Plugins\CustomJsTracker\Exception\AccessDeniedException;
/**
- * API for plugin CustomPiwikJs
+ * API for plugin CustomJsTracker
*
- * @method static \Piwik\Plugins\CustomPiwikJs\API getInstance()
+ * @method static \Piwik\Plugins\CustomJsTracker\API getInstance()
*/
class API extends \Piwik\Plugin\API
{
@@ -29,7 +29,7 @@ class API extends \Piwik\Plugin\API
Piwik::checkUserHasSomeAdminAccess();
try {
- $updater = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackerUpdater');
+ $updater = StaticContainer::get('Piwik\Plugins\CustomJsTracker\TrackerUpdater');
$updater->checkWillSucceed();
return true;
} catch (AccessDeniedException $e) {
diff --git a/plugins/CustomPiwikJs/Commands/UpdateTracker.php b/plugins/CustomJsTracker/Commands/UpdateTracker.php
index e01d750808..bddd99136a 100644
--- a/plugins/CustomPiwikJs/Commands/UpdateTracker.php
+++ b/plugins/CustomJsTracker/Commands/UpdateTracker.php
@@ -6,12 +6,12 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\Commands;
+namespace Piwik\Plugins\CustomJsTracker\Commands;
use Piwik\Container\StaticContainer;
use Piwik\Plugin\ConsoleCommand;
-use Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
-use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
+use Piwik\Plugins\CustomJsTracker\TrackerUpdater;
+use Piwik\Plugins\CustomJsTracker\TrackingCode\PluginTrackerFiles;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
@@ -46,7 +46,7 @@ class UpdateTracker extends ConsoleCommand
public function updateTracker($sourceFile, $targetFile, $ignoreMinified)
{
- $pluginTrackerFiles = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles');
+ $pluginTrackerFiles = StaticContainer::get('Piwik\Plugins\CustomJsTracker\TrackingCode\PluginTrackerFiles');
if ($ignoreMinified) {
if (empty($sourceFile) || $sourceFile === $this->getPathOriginalPiwikJs()) {
@@ -56,7 +56,7 @@ class UpdateTracker extends ConsoleCommand
$pluginTrackerFiles->ignoreMinified();
}
- $updater = StaticContainer::getContainer()->make('Piwik\Plugins\CustomPiwikJs\TrackerUpdater', array(
+ $updater = StaticContainer::getContainer()->make('Piwik\Plugins\CustomJsTracker\TrackerUpdater', array(
'fromFile' => $sourceFile, 'toFile' => $targetFile
));
$updater->setTrackerFiles($pluginTrackerFiles);
diff --git a/plugins/CustomPiwikJs/CustomPiwikJs.php b/plugins/CustomJsTracker/CustomJsTracker.php
index 1dcb0c4c65..ebf63933fa 100644
--- a/plugins/CustomPiwikJs/CustomPiwikJs.php
+++ b/plugins/CustomJsTracker/CustomJsTracker.php
@@ -6,15 +6,15 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs;
+namespace Piwik\Plugins\CustomJsTracker;
use Piwik\Container\StaticContainer;
use Piwik\Log;
use Piwik\Plugin;
-class CustomPiwikJs extends Plugin
+class CustomJsTracker extends Plugin
{
- public function getListHooksRegistered()
+ public function registerEvents()
{
return array(
'CoreUpdater.update.end' => 'updateTracker',
@@ -30,8 +30,8 @@ class CustomPiwikJs extends Plugin
public function updateTracker()
{
try {
- if (Plugin\Manager::getInstance()->isPluginActivated('CustomPiwikJs')) {
- $trackerUpdater = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackerUpdater');
+ if (Plugin\Manager::getInstance()->isPluginActivated('CustomJsTracker')) {
+ $trackerUpdater = StaticContainer::get('Piwik\Plugins\CustomJsTracker\TrackerUpdater');
$trackerUpdater->update();
}
} catch (\Exception $e) {
diff --git a/plugins/CustomPiwikJs/Diagnostic/PiwikJsCheck.php b/plugins/CustomJsTracker/Diagnostic/TrackerJsCheck.php
index dc01934808..5def5fa717 100644
--- a/plugins/CustomPiwikJs/Diagnostic/PiwikJsCheck.php
+++ b/plugins/CustomJsTracker/Diagnostic/TrackerJsCheck.php
@@ -5,11 +5,11 @@
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\Diagnostic;
+namespace Piwik\Plugins\CustomJsTracker\Diagnostic;
use Piwik\Filechecks;
use Piwik\Filesystem;
-use Piwik\Plugins\CustomPiwikJs\File;
+use Piwik\Plugins\CustomJsTracker\File;
use Piwik\Plugins\Diagnostics\Diagnostic\Diagnostic;
use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResult;
use Piwik\SettingsPiwik;
@@ -20,7 +20,7 @@ use Piwik\Translation\Translator;
/**
* Check Piwik JS is writable
*/
-class PiwikJsCheck implements Diagnostic
+class TrackerJsCheck implements Diagnostic
{
/**
* @var Translator
@@ -54,13 +54,13 @@ class PiwikJsCheck implements Diagnostic
}
}
- $label = $this->translator->translate('CustomPiwikJs_DiagnosticPiwikJsWritable', $this->makeFilesTitles($filesToCheck));
+ $label = $this->translator->translate('CustomJsTracker_DiagnosticPiwikJsWritable', $this->makeFilesTitles($filesToCheck));
if (empty($notWritableFiles)) {
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK, ''));
}
- $comment = $this->translator->translate('CustomPiwikJs_DiagnosticPiwikJsNotWritable', $this->makeFilesTitles($notWritableFiles));
+ $comment = $this->translator->translate('CustomJsTracker_DiagnosticPiwikJsNotWritable', $this->makeFilesTitles($notWritableFiles));
if (!SettingsServer::isWindows()) {
$command = '';
@@ -68,7 +68,7 @@ class PiwikJsCheck implements Diagnostic
$realpath = Filesystem::realpath(PIWIK_INCLUDE_PATH . '/' . $notWritableFile);
$command .= "<br/><code> chmod +w $realpath<br/> chown ". Filechecks::getUserAndGroup() ." " . $realpath . "</code><br />";
}
- $comment .= $this->translator->translate('CustomPiwikJs_DiagnosticPiwikJsMakeWritable', array($this->makeFilesTitles($notWritableFiles), $command));
+ $comment .= $this->translator->translate('CustomJsTracker_DiagnosticPiwikJsMakeWritable', array($this->makeFilesTitles($notWritableFiles), $command));
}
return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
diff --git a/plugins/CustomPiwikJs/Exception/AccessDeniedException.php b/plugins/CustomJsTracker/Exception/AccessDeniedException.php
index f3c89216f1..7cfd6a550e 100644
--- a/plugins/CustomPiwikJs/Exception/AccessDeniedException.php
+++ b/plugins/CustomJsTracker/Exception/AccessDeniedException.php
@@ -6,7 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\Exception;
+namespace Piwik\Plugins\CustomJsTracker\Exception;
use Exception;
diff --git a/plugins/CustomPiwikJs/File.php b/plugins/CustomJsTracker/File.php
index ffee10ca88..0b8325e902 100644
--- a/plugins/CustomPiwikJs/File.php
+++ b/plugins/CustomJsTracker/File.php
@@ -6,9 +6,9 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs;
+namespace Piwik\Plugins\CustomJsTracker;
-use Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException;
+use Piwik\Plugins\CustomJsTracker\Exception\AccessDeniedException;
class File
{
diff --git a/plugins/CustomPiwikJs/Tasks.php b/plugins/CustomJsTracker/Tasks.php
index 3957a4d823..24427a6d43 100644
--- a/plugins/CustomPiwikJs/Tasks.php
+++ b/plugins/CustomJsTracker/Tasks.php
@@ -6,7 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs;
+namespace Piwik\Plugins\CustomJsTracker;
use Piwik\Container\StaticContainer;
@@ -19,7 +19,7 @@ class Tasks extends \Piwik\Plugin\Tasks
public function updateTracker()
{
- $updater = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackerUpdater');
+ $updater = StaticContainer::get('Piwik\Plugins\CustomJsTracker\TrackerUpdater');
$updater->update();
}
}
diff --git a/plugins/CustomPiwikJs/TrackerUpdater.php b/plugins/CustomJsTracker/TrackerUpdater.php
index c5dabad5cc..c301862b90 100644
--- a/plugins/CustomPiwikJs/TrackerUpdater.php
+++ b/plugins/CustomJsTracker/TrackerUpdater.php
@@ -6,19 +6,19 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs;
+namespace Piwik\Plugins\CustomJsTracker;
use Piwik\Common;
use Piwik\Container\StaticContainer;
-use Piwik\Plugins\CustomPiwikJs\TrackingCode\PiwikJsManipulator;
-use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
+use Piwik\Plugins\CustomJsTracker\TrackingCode\PiwikJsManipulator;
+use Piwik\Plugins\CustomJsTracker\TrackingCode\PluginTrackerFiles;
use Piwik\Piwik;
/**
* Updates the Piwik JavaScript Tracker "piwik.js" in case plugins extend the tracker.
*
* Usage:
- * StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackerUpdater')->update();
+ * StaticContainer::get('Piwik\Plugins\CustomJsTracker\TrackerUpdater')->update();
*/
class TrackerUpdater
{
@@ -54,7 +54,7 @@ class TrackerUpdater
$this->setFromFile($fromFile);
$this->setToFile($toFile);
- $this->trackerFiles = StaticContainer::get('Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles');
+ $this->trackerFiles = StaticContainer::get('Piwik\Plugins\CustomJsTracker\TrackingCode\PluginTrackerFiles');
}
public function setFromFile($fromFile)
@@ -139,7 +139,7 @@ class TrackerUpdater
*
* @param string $absolutePath The path to the new piwik.js file.
*/
- Piwik::postEvent('CustomPiwikJs.piwikJsChanged', [$savedFile]);
+ Piwik::postEvent('CustomJsTracker.trackerJsChanged', [$savedFile]);
}
}
@@ -157,7 +157,7 @@ class TrackerUpdater
if ($file->hasWriteAccess() && !$file->isFileContentSame($newContent)) {
$savedFiles = $file->save($newContent);
foreach ($savedFiles as $savedFile) {
- Piwik::postEvent('CustomPiwikJs.piwikJsChanged', [$savedFile]);
+ Piwik::postEvent('CustomJsTracker.trackerJsChanged', [$savedFile]);
}
}
}
diff --git a/plugins/CustomPiwikJs/TrackingCode/JsTestPluginTrackerFiles.php b/plugins/CustomJsTracker/TrackingCode/JsTestPluginTrackerFiles.php
index 773ac03286..7bf8062a8b 100644
--- a/plugins/CustomPiwikJs/TrackingCode/JsTestPluginTrackerFiles.php
+++ b/plugins/CustomJsTracker/TrackingCode/JsTestPluginTrackerFiles.php
@@ -5,7 +5,7 @@
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\TrackingCode;
+namespace Piwik\Plugins\CustomJsTracker\TrackingCode;
/**
* Used for when running Piwik tracker tests. We simply include all custom tracker files there.
diff --git a/plugins/CustomPiwikJs/TrackingCode/PiwikJsManipulator.php b/plugins/CustomJsTracker/TrackingCode/PiwikJsManipulator.php
index 6e2e4c5500..0fe821c4e6 100644
--- a/plugins/CustomPiwikJs/TrackingCode/PiwikJsManipulator.php
+++ b/plugins/CustomJsTracker/TrackingCode/PiwikJsManipulator.php
@@ -6,7 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\TrackingCode;
+namespace Piwik\Plugins\CustomJsTracker\TrackingCode;
use Piwik\Piwik;
diff --git a/plugins/CustomPiwikJs/TrackingCode/PluginTrackerFiles.php b/plugins/CustomJsTracker/TrackingCode/PluginTrackerFiles.php
index 6e5085f90e..b35f89364b 100644
--- a/plugins/CustomPiwikJs/TrackingCode/PluginTrackerFiles.php
+++ b/plugins/CustomJsTracker/TrackingCode/PluginTrackerFiles.php
@@ -5,11 +5,11 @@
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\TrackingCode;
+namespace Piwik\Plugins\CustomJsTracker\TrackingCode;
use Piwik\Piwik;
use Piwik\Plugin;
-use Piwik\Plugins\CustomPiwikJs\File;
+use Piwik\Plugins\CustomJsTracker\File;
class PluginTrackerFiles
{
@@ -84,7 +84,7 @@ class PluginTrackerFiles
* @param bool &$shouldAddFile Decides whether the tracker file belonging to the given plugin should be added or not.
* @param string $pluginName The name of the plugin this file belongs to
*/
- Piwik::postEvent('CustomPiwikJs.shouldAddTrackerFile', array(&$shouldAddFile, $pluginName));
+ Piwik::postEvent('CustomJsTracker.shouldAddTrackerFile', array(&$shouldAddFile, $pluginName));
return $shouldAddFile;
}
diff --git a/plugins/CustomPiwikJs/config/config.php b/plugins/CustomJsTracker/config/config.php
index cafd3336ac..88d0d6417a 100644
--- a/plugins/CustomPiwikJs/config/config.php
+++ b/plugins/CustomJsTracker/config/config.php
@@ -2,6 +2,6 @@
return array(
'diagnostics.optional' => DI\add(array(
- DI\get('Piwik\Plugins\CustomPiwikJs\Diagnostic\PiwikJsCheck'),
+ DI\get('Piwik\Plugins\CustomJsTracker\Diagnostic\TrackerJsCheck'),
)),
);
diff --git a/plugins/CustomPiwikJs/config/tracker.php b/plugins/CustomJsTracker/config/tracker.php
index ca2affec34..ca2affec34 100644
--- a/plugins/CustomPiwikJs/config/tracker.php
+++ b/plugins/CustomJsTracker/config/tracker.php
diff --git a/plugins/CustomPiwikJs/lang/cs.json b/plugins/CustomJsTracker/lang/cs.json
index 0d8fde41a4..6812140b56 100644
--- a/plugins/CustomPiwikJs/lang/cs.json
+++ b/plugins/CustomJsTracker/lang/cs.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"DiagnosticPiwikJsWritable": "Zapisovatelný JavaScript záznam (%s)"
}
} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/da.json b/plugins/CustomJsTracker/lang/da.json
index 5bbbd36784..e73375b481 100644
--- a/plugins/CustomPiwikJs/lang/da.json
+++ b/plugins/CustomJsTracker/lang/da.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"DiagnosticPiwikJsWritable": "JavaScript-sporingsfiler (%s) skrivbare",
"DiagnosticPiwikJsMakeWritable": "Vi anbefaler at gøre %1$s skrivbare ved at køre denne kommando: %2$s"
}
diff --git a/plugins/CustomPiwikJs/lang/de.json b/plugins/CustomJsTracker/lang/de.json
index bf0ae55c02..a01246a60a 100644
--- a/plugins/CustomPiwikJs/lang/de.json
+++ b/plugins/CustomJsTracker/lang/de.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Ermöglicht es jedem Plugin, die Matomo-JavaScript-Tracking-Datei (matomo.js) zu erweitern und neue Funktionalitäts- und Website-Messfunktionen hinzuzufügen.",
"DiagnosticPiwikJsWritable": "Schreibbarer JavaScript-Tracker (%s)",
"DiagnosticPiwikJsNotWritable": "Für die Matomo JavaScript-Tracker-Datei %s sind keine Schreibrechte vorhanden , das bedeutet, dass andere Plugins den JavaScript-Tracker nicht erweitern können. In Zukunft könnten sogar einige Kernfunktionen nicht wie erwartet funktionieren.",
diff --git a/plugins/CustomPiwikJs/lang/el.json b/plugins/CustomJsTracker/lang/el.json
index 99c1012731..8a9676aa78 100644
--- a/plugins/CustomPiwikJs/lang/el.json
+++ b/plugins/CustomJsTracker/lang/el.json
@@ -1,8 +1,8 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Επιτρέπει σε οποιοδήποτε πρόσθετο να επεκτείνει το αρχείο ιχνηλάτησης σε JavaScript του Matomo (matomo.js) και να προσθέτει νέα λειτουργικότητα και δυνατότητες μετρήσεων των ιστοτόπων.",
"DiagnosticPiwikJsWritable": "Εγγράψιμο Αρχείο Ιχνηλάτησης JavaScript (%s)",
- "DiagnosticPiwikJsNotWritable": "Το αρχείο ιχνηλάτησης της JavaScript του Matomo %s δεν είναι εγγράψιμο, που σημαίνει ότι άλλα πρόσθετα δεν μπορούν να επεκτείνουν την ιχνηλάτηση. Μελλοντικά ενδέχεται ορισμένα χαρακτηριστικά του πυρήνα να μην λειτουργούν όπως πρέπει.",
- "DiagnosticPiwikJsMakeWritable": "Προτείνουμε να κάνετε το %1$s εγγράψιμο με εκτέλεση της εντολής: %2$s"
+ "DiagnosticPiwikJsNotWritable": "Το αρχείο ιχνηλάτησης σε JavaScript του Matomo %s δεν είναι εγγράψιμο, που σημαίνει ότι άλλα πρόσθετα δεν μπορούν να επεκτείνουν την ιχνηλάτηση. Ενδέχεται μελλοντικά ακόμη και ορισμένα χαρακτηριστικά του πυρήνα να μη λειτουργούν όπως πρέπει.",
+ "DiagnosticPiwikJsMakeWritable": "Προτείνουμε να κάνετε το %1$s εγγράψιμο εκτελώντας την εντολή: %2$s"
}
} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/en.json b/plugins/CustomJsTracker/lang/en.json
index 95aab1359b..9d64e174df 100644
--- a/plugins/CustomPiwikJs/lang/en.json
+++ b/plugins/CustomJsTracker/lang/en.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Allows any plugin to extend the Matomo JavaScript Tracking file (matomo.js) and add new functionality and website measurement capabilities.",
"DiagnosticPiwikJsWritable": "Writable JavaScript Tracker (%s)",
"DiagnosticPiwikJsNotWritable": "The Matomo JavaScript tracker file %s is not writable which means other plugins cannot extend the JavaScript tracker. In the future even some core features might not work as expected. ",
diff --git a/plugins/CustomPiwikJs/lang/eo.json b/plugins/CustomJsTracker/lang/eo.json
index f7be3f2f08..8e069b7a31 100644
--- a/plugins/CustomPiwikJs/lang/eo.json
+++ b/plugins/CustomJsTracker/lang/eo.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"DiagnosticPiwikJsWritable": "Skribebla Sekvanta JavaSkripto (%s)",
"DiagnosticPiwikJsNotWritable": "La JavaSkriptan sekvanta dosiero %sne stas skriblebla. Pro tio aliaj kromprogramoj ne povas etendi la JavaSkriptan sekvanto. Estontece eĉ kelkaj kernaj funkcioj povus ne funkcii kiel atendite.",
"DiagnosticPiwikJsMakeWritable": "Ni rekomendas fari %1$sskribebla per funkciado de ĉi tiu komando: %2$s"
diff --git a/plugins/CustomPiwikJs/lang/es-ar.json b/plugins/CustomJsTracker/lang/es-ar.json
index d2dbe88b3b..6db0d6c3eb 100644
--- a/plugins/CustomPiwikJs/lang/es-ar.json
+++ b/plugins/CustomJsTracker/lang/es-ar.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Permite a cualquier plugin extender el archivo de rastreo vía JavaScript de Matomo (\"matomo.js\"), y agrega nuevas capacidades de medición de funcionalidad y sitios web.",
"DiagnosticPiwikJsWritable": "Rastreador escribible de JavaScript (%s)",
"DiagnosticPiwikJsNotWritable": "El archivo rastreador vía JavaScript de Matomo %s no es escribible, lo cual significa que otros plugins no pueden extender el rastreador de JavaScript. En el futuro es posible que incluso funciones centrales no funcionen como lo esperado.",
diff --git a/plugins/CustomPiwikJs/lang/es.json b/plugins/CustomJsTracker/lang/es.json
index 7b801b65b7..cc338858e8 100644
--- a/plugins/CustomPiwikJs/lang/es.json
+++ b/plugins/CustomJsTracker/lang/es.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Permite a cualquier módulo ampliar el archivo de seguimiento Javascript Matomo (matomo.js) y agregar nuevas funcionalidades y capacidades de medición de desempeño a un sitio web.",
"DiagnosticPiwikJsWritable": "Archivo de seguimiento Javascript con permiso de escritura (%s)",
"DiagnosticPiwikJsNotWritable": "El archivo Javascript de seguimiento Matomo %s no posee permisos de escritura, lo que significa que los otros módulos no pueden enriquecerlo. Más aun, en un futuro, algunas funciones básicas podrían no funcionar como debieran.",
diff --git a/plugins/CustomPiwikJs/lang/fi.json b/plugins/CustomJsTracker/lang/fi.json
index 500f8d9134..ce556e4dd3 100644
--- a/plugins/CustomPiwikJs/lang/fi.json
+++ b/plugins/CustomJsTracker/lang/fi.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Sallii minkä tahansa liitännäisen laajentaa Matomon JavaScript-seurantatiedostoa (matomo.js) ja lisätä uusia toiminnallisuuksia sekä verkkosivuston mittauskyvykkyyksiä.",
"DiagnosticPiwikJsWritable": "Kirjoitettava JavaScript-seurain (%s)",
"DiagnosticPiwikJsMakeWritable": "Suosittelemme, että %1$s asetetaan kirjoitettavaksi suorittamalla seuraava komento: %2$s"
diff --git a/plugins/CustomPiwikJs/lang/fr.json b/plugins/CustomJsTracker/lang/fr.json
index 8105ee5490..d4e8979249 100644
--- a/plugins/CustomPiwikJs/lang/fr.json
+++ b/plugins/CustomJsTracker/lang/fr.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Autorise n'importe quel composant à mettre à jour le fichier de suivi Matomo (matomo.js) et à ajouter de nouvelles fonctionnalités ainsi que des capacités de suivi de site web.",
"DiagnosticPiwikJsWritable": "Traceur JavaScript inscriptible (%s)",
"DiagnosticPiwikJsNotWritable": "Le fichier traceur JavaScript Matomo %sinscriptible ce qui veut dit que d'autres composants ne peuvent pas le modifier. Dans le futur il se pourrait même que certaines fonctionnalités principales ne fonctionnent pas comme prévu.",
diff --git a/plugins/CustomPiwikJs/lang/id.json b/plugins/CustomJsTracker/lang/id.json
index 1e2c445b43..9f590870cf 100644
--- a/plugins/CustomPiwikJs/lang/id.json
+++ b/plugins/CustomJsTracker/lang/id.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"DiagnosticPiwikJsWritable": "Pelacak JavaScript yang Dapat Ditulis (\"\/piwik.js\")"
}
} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/it.json b/plugins/CustomJsTracker/lang/it.json
index 3b9df39795..e2d47aa161 100644
--- a/plugins/CustomPiwikJs/lang/it.json
+++ b/plugins/CustomJsTracker/lang/it.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Consente a qualsiasi plug-in di estendere il file di tracking JavaScript di Matomo (matomo.js) e di aggiungere nuove funzionalità e capacità di misurazione del sito web.",
"DiagnosticPiwikJsWritable": "JavaScript Tracker scrivibile (%s)",
"DiagnosticPiwikJsNotWritable": "Il file tracker JavaScript di Matomo %s non è scrivibile, il che significa che altri plugin non possono estendere il tracker JavaScript. In futuro anche alcune funzionalità di base potrebbero non funzionare come previsto.",
diff --git a/plugins/CustomPiwikJs/lang/ja.json b/plugins/CustomJsTracker/lang/ja.json
index f0aa33dd4c..dfa58e56c7 100644
--- a/plugins/CustomPiwikJs/lang/ja.json
+++ b/plugins/CustomJsTracker/lang/ja.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "任意のプラグインが Matomo JavaScript Tracking ファイル( matomo.js )を拡張し、新しい機能と Web サイトの測定機能を追加することができます。",
"DiagnosticPiwikJsWritable": "書き込み可能な JavaScript トラッカー(%s)",
"DiagnosticPiwikJsNotWritable": "Matomo JavaScriptトラッカーファイル %s は書き込み可能ではありません。これは、他のプラグインが JavaScriptトラッカー を拡張できないことを意味します。 将来的には、一部のコア機能も期待どおりに機能しない可能性があります。",
diff --git a/plugins/CustomPiwikJs/lang/nb.json b/plugins/CustomJsTracker/lang/nb.json
index 2be4031638..ce4b6f7f2b 100644
--- a/plugins/CustomPiwikJs/lang/nb.json
+++ b/plugins/CustomJsTracker/lang/nb.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"DiagnosticPiwikJsWritable": "Skrivbar JavaScript-tracker (\"\/piwik.js\")",
"DiagnosticPiwikJsMakeWritable": "Vi anbefaler å gjøre piwik.js skrivbar ved å kjøre denne kommandoen: %s"
}
diff --git a/plugins/CustomPiwikJs/lang/nl.json b/plugins/CustomJsTracker/lang/nl.json
index 3641b36930..c91b025cfc 100644
--- a/plugins/CustomPiwikJs/lang/nl.json
+++ b/plugins/CustomJsTracker/lang/nl.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"DiagnosticPiwikJsWritable": "Schrijfbare JavaScript-tracker (%s)",
"DiagnosticPiwikJsMakeWritable": "We adviseren %1$s schrijfbaar te maken door het volgende commando uit te voeren: %2$s"
}
diff --git a/plugins/CustomPiwikJs/lang/pl.json b/plugins/CustomJsTracker/lang/pl.json
index 00b352bf7f..fd21f3a1ae 100644
--- a/plugins/CustomPiwikJs/lang/pl.json
+++ b/plugins/CustomJsTracker/lang/pl.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"DiagnosticPiwikJsWritable": "Zapisywalny Traker JavaScript (%s)",
"DiagnosticPiwikJsMakeWritable": "Zalecamy nadanie dla %1$s uprawnień do zapisu wykonując tą komendę: %2$s"
}
diff --git a/plugins/CustomPiwikJs/lang/pt-br.json b/plugins/CustomJsTracker/lang/pt-br.json
index 6da26dbeea..cb1750ce4f 100644
--- a/plugins/CustomPiwikJs/lang/pt-br.json
+++ b/plugins/CustomJsTracker/lang/pt-br.json
@@ -1,8 +1,8 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Permite que qualquer plugin estenda o arquivo JavaScript de Rastreamento do Matomo (matomo.js) e adicione novas funcionalidades e recursos de medição de site.",
"DiagnosticPiwikJsWritable": "Rastreador Javascript gravável (%s)",
- "DiagnosticPiwikJsNotWritable": "O arquivo JavaScript rastreador do Matomo %s não é gravável, o que significa que outros plugins não podem estender o rastreador JavaScript. No futuro até mesmo alguns recursos principais podem não funcionar como esperado.",
+ "DiagnosticPiwikJsNotWritable": "O arquivo rastreador JavaScript do Matomo %s não é gravável, o que significa que outros plugins não podem estender o rastreador JavaScript. No futuro até mesmo algumas funcionalidades principais podem não funcionar como esperado.",
"DiagnosticPiwikJsMakeWritable": "Recomendamos tornar %1$s gravável executando este comando: %2$s"
}
} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/lang/pt.json b/plugins/CustomJsTracker/lang/pt.json
index a44a374183..f2bbd63711 100644
--- a/plugins/CustomPiwikJs/lang/pt.json
+++ b/plugins/CustomJsTracker/lang/pt.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Permite que qualquer extensão complemente o ficheiro de acompanhamento de JavaScript do Matomo (matomo.js) e adicione novas funcionalidades e capacidades de medição de sites.",
"DiagnosticPiwikJsWritable": "Permissões de escrita no JavaScript de acompanhamento (%s)",
"DiagnosticPiwikJsNotWritable": "O ficheiro JavaScript de acompanhamento do Matomo %snão tem permissões de escrita, o que significa que outras extensões não conseguem complementar o tracker JavaScript. É possível que no futuro certas funcionalidades centrais não funcionem como o esperado.",
diff --git a/plugins/CustomPiwikJs/lang/ru.json b/plugins/CustomJsTracker/lang/ru.json
index 34f8eb5c72..c128245e67 100644
--- a/plugins/CustomPiwikJs/lang/ru.json
+++ b/plugins/CustomJsTracker/lang/ru.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Разрешить любому плагину дополнять JavaScript-код отслеживания Matomo (matomo.js), добавляя новую функциональность и расширяя возможности мониторинга сайтов.",
"DiagnosticPiwikJsWritable": "Записываемый JavaScript Tracker (%s)",
"DiagnosticPiwikJsNotWritable": "Файл трекера JavaScript Matomo %s недоступен для записи, это означает, что другие плагины не могут расширять трекер JavaScript. В будущем даже некоторые основные функции могут работать не так, как ожидалось.",
diff --git a/plugins/CustomPiwikJs/lang/sq.json b/plugins/CustomJsTracker/lang/sq.json
index 5bd24a9b79..788f53286b 100644
--- a/plugins/CustomPiwikJs/lang/sq.json
+++ b/plugins/CustomJsTracker/lang/sq.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "I lejon cilësdo shtojcë të zgjerojë kartelën Matomo JavaScript Tracking (matomo.js) dhe të shtojë aftësi të reja funksionimi dhe matjesh në sajt.",
"DiagnosticPiwikJsWritable": "Ndjekës JavaScript i Shkrueshëm (%s)",
"DiagnosticPiwikJsNotWritable": "Kartela e ndjekësit JavaScript të Matomo-s %s 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ë.",
diff --git a/plugins/CustomPiwikJs/lang/sr.json b/plugins/CustomJsTracker/lang/sr.json
index 198df11b8d..a95564a8af 100644
--- a/plugins/CustomPiwikJs/lang/sr.json
+++ b/plugins/CustomJsTracker/lang/sr.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Omogućuje bilo kom Matomo dodatku da proširi Matomo JavaScript datoteku za praćenje (piwik.js) i doda nove funkcionalnosti i mogućnosti za praćenje sajtova.",
"DiagnosticPiwikJsWritable": "JavaScript treker u koji je moguće pisati (\"\/piwik.js\")",
"DiagnosticPiwikJsMakeWritable": "Predlažemo da omogućite pisanje u piwik.js sledećom komandom: %s"
diff --git a/plugins/CustomPiwikJs/lang/sv.json b/plugins/CustomJsTracker/lang/sv.json
index 42b11d736d..f0e5c00caa 100644
--- a/plugins/CustomPiwikJs/lang/sv.json
+++ b/plugins/CustomJsTracker/lang/sv.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Gör att insticksprogram kan bygga vidare på Matomos JavaScript-spårare (matomo.js) för att lägga till nya funktioner och möjligheter för att mäta webbplatser.",
"DiagnosticPiwikJsWritable": "Skrivbar JavaScript-spårare (%s)",
"DiagnosticPiwikJsNotWritable": "JavaScript-filen innehållande Matomos spårare (%s) är skrivskyddad, vilket innebär att insticksprogram inte kan utöka JavaScript-spåraren. I framtiden kan även vissa andra grundfunktioner upphöra fungera som väntat.",
diff --git a/plugins/CustomPiwikJs/lang/tr.json b/plugins/CustomJsTracker/lang/tr.json
index 9a699b436b..6a45f628b6 100644
--- a/plugins/CustomPiwikJs/lang/tr.json
+++ b/plugins/CustomJsTracker/lang/tr.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Matomo JavaScript İzleme dosyasına (matomo.js) tüm uygulama eklerinin katkıda bulunmasını sağlayarak yeni özellik ve web sitesi ölçüm yetenekleri ekler.",
"DiagnosticPiwikJsWritable": "Yazılabilir JavaScript İzleyici (%s)",
"DiagnosticPiwikJsNotWritable": "%s Matomo JavaScript izleyici dosyası yazılabilir olmadığından diğer uygulama ekleri JavaScript İzleyiciyi kullanamaz. İleride bazı temel özellikler de beklendiği gibi çalışmayabilir.",
diff --git a/plugins/CustomPiwikJs/lang/uk.json b/plugins/CustomJsTracker/lang/uk.json
index fbbf394e5b..0ffe45b22d 100644
--- a/plugins/CustomPiwikJs/lang/uk.json
+++ b/plugins/CustomJsTracker/lang/uk.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "Дозволяє будь-якому плагіну розширювати Matomo JavaScript код відстеження (piwik.js) і додавати нові можливості функціонування та можливості вимірювання веб-сайту.",
"DiagnosticPiwikJsWritable": "Доступний для запису JavaScript трекер (\"\/piwik.js\")",
"DiagnosticPiwikJsNotWritable": "Відстеження файлів Matomo через JavaScript \"\/piwik.js\" не підлягає запису, це означає, що інші плагіни не можуть розширити трекер JavaScript. Надалі навіть деякі основні функції можуть не працювати, як очікується.",
diff --git a/plugins/CustomPiwikJs/lang/zh-cn.json b/plugins/CustomJsTracker/lang/zh-cn.json
index cd3f4e91dc..dede8a4824 100644
--- a/plugins/CustomPiwikJs/lang/zh-cn.json
+++ b/plugins/CustomJsTracker/lang/zh-cn.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "允许任何插件扩展Matomo JavaScript追踪文件(matomo.js)并添加新功能和网站评估功能。",
"DiagnosticPiwikJsWritable": "可写的JavaScript追踪器(%s)",
"DiagnosticPiwikJsNotWritable": "Matomo JavaScript追踪器文件%s不可写,这意味着其他插件无法扩展JavaScript追踪器。 将来,甚至某些核心功能可能也无法按预期运行。",
diff --git a/plugins/CustomPiwikJs/lang/zh-tw.json b/plugins/CustomJsTracker/lang/zh-tw.json
index 4f5e361d65..d7d3087d30 100644
--- a/plugins/CustomPiwikJs/lang/zh-tw.json
+++ b/plugins/CustomJsTracker/lang/zh-tw.json
@@ -1,5 +1,5 @@
{
- "CustomPiwikJs": {
+ "CustomJsTracker": {
"PluginDescription": "允許任何外掛擴展 Matomo JavaScript 追蹤檔案(piwik.js)來增加新功能和網站追蹤能力。",
"DiagnosticPiwikJsWritable": "JavaScript 追蹤檔案可寫入(%s)",
"DiagnosticPiwikJsNotWritable": "Matomo 的 JavaScript 追蹤檔案 %s 無法寫入,這代表其他外掛無法擴展 JavaScript 追蹤功能。未來甚至有些核心功能會無法正常運作。",
diff --git a/plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php b/plugins/CustomJsTracker/tests/Framework/Mock/PluginTrackerFilesMock.php
index 2503353ec0..4849753a51 100644
--- a/plugins/CustomPiwikJs/tests/Framework/Mock/PluginTrackerFilesMock.php
+++ b/plugins/CustomJsTracker/tests/Framework/Mock/PluginTrackerFilesMock.php
@@ -6,10 +6,10 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\tests\Framework\Mock;
+namespace Piwik\Plugins\CustomJsTracker\tests\Framework\Mock;
-use Piwik\Plugins\CustomPiwikJs\File;
-use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
+use Piwik\Plugins\CustomJsTracker\File;
+use Piwik\Plugins\CustomJsTracker\TrackingCode\PluginTrackerFiles;
class PluginTrackerFilesMock extends PluginTrackerFiles
{
diff --git a/plugins/CustomPiwikJs/tests/Integration/ApiTest.php b/plugins/CustomJsTracker/tests/Integration/ApiTest.php
index d1fce33e4c..6bd2fc753e 100644
--- a/plugins/CustomPiwikJs/tests/Integration/ApiTest.php
+++ b/plugins/CustomJsTracker/tests/Integration/ApiTest.php
@@ -6,15 +6,15 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\tests\Integration;
+namespace Piwik\Plugins\CustomJsTracker\tests\Integration;
-use Piwik\Plugins\CustomPiwikJs\API;
+use Piwik\Plugins\CustomJsTracker\API;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\Mock\FakeAccess;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
/**
- * @group CustomPiwikJs
+ * @group CustomJsTracker
* @group ApiTest
* @group Api
* @group Plugins
@@ -26,7 +26,7 @@ class ApiTest extends IntegrationTestCase
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -35,22 +35,20 @@ class ApiTest extends IntegrationTestCase
$this->api = API::getInstance();
}
- /**
- * @expectedException \Piwik\NoAccessException
- * @expectedExceptionMessage checkUserHasSomeAdminAccess
- */
public function test_doesIncludePluginTrackersAutomatically_failsIfNotEnoughPermission()
{
+ $this->expectException(\Piwik\NoAccessException::class);
+ $this->expectExceptionMessage('checkUserHasSomeAdminAccess');
+
$this->setUser();
$this->api->doesIncludePluginTrackersAutomatically();
}
- /**
- * @expectedException \Piwik\NoAccessException
- * @expectedExceptionMessage checkUserHasSomeAdminAccess
- */
public function test_doesIncludePluginTrackersAutomatically_failsIfNotEnoughPermissionAnonymous()
{
+ $this->expectException(\Piwik\NoAccessException::class);
+ $this->expectExceptionMessage('checkUserHasSomeAdminAccess');
+
$this->setAnonymousUser();
$this->api->doesIncludePluginTrackersAutomatically();
}
diff --git a/plugins/CustomPiwikJs/tests/Integration/FileTest.php b/plugins/CustomJsTracker/tests/Integration/FileTest.php
index da221e0f2e..d64d5d413a 100644
--- a/plugins/CustomPiwikJs/tests/Integration/FileTest.php
+++ b/plugins/CustomJsTracker/tests/Integration/FileTest.php
@@ -6,9 +6,9 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\tests\Integration;
+namespace Piwik\Plugins\CustomJsTracker\tests\Integration;
-use Piwik\Plugins\CustomPiwikJs\File;
+use Piwik\Plugins\CustomJsTracker\File;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
class CustomTestFile extends File {
@@ -16,7 +16,7 @@ class CustomTestFile extends File {
}
/**
- * @group CustomPiwikJs
+ * @group CustomJsTracker
* @group FileTest
* @group File
* @group Plugins
@@ -31,10 +31,10 @@ class FileTest extends IntegrationTestCase
*/
private $dir = '';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- $this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/CustomPiwikJs/tests/resources/';
+ $this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/CustomJsTracker/tests/resources/';
// make directory not writable
$nonWritableDir = dirname($this->dir . self::NOT_EXISTING_FILE_IN_NON_WRITABLE_DIRECTORY);
@@ -44,7 +44,7 @@ class FileTest extends IntegrationTestCase
}
}
- public function tearDown()
+ public function tearDown(): void
{
// restore permissions changed by makeNotWritableFile()
chmod($this->dir, 0777);
@@ -152,21 +152,19 @@ class FileTest extends IntegrationTestCase
$this->assertTrue(true);
}
- /**
- * @expectedException \Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException
- * @expectedExceptionMessage not readable
- */
public function test_checkReadable_shouldThrowException_IfNotIsReadable()
{
+ $this->expectException(\Piwik\Plugins\CustomJsTracker\Exception\AccessDeniedException::class);
+ $this->expectExceptionMessage('not readable');
+
$this->makeNotReadableFile()->checkReadable();
}
- /**
- * @expectedException \Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException
- * @expectedExceptionMessage not writable
- */
public function test_checkWritable_shouldThrowException_IfNotIsWritable()
{
+ $this->expectException(\Piwik\Plugins\CustomJsTracker\Exception\AccessDeniedException::class);
+ $this->expectExceptionMessage('not writable');
+
$this->makeNotReadableFile_inNonWritableDirectory()->checkWritable();
}
diff --git a/plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php b/plugins/CustomJsTracker/tests/Integration/PiwikJsManipulatorTest.php
index 75c66b73f7..3decbd21f7 100644
--- a/plugins/CustomPiwikJs/tests/Integration/PiwikJsManipulatorTest.php
+++ b/plugins/CustomJsTracker/tests/Integration/PiwikJsManipulatorTest.php
@@ -6,14 +6,14 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\tests\Integration;
+namespace Piwik\Plugins\CustomJsTracker\tests\Integration;
-use Piwik\Plugins\CustomPiwikJs\tests\Framework\Mock\PluginTrackerFilesMock;
-use Piwik\Plugins\CustomPiwikJs\TrackingCode\PiwikJsManipulator;
+use Piwik\Plugins\CustomJsTracker\tests\Framework\Mock\PluginTrackerFilesMock;
+use Piwik\Plugins\CustomJsTracker\TrackingCode\PiwikJsManipulator;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
/**
- * @group CustomPiwikJs
+ * @group CustomJsTracker
* @group PiwikJsManipulatorTest
* @group PiwikJsManipulator
* @group Plugins
@@ -29,8 +29,8 @@ var myArray = [];
public function test_manipulateContent_shouldAddCodeOfTrackerPlugins()
{
$manipulator = $this->makeManipulator(array(
- '/plugins/CustomPiwikJs/tests/resources/tracker.js',
- '/plugins/CustomPiwikJs/tests/resources/tracker.min.js',
+ '/plugins/CustomJsTracker/tests/resources/tracker.js',
+ '/plugins/CustomJsTracker/tests/resources/tracker.min.js',
));
$updatedContent = $manipulator->manipulateContent();
diff --git a/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php b/plugins/CustomJsTracker/tests/Integration/PluginTrackerFilesTest.php
index f6eecdab20..7dab1b6032 100644
--- a/plugins/CustomPiwikJs/tests/Integration/PluginTrackerFilesTest.php
+++ b/plugins/CustomJsTracker/tests/Integration/PluginTrackerFilesTest.php
@@ -6,10 +6,10 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\tests\Integration;
+namespace Piwik\Plugins\CustomJsTracker\tests\Integration;
use Piwik\Piwik;
-use Piwik\Plugins\CustomPiwikJs\TrackingCode\PluginTrackerFiles;
+use Piwik\Plugins\CustomJsTracker\TrackingCode\PluginTrackerFiles;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
class CustomPluginTrackerFiles extends PluginTrackerFiles {
@@ -17,13 +17,13 @@ class CustomPluginTrackerFiles extends PluginTrackerFiles {
protected function getDirectoriesToLook() {
return array(
- 'CustomPiwikJs' => PIWIK_DOCUMENT_ROOT . '/plugins/CustomPiwikJs/tests/resources/'
+ 'CustomJsTracker' => PIWIK_DOCUMENT_ROOT . '/plugins/CustomJsTracker/tests/resources/'
);
}
}
/**
- * @group CustomPiwikJs
+ * @group CustomJsTracker
* @group PluginTrackerFilesTest
* @group PluginTrackerFiles
* @group Plugins
@@ -36,8 +36,8 @@ class PluginTrackerFilesTest extends IntegrationTestCase
$foundFiles = $trackerFiles->find();
$this->assertCount(1, $foundFiles);
- $this->assertTrue(isset($foundFiles['CustomPiwikJs']));
- $this->assertEquals('tracker.min.js', $foundFiles['CustomPiwikJs']->getName());
+ $this->assertTrue(isset($foundFiles['CustomJsTracker']));
+ $this->assertEquals('tracker.min.js', $foundFiles['CustomJsTracker']->getName());
}
public function test_find_shouldIgnoreMinifiedVersion_IfRequested()
@@ -47,8 +47,8 @@ class PluginTrackerFilesTest extends IntegrationTestCase
$foundFiles = $trackerFiles->find();
$this->assertCount(1, $foundFiles);
- $this->assertTrue(isset($foundFiles['CustomPiwikJs']));
- $this->assertEquals('tracker.js', $foundFiles['CustomPiwikJs']->getName());
+ $this->assertTrue(isset($foundFiles['CustomJsTracker']));
+ $this->assertEquals('tracker.js', $foundFiles['CustomJsTracker']->getName());
}
public function test_find_EventsCanIgnoreFiles()
@@ -57,8 +57,8 @@ class PluginTrackerFilesTest extends IntegrationTestCase
$foundFiles = $trackerFiles->find();
$this->assertCount(1, $foundFiles);
- Piwik::addAction('CustomPiwikJs.shouldAddTrackerFile', function (&$shouldAdd, $pluginName) {
- if ($pluginName === 'CustomPiwikJs') {
+ Piwik::addAction('CustomJsTracker.shouldAddTrackerFile', function (&$shouldAdd, $pluginName) {
+ if ($pluginName === 'CustomJsTracker') {
$shouldAdd = false;
}
});
diff --git a/plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php b/plugins/CustomJsTracker/tests/Integration/TrackerUpdaterTest.php
index 7a66b035fb..4977037c72 100644
--- a/plugins/CustomPiwikJs/tests/Integration/TrackerUpdaterTest.php
+++ b/plugins/CustomJsTracker/tests/Integration/TrackerUpdaterTest.php
@@ -6,15 +6,15 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\tests\Integration;
+namespace Piwik\Plugins\CustomJsTracker\tests\Integration;
-use Piwik\Plugins\CustomPiwikJs\File;
-use Piwik\Plugins\CustomPiwikJs\tests\Framework\Mock\PluginTrackerFilesMock;
-use Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
+use Piwik\Plugins\CustomJsTracker\File;
+use Piwik\Plugins\CustomJsTracker\tests\Framework\Mock\PluginTrackerFilesMock;
+use Piwik\Plugins\CustomJsTracker\TrackerUpdater;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
/**
- * @group CustomPiwikJs
+ * @group CustomJsTracker
* @group PiwikJsManipulatorTest
* @group PiwikJsManipulator
* @group Plugins
@@ -22,18 +22,18 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
class TrackerUpdaterTest extends IntegrationTestCase
{
private $dir;
- private $piwikJsChangedEventPath = null;
+ private $trackerJsChangedEventPath = null;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- $this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/CustomPiwikJs/tests/resources/';
- $this->piwikJsChangedEventPath = null;
+ $this->dir = PIWIK_DOCUMENT_ROOT . '/plugins/CustomJsTracker/tests/resources/';
+ $this->trackerJsChangedEventPath = null;
$this->cleanUp();
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
@@ -112,12 +112,11 @@ class TrackerUpdaterTest extends IntegrationTestCase
$this->assertTrue(true);
}
- /**
- * @expectedException \Piwik\Plugins\CustomPiwikJs\Exception\AccessDeniedException
- * @expectedExceptionMessage not writable
- */
public function test_checkWillSucceed_shouldNotThrowExceptionIfTargetIsNotWritable()
{
+ $this->expectException(\Piwik\Plugins\CustomJsTracker\Exception\AccessDeniedException::class);
+ $this->expectExceptionMessage('not writable');
+
$updater = $this->makeUpdater(null, $this->dir . 'not-writable/MyNotExisIngFilessss.js');
$updater->checkWillSucceed();
}
@@ -185,7 +184,7 @@ var myArray = [];
$updater = $this->makeUpdater(null, $this->dir . 'not-writable/MyNotExisIngFilessss.js');
$updater->update();
$this->assertTrue(true);
- $this->assertNull($this->piwikJsChangedEventPath);
+ $this->assertNull($this->trackerJsChangedEventPath);
}
public function test_update_shouldNotWriteToFileIfThereIsNothingToChange()
@@ -199,7 +198,7 @@ var myArray = [];
$updater->update();
$this->assertSame(file_get_contents($source), file_get_contents($target));
- $this->assertNull($this->piwikJsChangedEventPath);
+ $this->assertNull($this->trackerJsChangedEventPath);
}
public function test_update_targetFileIfPluginsDefineDifferentFiles()
@@ -230,15 +229,15 @@ var PiwikJs = "mytest";
var myArray = [];
', file_get_contents($target));
- $this->assertEquals($target, $this->piwikJsChangedEventPath);
+ $this->assertEquals($target, $this->trackerJsChangedEventPath);
}
public function provideContainerConfig()
{
return [
'observers.global' => \DI\add([
- ['CustomPiwikJs.piwikJsChanged', function ($path) {
- $this->piwikJsChangedEventPath = $path;
+ ['CustomJsTracker.trackerJsChanged', function ($path) {
+ $this->trackerJsChangedEventPath = $path;
}],
]),
];
diff --git a/plugins/CustomPiwikJs/tests/System/PiwikJsContentTest.php b/plugins/CustomJsTracker/tests/System/PiwikJsContentTest.php
index a08ecdb61e..26bbede5a8 100644
--- a/plugins/CustomPiwikJs/tests/System/PiwikJsContentTest.php
+++ b/plugins/CustomJsTracker/tests/System/PiwikJsContentTest.php
@@ -6,14 +6,14 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\CustomPiwikJs\tests\System;
+namespace Piwik\Plugins\CustomJsTracker\tests\System;
-use Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
-use Piwik\Plugins\CustomPiwikJs\TrackingCode\PiwikJsManipulator;
+use Piwik\Plugins\CustomJsTracker\TrackerUpdater;
+use Piwik\Plugins\CustomJsTracker\TrackingCode\PiwikJsManipulator;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
/**
- * @group CustomPiwikJs
+ * @group CustomJsTracker
* @group PiwikJsContentTest
* @group PiwikJsContent
* @group Plugins
@@ -33,7 +33,7 @@ class PiwikJsContentTest extends SystemTestCase
$piwikMin = PIWIK_DOCUMENT_ROOT . '/js/piwik.min.js';
$content = file_get_contents($piwikMin);
- $this->assertContains(PiwikJsManipulator::HOOK, $content);
+ self::assertStringContainsString(PiwikJsManipulator::HOOK, $content);
}
} \ No newline at end of file
diff --git a/plugins/CustomPiwikJs/tests/resources/MyTestTarget2.js b/plugins/CustomJsTracker/tests/resources/MyTestTarget2.js
index 258c2d3e11..258c2d3e11 100644
--- a/plugins/CustomPiwikJs/tests/resources/MyTestTarget2.js
+++ b/plugins/CustomJsTracker/tests/resources/MyTestTarget2.js
diff --git a/plugins/CustomPiwikJs/tests/resources/test.js b/plugins/CustomJsTracker/tests/resources/test.js
index 0ea6fcc24a..0ea6fcc24a 100644
--- a/plugins/CustomPiwikJs/tests/resources/test.js
+++ b/plugins/CustomJsTracker/tests/resources/test.js
diff --git a/plugins/CustomPiwikJs/tests/resources/testpiwik.js b/plugins/CustomJsTracker/tests/resources/testpiwik.js
index 02b60f8bcd..02b60f8bcd 100644
--- a/plugins/CustomPiwikJs/tests/resources/testpiwik.js
+++ b/plugins/CustomJsTracker/tests/resources/testpiwik.js
diff --git a/plugins/CustomPiwikJs/tests/resources/tracker.js b/plugins/CustomJsTracker/tests/resources/tracker.js
index ae4d228f39..ae4d228f39 100644
--- a/plugins/CustomPiwikJs/tests/resources/tracker.js
+++ b/plugins/CustomJsTracker/tests/resources/tracker.js
diff --git a/plugins/CustomPiwikJs/tests/resources/tracker.min.js b/plugins/CustomJsTracker/tests/resources/tracker.min.js
index 587ee0464d..587ee0464d 100644
--- a/plugins/CustomPiwikJs/tests/resources/tracker.min.js
+++ b/plugins/CustomJsTracker/tests/resources/tracker.min.js
diff --git a/plugins/CustomVariables/API.php b/plugins/CustomVariables/API.php
index 4e91daacb5..1625c18836 100644
--- a/plugins/CustomVariables/API.php
+++ b/plugins/CustomVariables/API.php
@@ -92,7 +92,8 @@ class API extends \Piwik\Plugin\API
*/
public static function getReservedCustomVariableKeys()
{
- return array('_pks', '_pkn', '_pkc', '_pkp', ActionSiteSearch::CVAR_KEY_SEARCH_COUNT, ActionSiteSearch::CVAR_KEY_SEARCH_CATEGORY);
+ // Note: _pk_scat and _pk_scount has been used for site search, but aren't in use anymore
+ return array('_pks', '_pkn', '_pkc', '_pkp', '_pk_scat', '_pk_scount');
}
/**
diff --git a/plugins/CustomVariables/Archiver.php b/plugins/CustomVariables/Archiver.php
index 221f916cf4..5d2448e7a4 100644
--- a/plugins/CustomVariables/Archiver.php
+++ b/plugins/CustomVariables/Archiver.php
@@ -16,8 +16,6 @@ use Piwik\Metrics;
use Piwik\Tracker\GoalManager;
use Piwik\Tracker;
-require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php';
-
class Archiver extends \Piwik\Plugin\Archiver
{
const LABEL_CUSTOM_VALUE_NOT_DEFINED = "Value not defined";
@@ -109,7 +107,7 @@ class Archiver extends \Piwik\Plugin\Archiver
// then we also query the "Product page view" price which was possibly recorded.
$additionalSelects = false;
- if (in_array($slot, array(\PiwikTracker::CVAR_INDEX_ECOMMERCE_ITEM_SKU, \PiwikTracker::CVAR_INDEX_ECOMMERCE_ITEM_NAME, \PiwikTracker::CVAR_INDEX_ECOMMERCE_ITEM_CATEGORY))) {
+ if (in_array($slot, array(\MatomoTracker::CVAR_INDEX_ECOMMERCE_ITEM_SKU, \MatomoTracker::CVAR_INDEX_ECOMMERCE_ITEM_NAME, \MatomoTracker::CVAR_INDEX_ECOMMERCE_ITEM_CATEGORY))) {
$additionalSelects = array($this->getSelectAveragePrice());
}
$query = $this->getLogAggregator()->queryActionsByDimension($dimensions, $where, $additionalSelects);
@@ -121,7 +119,7 @@ class Archiver extends \Piwik\Plugin\Archiver
protected function getSelectAveragePrice()
{
- $field = "custom_var_v" . \PiwikTracker::CVAR_INDEX_ECOMMERCE_ITEM_PRICE;
+ $field = "custom_var_v" . \MatomoTracker::CVAR_INDEX_ECOMMERCE_ITEM_PRICE;
return LogAggregator::getSqlRevenue("AVG(log_link_visit_action." . $field . ")") . " as `" . Metrics::INDEX_ECOMMERCE_ITEM_PRICE_VIEWED . "`";
}
diff --git a/plugins/CustomVariables/Columns/SearchCategory.php b/plugins/CustomVariables/Columns/SearchCategory.php
deleted file mode 100644
index deefc6b9c6..0000000000
--- a/plugins/CustomVariables/Columns/SearchCategory.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\CustomVariables\Columns;
-
-use Piwik\Columns\Discriminator;
-use Piwik\Plugin\Dimension\ActionDimension;
-use Piwik\Plugins\Actions\Actions\ActionSiteSearch;
-
-class SearchCategory extends ActionDimension
-{
- protected $type = self::TYPE_TEXT;
- protected $columnName = 'custom_var_v4';
- protected $nameSingular = 'Actions_SiteSearchCategory';
- protected $namePlural = 'Actions_SiteSearchCategories';
-
- public function getDbDiscriminator()
- {
- return new Discriminator($this->dbTableName, 'custom_var_k4', ActionSiteSearch::CVAR_KEY_SEARCH_CATEGORY);
- }
-} \ No newline at end of file
diff --git a/plugins/CustomVariables/VisitorDetails.php b/plugins/CustomVariables/VisitorDetails.php
index 6be82c6e43..d413ce9804 100644
--- a/plugins/CustomVariables/VisitorDetails.php
+++ b/plugins/CustomVariables/VisitorDetails.php
@@ -41,7 +41,11 @@ class VisitorDetails extends VisitorDetailsAbstract
for ($i = 1; $i <= $maxCustomVariables; $i++) {
if (!empty($action['custom_var_k' . $i])) {
$cvarKey = $action['custom_var_k' . $i];
- $cvarKey = static::getCustomVariablePrettyKey($cvarKey);
+
+ if (in_array($cvarKey, ['_pk_scat', '_pk_scount'])) {
+ continue; // ignore old site search variables
+ }
+
$customVariablesPage[$i] = array(
'customVariablePageName' . $i => $cvarKey,
'customVariablePageValue' . $i => $action['custom_var_v' . $i],
@@ -77,19 +81,6 @@ class VisitorDetails extends VisitorDetailsAbstract
return [[ 50, $view->render() ]];
}
- private static function getCustomVariablePrettyKey($key)
- {
- $rename = array(
- ActionSiteSearch::CVAR_KEY_SEARCH_CATEGORY => Piwik::translate('Actions_ColumnSearchCategory'),
- ActionSiteSearch::CVAR_KEY_SEARCH_COUNT => Piwik::translate('Actions_ColumnSearchResultsCount'),
- );
- if (isset($rename[$key])) {
- return $rename[$key];
- }
- return $key;
- }
-
-
protected $customVariables = [];
public function initProfile($visits, &$profile)
diff --git a/plugins/CustomVariables/tests/Commands/InfoTest.php b/plugins/CustomVariables/tests/Commands/InfoTest.php
index 64335fcb3b..64851f277e 100644
--- a/plugins/CustomVariables/tests/Commands/InfoTest.php
+++ b/plugins/CustomVariables/tests/Commands/InfoTest.php
@@ -25,7 +25,7 @@ class InfoTest extends IntegrationTestCase
{
public function testExecute_ShouldOutputInfoSuccess_IfEverythingIsOk()
{
- $this->assertContains('Your Piwik is configured for 5 custom variables.', $this->executeCommand());
+ self::assertStringContainsString('Your Piwik is configured for 5 custom variables.', $this->executeCommand());
}
public function testExecute_ShouldOutputErrorMessage_IfColumnsDoNotMatch()
@@ -33,7 +33,7 @@ class InfoTest extends IntegrationTestCase
$model = new Model(Model::SCOPE_PAGE);
$model->removeCustomVariable();
- $this->assertContains('There is a problem with your custom variables configuration', $this->executeCommand());
+ self::assertStringContainsString('There is a problem with your custom variables configuration', $this->executeCommand());
}
private function executeCommand()
diff --git a/plugins/CustomVariables/tests/Commands/SetNumberOfCustomVariablesTest.php b/plugins/CustomVariables/tests/Commands/SetNumberOfCustomVariablesTest.php
index 10f2f3f5d9..f4d6f49548 100644
--- a/plugins/CustomVariables/tests/Commands/SetNumberOfCustomVariablesTest.php
+++ b/plugins/CustomVariables/tests/Commands/SetNumberOfCustomVariablesTest.php
@@ -23,30 +23,27 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class SetNumberOfCustomVariablesTest extends IntegrationTestCase
{
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage Not enough arguments
- */
public function testExecute_ShouldThrowException_IfArgumentIsMissing()
{
+ $this->expectException(\RuntimeException::class);
+ $this->expectExceptionMessage('Not enough arguments');
+
$this->executeCommand(null);
}
- /**
- * @expectedException \InvalidArgumentException
- * @expectedExceptionMessage The number of available custom variables has to be a number
- */
public function testExecute_ShouldThrowException_HasToBeANumber()
{
+ $this->expectException(\InvalidArgumentException::class);
+ $this->expectExceptionMessage('The number of available custom variables has to be a number');
+
$this->executeCommand('a');
}
- /**
- * @expectedException \InvalidArgumentException
- * @expectedExceptionMessage There has to be at least five custom variables
- */
public function testExecute_ShouldThrowException_Minimum2CustomVarsRequired()
{
+ $this->expectException(\InvalidArgumentException::class);
+ $this->expectExceptionMessage('There has to be at least five custom variables');
+
$this->executeCommand(4);
}
@@ -60,7 +57,7 @@ class SetNumberOfCustomVariablesTest extends IntegrationTestCase
{
$result = $this->executeCommand(5);
- $this->assertContains('Your Piwik is already configured for 5 custom variables', $result);
+ self::assertStringContainsString('Your Piwik is already configured for 5 custom variables', $result);
}
public function testExecute_ShouldAddMaxCustomVars_IfNumberIsHigherThanActual()
@@ -69,13 +66,13 @@ class SetNumberOfCustomVariablesTest extends IntegrationTestCase
$result = $this->executeCommand(6);
- $this->assertContains('Configuring Piwik for 6 custom variables', $result);
- $this->assertContains('1 new custom variables having the index(es) 6 will be ADDED', $result);
- $this->assertContains('Starting to apply changes', $result);
- $this->assertContains('Added a variable in scope "Page" having the index 6', $result);
- $this->assertContains('Added a variable in scope "Visit" having the index 6', $result);
- $this->assertContains('Added a variable in scope "Conversion" having the index 6', $result);
- $this->assertContains('Your Piwik is now configured for 6 custom variables.', $result);
+ self::assertStringContainsString('Configuring Piwik for 6 custom variables', $result);
+ self::assertStringContainsString('1 new custom variables having the index(es) 6 will be ADDED', $result);
+ self::assertStringContainsString('Starting to apply changes', $result);
+ self::assertStringContainsString('Added a variable in scope "Page" having the index 6', $result);
+ self::assertStringContainsString('Added a variable in scope "Visit" having the index 6', $result);
+ self::assertStringContainsString('Added a variable in scope "Conversion" having the index 6', $result);
+ self::assertStringContainsString('Your Piwik is now configured for 6 custom variables.', $result);
$this->assertEquals(6, CustomVariables::getNumUsableCustomVariables());
}
@@ -87,13 +84,13 @@ class SetNumberOfCustomVariablesTest extends IntegrationTestCase
$result = $this->executeCommand(5);
- $this->assertContains('Configuring Piwik for 5 custom variables', $result);
- $this->assertContains('1 existing custom variables having the index(es) 6 will be REMOVED.', $result);
- $this->assertContains('Starting to apply changes', $result);
- $this->assertContains('Removed a variable in scope "Page" having the index 6', $result);
- $this->assertContains('Removed a variable in scope "Visit" having the index 6', $result);
- $this->assertContains('Removed a variable in scope "Conversion" having the index 6', $result);
- $this->assertContains('Your Piwik is now configured for 5 custom variables.', $result);
+ self::assertStringContainsString('Configuring Piwik for 5 custom variables', $result);
+ self::assertStringContainsString('1 existing custom variables having the index(es) 6 will be REMOVED.', $result);
+ self::assertStringContainsString('Starting to apply changes', $result);
+ self::assertStringContainsString('Removed a variable in scope "Page" having the index 6', $result);
+ self::assertStringContainsString('Removed a variable in scope "Visit" having the index 6', $result);
+ self::assertStringContainsString('Removed a variable in scope "Conversion" having the index 6', $result);
+ self::assertStringContainsString('Your Piwik is now configured for 5 custom variables.', $result);
$this->assertEquals(5, CustomVariables::getNumUsableCustomVariables());
}
diff --git a/plugins/CustomVariables/tests/Fixtures/VisitWithManyCustomVariables.php b/plugins/CustomVariables/tests/Fixtures/VisitWithManyCustomVariables.php
index 5cf92e75c8..594fa45b78 100644
--- a/plugins/CustomVariables/tests/Fixtures/VisitWithManyCustomVariables.php
+++ b/plugins/CustomVariables/tests/Fixtures/VisitWithManyCustomVariables.php
@@ -22,14 +22,14 @@ class VisitWithManyCustomVariables extends Fixture
public $visitorId = '61e8cc2d51fea26d';
private $numCustomVars = 8;
- public function setUp()
+ public function setUp(): void
{
$this->setUpCustomVars();
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/CustomVariables/tests/Integration/ModelTest.php b/plugins/CustomVariables/tests/Integration/ModelTest.php
index 5324cfdf22..5e8bff8deb 100644
--- a/plugins/CustomVariables/tests/Integration/ModelTest.php
+++ b/plugins/CustomVariables/tests/Integration/ModelTest.php
@@ -21,7 +21,7 @@ class ModelTest extends IntegrationTestCase
{
private static $cvarScopes = array('page', 'visit', 'conversion');
- public function setUp()
+ public function setUp(): void
{
// do not call parent::setUp() since it expects database to be created,
// but DB for this test is removed in tearDown
@@ -29,26 +29,24 @@ class ModelTest extends IntegrationTestCase
self::$fixture->performSetUp();
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
self::$fixture->performTearDown();
}
- /**
- * @expectedException \Exception
- */
public function test_construct_shouldFailInCaseOfEmptyScope()
{
+ $this->expectException(\Exception::class);
+
new Model(null);
}
- /**
- * @expectedException \Exception
- */
public function test_construct_shouldFailInCaseOfInvalidScope()
{
+ $this->expectException(\Exception::class);
+
new Model('inValId');
}
diff --git a/plugins/DBStats/DBStats.php b/plugins/DBStats/DBStats.php
index 47f83c0442..fab4ffab8d 100644
--- a/plugins/DBStats/DBStats.php
+++ b/plugins/DBStats/DBStats.php
@@ -18,7 +18,7 @@ class DBStats extends \Piwik\Plugin
const TIME_OF_LAST_TASK_RUN_OPTION = 'dbstats_time_of_last_cache_task_run';
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/Dashboard/Dashboard.php b/plugins/Dashboard/Dashboard.php
index f60aeb9125..9a5e381513 100644
--- a/plugins/Dashboard/Dashboard.php
+++ b/plugins/Dashboard/Dashboard.php
@@ -150,12 +150,18 @@ class Dashboard extends \Piwik\Plugin
$defaultLayout = $this->getLayoutForUser('', 1);
if (empty($defaultLayout)) {
+ $pluginManager = Plugin\Manager::getInstance();
+
$advertisingWidget = '';
$advertising = StaticContainer::get('Piwik\ProfessionalServices\Advertising');
- if ($advertising->areAdsForProfessionalServicesEnabled() && Plugin\Manager::getInstance()->isPluginActivated('ProfessionalServices')) {
+ if ($advertising->areAdsForProfessionalServicesEnabled() && $pluginManager->isPluginActivated('ProfessionalServices')) {
$advertisingWidget = '{"uniqueId":"widgetProfessionalServicespromoServices","parameters":{"module":"ProfessionalServices","action":"promoServices"}},';
}
$piwikPromoWidget = '{"uniqueId":"widgetCoreHomegetPromoVideo","parameters":{"module":"CoreHome","action":"getPromoVideo"}}';
+ $insightsWidget = '';
+ if ($pluginManager->isPluginActivated('Insights')) {
+ $insightsWidget = '{"uniqueId":"widgetInsightsgetOverallMoversAndShakers","parameters":{"module":"Insights","action":"getOverallMoversAndShakers"}},';
+ }
$defaultLayout = '[
[
{"uniqueId":"widgetLivewidget","parameters":{"module":"Live","action":"widget"}},
@@ -164,6 +170,7 @@ class Dashboard extends \Piwik\Plugin
[
{"uniqueId":"widgetVisitsSummarygetEvolutionGraphforceView1viewDataTablegraphEvolution","parameters":{"forceView":"1","viewDataTable":"graphEvolution","module":"VisitsSummary","action":"getEvolutionGraph"}},
' . $advertisingWidget . '
+ ' . $insightsWidget . '
{"uniqueId":"widgetVisitsSummarygetforceView1viewDataTablesparklines","parameters":{"forceView":"1","viewDataTable":"sparklines","module":"VisitsSummary","action":"get"}}
],
[
diff --git a/plugins/Dashboard/tests/Integration/APITest.php b/plugins/Dashboard/tests/Integration/APITest.php
index 42e6a4b0db..ece366f224 100644
--- a/plugins/Dashboard/tests/Integration/APITest.php
+++ b/plugins/Dashboard/tests/Integration/APITest.php
@@ -33,7 +33,7 @@ class APITest extends IntegrationTestCase
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -103,24 +103,22 @@ class APITest extends IntegrationTestCase
$this->assertCount(1, $result);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ExceptionCheckUserHasSuperUserAccessOrIsTheUser
- */
public function testGetDashboardsShouldNotReturnForeignDashboardsForNonSuperUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ExceptionCheckUserHasSuperUserAccessOrIsTheUser');
+
FakeAccess::$superUser = false;
FakeAccess::$identity = 'eva';
$this->api->getDashboards('peter', false);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ExceptionCheckUserHasSuperUserAccessOrIsTheUser
- */
public function testCreateNewDashboardForOtherUserDoesNotWorkForNonSuperUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ExceptionCheckUserHasSuperUserAccessOrIsTheUser');
+
FakeAccess::$superUser = false;
$layout ='[[{"uniqueId":"widgetLivewidget","parameters":{"module":"Live","action":"widget"}}]]';
@@ -168,12 +166,11 @@ class APITest extends IntegrationTestCase
$this->assertEquals($dashboard['layout'], $layout);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Dashboard not found
- */
public function testCopyDashboardToUserFails()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Dashboard not found');
+
$this->api->copyDashboardToUser(5, 'eva', 'new name');
}
diff --git a/plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_create_new.png b/plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_create_new.png
index ede6b1c22a..e7e03cfe7b 100644
--- a/plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_create_new.png
+++ b/plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_create_new.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f780b9205bc7687d0f0a66aabe57462200bdb1eef9c2b39a2b39e68f99749ad0
-size 299642
+oid sha256:ceba2add6b8d6537ed128ad8930a48e10fdf701551bf6d51f98aaa60d91fd705
+size 317218
diff --git a/plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_removed.png b/plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_removed.png
index 36250a8d93..495f3364a1 100644
--- a/plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_removed.png
+++ b/plugins/Dashboard/tests/UI/expected-screenshots/DashboardManager_removed.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e5f6d25962b75a03fe35d7e5c0e9cc840ce93ba2b46de51d7dd001e0418d2383
-size 470775
+oid sha256:6e7d11d9f51bac358db2dfeac828152783669794626099bd8ef15012e6a104e8
+size 471855
diff --git a/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_loaded_token_auth.png b/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_loaded_token_auth.png
index 055759ea40..6fe4e3d7f2 100644
--- a/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_loaded_token_auth.png
+++ b/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_loaded_token_auth.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:31a23459a9221a91239db4447642cd67e15ea5a9c0fda060df976b1070e48a48
-size 715122
+oid sha256:6efe14c359d8f3d1b4329fdb2e9538d7cc4d0c95cd4dc2fb90ab212e34440594
+size 715000
diff --git a/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_removed.png b/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_removed.png
index 055759ea40..6fe4e3d7f2 100644
--- a/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_removed.png
+++ b/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_removed.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:31a23459a9221a91239db4447642cd67e15ea5a9c0fda060df976b1070e48a48
-size 715122
+oid sha256:6efe14c359d8f3d1b4329fdb2e9538d7cc4d0c95cd4dc2fb90ab212e34440594
+size 715000
diff --git a/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_reset.png b/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_reset.png
index 3bb46bfe79..5e1d8961c9 100644
--- a/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_reset.png
+++ b/plugins/Dashboard/tests/UI/expected-screenshots/Dashboard_reset.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:32c1b69c45423575c081bb49ae123f5458024d833d7b64b55c6240ab0e0f207b
-size 309668
+oid sha256:c826017ba202846f96d3b6c995d8d3c525d635975afec436baff38da7a8488e3
+size 378817
diff --git a/plugins/DeviceDetectorCache b/plugins/DeviceDetectorCache
-Subproject 50d8c2cab56dd196855521ba63f833a5dd41504
+Subproject a34a70f5d7db59745c5f64e07957846148b7a2f
diff --git a/plugins/DevicePlugins/Archiver.php b/plugins/DevicePlugins/Archiver.php
index e5dc87e4fc..c3d1833f33 100644
--- a/plugins/DevicePlugins/Archiver.php
+++ b/plugins/DevicePlugins/Archiver.php
@@ -80,7 +80,7 @@ class Archiver extends \Piwik\Plugin\Archiver
protected function insertTable($recordName, DataTable $table)
{
$report = $table->getSerialized($this->maximumRows, null, Metrics::INDEX_NB_VISITS);
- return $this->getProcessor()->insertBlobRecord($recordName, $report);
+ $this->getProcessor()->insertBlobRecord($recordName, $report);
}
}
diff --git a/plugins/DevicePlugins/lang/pt-br.json b/plugins/DevicePlugins/lang/pt-br.json
index 7268b700a5..bb0ee59adb 100644
--- a/plugins/DevicePlugins/lang/pt-br.json
+++ b/plugins/DevicePlugins/lang/pt-br.json
@@ -1,10 +1,10 @@
{
"DevicePlugins": {
- "BrowserWithNoPluginsEnabled": "%1$s sem plugins ativados",
- "BrowserWithPluginsEnabled": "%1$s com os plugins %2$s ativados",
- "PluginDescription": "Informa a lista de plugins que são suportados nos navegadores dos Visitantes.",
- "PluginDetectionDoesNotWorkInIE": "Nota: A detecção de plugins não funciona no Internet Explorer anterior ao 11. Este relatório se baseia apenas em navegadores não-IE e versões mais recentes do IE.",
- "WidgetPlugins": "Lista de Plugins",
- "WidgetPluginsDocumentation": "Este relatório mostra quais plugins de navegador seus visitantes tinham ativado. Esta informação pode ser importante para escolher o caminho certo para levar o seu conteúdo."
+ "BrowserWithNoPluginsEnabled": "%1$s sem plugins habilitados",
+ "BrowserWithPluginsEnabled": "%1$s com os plugins %2$s habilitados",
+ "PluginDescription": "Informa a lista de plugins que são suportados nos navegadores dos visitantes.",
+ "PluginDetectionDoesNotWorkInIE": "Obs: A detecção de plugins não funciona no Internet Explorer anterior ao 11. Este relatório se baseia apenas em navegadores não-IE e versões mais recentes do IE.",
+ "WidgetPlugins": "Plugins do navegador",
+ "WidgetPluginsDocumentation": "Este relatório mostra quais plugins de navegador seus visitantes tinham habilitados. Esta informação pode ser importante para escolher a maneira correta para entregar o seu conteúdo."
}
} \ No newline at end of file
diff --git a/plugins/DevicePlugins/lang/tr.json b/plugins/DevicePlugins/lang/tr.json
index 9863f35f85..be0c2cd48f 100644
--- a/plugins/DevicePlugins/lang/tr.json
+++ b/plugins/DevicePlugins/lang/tr.json
@@ -1,10 +1,10 @@
{
"DevicePlugins": {
- "BrowserWithNoPluginsEnabled": "%1$s için bir eklenti yüklenmemiş",
- "BrowserWithPluginsEnabled": "%1$s için %2$s eklenti yüklenmiş",
- "PluginDescription": "Ziyaretçilerin web tarayıcıları tarafından desteklenen eklentilerin listesini görüntüler.",
- "PluginDetectionDoesNotWorkInIE": "Not: Eklenti algılaması Internet Explorer 11 öncesindeki sürümleri desteklemez. Bu raporda yalnız IE dışındaki tarayıcılar ve yeni IE tarayıcıları için veriler bulunur.",
- "WidgetPlugins": "Tarayıcı Eklentileri",
- "WidgetPluginsDocumentation": "Bu raporda ziyaretçilerinizin web tarayıcılarında hangi eklentilerin etkin olduğu görüntülenir. Bu bilgiler içeriğinizi doğru şekilde sunmanız için önemli olabilir."
+ "BrowserWithNoPluginsEnabled": "%1$s uygulama ekleri etkinleştirilmemiş olarak",
+ "BrowserWithPluginsEnabled": "%1$s, %2$s uygulama ekleri etkinleştirilmiş olarak",
+ "PluginDescription": "Ziyaretçilerin web tarayıcıları tarafından desteklenen uygulama eklerinin listesini görüntüler.",
+ "PluginDetectionDoesNotWorkInIE": "Not: Uygulama eki algılaması Internet Explorer 11 öncesindeki sürümleri desteklemez. Bu raporda yalnız IE dışındaki tarayıcılar ve yeni IE tarayıcıları için veriler bulunur.",
+ "WidgetPlugins": "Tarayıcı Uygulama Ekleri",
+ "WidgetPluginsDocumentation": "Bu raporda ziyaretçilerinizin web tarayıcılarında hangi uygulama eklerinin etkin olduğu görüntülenir. Bu bilgiler içeriğinizi doğru şekilde sunmanız için önemli olabilir."
}
} \ No newline at end of file
diff --git a/plugins/DevicesDetection/Archiver.php b/plugins/DevicesDetection/Archiver.php
index f03c4e8403..782386cf4a 100644
--- a/plugins/DevicesDetection/Archiver.php
+++ b/plugins/DevicesDetection/Archiver.php
@@ -76,7 +76,7 @@ class Archiver extends \Piwik\Plugin\Archiver
{
$metrics = $this->getLogAggregator()->getMetricsFromVisitByDimension($labelSQL);
- if (in_array($recordName, array(self::DEVICE_TYPE_RECORD_NAME, self::DEVICE_BRAND_RECORD_NAME, self::DEVICE_MODEL_RECORD_NAME))) {
+ if (in_array($recordName, array(self::DEVICE_TYPE_RECORD_NAME, self::DEVICE_BRAND_RECORD_NAME, self::DEVICE_MODEL_RECORD_NAME, self::BROWSER_RECORD_NAME))) {
$labelSQL = str_replace('log_visit.', 'log_conversion.', $labelSQL);
diff --git a/plugins/DevicesDetection/Columns/BrowserName.php b/plugins/DevicesDetection/Columns/BrowserName.php
index 2283db01e8..9a1e59ee23 100644
--- a/plugins/DevicesDetection/Columns/BrowserName.php
+++ b/plugins/DevicesDetection/Columns/BrowserName.php
@@ -60,6 +60,11 @@ class BrowserName extends Base
return \Piwik\Plugins\DevicesDetection\getBrowserName($value);
}
+ public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
+ {
+ return $visitor->getVisitorColumn($this->columnName);
+ }
+
/**
* @param Request $request
* @param Visitor $visitor
diff --git a/plugins/DevicesDetection/Reports/GetBrowsers.php b/plugins/DevicesDetection/Reports/GetBrowsers.php
index 01045df62e..881f4bfec7 100644
--- a/plugins/DevicesDetection/Reports/GetBrowsers.php
+++ b/plugins/DevicesDetection/Reports/GetBrowsers.php
@@ -23,6 +23,7 @@ class GetBrowsers extends Base
$this->documentation = Piwik::translate('DevicesDetection_WidgetBrowsersDocumentation', '<br />');
$this->order = 5;
$this->subcategoryId = 'DevicesDetection_Software';
+ $this->hasGoalMetrics = true;
}
public function configureView(ViewDataTable $view)
diff --git a/plugins/DevicesDetection/lang/zh-cn.json b/plugins/DevicesDetection/lang/zh-cn.json
index 68ff89b15d..e898843027 100644
--- a/plugins/DevicesDetection/lang/zh-cn.json
+++ b/plugins/DevicesDetection/lang/zh-cn.json
@@ -38,6 +38,7 @@
"PluginDescription": "提供使用者设备的品牌(制造商)、型号(版本)、类型(电视、手机或电脑等)以及更多扩展信息。",
"SmartDisplay": "智能显示器",
"Smartphone": "智能手机",
+ "SmartSpeaker": "智能音箱",
"PortableMediaPlayer": "便携媒体播放器",
"Devices": "设备",
"GenericDevice": "通用%s",
diff --git a/plugins/DevicesDetection/tests/Fixtures/MultiDeviceGoalConversions.php b/plugins/DevicesDetection/tests/Fixtures/MultiDeviceGoalConversions.php
index a1de38c6d4..681476b565 100644
--- a/plugins/DevicesDetection/tests/Fixtures/MultiDeviceGoalConversions.php
+++ b/plugins/DevicesDetection/tests/Fixtures/MultiDeviceGoalConversions.php
@@ -20,7 +20,7 @@ class MultiDeviceGoalConversions extends Fixture
public $idSite = 1;
public $idGoal = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackSmartphoneVisits();
@@ -28,7 +28,7 @@ class MultiDeviceGoalConversions extends Fixture
$this->trackOtherVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/Diagnostics/ConfigReader.php b/plugins/Diagnostics/ConfigReader.php
index 9f98ab94cb..824dc4f362 100644
--- a/plugins/Diagnostics/ConfigReader.php
+++ b/plugins/Diagnostics/ConfigReader.php
@@ -8,7 +8,7 @@
namespace Piwik\Plugins\Diagnostics;
use Piwik\Development;
-use Piwik\Ini\IniReader;
+use Matomo\Ini\IniReader;
use Piwik\Application\Kernel\GlobalSettingsProvider;
use Piwik\Settings as PiwikSettings;
use Piwik\Plugin\Settings as PluginSettings;
diff --git a/plugins/Diagnostics/Diagnostic/CronArchivingLastRunCheck.php b/plugins/Diagnostics/Diagnostic/CronArchivingLastRunCheck.php
index 7ce15e6350..e226644985 100644
--- a/plugins/Diagnostics/Diagnostic/CronArchivingLastRunCheck.php
+++ b/plugins/Diagnostics/Diagnostic/CronArchivingLastRunCheck.php
@@ -59,7 +59,7 @@ class CronArchivingLastRunCheck implements Diagnostic
if (empty($lastRunTime)) {
$comment = $this->translator->translate('Diagnostics_CronArchivingHasNotRun')
. '<br/><br/>' . $this->translator->translate('Diagnostics_CronArchivingRunDetails',
- [$coreArchiveShort, $mailto, $commandToRerun, '<a href="https://matomo.org/docs/setup-auto-archiving/" target="_blank" rel="noreferrer noopener">', '</a>']);;
+ [$coreArchiveShort, $mailto, $commandToRerun, '<a href="https://matomo.org/docs/setup-auto-archiving/" target="_blank" rel="noreferrer noopener">', '</a>']);
return [DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_ERROR, $comment)];
}
diff --git a/plugins/Diagnostics/Diagnostic/DatabaseAbilitiesCheck.php b/plugins/Diagnostics/Diagnostic/DatabaseAbilitiesCheck.php
new file mode 100644
index 0000000000..2efa9ff494
--- /dev/null
+++ b/plugins/Diagnostics/Diagnostic/DatabaseAbilitiesCheck.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Plugins\Diagnostics\Diagnostic;
+
+use Piwik\Common;
+use Piwik\Config;
+use Piwik\Db;
+use Piwik\Translation\Translator;
+
+/**
+ * Check if Piwik can use LOAD DATA INFILE.
+ */
+class DatabaseAbilitiesCheck implements Diagnostic
+{
+ /**
+ * @var Translator
+ */
+ private $translator;
+
+ public function __construct(Translator $translator)
+ {
+ $this->translator = $translator;
+ }
+
+ public function execute()
+ {
+ $isPiwikInstalling = !Config::getInstance()->existsLocalConfig();
+ if ($isPiwikInstalling) {
+ // Skip the diagnostic if Piwik is being installed
+ return array();
+ }
+
+ $result = new DiagnosticResult($this->translator->translate('Installation_DatabaseAbilities'));
+
+ if (Config::getInstance()->General['enable_load_data_infile']) {
+ $result->addItem($this->checkLoadDataInfile());
+ }
+
+ $result->addItem($this->checkTemporaryTables());
+ $result->addItem($this->checkTransactionLevel());
+
+ return [$result];
+ }
+
+ protected function checkLoadDataInfile()
+ {
+ $optionTable = Common::prefixTable('option');
+ $testOptionNames = array('test_system_check1', 'test_system_check2');
+
+ $loadDataInfile = false;
+ $errorMessage = null;
+ try {
+ $loadDataInfile = Db\BatchInsert::tableInsertBatch(
+ $optionTable,
+ array('option_name', 'option_value'),
+ array(
+ array($testOptionNames[0], '1'),
+ array($testOptionNames[1], '2'),
+ ),
+ $throwException = true,
+ $charset = 'latin1'
+ );
+ } catch (\Exception $ex) {
+ $errorMessage = str_replace("\n", "<br/>", $ex->getMessage());
+ }
+
+ // delete the temporary rows that were created
+ Db::exec("DELETE FROM `$optionTable` WHERE option_name IN ('" . implode("','", $testOptionNames) . "')");
+
+ if ($loadDataInfile) {
+ return new DiagnosticResultItem(DiagnosticResult::STATUS_OK, 'LOAD DATA INFILE');
+ }
+
+ $comment = sprintf(
+ 'LOAD DATA INFILE<br/>%s<br/>%s',
+ $this->translator->translate('Installation_LoadDataInfileUnavailableHelp', array(
+ 'LOAD DATA INFILE',
+ 'FILE',
+ )),
+ $this->translator->translate('Installation_LoadDataInfileRecommended')
+ );
+
+ if ($errorMessage) {
+ $comment .= sprintf(
+ '<br/><strong>%s:</strong> %s<br/>%s',
+ $this->translator->translate('General_Error'),
+ $errorMessage,
+ 'Troubleshooting: <a target="_blank" rel="noreferrer noopener" href="https://matomo.org/faq/troubleshooting/#faq_194">FAQ on matomo.org</a>'
+ );
+ }
+
+ return new DiagnosticResultItem(DiagnosticResult::STATUS_WARNING, $comment);
+ }
+
+ protected function checkTemporaryTables()
+ {
+ $status = DiagnosticResult::STATUS_OK;
+ $comment = 'CREATE TEMPORARY TABLES';
+
+ try {
+ // create a temporary table
+ Db::exec("CREATE TEMPORARY TABLE `piwik_test_table_temp` (
+ id INT,
+ val VARCHAR(5) NULL,
+ PRIMARY KEY (id)
+ )");
+
+ // insert an entry into the new temporary table
+ Db::exec('INSERT INTO `piwik_test_table_temp` (`id`, `val`) VALUES ("1", "val1");');
+
+ for ($i=0; $i < 5; $i++) {
+ // try reading the entry a few times to ensure it doesn't fail, which might be possible when using load balanced databases
+ $result = Db::fetchRow('SELECT * FROM `piwik_test_table_temp` WHERE `id` = 1');
+
+ if (empty($result)) {
+ throw new \Exception('read failed');
+ }
+ }
+ } catch (\Exception $e) {
+ $status = DiagnosticResult::STATUS_ERROR;
+ $comment .= '<br/>' . $this->translator->translate('Diagnostics_MysqlTemporaryTablesWarning');
+ $comment .= '<br/>Troubleshooting: <a target="_blank" rel="noreferrer noopener" href="https://matomo.org/faq/how-to-install/faq_23484/">FAQ on matomo.org</a>';
+ }
+
+ return new DiagnosticResultItem($status, $comment);
+
+ }
+
+ protected function checkTransactionLevel()
+ {
+ $status = DiagnosticResult::STATUS_OK;
+ $comment = 'Changing transaction isolation level';
+
+ $level = new Db\TransactionLevel(Db::getReader());
+ if (!$level->setUncommitted()) {
+ $status = DiagnosticResult::STATUS_WARNING;
+ $comment .= '<br/>' . $this->translator->translate('Diagnostics_MysqlTransactionLevel');
+ } else {
+ $level->restorePreviousStatus();
+ }
+
+ return new DiagnosticResultItem($status, $comment);
+
+ }
+}
diff --git a/plugins/Diagnostics/Diagnostic/DbMaxPacket.php b/plugins/Diagnostics/Diagnostic/DbMaxPacket.php
index 91745db88d..a771ba564d 100644
--- a/plugins/Diagnostics/Diagnostic/DbMaxPacket.php
+++ b/plugins/Diagnostics/Diagnostic/DbMaxPacket.php
@@ -27,7 +27,7 @@ class DbMaxPacket implements Diagnostic
public function execute()
{
- if (!SettingsPiwik::isPiwikInstalled()) {
+ if (!SettingsPiwik::isMatomoInstalled()) {
return array(); // only possible to perform check once we have DB connection
}
diff --git a/plugins/Diagnostics/Diagnostic/LoadDataInfileCheck.php b/plugins/Diagnostics/Diagnostic/LoadDataInfileCheck.php
deleted file mode 100644
index 50a8674f8c..0000000000
--- a/plugins/Diagnostics/Diagnostic/LoadDataInfileCheck.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-namespace Piwik\Plugins\Diagnostics\Diagnostic;
-
-use Piwik\Common;
-use Piwik\Config;
-use Piwik\Db;
-use Piwik\Translation\Translator;
-
-/**
- * Check if Piwik can use LOAD DATA INFILE.
- */
-class LoadDataInfileCheck implements Diagnostic
-{
- /**
- * @var Translator
- */
- private $translator;
-
- public function __construct(Translator $translator)
- {
- $this->translator = $translator;
- }
-
- public function execute()
- {
- $isPiwikInstalling = !Config::getInstance()->existsLocalConfig();
- if ($isPiwikInstalling) {
- // Skip the diagnostic if Piwik is being installed
- return array();
- }
-
- $label = $this->translator->translate('Installation_DatabaseAbilities');
-
- $optionTable = Common::prefixTable('option');
- $testOptionNames = array('test_system_check1', 'test_system_check2');
-
- $loadDataInfile = false;
- $errorMessage = null;
- try {
- $loadDataInfile = Db\BatchInsert::tableInsertBatch(
- $optionTable,
- array('option_name', 'option_value'),
- array(
- array($testOptionNames[0], '1'),
- array($testOptionNames[1], '2'),
- ),
- $throwException = true,
- $charset = 'latin1'
- );
- } catch (\Exception $ex) {
- $errorMessage = str_replace("\n", "<br/>", $ex->getMessage());
- }
-
- // delete the temporary rows that were created
- Db::exec("DELETE FROM `$optionTable` WHERE option_name IN ('" . implode("','", $testOptionNames) . "')");
-
- if ($loadDataInfile) {
- return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_OK, 'LOAD DATA INFILE'));
- }
-
- $comment = sprintf(
- 'LOAD DATA INFILE<br/>%s<br/>%s',
- $this->translator->translate('Installation_LoadDataInfileUnavailableHelp', array(
- 'LOAD DATA INFILE',
- 'FILE',
- )),
- $this->translator->translate('Installation_LoadDataInfileRecommended')
- );
-
- if ($errorMessage) {
- $comment .= sprintf(
- '<br/><strong>%s:</strong> %s<br/>%s',
- $this->translator->translate('General_Error'),
- $errorMessage,
- 'Troubleshooting: <a target="_blank" rel="noreferrer noopener" href="https://matomo.org/faq/troubleshooting/#faq_194">FAQ on matomo.org</a>'
- );
- }
-
- return array(DiagnosticResult::singleResult($label, DiagnosticResult::STATUS_WARNING, $comment));
- }
-}
diff --git a/plugins/Diagnostics/Diagnostic/PhpSettingsCheck.php b/plugins/Diagnostics/Diagnostic/PhpSettingsCheck.php
index 679167576e..da353a8256 100644
--- a/plugins/Diagnostics/Diagnostic/PhpSettingsCheck.php
+++ b/plugins/Diagnostics/Diagnostic/PhpSettingsCheck.php
@@ -62,23 +62,6 @@ class PhpSettingsCheck implements Diagnostic
$maxExecutionTime->setErrorResult(DiagnosticResult::STATUS_WARNING);
$requiredSettings[] = $maxExecutionTime;
- if ($this->isPhpVersionAtLeast56() && ! defined("HHVM_VERSION") && !$this->isPhpVersionAtLeast70()) {
- // always_populate_raw_post_data must be -1
- // removed in PHP 7
- $requiredSettings[] = new RequiredPhpSetting('always_populate_raw_post_data', -1);
- }
-
return $requiredSettings;
}
-
- private function isPhpVersionAtLeast56()
- {
- return version_compare(PHP_VERSION, '5.6', '>=');
- }
-
- private function isPhpVersionAtLeast70()
- {
- return version_compare(PHP_VERSION, '7.0.0-dev', '>=');
- }
-
}
diff --git a/plugins/Diagnostics/Diagnostics.php b/plugins/Diagnostics/Diagnostics.php
index cdef33bb27..a4e366866c 100644
--- a/plugins/Diagnostics/Diagnostics.php
+++ b/plugins/Diagnostics/Diagnostics.php
@@ -20,7 +20,7 @@ class Diagnostics extends Plugin
const NO_DATA_ARCHIVING_NOT_RUN_NOTIFICATION_ID = 'DiagnosticsNoDataArchivingNotRun';
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/Diagnostics/config/config.php b/plugins/Diagnostics/config/config.php
index 3bf076e014..3861c5c5a1 100644
--- a/plugins/Diagnostics/config/config.php
+++ b/plugins/Diagnostics/config/config.php
@@ -27,7 +27,7 @@ return array(
DI\get('Piwik\Plugins\Diagnostics\Diagnostic\NfsDiskCheck'),
DI\get('Piwik\Plugins\Diagnostics\Diagnostic\CronArchivingCheck'),
DI\get(CronArchivingLastRunCheck::class),
- DI\get('Piwik\Plugins\Diagnostics\Diagnostic\LoadDataInfileCheck'),
+ DI\get('Piwik\Plugins\Diagnostics\Diagnostic\DatabaseAbilitiesCheck'),
Di\get('Piwik\Plugins\Diagnostics\Diagnostic\DbOverSSLCheck'),
Di\get('Piwik\Plugins\Diagnostics\Diagnostic\DbMaxPacket'),
Di\get('Piwik\Plugins\Diagnostics\Diagnostic\ForceSSLCheck'),
diff --git a/plugins/Diagnostics/lang/el.json b/plugins/Diagnostics/lang/el.json
index a549c337ba..2285f14b78 100644
--- a/plugins/Diagnostics/lang/el.json
+++ b/plugins/Diagnostics/lang/el.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "Αρχείο ρυθμίσεων",
+ "MysqlTemporaryTablesWarning": "Η άδεια CREATE TEMPORARY TABLES της MySQL απαιτείται για τη σωστή λειτουργία του Matomo.",
+ "MysqlTransactionLevel": "Η αλλαγή του επιπέδου απομόνωσης συναλλαγής δεν υποστηρίζεται. Η αρχειοθέτηση θα συνεχίσει να λειτουργεί αλλά ενδέχεται να είναι πιο αργή και προτείνεται για παράδειγμα η αλλαγή του `binlog_format` σε `row` αν αυτό είναι δυνατόν.",
"MysqlMaxPacketSize": "Μέγιστο Μέγεθος Πακέτου",
"MysqlMaxPacketSizeWarning": "Προτείνεται να ρυθμίσετε το μέγεθος του 'max_allowed_packet' στη βάση MySQL τουλάχιστον σε %1$s. Αυτή τη στιγμή είναι ρυθμισμένο σε %2$s.",
"ConfigFileIntroduction": "Εδώ μπορείτε να δείτε την παραμετροποίηση του Matomo. Αν εκτελείτε το Matomo σε περιβάλλον μοιραζόμενου φόρτου, η σελίδα ενδέχεται να είναι διαφορετικά ανάλογα με τον διακομιστή από τον οποίο φορτώνεται. Οι γραμμές με διαφορετικό χρώμα υποβάθρου αποτελούν τροποποιημένες τιμές παραμετροποίησης που έχουν οριστεί για παράδειγμα στο αρχείο %1$s.",
diff --git a/plugins/Diagnostics/lang/en.json b/plugins/Diagnostics/lang/en.json
index c3638dfcb7..741126d70b 100644
--- a/plugins/Diagnostics/lang/en.json
+++ b/plugins/Diagnostics/lang/en.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "Config file",
+ "MysqlTemporaryTablesWarning": "MySQL Permission CREATE TEMPORARY TABLES is required for Matomo to work properly.",
+ "MysqlTransactionLevel": "Changing transaction isolation level not supported. Archiving will still work but it may be slower and it is recommended to change for example the `binlog_format` to `row` if possible.",
"MysqlMaxPacketSize": "Max Packet Size",
"MysqlMaxPacketSizeWarning": "It is recommended to configure a 'max_allowed_packet' size in your MySQL database of at least %1$s. Configured is currently %2$s.",
"ConfigFileIntroduction": "Here you can view the Matomo configuration. If you are running Matomo in a load balanced environment, the page might be different depending on from which server this page is loaded. Rows with a different background color are changed config values that are specified for example in the %1$s file.",
diff --git a/plugins/Diagnostics/lang/es-ar.json b/plugins/Diagnostics/lang/es-ar.json
index 03e990f47e..dcd3ff3862 100644
--- a/plugins/Diagnostics/lang/es-ar.json
+++ b/plugins/Diagnostics/lang/es-ar.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "Archivo de configuración",
+ "MysqlTemporaryTablesWarning": "El permiso \"CREATE TEMPORARY TABLES\" de MySQL es requerido para que Matomo funcione correctamente.",
+ "MysqlTransactionLevel": "Cambiar el nivel de transacción de aislamiento no está soportado. El archivado aún funcionará pero podría ser más lento y es recomendado cambiar, por ejemplo, \"binlog_format\" a \"row\", de ser posible.",
"MysqlMaxPacketSize": "Tamaño máximo del paquete",
"MysqlMaxPacketSizeWarning": "Se recomienda configurar el tamaño de \"max_allowed_packet\" en tu base de datos MySQL en al menos %1$s. La configuración actual es de %2$s.",
"ConfigFileIntroduction": "Acá podés ver la configuración de Matomo. Si estás ejecutando Matomo en un entorno de carga balanceada, la página podría ser diferente dependiendo desde qué servidor se página esta página. Las filas con diferente fondo de color son valores de configuración cambiadas que están especificadas, por ejemplo, en el archivo %1$s.",
diff --git a/plugins/Diagnostics/lang/lt.json b/plugins/Diagnostics/lang/lt.json
new file mode 100644
index 0000000000..84bf198c31
--- /dev/null
+++ b/plugins/Diagnostics/lang/lt.json
@@ -0,0 +1,6 @@
+{
+ "Diagnostics": {
+ "ConfigFileTitle": "Konfigūracijos failas",
+ "Sections": "Sekcijos"
+ }
+} \ No newline at end of file
diff --git a/plugins/Diagnostics/lang/pt-br.json b/plugins/Diagnostics/lang/pt-br.json
index 91e19f2d69..c7d9c7d083 100644
--- a/plugins/Diagnostics/lang/pt-br.json
+++ b/plugins/Diagnostics/lang/pt-br.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "Arquivo de configuração",
+ "MysqlTemporaryTablesWarning": "A permissão CREATE TEMPORARY TABLES do MySQL é requerida para que o Matomo funcione corretamente.",
+ "MysqlTransactionLevel": "A alteração do nível de isolamento de transação não é suportada. O arquivamento ainda funcionará mas ele pode ser mais lento e ele é recomendado para alterar, por exemplo, o `binlog_format` para `row` se possível.",
"MysqlMaxPacketSize": "Tamanho máximo de pacote",
"MysqlMaxPacketSizeWarning": "É recomendado configurar um tamanho máximo de pacote (max_allowed_packet) no seu banco de dados MySQL de pelo menos %1$s. Atualmente está configurado %2$s.",
"ConfigFileIntroduction": "Aqui você pode ver a configuração do Matomo. Se você estiver rodando o Matomo em um ambiente com balanceamento de carga, a página pode estar diferente dependendo de qual servidor esta página é carregada. Linhas com diferentes cores de fundo são valores de configuração alterados que estão especificados por exemplo no arquivo %1$s.",
diff --git a/plugins/Diagnostics/lang/pt.json b/plugins/Diagnostics/lang/pt.json
index 4c980dbbd4..5aa081714b 100644
--- a/plugins/Diagnostics/lang/pt.json
+++ b/plugins/Diagnostics/lang/pt.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "Ficheiro de configuração",
+ "MysqlTemporaryTablesWarning": "A permissão MySQL CREATE TEMPORARY TABLES é necessária para que o Matomo funcione corretamente.",
+ "MysqlTransactionLevel": "A alteração do nível de isolamento da transação não é suportado. O arquivamento irá funcionar mas será mais lento e é recomendável que altere, por exemplo, o `binlog_format` para `row`, se for possível.",
"MysqlMaxPacketSize": "Tamanho máximo do pacote",
"MysqlMaxPacketSizeWarning": "É recomendável a configuração de um tamanho de pacote 'max_allowed_packet' na sua base de dados MySQL de, pelo menos, %1$s. Atualmente está configurado como %2$s.",
"ConfigFileIntroduction": "Aqui, pode consultar a configuração do Matomo. Se estiver a executar o Matomo num ambiente distribuído, a página pode ser diferente mediante o servidor a partir do qual foi carregada. As linhas com uma cor de fundo diferente são valores alterados de configuração especificados, por exemplo, no ficheiro %1$s.",
diff --git a/plugins/Diagnostics/lang/tr.json b/plugins/Diagnostics/lang/tr.json
index 5748def81d..8e722cbb20 100644
--- a/plugins/Diagnostics/lang/tr.json
+++ b/plugins/Diagnostics/lang/tr.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "Ayar Dosyası",
+ "MysqlTemporaryTablesWarning": "Matomo uygulamasının düzgün çalışabilmesi için CREATE TEMPORARY TABLES MySQL izninin verilmiş olması gereklidir.",
+ "MysqlTransactionLevel": "İşlem yalıtma düzeyinin değiştirilmesi desteklenmiyor. Arşivleme çalışır ancak daha yavaş olabilir. Olabiliyorsa `binlog_format` seçeneğinin `row` olarak değiştirilmesi önerilir.",
"MysqlMaxPacketSize": "En Büyük Paket Boyutu",
"MysqlMaxPacketSizeWarning": "MySQL veritabanınız için 'max_allowed_packet' değerini en az %1$s olarak ayarlamanız önerilir. Şu anda %2$s olarak ayarlanmış.",
"ConfigFileIntroduction": "Matomo ayarları bu bölümde görülebilir. Matomo 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.",
diff --git a/plugins/Diagnostics/lang/zh-cn.json b/plugins/Diagnostics/lang/zh-cn.json
index 6570235a8b..ec59fcb01b 100644
--- a/plugins/Diagnostics/lang/zh-cn.json
+++ b/plugins/Diagnostics/lang/zh-cn.json
@@ -1,6 +1,8 @@
{
"Diagnostics": {
"ConfigFileTitle": "配置文件",
+ "MysqlTemporaryTablesWarning": "Matomo必须具备MySQL权限CREATE TEMPORARY TABLES才能正常工作。",
+ "MysqlTransactionLevel": "不支持更改事务隔离级别。 归档仍然可以,但是可能会比较慢,因此建议将“ binlog_format”更改为“ row”。",
"MysqlMaxPacketSize": "最大包大小",
"MysqlMaxPacketSizeWarning": "建议在您的MySQL数据库中配置至少%1$s的'max_allowed_packet'大小。 配置目前为%2$s。",
"ConfigFileIntroduction": "在这里,您可以查看Matomo配置。 如果您在负载平衡环境中运行Matomo,则页面可能会有所不同,具体取决于加载此页面的服务器。 具有不同背景颜色的行是更改的配置值,例如在%1$s文件中指定。",
diff --git a/plugins/Diagnostics/tests/Integration/Commands/AnalyzeArchiveTableTest.php b/plugins/Diagnostics/tests/Integration/Commands/AnalyzeArchiveTableTest.php
index 8402b9506c..59d3139cd8 100644
--- a/plugins/Diagnostics/tests/Integration/Commands/AnalyzeArchiveTableTest.php
+++ b/plugins/Diagnostics/tests/Integration/Commands/AnalyzeArchiveTableTest.php
@@ -23,7 +23,7 @@ class AnalyzeArchiveTableTest extends ConsoleCommandTestCase
*/
public static $fixture = null;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
@@ -41,12 +41,12 @@ Statistics for the archive_numeric_2010_03 and archive_blob_2010_03 tables:
+-------------------------------------------+------------+---------------+-------------+---------+-----------+----------------+-------------+-------------+
| Group | # Archives | # Invalidated | # Temporary | # Error | # Segment | # Numeric Rows | # Blob Rows | # Blob Data |
+-------------------------------------------+------------+---------------+-------------+---------+-----------+----------------+-------------+-------------+
-| week[2010-03-01 - 2010-03-07] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 61 | 96 | %d |
-| month[2010-03-01 - 2010-03-31] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 61 | 96 | %d |
+| week[2010-03-01 - 2010-03-07] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 61 | 97 | %d |
+| month[2010-03-01 - 2010-03-31] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 61 | 97 | %d |
| day[2010-03-03 - 2010-03-03] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 0 | 0 | |
| day[2010-03-04 - 2010-03-04] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 0 | 0 | |
| day[2010-03-05 - 2010-03-05] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 0 | 0 | |
-| day[2010-03-06 - 2010-03-06] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 61 | 72 | %d |
+| day[2010-03-06 - 2010-03-06] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 61 | 73 | %d |
| day[2010-03-07 - 2010-03-07] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 0 | 0 | |
| day[2010-03-08 - 2010-03-08] idSite = 1 | 5 | 0 | 0 | 0 | 4 | 0 | 0 | |
| week[2010-03-08 - 2010-03-14] idSite = 1 | 7 | 0 | 0 | 0 | 6 | 0 | 0 | |
diff --git a/plugins/Diagnostics/tests/Integration/ConfigReaderTest.php b/plugins/Diagnostics/tests/Integration/ConfigReaderTest.php
index 05b5f0af50..8e95691571 100644
--- a/plugins/Diagnostics/tests/Integration/ConfigReaderTest.php
+++ b/plugins/Diagnostics/tests/Integration/ConfigReaderTest.php
@@ -9,7 +9,7 @@
namespace Piwik\Plugins\Diagnostics\tests\Integration\Commands;
use Piwik\Application\Kernel\GlobalSettingsProvider;
-use Piwik\Ini\IniReader;
+use Matomo\Ini\IniReader;
use Piwik\Plugins\Diagnostics\ConfigReader;
use Piwik\Plugins\ExampleSettingsPlugin\SystemSettings;
use Piwik\Settings\FieldConfig;
@@ -29,7 +29,7 @@ class ConfigReaderTest extends IntegrationTestCase
*/
private $configReader;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Diagnostics/tests/UI/Diagnostics_spec.js b/plugins/Diagnostics/tests/UI/Diagnostics_spec.js
new file mode 100644
index 0000000000..ce6d4b9ccd
--- /dev/null
+++ b/plugins/Diagnostics/tests/UI/Diagnostics_spec.js
@@ -0,0 +1,21 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * Screenshot tests for the DBStats plugin.
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+describe("Diagnostics", function () {
+ this.timeout(0);
+
+ const url = "?module=Installation&action=systemCheckPage&idSite=1&period=day&date=yesterday";
+
+ it("should load correctly", async function() {
+ await page.goto(url);
+
+ const content = await page.$('#content');
+ expect(await content.screenshot()).to.matchImage('page');
+ });
+}); \ No newline at end of file
diff --git a/plugins/Diagnostics/tests/UI/expected-screenshots/Diagnostics_page.png b/plugins/Diagnostics/tests/UI/expected-screenshots/Diagnostics_page.png
new file mode 100644
index 0000000000..12ce6f3132
--- /dev/null
+++ b/plugins/Diagnostics/tests/UI/expected-screenshots/Diagnostics_page.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5fc381582cbb0bdbd3c81935c3e0b45662f22336f85b9b3a9028de1663ca6b97
+size 204418
diff --git a/plugins/Diagnostics/tests/Unit/Diagnostic/DiagnosticResultTest.php b/plugins/Diagnostics/tests/Unit/Diagnostic/DiagnosticResultTest.php
index 8e02dc4f54..9a820f8e10 100644
--- a/plugins/Diagnostics/tests/Unit/Diagnostic/DiagnosticResultTest.php
+++ b/plugins/Diagnostics/tests/Unit/Diagnostic/DiagnosticResultTest.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\Diagnostics\tests\Unit\Diagnostic;
use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResult;
use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResultItem;
-class DiagnosticResultTest extends \PHPUnit_Framework_TestCase
+class DiagnosticResultTest extends \PHPUnit\Framework\TestCase
{
public function test_getStatus_shouldReturnTheWorstStatus()
{
diff --git a/plugins/Diagnostics/tests/Unit/DiagnosticReportTest.php b/plugins/Diagnostics/tests/Unit/DiagnosticReportTest.php
index c48b88e98c..e50612cb40 100644
--- a/plugins/Diagnostics/tests/Unit/DiagnosticReportTest.php
+++ b/plugins/Diagnostics/tests/Unit/DiagnosticReportTest.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\Diagnostics\tests\Unit;
use Piwik\Plugins\Diagnostics\Diagnostic\DiagnosticResult;
use Piwik\Plugins\Diagnostics\DiagnosticReport;
-class DiagnosticReportTest extends \PHPUnit_Framework_TestCase
+class DiagnosticReportTest extends \PHPUnit\Framework\TestCase
{
public function test_shouldComputeErrorAndWarningCount()
{
diff --git a/plugins/Diagnostics/tests/Unit/DiagnosticServiceTest.php b/plugins/Diagnostics/tests/Unit/DiagnosticServiceTest.php
index 482296e66f..1489a7abf1 100644
--- a/plugins/Diagnostics/tests/Unit/DiagnosticServiceTest.php
+++ b/plugins/Diagnostics/tests/Unit/DiagnosticServiceTest.php
@@ -14,7 +14,7 @@ use Piwik\Plugins\Diagnostics\tests\Mock\DiagnosticWithError;
use Piwik\Plugins\Diagnostics\tests\Mock\DiagnosticWithSuccess;
use Piwik\Plugins\Diagnostics\tests\Mock\DiagnosticWithWarning;
-class DiagnosticServiceTest extends \PHPUnit_Framework_TestCase
+class DiagnosticServiceTest extends \PHPUnit\Framework\TestCase
{
public function test_runDiagnostics()
{
diff --git a/plugins/Ecommerce/Reports/Base.php b/plugins/Ecommerce/Reports/Base.php
index 775f3e1446..1273a19576 100644
--- a/plugins/Ecommerce/Reports/Base.php
+++ b/plugins/Ecommerce/Reports/Base.php
@@ -57,7 +57,7 @@ abstract class Base extends Report
{
$idSite = $infos['idSite'];
- if (empty($idSite)) {
+ if (empty($idSite) || !is_numeric($idSite)) {
return false;
}
diff --git a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_week.original.html b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_week.original.html
index 29af22cde9..81c4d07383 100644
--- a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_week.original.html
+++ b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_week.original.html
@@ -45,7 +45,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
diff --git a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_week.original.html b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_week.original.html
index 76b56765de..c8f3f414c7 100644
--- a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_week.original.html
+++ b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_week.original.html
@@ -45,7 +45,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAgAElEQVR4nO2dd3jTVvfHT5zYGXYWJGQPkwUJkEACAcIqgbJXGGG0jJYChZaWVaBQMGV0QBd9S8fb8YYOStmlUOhbaBkdlPEyfm1ZATJJSACHTCdO8vtDqWJsSZZlyZKd83l4eG5k3XO/upKuju44cmpsbIR/iIqKItPZ2dmAIAiCIAjyDy5kKioqytBRMPoTQRAEQZAWjoxMoYuAIAiCIAgDMvO7IAiCIAiCGA5PGGI4NlFQUGD4U3FxcWBgoOC6WNPQ0FBdXa1UKsUWImme2XgKAJZO7RAWgBVFS1VVlUKhcHGhvikQgvLyck9PT7FVSBq9Xl9bW+vh4SG2EElTU1Mjk8kUCoXYQiRNZWWlu7u7TCah13tjKVFRUfY1m6GhoUGn04mtQtIQHgMA7P45J/d2hbhipExtba1erxdbhdTB280shNMgtgqpU1dXV1dXJ7YKqaPT6RoaGsRW8RAPvVRRugshISEMf4pOdXV1bW1tcHCw2EIkSrWu6SkYFaq6llu+9fubT2YkJsdLqK9IOtTV1fn4+Hh7e4stRNKUl5fj7cZMWVmZVqvFWmKmsLBQLpf7+/uLLUTSVFVV+fv7u7u7iy2kmeaeBvvqYEBYMmXZfgBIjGk1JyNuTP+YortVh365cfTUrTq9tLxXBEEQRPoY9zQY/imcD/F/10r4MqWr1ZWWVtQ08mbQkbj/oIZItFN75xVXdW4XoKutP3jyxtm/iv++ebdvcri48qRGUXG56n6jSumwHcsdYvCtDkEQq2h2GrCbwfF464szAJAcHxDir9Tr6wGgW8cguYvswrU7R07l1ujq+6WEuyqcxZaJIAiC2Ac4UdxhKSxpmvPYJzkMGpq6HGROTsnxgd4q18b6nF/OF1Tr9IN6qt1d8TJAEARBzCOhhRz2yKjB3W1vcNTg7sQ/5t0+2HEeANKSQrxVrkY/RYf7Dusb08rL9dzfxV9//1dFlY065HmvLsQUrGQEQYRDKk4DZUtHbMRG0JBRg7vvO/Q78Y9ht1VbTgJAK2+39NQImZOT6Q6BrZWPDe+Q0Lb1zcIH+366VlRaKZTifyCUA/0JZT7Rgl4GhBM2e9qoKWPTbXm9CVHWvkO/4y2DIIhASMVpYID56WiP8NimU5rS1dYTid6dQ12caU+xn4/7kN5tY8N9ruTc//bYtbyiB/zKMNrByvMo9GWw79DvH2bt+3LXEVs+dAU6KPQbEAQRCKk4DabNnPWPmRbL+o9/A4C4yFaJcW2Y9/RSuk4cEt+5XZv84op9P1+7cuueTQRKHXzoIgiCUGIHM+AMvQeyKSe3TBjZd8unuyj3NPU5iI2mRgy3M5RltJ1SoVnNRmMuDI4RpU7yf1Kw0W4PKpsC9h3c9uqUoVsJJdMyB5NmjUp0cZYN6dVW5a448b/8Lw/+lXf+m/t5Z/d+/wvl8ZKHYFhdZo/IIv/P6BwZFWoqidTA/hRYiqkYOhl0xdHJYxZJdz1TDvQY2aesEwRBECuxA6eBxKxPYI0RI4Psd7O0OJatOWWhRnkpTW3KOg0ASbH+F/dnk9mzth/S6+v9Wrc2PQQAcFO4DOwRuW3ru6Edx4QlTZg+a7HhY4myWszKsAaGc0H5J3trHHSyqQFDGdyK45CLuVoQBEGEQCrDE/BwnzDziyPQD2eYfYTQGWFofw1fpi1ql03tcM7Isre85H4VkejZObSxsZ59uaMGd/94y6Yx/WMA4MgfuXNe+qqmVs+QV9DnE3Pvi5WngE1NGrlE7GXQFWdULvPzntu1jR4DgiA2gIeehowFe9jvvPutMZwLomw0v/n22ISRfZk9DHuE25j6u9vOAUDXDoFtWln8hT2Zk1PndgGeHoojf9z67UJhjU4/pFdbN4WLvY/us9TP0NVvUQ1wqy7KXMzDLqYDagiCIEJj6+EJjUaj0Wi45W1RjSOHg80pLCMS/btSL7NkQ3S4r6dSsfPHK/+7fOf+A92BzxZZNBYgQVjW5L5DvxcVF6tUKtXDn1m3dDSEoW/GdB6DpSIpc6HrgCCIzeDBadj91hiNRqNWq9nsfPMm06+cX55MX79aGrV19Z/svQQAg9PUSne5NaYCWiszB7X/8fdbf924O3b220WllYF+SvPZHBEpdFmZvbYp51ggCIIIAT9zGjQazTR2WNPNYDrQSyTI1ROGO7OxSdfO0o1Am26nM0tnh40q04xs8q77928AEN+2ded2ASxLYSjxyYmPDO8TVXb7/y7furf7yNXcogdsNHAri4DlM8/KU8CQhQ1mzyxzcQzdDHS5GPokWqZzjCCIuNjT6gmjtpXz6gk2FujmSBptp5zmRrmPoR0643QCzO7mrFB2GLwGABKi/Th/SMJU1abVs557cRNAz493X7x56lOGXhzmIzJ9WJqaYn82rTkFFhXE3qz1xXHIxZwFOx4QBBECp8bGRtuXyvensUtDgkPY7OyoLSkRNDohqvWY/rEKOcVXK7VlWnLJpUXoautP/i//2Nk8ABjeJyo5PtBZxmW2hHA1z6NlyjkNtpfBC5R6ePk09pUrV+Li4qy348CUlZVptdqIiAixhUiawsJCuVzu74+fa2fi+vXrISEh7u7uYgtpRkJLLhFulFU0RXNK7RhM6TFYg6vCOT01YkgvNQB8dzz75P/yudlxvLkmDEsoRUdqehAEcRjsaXgCoeSNracBICmuTXiQl0BFdOsQrHST7/zx6pFTOZVVtY90i+AwCEI3om+nsBljEgVHqmQEQaSGOE4DL92kBNXV1QWuNdHRrAxmZ2fzVa5EuJGvJRKzxiUxrHEoKYG6urrgYO7VnhjXJiHaf+v+S79fuu3m6vLUuCQOfoMQ9c+jTU9FlY+Pj7e3t+2L5hFpqkIQxDHA4Qk7praufvEbPwHApCHtbbAqMjGuzXNTUmLCfX8+k7f+o1/J6JMIgiBIC0GcngZ9/jG+TDXodPK7pXq3Ar4M2hET37gHAKkx8r7ht/X5xQx7yrRaZ329vsHiiZBGBAPMS2/46rjLH9l3P912dHxP93A/xxnhcikphmqVvtxeg1K4hPYVWwKCIA4O9jTYK9W1TcteOqvlrVS2O4/BrZxnD1Ilt3U5da3ujX0VVwrrbFY0giAIIi7oNNgr0969DwCd1S7dY11tXLSnu2z+MM+BnRS3tQ0vbSs/fb3WxgIQBEEQUXB8pyGu7xNiS2CCm7zKmgYiMbCTq4crx89MWIO7wmlqP+X4Hm4AsHFfxffnauobGiVe1Y4BVjKCICIiuQFpok28cuxTsYVQY9Rki6VzxntaAOgeK0+JtnU3A4mr3Gl8Tw+lm9N/fqr+7KeqDVt2ErUR1/cJymqh287mVysR66wJcVBXjn0qaF0hCIIwIDmngRcEbVUNLYvSfBdr9URibHfxw4QNSnLzVcre+q4yqP3QT49Uju/JUZLQ1SjKWROoFPQbEAQRC2kNTxBNIdEmiq2FFbaXWt/Q+OwnDwBgZFe3CH/xfT5nmVOPONfsXz8AgEPndZ8drXKSia+KGTu6wBAEQSSF1Nt3+MeTMGzlDd+xOj36tNFGYk+jpwJddnK7YXayOPYvc5S5TI2bijHMTrfF0M6kt+4T6Vc3vLT2pfuUxg2ri6Foynow+onOjmmJ+aX6T45Wnrxc27b7U3fK6tt4Uwe0pjublMdL7sC+fuhEMmBY3LkD71JuB8Y6oZPHLNLoV9M03ckC7GxAEEQk7MBpAJNG2bBVvfjD+6WlpSEhIeRG08aaIbvZFtx6kczGzb7yPpS338zEEa8DQMGlvf936A1WWRiLppyFQEqyqE5C/VyeGqD6/HjlWYj6/FgVQwgHhopiEGPpwbLEMEtxUXGXYc/yWCfWiGSuFgRBEFGQ1vAEHWwm1jH0OVua3dIOBtNcdMYtbfqN9ic8htgg53t5ZxhyWXRcLOctsunSD27l/OwQT23hxVPX6hZnPbhcQB3CgcfpkBxEAv1ZMyuDrjijcpmf96YiTXtfTEGPAUEQKcBDT0P5O27sd/Z8robuJ6Om3AavVtwGthk6jQWl4Z+PmA/u7LZDT1uNzFh0yBzqx8PVKe/89glDuv5wQbfq6/LFI1XdYhSWGrEIliIZzprQdUKXi3nYhcMYGYIgiNDYenhCo9FoNBq6X208PY1bcyxWIz7xTSKak7xXe47LLC3t+ed2pA163dR+Hr4q2fZfqjd9WzG1r/uQLm7OMqGCSbAUSbeb0fBEn8zl3OyQHgCls2vNlYauA4Ig0oEHp8HzuRqNRqNWq1ntff8mw48WPdJaFA+qmqI5ZaRa0K9jSM+xS2z24FG4OI3t7u4mh6yfq7ceq66rbxyT6mGboi1CChMFTLsWjKCcY4EgCCIK/Mxp0Gg009hB181g2iayGeVlGEg2C+XQMvvsFhmnezDQlWg4C4FIz3xfCwAlN07GhcgtUsIwPE8nlXI7g1ojyIxDurgtGqkCgG0na/o/s//MoY/Z52Uu0XqRlJDdDNzqhKGbgS4XQ58EOs0IgkgQ+1g9QQfdLD+WE+KMduP3TY6NNrqZdEb7THjjHpH+4uVhzMYJKA/q110bGYowm6YsyHA3umNUto6KTnvaT5327/9WPjtMRWnB1JpRmrl+OJ9Eo7zHt79C6TdYXxyHXMxZsOMBQRBRcGr8Z3qdLeHx09g6nY5YcsmXQQlCOA0TerqN62G+k5/ycVKm1er19a39WH0a28qFi6YU3qt//rMyAIgLdp47WBXkSx3CgS8xnCkuKlapVEoVxaexpfaQptRjm09jX7lyJS4uzgYF2S9lZWVarTYiIkJsIZKmsLBQLpf7+/uLLUTSXL9+PSQkxN1d/OC/JPax5LIlQ3gMQT5Og5I4zmYwizWjPATMXTvBrZzfnuGdGOlypbD+uU/L8krrOQq1IdbXiXBITQ+CIC0H+x6eaDmM6Oru6S6Uh2c2lgN7I3TZg1s5Lxnl+c6BitPX6xZlla3J9GwfatnkDBvDS50IAXoMCIKIiDjDEzxSXV1dUFAQHR0tthBByFiwBwDaq1utn29Vz3NJSUldXV1wcDBPujhSVVP3+f4/D/96EwCWzkhN7SSyHiNycnJ8fHy8vb3FFiJpcHjCLDg8wQYcnmADDk8gFvCgQkckJgxqL64SvvBwk8/M6DRlWDwAvPbZqb1HrzY02LfPiiAI0qIQZ3ii/EwhX6Z0Op2+9H65ljeD0mH6l6cAoFdbv7bleitrrEar1dfry6VRSY/6eDYmh391Nnfr/j8rc8tGdpDKJNba4ntVqlqZslJsIZJGn6ctl8iVJFWqKitrKyrKS6wagPNMkVY/HIIQYE+DRMnXVhGJIe2DxFUiBAPjAp/vGwMAuy7kf3bqRnkN9VcqEARBEEmBToNEWXHgEgAMjQ8K9ZFiLEUrkTk5dQ5t9eLAeAD4+XrJJ7/faLDzuTUIgiAtAcd3GpIye4stgQlKedO+PEUkhsU7YBclechxbTw3jkwEgP8VaGd89cftB9VClMKewfPH8SjA3pH4jeMYYCUjdofknIakzN5SvpEIeeQ/Qct6LDlc5Wrfa2LNVlEbT7dXR3SKD/AEgGX7LxaW8ek3cNBj1/B4dEmZvc9vP8Fgk7ksQevZlvegUbm82zy//YRjX5OI4yE5p4EXBL0Pz28/Qf4ToiCimyHC12NgO9rZDPbS0BAPHmAUHOTlviS9fUqYLwAs/+7itZJyfjUYFk3qsT02OGV8HR3pMYiuhMG+oPcgXaECmbWX2xlBQGpOA9Fa2dFdxLvUCp2eSIzuFMqjWYkjc3J6onvbR6L9AWDdD3+dzbsntiLEbrCj5gJBHAA76P0mPAm698XUqQOMNhJ7GrUjdNnJ7YbZyeLYv1tQ5jI1birGMDsAzNt5FgC6hbd6YtFIOjtGB2hq3LC6GIqmrAejn+jsmCqnTBuKYT4jSoXL1G5qf5XbN+fzNh+/Ni4pbERCMOWxmP5JWQOGpRiVxVxFLA+cYTfTSqY8ZSwvD4ZzYXTVmR64WWGUR8Ttsjc6NLpOJiOdpoWyrHkGSUZi6GTQFUcnj1mk4a+9nhh8aPNOo+0MlU9ZJwgiTezAaQCT29jwPjy19Ufig1XkRtPbmyE7wwOPL5HMxg2bEnIm4PCE4H/T2zHbxLAvmvK5S0qyvk4IWJ4RmZPTsIRgF2fZV2dzdp7PI2KVmrbUFkmia+uZD43lgVPuRnlopqfM0svDomuVvTDK47IIZrMMV7tZaxwU2uYK55BLoMpHENsjreEJOujeBQ23n6fvpbQ0u6VvWqa56IwzNxbL9l8EgP4xbSJaKenssFFl0XHRSWJfvYb7m30qMCghGNQucGG/WADYdSE/tNP4E1lHWWa0CIZDY3ngdKeGwyPE7OVh0bXKUr8QNcmsxCyWXnKmuXi5wpmvB7MikzJ7n/z0EPNKHPQYEPuFh56Gsykfsd85+cwsup+Mbn4bOOMsn3AMuXhUSC6zHN1RwNkMFh0ym50pz5SV5y4xxPelR+PX/vBX68jUZ3ady5qSytkUN7hdGBZlt7IIDsYNH4rCFW0lLKuF4R7k/QpnmYv5RrCLykcQNth6eEKj0Wg0GrpfBW1JTeF2Awt6249PDPV0E+qkWNpXLGIDF+3vuWlU0uJ95wFg2penXhneKdjbdp9ssebAWVayoHVLZ5zsqxdaAGc49KUZwtcVTnoAlO6vNe2GlCsfQdjAw/Mp+cwsjUajVqtZ7X2T6UeLbnhHInHkJgCIbOUxuH2QzMlJiCIGzB0jXFNl+kZlPf4q17+PvNI+fTkALP/u4qsjOvFiVlDsYqyacpjfAZDCEREaKiorD23eyTAqJAWpCMINfuY0aDSaaeyg62YwvYvMPn6Yhx7NQjkYyT67RcbpnqlEurK2aZnlo+2CXJxlhkoo97cIhgFd5iLY1w9fr2Km1FbezZqS2i28FQAs239R2bqt2SzWVxHLA2dzahhqjLIIlueC+VKnM87t8qa8DVneayyvXg6XHBusvMIZuhnocjHcCC3qFQhxbOxj9QQddDPCWL7vGu3Gr+/PRhuRnrvjLABoC84/8+KyxgY95T5GdsxOhTM9qB+37DFtE9mnKQtijzU9ENNT1SpX56PXSqLT5p7OvZsc1sqwM8ZUpFFBdI89wx2Y1TJ3YhvuwyDGKE1XBMvzQqmHWb9FB8V8N7G/EigPgWUtWVQQe7PWF8chF3MW7HhA7AinRjE+FMTvp7GJJZd8GbQxpZW6RXvPA8Cy9HbtA72tN0jZAGm1Wn293q+1H2cLovP937e/PpcLAOMSQ0dY9zVtugMsKi5WqVQqpdIa4/wiyrlgLjQ3Ly88LEwIyzZDaBkVlZUVFRWBAQHW6HH4T2MXFhbK5XJ/f3+xhUia69evh4SEuLvbbkaXWexjyaUDQ3gMaerWsW28xNJgzSiPzRjSPmhyl3AA2Hkhf9+lAkf9KqYUzgWPE1MkghRqlQ6p6UEQZux7eMLeIZdZjuwQ4iwTZP4jGyzq+haRQe2DAr3c3vz56u6L+bsv5r83LtneP+hlikTOBd2Ivp0ikVo1xZEqGWkhiDM8wSPV1dUFBQXR0dFiC7GYhobGcYv2AsDYAbFThiUIWlZJSUldXV1wsCN0eF7Lubf07WNEevvGUXIX3nrLcnJyfHx8vL15GCRyYK5cuRIXFye2CklTVlam1WojIiLEFiJpcHiCDTg8gTRDeAwAMKKv/Xk8IhIT0WrLikeJdOaSfXlFD8TVgyAI0nIQp3e38Axvnz/W6XT3S/WFWp6/pyw01f8ss8zs2q7icm0F1ApanFZbo6/XQ6Gd1RIDmpE9Nd/+CgDPvXZkxfDuQd4q623eK66tVVVVKtGTZkKbpy8sd5wLiZngFE+xJSCItMD2URyW7PgZALqEByRHsp1ijRji5+nxrylNHzhd/93vV4rwa9oIgiCCg06DCJTXNPUrpEQGeCjk4oqxa14f37dvXBgAvHvk3LmcYkddUoEgCCIRHN9p6J2ZJLYEY5bvOg4AnUL92ge3lqA8oeHxkD0U8vEpcRldYgHg05OX/vvnLb4sS4QWeHnYHqxkBGGP5JyG3plJUr6HCXnkPw4WnvnyRyIxKEEtd3bmVZ3ksM2p7N8+fFxKLADsv5B94GK2vr7BBoXagN6ZSSe2nwf6amSuXkEr3/obgXO5vNs8sf28lNscBJEUknMaeEHQJuDE9vPkP0sLIvvPe8eGRvhxX9pnL20c8cwD4QX3iwuf0y8JAL6/dPP5r49W6uostSC1KiU9Bs5YmZ2Nfc43gjWFCmRWahcAgkgTaTkNRENpRzewpVLnf3WESAxoj2u4eaZDiN+yIalEeunOY7X6enH1tCjs6J5FEMQa7CCgHuFJGDZJhm8bA6amGm0k9jRqwuiyk9sNs5PFsX+tocxlZLyuvukxVvjn/tHfLjbNTrfFyI7RAVJmZPiVTFPWg9FPdHbodJpWIymG5RmhOxA6wYYbQ1t5rh7Zc823vwLAwu0/rRjWfcLsXswHa1il4+YPNt1oKo99XRldFcxnmc12SugqivISInew6JKzFOsvMzp5zCKZr0YGYUBTJwiCGGEHTgOYtCCGTcCPW08RH6wiN5q2LAzZzTY31osk0wu+/gkAtAUXslZt9HRTkD+xN2vYE8OgkOVxUdaDoSTr64SA/RlhOBA6wUb7+Ht6rBmVtnrfLwCw/sDv2z44EerryXywZJXu3HxIpVIplSqGIiytK9s8h5jrk04zG2sc9NvmMuOQi+VVhyAIA9IanqCDzROFoYPU0uyWvuSZ5jI13ndyNyI9f9wk0mOwyD57YRYdF8sHNkP1Gu5v9oHEoITlbmaFtVa5kyEcXj146vLtu4amODxdDDtLrLmWjKTy+NBi6UGywdLzbpqLl8uMua7MimRzNaLHgCAc4KGn4aOUs+x3nnUmme4no3bHBu8BLJ9wDLnYK+w4bAMAlJdcTwp/hEOhfGHRIbPZ2WxHt1hcOrhy/sKsny7n/evo/6b1TOgSEeAsk5HyzGbndm04BiyPneFG4P0yY5mL+Wo8YTKAiCCIpdh6eEKj0Wg0GrpfbdxSc2s7OOQig0YXX/1B4TKHQ6G8YGk3tV23rQ36mrHJcb4ebrvPXcv69c/7lTWPdlAD60oQ6NhPGMzzkGz1WtMPBPxdZsx1Zc3Ni64DgnCGB6dh1plkjUajVqtZ7X2T6UeL2hp7oaGxkQga3U0deOHbG2LJGDN3gHCtpOnLnETo1y7cReb0zZmr317I/vZC9sUDy/FRIShScIbMXo2UcywQBGEDP3MaNBrNNHbQdTOY3sBshiStGSGmHAdln5298eZllvGRppopsxuOiLPZnwGGsWTmItjXD19vgSxhed6J3WROTn3+CeEAAJ2GvVJVW2eYl00RYPBuyqaumC9FDt0MlPcCSyNWXnIMWdhg5WXG0M1Al4vhapSUO4sgdop9rJ6gg+WMMzbZge9HXZNxJ1niiNcBYHAHdbCPylQz5dOIch9DhczTGykPas+WH1kWQdegW1M//PZAMB8+5W7b3j/x6venAOCFHccuHVzZoK8xtWOYpjt2lvXGywEyX9LsS7HmkrOoIPZmrS+OQy7mLNjxgCBscGoU4xs//H4am1hyyZdBfiGDRq8d3ctX6WaDEinbPq1Wq6/X+7X242zBASh+ULl2/29E+sVh3Qkf7qEdiovIJZcs4VZXbHIJdxastJyXlxsWFi66DN6h1MPt09hlZWVarTYiAgO4MVFYWCiXy/39/cUWImmuX78eEhLi7u4utpBm7GPJpZ1CBo2e0DXONh4DN6wZ5bEjAryUL49OI9IbDvyed/cBByPW1xW3YQUHQMqXmdT0IIhkse/hCYlDzGYI9lamqoPE1sIEv13rUqaV0v2dSf2f23YUAF479MfcR5Lig1n1vpDYsq4kvsjCUiR7mTlSJSOI0BgPT0RFRQFAdna2SHosprq6uqCgIDo6WmwhFGQs2AMAK5/q0SU+UFwlJSUldXV1wcHB4sqQCJVVtY+vOECk509O7t0l1NlZBgA5OTk+Pj7e3tw/JNYSuHLlSlxcnNgqJA0OT7ABhyfYIPXhiaioKDtyFyQO4TF07xgkuseAGKH0UOx+a8yM0R0BYPNXZ8cv3ie2IgRBEPvgoeEJm3kMt4rO8GVKp9OVlpW6FGn5MsgLC1/LIxKpSfU8HixntFqtXl9fKysUW4iESIhtHD/Id8fh+wCQsWDPKwtC7t8vKa9T3a9W0mWJDEyxoUAEQRDJgRMhBaRviioi2FVsFQg1MienHkmqp8Y3zWlY/lZBTa0IK4kQBEHsCHQa+IfsZkhL5rJeSwj2nVp2//RlsVVIkfZt3RdODyDSm7fVldzXi6sHQRBEylDEaTCa2fD3338b/nrz5k1isqQ1FJf9ZaUFksbGhrq6OoXCghf6GZMWf7Ztk2mabh9LeXsbAEDPTtAtgR+DVhr56e/1RCLh1iC/9CSZApfMGHOvDLYebEr/eXjNv/+zmnK3AO9422mSKlVVVR4eHmKrkDR6vV6v17u5SXeVtRTQ6XQymUwul4stRNJUV1e7urrKZBJ6vTf//DCacu/l5eXl5WVlqfXyYqMtIwbO2P/fzziYqqvTl5Vp/fxaW5TLz681WSJdXkttEqx89y4AeHpAeo9Wrgon9gbN1gC5A92eptvra+t2n1oKALIynwZv7Z+Rh9UHq1NmjmZ9NGwZMXCG4Z/cTiW3cnkpy88P5k/Wb/6qDAASBq2eN3fz9m/WmO4W7I/LTyA3NxeX4TBTWVlZUVEREBAgthBJU1pa6uLi4uPjI7YQSVNQUODv769QKMQW0ox5p8FoBRovC9I8Ko3fVI78sp2bKZ1OV1HhbOmrj4eHB1kiXV6LbKanZf5j8C4AZAxs7evjYbCRlUGGHViaMtqedWIOAHjkRXmVt5LdlhW2O3Uz7njDxw1pT42Tu/P8GmQoz0itcPBYSqQHzJtQ9d43dQAQ03v+pEkb9uxdK3N6yNOQ55MAAB0zSURBVO3z9JTKeJOIuLi4YD0w09DQoNPpsJaYKS8vl8vlWEvMuLi4eHh4SHrJJTH0QCYQiyBmM8SpXRPbidx/m3V4TtbhOQDgfM/PvzowdcbYzlNGJuYPA4CcuJNfHX++Kv+OcKUf+WV7elqmcPYFQunu9PK8VkQ6qufsxa/ni6sHQRBEaoiz5NIU4t2U/J/cbvT+ariR2Hlo/6mGuxntY5rXqETmXGx+JXcg5z8e+OKt2RNeITZSPjvNGmSQymbnqat8ibTHjeiGbOe0teMrdTWZo+Ye+WW7+zcev3vvAIAdf67aNaW8Uq+Hf57xpjXGsn7YSCLTlCfU6CfT4ujkMYs0+tU0TSls45LQI78/OHTiAQAsfC1v45JQZ9lD/Q0IgiAtFsnNiTN6PBi275SN/sGjW0tLS03z0qXB5FnFsKfZXwkMHZ0eScoL394AkycxuQMbg9ZAeAzu+eoan9KOPkntNg1IT8vcdeBD4te4Cen7p/7Utqdfufry2Bc9B7o9/fiLG5gNWimYzQkFq+uHQy5TAV/u2gwAzjKnR3t6+/m4fLH/HgAs2Zj/6sIQhVxCE5EQBEHEQnJNId27vuF2Ms0wjk4+yM0+QihzMds0JXFk06KGvl2ZhujYG+QGMSShyomFBqdHvCa0mzTAVMDireu6t3/E9XY4APy35v3uoUwfCOUm2DAXmxNqtjjm82JWpGkPlilGerrEK7N//YBIL3uzoE6PIRwQBEH46GlYk2VBmLzV0wQMjyjEOLpFNvunerZpZWYFkXCD/U19DDejGlzq09TpIenJdHsG903MSIo+sO3jB+q/Y5+ourr9KINZloLpxiDYW+CwM3Mu5mEXQ4+E0mZF6fWF0wLezCoGgKVv5L84OygSA4IjCNKysfXwhEaj0Wg0AhkXYsY+G5vEbAZ3V3g0zfxiVIGWFRB9DB45UQ3QOGrsHFdfM0oU3sr09IwThw+Uxpz/zeebJ7t1q6+tc1ZQeDwsBTNM+GAYG2Jvx3DKi+k+3GrVcGYDpYXQQMWypwJf/XcRAGz48PaHq6r8fTFEAYIgLRcenIbV085oNBq1Ws1m55tw0/oSJUV9Q1PH9cj+vtaMfFvjTBAeg1tepHut6tuDFzLnsAqk4RUTNixmzt51W8q6XqwbfO33D3elPTuRswZKbLb2ko0GuhEK0nUg5jQY0aaV/JUFIcvfKgCA2S8f3jC/Tzs1lwAeCIIgDgA/cxo0Gs00dnDrZjAd0ja7Dxi8QZrNa/ir2dFxoyxLNuYDQHnJ9dROKksPxNAg+255IyOEx+CaG+lXFTjoyRnZZffZ501Py/zo8InIq70A4Hrszz9t3lpbVmkohk0NsIfOLMviGLoZ6HIx9EmwPxBXhWzNM03hjF7cfPzs30UNDTjFAUGQlojkVk/QYfhgYO7BNvyTMi/zY4mlTQJymeWieT1MH0KUr7bMBikxfVgSW8illc73WgfWhPSb/7hZU0BVG32ffcz7E+8LoQdy437N/f3Xw5t0DDVmUc+BaV5Ks9YXx7lWDf8sKmoOVGpU4Z5K5zeXhhGne/1HvwHA7rfGsBGGIAjiSFB8e8IG8Pxp7NLSkBCmJQDCQTxFkhM8pgwXtsva9A2b6GAAANWtWLUsOnHaEMoZCQTEp7Ep41iTlq9+c+Q37x3ExvGd1nsE2bQTXgoDGUVFxSqVSqVS0ukJ8euy/9i1L75r+nLK9o2j5C6SW38kNFeuXImLixNbhaQpKyvTarURERFiC5E0hYWFcrnc399fbCGS5vr16yEhIdKNCIlYBNnN0L+74JFQKYckAABqXDv4JHZ5aiSDx8CS2Anp6U4zifSOiysKj12w0iAzDEsoRYdOj9xFlpEet2hqV+LPzCX7auvqbSsNQRBETNBpsJYeScqA1rb4UBvpNzQFY7gV55ETPdB7elxmOl9FhD6aMtjzGdfCphAOt48L6DcQh0P8swuPgSStc+iq2T2J9MQXvq3W4de0EQRpKYgzPMEj1dXVBQUF0dHRNi43Y8EeIvH5huFKd9t93ZWIiuGRG90g149ImB4/YjibXCUlJXV1dSw/TlhRVPTx+8vK2v4fAPSvfqr3nNnWCLYjcnJyfHx8WH6SLTtPu+TNn4j0lhWPBvophZQmIXB4wiw4PMEGHJ5gAw5POAj19Q1E4onRHUXwGHKiodFp0cKvWHoMlqIKDJw0bon/9S4AcNT93wdee7W2olKIguyaqDCf914cSKTnrv/hzl2sIgRBHB90GrgwfvE+AEiIbv1oT1bRKXiB8BjcC9TudarpEzQuQn5hPaBjwty1H0Vc7Q0AZwJ37np9nXBl2S9B/qovXmny2+as++GvG6Xi6kEQBBEadBos5kGFjkgM7dVWIXe2TaGEx+BaGB5YHf7M2o/929mif3jy8nUx19MB4GrUf/+zcmFlCT4UjfFwk/9n7VAivfLdE6cuFWIIBwRBHBh0Gixm+ksHAaB3l9Dk+CAbFLcmK4XwGJzv+gVXqqeufcMGhRIoVMrJa19LvZMJADkxxzcdHFxRVGSz0u0FL5UrGbPhtU9PjVu0V1w9CIIgwoFOg2WQ8x+H2KSbgfwYmDInpmvjwKnrbOcxkAxesiS9pmmF5xuHh5dev257DdJn+8ZRU0d0INIZC/bgUkwEQRwSdBq40LtLaEy4r9ClNH8+VO/cI3jAoEWLhC6Rjl6zZ472WE6k3/tl4uXvvxdLiWSRu8hG948hQzhMfOHbOn2DuJIQBEF4B50GCyC7GR4fnuDsLGzVER6D6lY7z1vtMoM1aTOfFLQ4sySOH/tYxCa3wggA2H7npb++OyCuHmmS1jl09dNpRDpzyb7Kqlpx9SAIgvALOg1sIV8cMwe18xP4+8j/BGOIqldUD+02pd2QIYIWx5Kofv3mPPaOb3ZHANhxd/WxLe+LrUiKJMa22bjwESL9+IoDRaW4FBNBEMcBnQa2ZC7ZBwBd2gcM6dVW0IIIj0GZE+3U6PzC8l0S8RgIvMNCJ01e5n8tGQB+Vn6y/5UNGMLBlKgwnw9WPkqkMYQDgiCOBDoNrCD7mbsnBnupXIUrqCkYQ36UW51q2oTVwhXEGf92cXPXfRhxrTcAnAvevfv19WIrkiJtWiuz1g0j0nPW/fBnNq5WRRDEEUCngRWPrzgAAGlJIT0TBfycJuExKIpCgmrCbBaMgRuZSzRxNx4FgCtRP3y28vmyvHyxFUkOT6WCDOHw0r9O/Ha+AEM4IAhi76DTYB5y/mP/bhEeboIEjSaDMchLAkPLYx5fu0mIUnjE3dt74poNRAiH3JiTbx8djaGfTDEM4bAx6w8M4YAgiL2DTgNburQP6BAjyLdVmoMx5MYkOz3y+Dqpewwkg5csGVD3NJHedHBw8aU/xdUjTb5+feSM0R2JdMaCPbpa/ComgiD2CjoNZiC7GWaM7ih34b+6moMx1Ln0DhssYjAGbqTNfJIM4fDBuWkYwsEUhdx5RN/oxdO6EX9OWrqf/OAZgiCIfYFOAxNk4z6qX3RIG0/e7ZMeg+fN9uMDVqZOn8Z7ETYgcfzY6dGbifT2Oy/9uW+/uHqkSc+kkNVzmkI4jF+8j/yCCYIgiB2BTgMTxNcsAWBonyjejTcFY8hr61YYMbzH4wJ959o2RKT1nN9nZ6vsRADYqV3z83vvia1IiiTGtXl9QT8iPf2lg7gUE0EQuwOdBlrIsecnRnf05zuaU1Mwhlsxsnr5okXbYgc9yq992+Orjpw0dXnAtRQAOKb6bN/6tfpajIdoTHS470erBxPpOet+KLpbIa4eBEEQi0CngZZJS/cDQLeOQX2Sw/i1/E8fQ7SH3nNq5ioXhYJf+2LhFx09Z90H4Vd7A8D50H27NqwRW5EU8fNxJ5dizl333/+7ViKuHgRBEPag00ANOf+xV1IIv9GcCI/BpTgwQBc6d+1HUg7GwI2JL2ja3xgMAJfVhz9ZMR9DOJjipXL9fH1T6KdVW06ePJeHIRwQBLEL0GlgIj6qdWon3qI5kcEYFMWhEeXxk1/awJdlSeHu7T1hzbrupZMAID/217ePjq4uKxNblORQeijIEA5vfn4GQzggCGIXoNNAAdnNMG1EB76WWZILJTxyo7o4935s7esOMypByaBFi8gQDq/vTS84c1ZcPdJk+8ZRMzM6EemMBXuqdRjCAUEQSYNOgzFkR/GgnpExEa14sdkcjKFK2TtsqN0FY+CGYQiHj/+cffXwD+LqkSByF9nQ3lFLpjeFcJiyDFerIggiadBpMIbsKB7WJ5oXg83BGG60Hxu0qLt9BmPgRuL4sTMTPiTS24pe/L+9+8TVI016JIZonu5FpDMW7NGW14irB0EQhA50Gh6C7GaYNKR9aAAP0ZxIj8G9IHJE7+kdRo+03qZ9EZKSPC/tayK9q2wthnCgpFOs/8aFjxDpJ1Z9jyEcEASRJug0PATRzdAp1n9A90jrrTUFY8iJ9boR/+y8T2IGpFtv0x7xi46e32dn4LVuAHBM9dnulzUYwsGUqDCfT9YMIdJz1v1wuwRDOCAIIjnQaWiGnP/YMzHE18vNSmtNwRhyo5U6z8cmrXD39rZWnz3jq46cvW5LxLVeAHAp4rtd6zViK5Iivl5un77c5DfM24AhHBAEkRzoNBgTHebzSLcIK400BWO4ExBQG/r0+g8dLxgDNzKXrEm4NQQALrf94eMVz96/eUtsRZLDx9Pti1eaAoqv2nLyxNk8cfUgCIIYgk5DE2Q3w2PDE6xZZkkGY3C9Hd62vOPEpRgVsRl3b+9xq9f2vDsZAApif9t8fByOU5ji4SYnQzi89cUZ8spEEAQRHXQaHqJPl9BOsW04Z2+e9pgX1VmeNunlVxUqJU/SHIeBCxcOrJ9HpNdv65l76g9x9UiT7RtHzRqXSKQxhAOCIBIBnQYAg26GUY/EcDZCegxOZb59Qoa0kGAM3Oj5xAwyhMNnl+diCAdT5C6ywWltlz3ZnfgTQzggCCIF0GloZkz/GHWoD7e8pMfgdSM+I/zZ7jOm8ybLQUkcP3Zu6pdEelvRixd3fyuuHmnSrUPQ2nnNIRzulVWLqwdBkBYOOg3N3QxDekdxs0B6DG4F6tHpT7XAYAzc8G8XR/oNe8pf/undd8XVI00SoptDOMzUHCq5XyWuHgRBWjLoNDTx+IgEPx93Dhn/CcYQ453d4Zmn3lf36c23NEfGv13c8/33Bl1NBYDjXlk71qwSW5EUiQrzyVrX9FXM2S8fzi8uF1cPgiAtlpbuNBDdDKEBqpF9uQSNJj0Gz1qfKZOXK/39eNbXAvAOC521/r3wq70A4K/Ig99oVoqtSIp4KhVkCIf5r/6IIRwQBBGFFu00GCyz7ODsbFlV6GtrDYIxhMxe9z4GY7CGKcvXd8wdDgB/qw99tGIehnAwxcfT7ctXRxDpVVtO/nw6V1w9CIK0QFq000CQ2jGoW4cgi7KsyUpZv60nALgXqKPKkzKXYTAGa1GolBkvaXpppwLA7dhTm4+PE1uRFHF3dSFDOGz+6iyGcEAQxMa0XKeBbHBH94+1KGNzMIbCyM5uPSa+vB6DMfBF+nPzh8meJ9JrslJuHj8hrh5psn3jqKcndCbSGMIBQRBb0nKdBoKhvdvGRbZivz/pMTjf9e8bNHLgwoXC6Gq5pDz+GBnCYevNBdd+PCKuHgkid5EN7BG5fCaGcEAQxNa0UKeBWzQn0mPwvpkwMnJ26vSp/CtDABLHj53fZyeR/qpg6YUdu8TVI026JgRtmN+HSGcs2FOqxRAOCIIITgt1Gggy0mP9fT1Y7tw8KlGgHjNwdqeM0YLpQsBXHTmnSxaR3lv1CoZwoKSdujUZwmHWmkPoNyAIIjQt0Wkguhn8fd0nD41nsz+5UAIAWmUnzn78rYi0ngLqQwAAIKBjwuKhh4j0ca+sHbgUk4qoMB9yScWsNYdybpeJqwdBEMemxTkN5MDElGEJMpkTmyzEQgllbkzA1a6Tpi73DgsVUB9igNLfb/W0M+HXegHAX+pDX69eLrYiKeLu6vLJmqYQDgteP4ohHBAEEY4W5zQQdI5r0yc5zOxutRWVRB+DvCSgjS54zvr3/aK5xIBCrGHKsvVJ+aMB4Erb/364ci6GcDDF18vt69ebgpev2nLyp9M54upBEMRRaVlOA9nNkDHQfCCmNVkpr+zqCwAe+VHRFZ0nLntZWHEIDQqVctSKlX0eTAOAopg/MIQDJQq5MxnC4d2vzmEIBwRBhKBlOQ0E/btFJESZifdMTmJwLQpNck+doFmHwRjE5ZFnnx3h+gKRXpOVkv3zz6LKkSg7No2aNxFDOCAIIhQtyGkg373GDjATzYn0GOR3gh4JHIvBGCRCl4kTxng2TYf8Imcx+g2mODvL0lMjV85qmqiLIRwQBOGXFuQ0EAzp1TagNVOfAekxeN1sPzzqydRpj9tEF8KKThmjySUVX+QsPrfta3H1SJMu7QNefb4vkc5YsAe/po0gCF+0FKeB7GaYNrIDw6IJ0mPwyG87YfjzGIxBgij9/cgQDvtrN2EIB0piI1q9sagphMPslw/fK8MQDgiC8ECLcBpIj2HWuESF3JlyH8NgDK2vJ82c/HpISrKN9CEWEtAxYfnYY0T6uFfWdgzhQIU61Gfba01LKmZqDt3M14qrB0EQB6BFOA0EyfGB/btF0P1KBGMAgKCr3aY8sdJXHWkbVQg3FCrl6mlniPRl9aFtq5aJq0eauCqcyRAOi974CUM4IAhiJY7vNJDdDIN6RlJ2M1SXlRF9DC6lAeprfWat34Ieg72wYtKvXQpGA8DVqB8/WPk0hnAwxdfLbcemUUR61ZaTR09hCAcEQbjj+E4DQd+UsMS4ANPta7JSXt+bDgAeudHtKlImLltrc2kId1wUihEvruxX+SQAFMecxhAOlDg7y3a+0TQ7519fYwgHBEG44+BOA9k+DuvdVu5ifLDNSytLAzuruo9dvQaDMdgjfec+PUa1gkivyUrBr2mbIpM57Xxj9PzJTdN0MIQDgiDccHCngSA9NaJtqK/RxubwTYVhAwMmD1jwvM11IbzRaewYMoTDVwVLbx4/Ia4eCSKTOfXrGr7yqR7EnxjCAUEQDjiy00B2M0weGm+0zJL0GDxz4obGTev62GRbi0P4plPG6BWTfiXSW28uOL31c3H1SJOkdgEbF/Yj0hkL9ty5WymqHARB7AyHdRpIj+GxYfG+Xm6GPxkEY4iaMuZFDMbgMLgoFE8lfkqkDza+gyEcTJHJnKLCfN9c0p/4c866H7TlNeJKQhDEjnBYp4EgtWPQwB5q8s+HgzF0npG5PqBjgkjSEEEITupELsU87pW1XbNCXD3SJDLYe/vGpiUVT6z6/nrufXH1IAhiLzim00B2M/RMDPFUKsjtZDCG4Kupj89ajd+5dlQMQjgcxhAOlMhdZGQIhxfe+hlDOCAIwgbHdBoIeiQGp3QIItKVJaVNwRju+quv9X1q/XveYaGiqkOEZfW0MylF4wDgatSP76+cgyEcTPH1ciO/pr1qy8mjf2AIBwRBzOCAToNBNCe1u6sLAKzJStl0cDAAKHNj4iu7T1z2spj6EFsxbOmyflVPAcCdmDMYwoEOMvTTv7ZhCAcEQczggE4DQa+kkA7R/mAw7dHlfutkn55jXlqNwRhaDn2fnk0uxcQQDpQ4O8t2vzXm+ceabpOMBXt0tRjCAUEQahzNaSBflTKHtJfJnEiPwS1fPbjNjEeefVY8aYg4dMoYPdZ7FZH+qmDprZO/iKtHmvRJDlsxsymEw6Sl+xsaGsXVgyCINHEop6FO30Akxj8aF9LGk/QYlLkxQ9pPSZ48UTxpiJh0GD2S/CpmVvZzp/6TJa4eaZKcELhxYdPXtMct2oshHBAEMcWhnIbMJfuIxMAe6uZgDLlRTz72CgZjaOEoVEoyhMMhp3ePvPOOvrZWXEkSJCrM560XmkM43C+rFlcPgiBSw3GcBnJgYta4xPf29SbSftc7Tx//Mn61EoGHQzic9Pl814Y14uqRJhFB3tteG0Gkn9QcupZzT1w9CIJICsdxGgi6xAecuj6BSIdc7TF9/iv+7eLElYRICjLU9GX14S9eeqG2AjvhjXFVuJAhHJa+fezC1Ts4xQFBEIKHnIYoA8QSxA2im8GzvqJeMZ/YEnmtz8z17yr9/UTVhUgOF4WC7G/Ijj76yauLyvLyxZUkQQxDOKx5/5efTueKqwdBEInQ7DRERUVlG2B3fkNi0vq2ye8AgDIntnP+qEnL1oqtCJEuq6ed6Vc5EwDuxJx5++jo6rIysRVJETLU9Htfn8tYsKe+vkFcPQiCiI4jDE+88N6lxKT1RNqpQpXSOm3kipcwGAPCTN+5c0Z7LCfSr+9Nv3r4B3H1SBC5y0MhHMYv3ochHBCkhWP3TkNDQyPpMbjnth3p/0y/efPElYTYC4njx2a2aeqR2lb0YvHps+LqkSZ9ksNWzmoO4aCvx/kNCNJycWpsbGoCiOEJ8gejPyVL89LKvKghHaZ0GD1SXD3SpKSkpK6uLjg4WGwhUqSypJSIMo4gCCI10l1e6DVlgtgqmnExu8fp06cN/7x8+XJ8fLxgeiwm6OLg250OKfIjenWfpfP1OXsWXxYpuHfvnk6nu337tthCJEp/r5VHH6wTWwWCIIgxedduSOq5Zvc9DdXV1f9Zs6hL12GpY4eJrUW6FBcX19TUREREiC1EulSXlb37r5nelf5KZ5wNQ0t9Q2Nu8Dm/nPZOTnY/sikc5W6levfqNvfVYguRNCW+t+RVKh+dv9hCJE21U+WAEU+2S+smtpBmzPc0SJ9eU57u2LGj2CoQ+8bd23vUuHVt2rTx9fUVW4ukOX36dNd5XcVWIWnu379/586duDiMEMNETk6Om5tbQECA2EIkzaVLlyKio8VW8RDNToPRMku76GZAEARBEMRmPNTTgI4CgiAIgiB04MAkgiAIgiCsaJ4IiSAIgiAIwoCNJkISsyWMVmcA3wMifK34EHHlCGX0bunUkqk8exzSspeVQULQko/dLEaXt1FFsaw6K2tYshPLWAqz6PAdoK4E1WD93Ur35CXgZtwRVk8QEPXLVy2LBSleoMbd+loSsSFjXhXMe43xeC3ZvtLQ++QGgwz2HgPnmpHsunchhDlAXQmqwfq2mrRgtIXuT5bYbk6DoXpT6UZf1yQSVn5yk9IIuZEui0TuUiOMBBseju1rqSVger9xs0DAozCWGBYthAwr6yf7YXgUxi+GNwK3g3XI+8vw3Yau3eZg1t7riqgWyrZalCeaQHeW+D0NdL6P4XZevFFKywxKpA8vbiNYXktk2sbVZeh3Rz3shhsdgqlC6xsdo8ckpQyjna0sUTgoj8LwVw7iLaof04yWFmczrJdn0f1lXxgdl/V9vQ5cV7Z/ogmE+E4DHRbVAllrRlctpRHH8Bg4YH0tSf/RSPn8M91ovXEpe1fM8NJ4sbcswYuEAdOzxl48L/eXNC8b3oVZX1dSwKJqsfETTThs6jSQVSzNi8Dw9NtLS2cXvXZ2By93LC+dQEIgqRZfUjUDYjdNfPUdCgFdf7CIeqTQ+kn2fAmHdHsaLMXKC8hOz72lOqVwm1kP3UOL/FUkXUhLp0Vde3RjguyzWymAl+5DySLZI7K108Dj6CDDRjt66nOA7mJi7hDmpZZEr1jK1wsjVbwolOwdKxF4qR/RLydutMBWiJcxeIaNPM6EsCVmyzV7m9jjtSR+T4Ogw3jSHCDkQPbDU8zIUR5eDtCiYTkpVKmRi8BwZzL3Q9jjHSs0WD+8Y3f3lymUwihvPSvHoC06fKNZt7bHbLXwPobCrX7IM8LLBWZnESEtap5abFvm2LVk9qFFeVcY3cYcumSMbn4GCwwybA/zMLnp4LQt68e+LjwSx76/+AXrihl7rB97chosrTKJVLGNwVpijz3esbYE68cUvL/Yg3XFjJ3Wjz05DQjCI3Z6x9oMrB8EQUxBpwFBEARBEFbgp7ERBEEQBGEFOg0IgiAIgrDi/wE8otCR9vDdnwAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
diff --git a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_week.original.html b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_week.original.html
index 2cb03590a8..2912cce616 100644
--- a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_week.original.html
+++ b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_week.original.html
@@ -45,7 +45,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
diff --git a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_and_graph__ScheduledReports.generateReport_week.original.html b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_and_graph__ScheduledReports.generateReport_week.original.html
index e0aba48a2e..7e29ffa293 100644
--- a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_and_graph__ScheduledReports.generateReport_week.original.html
+++ b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_and_graph__ScheduledReports.generateReport_week.original.html
@@ -445,7 +445,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -545,7 +545,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAORElEQVR4nO3d728c6UEH8CeOHTvOOYmTtdc/rlFyvjuaO4HowRVdj2vp0WuhVRF3fVFQkXiBBAKpqk6oalUhEVWgIlR0L5DgFW/4A3qqCpwKVQuFSpRThUC6KiBtrIY6qS++S3OOnfV6vebFpPZm7V3P7sx41zOfz6tn7WeefTw7nvnuzPPMHNve3g5NFhYWokKlUgkAAD8x3PxiYWFBVgAA9jW0U5IYAIAOWs807JQFCACg2QOhoTko7Jx4WFpaaq6zvLw8MzPTocVqtTo0NHTixIlU+0l+bG1tVavVU6dO9bsjDK61tbWxsbHjx4/3uyMMqFqt1mg0xsbG+t2Rwhk6uEqXarVavV5PvVlyY2trq1ar9bsXDLRarba1tdXvXjC46vW63UhfDB9YY35+vsPLvba3t0dHR0ulUqJ+kV9ra2uNRmNubq7fHWFwVavVqakpp6NoZ2VlZWNjw27k8KV/pgEAyKXdMw2VSsVASACgnbYDIQEAmrk8AQDEIjQAALEIDQBALH0LDc2DLlt+uO+vOiwFAByCQTzT0GE85s6vpAcAOGR9Cw0tMzyDJ2YBwGA7+I6Qh28nPey9b0T0q5arGO4wAQCHYBBDQ6TlxEPzyyglNF+qaFcTAEhLCqHhpZdfjV/5K6+8uFNuPvYfeKSPnwMkBgDIwmGPabhy5UrMmlGkiDPgMX5NAKBnKZxp+MorL165cuXSpUvRy9u3bw8PD09MTOxbeXGxi5abRzbEOQ8RpyYA0Jt0xjQ0nz9YWlqK/2jsnTGMB06zjDNSIX5NAKBbg3ifhkj8yw0uTADAIRjc2ROdJ1I2/9aUSwA4BP0PDXuP8c1TKztUblcGALIwuJcnAICBIjQAALEIDQBALEIDABCL0AAAxCI0AACxCA0AQCxCAwAQi9AAAISXXn71pZdfvXN3o0MdoQEAiu7eRj0qjI4c71BNaACAorv55mpUGBvt9HwJoQEAiu7mylqcakIDABTdX/zt6yGE3/iVy52rCQ0AQAghzE6d6lxBaAAAQghhtvRQ5wpCAwAQQghz00IDANDezVt3o8L42EjnmkIDABTaD5ffiVlTaACAQvvS33w3hPCJDz1+YE2hAQAIM+cPmDoRhAYAIIQwUxIaAID2Go3tqDA3PXFgZaEBAIrr9jvVqDB5euzAykIDABTX0k/mW8YhNABAcV35q38LIfzaLz0ap7LQAABFVz4/Hqea0AAARVc+d/DUiSA0AEBh7UydmJ064KkTEaEBAAqqulGPCqVJlycAgPaWbq1GhZHhWHlAaACAgvrcK/8SQvjoc4/ErC80AEChlSZPxqwpNABAoU3HmzoRhAYAKLg4z7eMCA0AUESb9UZUiPN8y4jQAABF9KO31qLC+NhIzEWEBgAoos/82Te6XURoAIDi+s1fvRy/stAAAMU1Fe9ekBGhAQCKK/4oyCA0AEABbW3dnzoxF+9RVRGhAQAK5/ZqNSqcfmg0/lJCAwAUzo037/awlNAAAIVz5a+/E0L4xAuPd7WU0AAABTV1toupE0FoAIDCmjkvNAAA7TUa21Gh3M18yyA0AEDRrFc3o8K5M840AADt3Vy5/6iqkeHuYoDQAADF8rlX/jmE8PEPLHS7oNAAAEVU6uapExGhAQCKaPqc0AAAxDBb6uKpExGhAQAK5N5GPSqUu7xJQxAaAKBQVt6+P3Vi9MRwt8sKDQBQIJ/582+GED78zMUelhUaAKBwepg6EYQGACigqbMne1hKaACAwpmZ6nrqRBAaAKA4NuuNqDA/LTQAAO29fedeVBgfG+lh8QemWyws7N6GulKpJOkWADBofv9P/jEqDA0d62Hx3dCwsLDQHBRaXgIA+fDi84/1tuDu5QkRAQCKoIenTkSMaQCAYpntaepEaBnTEJqGNeyceLhz505zhbt3754+fbpDi7VabXt7e3V1tbcOkXvVarVer9tC6KBer6+vrzcajX53hAFVrVY3NzftRno2cfJYb2uvNTTsZIWdMQ03btxorrC4uNg8XnKvjY2NoaGhtbW1HnpDEdTr9Xq93rJdQbPokDA83PWN8SmIzc3NRqNRq9X63ZEjZu3e/UdV3bv71o31ZAMh27l8+XKHl3stLS2Njo6WSqUeekMRrK2tLS8vP/LII/3uCIPr2rVr5XL51KlT/e4IA2plZWVjY2N+fr7fHTlirl57K4T/DSE8cfndvbWwO6ah8/kDAOBI+8JffjuE8JH3Xey5hd0zDZVKxX0aACDfZko9joIMLZcnBAUAyLfZUu8X/ky5BIAC6Xm+ZRAaAKAI1qubUWFOaAAAOlh+6/6tEI4f7/3QLzQAQP794Ze/FUJ49mcTzVMVGgCgKGamEt3+RGgAgKKYTzCgIQgNAFAcc9MTSRYXGgAg57a27j/+bV5oAAA6uHV7PSqcHE30HDihAQBy7g/+9J+iwtBQLw+33CE0AEAhfPS5pI8XFhoAoBAeTjagIQgNAFAQc9OJ5lsGoQEACuLhsjMNAEB7t9+pRoVzZ04mbEpoAIA8+50/fi2tpoQGAMi/Dz9zMXkjQgMA5N9MsqdORIQGAMi/hI+qiggNAJB/yedbBqEBAHLs3kY9KsyWhAYAoL1Pff5rUSHhUyfuN5K8CQBgkH3wvRdSaUdoAICcmy2dSqUdoQEAcq58XmgAAGJIZb5lEBoAIPdSubNTEBoAIK+W3lyNCuNjI6k0KDQAQD59+kvfCCG8/+felVaDQgMA5Nn0ufG0mhIaACDPps8LDQBADHNp3EA6IjQAQA41GttRYTalqRNBaACAXHr7zr2oMHl6LK02hQYAyKHf/eLXU29TaACA3Pr15x9LsTWhAQBya+rsyRRbExoAILdm0ps6EYQGAMifpqkT6TzfMiI0AEDeVDfqUeH82dTu7BSEBgDIn9/6wt9FhZHhNA/0QgMA5NPH3r+QboNCAwDk09RkmlMngtAAAHmV4vMtI0IDAORT+Xya8y2D0AAAObNZb0SFcnoPxY4IDQCQK5/87FejwvjYSLotCw0AkEMfed/F1NsUGgAgh86dSXnqRBAaACCXUp86EYQGAMil8vk0nzoRERoAID92pk7MT0+k3rjQAAD58ePValSYOHUi9caFBgDIj9/74tdDCM+/90IWjQsNAJA3506PZdGs0AAAeTN1Lv1RkEFoAID8yWK+ZRAaACA3Go3tqDA75UwDANDe2r1aVJg8nf7tIIPQAAC58dt/9A9RYWQ4k+O70AAAufLxDzyaUctCAwDkSmkyk2sTQWgAgJyZyWbqRBAaACBnyqVMpk4EoQEA8uHeRj0qZPF8y4jQAAB58KnPfy0qjJ4YzugthAYAyI8XnrmYXeNCAwDkx9RkVqMgg9AAAHlSzmzqRBAaACBPshsFGYQGAMiBzXojKjxcfii7dxEaAODI++RnvxoVxkZHsnsXoQEAcuLZ98wPDR3Lrn2hAQByYnoywwENQWgAgNwon89w6kQQGgAgN2aynDoRQnjgTpMLCws75UqlkukbAwDpmpueyLT93dCwsLDQHBRaXgIAg+mll1+NCpOnRzN9I5cnACAP3vPu6ePHsz2sCw0AkAeZPnUikv7TMz/95f9IvU3y6L/63QGAXJkpZXgvyMjBoeH1119vfnn16tUnnngis/4AAL24tnj9e997J9O3ODg0PP300x1e7vXLV6uN7aEL86Uk3frmd3/w049PnT9zMkkjf/+vlQ/9wsUkLdy8tfrD5dVffOpdSRr5/rWV2ubWU5dnkjTy7/99o3T25KMXJpM0ktZa/eDPX0hyx7HrN3/8g6XbLzz7WJJuWKstfnTr7v+9ufpcXrbV1779Pz/zU+XZqTNJGrFWW+RpW/3P7y9Va5vPPnUpSSMDsla3trZe+85iwqNVdaM+8dCJjz336Mmx9C8gNDu2vb0dldKaPbG4uDg+Pl4ul9PpILmzurp6/fr1J598st8dYXC98cYbFy5cmJjIdvIYR9fy8vL6+vqlS4lCAz3YjSSVSsV9GgCAdh44jyEoAADtmHIJAMSyO6YBAKCDB24jHR68QpHKEIeEze5buV0LGf0JR92+qyXhBxpJcavoqm+2isOR8F7yydfzYe4r2v2QZh4vwP3QEG0Kzf9gqUymSNjsvpXbtZDRn0CzjLaK5l/11gdbxaBJvp4Pc1/R7ofF0fKHpx4WEybIdtG/56biLCuG7ut+aNj7V6XydyZspKvFc/bBpGvvDjSy9x+guVpGB9R2bcbca9sq+qJlV9vyYWW0A4kv+VZhU0llDXSV3g5f/LcWQ9vJ9i4QDLLB+U/u+7tzoL1R8hDyJf3V+Vt1ONyw2HzMbjket0u0e7/3x++eGNrOAaEh/pmcrNkrJdTuZEO7avtWrmRzM4+eP1xbRR/FWfN92YHYKlLR+Vv1vnX6pXOibWY8U3IHhIYOG8e+Z11iHpO66WE+Lwv1Rczc0MGBJyd62ypaFow/FtJWcWh6O8uaZAdiX3HIYh5Q46/enQ89oy8bHbR7i97OrQ5INhoQvV+e6Hkl7nuaqx2f1tHS24fV7X+yreKQtXy5TKXNOJ+gfcVh6jzmqSst6S2tLxs74SPO4qkQQ/dqGxoO4T/wwNNc9gKpiznScEDWvK3i6Er3Y7Kv6ItDu2iY1unPdNODjWpfu1MumwuVSiWVE0p7m23+YbdnrTt3LKM/Icd6WD/ZbRW9tbDTDVtFpnq4UpDuppL1vqLdD9kR8wia9YE2i8bF0K4Myh0hfULsZavor8Fc/4PZq6Ou3YFzp9wSrZp/2G6Rdgv29j2hw3G9pfEOW0i7EJnwD9l3tRy4ro6ogQgN9gLsZavouwH8CAawSxx1NqquDERoAAaKU/QUhMTQLaEBAIjFo7EBgFiEBgAgFqEBAIjl/wG0wxwGKo8tpwAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -631,7 +631,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGxElEQVR4nO3dv4scZQDH4TnZNMFKsEmKFINYWMZWRUGwMZAi+AcI1iJoYZUmgggGa7GzskhjaWFhYeNiJ4hOY7iNIMFgocIJa7E4TuZuZ793t7ezM/M81c2PvX0DezufzDuze7BcLgsAgE2e6HsAAMAwiAYAICIaAICIaAAAIqIBAIiIBgAgMvVoKMty3coTN3U8CgDGberR0KGqqo2b1AMA0zH1aKiqqnXgL8uyIxcAYLJmfQ9gFz747LvWmvfffH7jo+p6aFZFvaaujXprqz+UBwAjM4lo+On+H0dHR/XipUuXDg8Pr169mjy2deKhubiqhOZUxbo9AWAEpjI98WdDURSLxaLe1DxDsPFIn3eAYgBgZKYSDWe2Sorkgsd8TwAYoklMT5xT88qG5DxEsicADM5UouHy5csdW+sZio23WSZXKuR7AsCATCIabr5SLg4Pz/bY/NivEgAYt0lEw40XrxXFtbM9tvtGyuZWt1wCMG4Hy+Wy7zEAAAPg7gkAICIaAICIaAAAIqIBAIgM/u4JNyzAnvNHCgPS/fEBw44G3xEFe84fKQzIxm9CMD0BXCCJAEORNL1oAICpC88CigZgR8xNwH7K/zaHfU0DMAi++hX2XPNqho6GEA3AxXKCAfZcfrWy6QngAikGGJNhn2nwxZKw/1o3cfk7heHyLZcAQMT0BAAQEQ0AQEQ0AAAR0QAAREQDABARDQBAZCTRMJ/P+x4C0GWxWCwWi75HAXTZeDAdSTQAABdNNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAARGZ9D2Br5j/82vcQgLUePvy9KIoHj/xHBfbXz4d/Xb/etcN4ouHOp9/2PQQAGLY3bnRtVf0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAkbNEQ1mWZ36+8zwWAOjRrP6pdTivqmrngwEA9khZls0emDW3NTe09gMAJuX45MDsxP3WPaaVEfWm1fpVZ7RWnvisAMA+ax3TVzZEQ+t8Q2uxmQXNbmg9X+s3nO9fAQBcrHWzDVu+e8KMBgAMWsf1CbPWfvXPyeF/i6cNqqdfONX+5W/fbOupAYCm5vG92RBrL4RMfqOrFgBgZDouS9jphztpCwAYrg0XQraunGxdBZlEQOt+Ct0AAAN1sFwu+x5DUZz7mob5fH7n81+2OiIAmJx7d292bPXdEwBAZPOHO+2GuyEAYM850wAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQmfU9gK25d/dm30MA1losFkVRXLlype+BAGvN5/PuHZxpAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAyKzvAWzNux9/3fcQ2KaP3nm57yEA8JjxREN1/1HfQwCAMTM9AQBERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABCZ1T+VZdncUFXVLsdx8Ozt5uIXn9y69dpz9eI/X37191vvNXd48sH3uxkY/Vq9LHf8agTgRLPmgrdm9kpZllVVtXIWgL7MOrbVb9mrmKjfu+vF5ht6HRzNt/jWAwtdwml4tQDsla5oKP4rg9XPzSxodkNzZXPN8d9wfBEAGIrHouH4KYHuA7zDPwBMxymuaTjz1LI5aQAYgQ3TE7XWTMSpnsMJCQAYgV1/ToOzDgAwUOmZhvDOt9ZuVVUdX3PaITJZ9SvHpzUA7IP/o+H4O3JrTbi48fdAyCsHYK/4GGkAICIaAIBIek3DRVv+eLtj6+z1V33ZBAD0y5kGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgMis7wFszYdvv9T3EABgzMYTDc9ce6rvIQDAmJmeAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAIHKwXC77HgMAMADONAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBA5F/BNO3dtqRi2AAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -726,7 +726,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -794,7 +794,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -864,7 +864,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAGU0lEQVR4nO3dsW7cdADHcQddl4yM6dDB4gnKDIIHqNSJB+AFEBILe5EQEn0AxMbcV2Bk4VYW8EIVw1JRMcCQ4RgCxufL2b86bXz/u89nSmxf8h9y8ff+f/vubLPZVAAAU95aegAAQBlEAwAQEQ0AQEQ0AAAR0QAAREQDABA5hmio63rfxht3jTwKANjnGKJhRNM0k7vUAwAkjiEamqYZnPjruh7JBQBghtXSA0h98e2Pgy2ff/zu5KO6euhXRbelq41u76A/lAcAdIqJhp+f/3l1ddV9e+/evcvLy/v37yePHUw89L+9roT+UsW+IwHgxJW0PPFXT1VVbdt2u/ozBJNn+rwDFAMAdEqKhtmukyK54DE/EgBOTTHLE7fUv7IhmYdIjgSAk1JSNJyfn4/s7VYoJm+zTK5UyI8EgBNRTDQ8/rBuLy/nPTY/96sEANinmGh49N6Dqnow77HjN1L297rlEgD2OdtsNkuPAQAowEncPQEA3J5oAAAiogEAiIgGACByEHdPuGEBiuYpDEdj/K0Hlo8GnxEFRfMUhqMx+SkKlieAW5EIcByS4hcNAHDqwjlC0QC8NtYmoET5M3f5axqAI+CDYaFo/asZRhpCNAC3ZYIBipZfy2x5ArgVxQCnY/mZBh8sCaUb3KblWQzHyqdcAgARyxMAQEQ0AAAR0QAAREQDABARDQBARDQAAJEDiob1er30EID52rZt23bpUQDzTZ6IDygaAIBDJhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKrpQewZf3T70sPAZjpxYs/qqr67aWXIlCqXy7/fvhw7IDDioYn3/yw9BAA4HR99Ghsr9cEAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAAJHXFg11Xc/YBQCUYjW+e3C+b5pm8vjJYwCAIgxO6xPRUG2HwmQTKAYAOA67CwXT0TD5g26siu6Abu/uFgDgMF2f0AfdMCcaBvMNu9MP41ssYQDAIdt3pr6juydUAgAUYeS1/fRMw76ViBHdhIZWAIDi9E/9/YZ4tQshc92VDboBAAoycgWCN3cCACJzLoQcXE65O5fgRgkAOD5nm81m6TH8a71eP/nu16VHAQCn69nTxyN7LU8AABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBAZLX0ALY8e/p46SEAM7VtW1XVxcXF0gMBZlqv1+MHmGkAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAIDIaukBbPns6++XHgJv0FeffrD0EACY77CioXn+cukhAAA3szwBAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAELmLaKjr+g5+C6Wo69qfBECJVt1Xg//jTdPc+WA4fnVdN00jGgBKtOp/IxR40/yNAZRrNbKve1F4/Y++/+qw29J/1didD3aP7G902gCAEo1FQ/VfFvS/GNk+iIwbf87ujwIAirAVDbszBJNn9/D0rxIAoHSvcE2Di9cA4JRNLE/0mS0AgFM2830azDowT/cmDd6tAaA46UzD4N76kVmH/EhOkL8HgHL9Hw27/80HW/IDxh/otAEAJfLZEwBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABBZLT2ALV9+8v7SQwAAbnZY0fDOg7eXHgIAcDPLEwBARDQAABHRAABERAMAEBENAEBENAAAEdEAAETONpvN0mMAAApgpgEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIv8AOfLTtBddQvoAAAAASUVORK5CYII="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGU0lEQVR4nO3dsW7cdADHcQddl4yM6dDB4gnKDIIHqNSJB+AFEBILe5EQEn0AxMbcV2Bk4VYW8EIVw1JRMcCQ4RgCxufL2b86bXz/u89nSmxf8h9y8ff+f/vubLPZVAAAU95aegAAQBlEAwAQEQ0AQEQ0AAAR0QAAREQDABA5hmio63rfxht3jTwKANjnGKJhRNM0k7vUAwAkjiEamqYZnPjruh7JBQBghtXSA0h98e2Pgy2ff/zu5KO6euhXRbelq41u76A/lAcAdIqJhp+f/3l1ddV9e+/evcvLy/v37yePHUw89L+9roT+UsW+IwHgxJW0PPFXT1VVbdt2u/ozBJNn+rwDFAMAdEqKhtmukyK54DE/EgBOTTHLE7fUv7IhmYdIjgSAk1JSNJyfn4/s7VYoJm+zTK5UyI8EgBNRTDQ8/rBuLy/nPTY/96sEANinmGh49N6Dqnow77HjN1L297rlEgD2OdtsNkuPAQAowEncPQEA3J5oAAAiogEAiIgGACByEHdPuGEBiuYpDEdj/K0Hlo8GnxEFRfMUhqMx+SkKlieAW5EIcByS4hcNAHDqwjlC0QC8NtYmoET5M3f5axqAI+CDYaFo/asZRhpCNAC3ZYIBipZfy2x5ArgVxQCnY/mZBh8sCaUb3KblWQzHyqdcAgARyxMAQEQ0AAAR0QAAREQDABARDQBARDQAAJEDiob1er30EID52rZt23bpUQDzTZ6IDygaAIBDJhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKrpQewZf3T70sPAZjpxYs/qqr67aWXIlCqXy7/fvhw7IDDioYn3/yw9BAA4HR99Ghsr9cEAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAAJHXFg11Xc/YBQCUYjW+e3C+b5pm8vjJYwCAIgxO6xPRUG2HwmQTKAYAOA67CwXT0TD5g26siu6Abu/uFgDgMF2f0AfdMCcaBvMNu9MP41ssYQDAIdt3pr6juydUAgAUYeS1/fRMw76ViBHdhIZWAIDi9E/9/YZ4tQshc92VDboBAAoycgWCN3cCACJzLoQcXE65O5fgRgkAOD5nm81m6TH8a71eP/nu16VHAQCn69nTxyN7LU8AABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBAZLX0ALY8e/p46SEAM7VtW1XVxcXF0gMBZlqv1+MHmGkAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAIDIaukBbPns6++XHgJv0FeffrD0EACY77CioXn+cukhAAA3szwBAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAELmLaKjr+g5+C6Wo69qfBECJVt1Xg//jTdPc+WA4fnVdN00jGgBKtOp/IxR40/yNAZRrNbKve1F4/Y++/+qw29J/1didD3aP7G902gCAEo1FQ/VfFvS/GNk+iIwbf87ujwIAirAVDbszBJNn9/D0rxIAoHSvcE2Di9cA4JRNLE/0mS0AgFM2830azDowT/cmDd6tAaA46UzD4N76kVmH/EhOkL8HgHL9Hw27/80HW/IDxh/otAEAJfLZEwBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABBZLT2ALV9+8v7SQwAAbnZY0fDOg7eXHgIAcDPLEwBARDQAABHRAABERAMAEBENAEBENAAAEdEAAETONpvN0mMAAApgpgEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIv8AOfLTtBddQvoAAAAASUVORK5CYII="
height="200"
width="700"
margin="0 auto"/>
@@ -955,7 +955,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAGOElEQVR4nO3dv4/TZgDHYd9xtwA7EgwM/gcqUTFWp05MlZA6MlSqdH8CQ3e6wlypEkPHwnwDI90a1L2KKrU6Dx0j6BJQOkSkbi4/vhcCr508z4CS2L68OmT8iV+bHEwmkwoAYJ3D0gMAAPpBNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0XA5dV0ve3HhohVbAUC/iIatGQ6HaxepBwD6SzRcznA4nDvw13W9IhcAYGcclR5AF33/469zr3z37edrt5rVQ7sqZq/MamO2dK4/lAcAHScaFvj9r9F4PJ49PT4+Pj8/v3XrVrLt3ImH9tNpJbSnKpatCQAdZHpisX9aqqpqmma2qH2GYO2RPu8AxQBAx4mGLZsmRXLBY74mAHSB6Ynta1/ZkJyHSNYEgOJEw2JXr15dsXQ2Q7H2NsvkSoV8TQAoSDQscP/Lujk/32zb/NivEgDoF9GwwFdf3K6q25ttu/pGyvZSt1wC0C8Hk8mk9BgAgB5w9wQAEBENAEBENAAAEdEAAET27u4JNyxAR9gZoVPaN/ctW2e/osF3REFH2BmhU8J90PQEUIBEgO7Iq32/zjQAABeF04WiASgmmUMFPoFwulA0AMXM/mFyTQP0gmsaAICIaAAKaE+gAn2xd19Y5dZw6Ag7I3RHuD/uXTQAAJsxPQEAREQDABARDQBARDQAABHRAABERAMAENnTaBgMBqWHAFRVVTVN0zRN6VEAVRUcHPc0GgCAyxINAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAESOSg+gmB9+/q30EIDqzZs3VVVdu/Z36YGwm06//qz0EHbK/kbD2S9/lB4CAB+XaNgu0xMAQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAARDaMhrqutzsOAKDjjmaP6roeDoftZRdfAYB+ufgp16FtY0frV+mJ8Xh8dnZWVdW9e/eOj49LDweArlAJ27J+emLaaPV7K1ZYuFrd0l5/2eO1b7fM6enpN+/lWwEAoehMQ3ueYm7OYtmi6eMVK2/2dsu8e/duNBq9ePHi9evXJycnT58+dbIBgKn2R1BnHT5EFA3LfsVzR/Twb2IWExf/vNTPabty5cqzZ8/G4/GDBw/u3r2rGACYcrneFm1+TUMHf+9Pnjx59erVy5cvSw8EAHbQ5v9Pw/T0wBaH8uEODw8fPnx448aN0gMBgB30XzTMRUByImHjbmjPR1y89GFjo9Ho7du3H/5zANgZXft822v/m55oR8BlL1BYsbT9dNNxRk5OTq5fv/5R3wKAfvnER6LddjCZTEqPoYDBYPDopz9LjwKAj+v54/ulh9Ang8Hgzp07K1bw3RMAQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBA5Kj0AIp5/vh+6SEAVdM0VVXdvHmz9ECA9ZxpAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACIHk8mk9BgAgB5wpgEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIv8CLZesFgJjzocAAAAASUVORK5CYII="
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1025,7 +1025,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1116,7 +1116,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1186,7 +1186,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1254,7 +1254,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAFsUlEQVR4nO3dMY7jVADHYQ/KNLM3mCm28AWQhpqCAyCNxA2QOAQ9tNsj0VGirbnAdkSiRxESKC4okYZmClNEGJNJ4n+Ml2dPvq9YJfHzztOssv7Fz1au2ratAACGfFB6AgDAMogGACAiGgCAiGgAACKiAQCIiAYAICIazlPX9bEXD246sRcALItomMxmsxncpB4AWC7RcJ7NZrN34K/r+kQuAMCLsSo9gTn6+tsf91758vOPBvfq6qFfFd0rXW10W/f6Q3kAMHOi4YCff/vj6empe3p9fb3dbu/u7pJ990489J/uKqG/VHFsJADMkOWJw/7sqaqqaZpuU/8MweCRPu8AxQDAzImGie2SIrngMR8JAHNgeWJ6/SsbkvMQyUgAKE40HHZzc3Nia7dCMXibZXKlQj4SAAoSDQc8fFI32+24ffNjv0oAYFlEwwGffvy6ql6P2/f0jZT9rW65BGBZrtq2LT0HAGAB3D0BAEREAwAQEQ0AQEQ0AACRi7t7wg0LMBPejDAr/Zv7jo25rGjwHVEwE96MMCvhe9DyBFCARID5yKv9ss40AADPhcuFogEoJllDBf4H4XKhaACK6f5jck0DLIJrGgCAiGgACugvoAJLcXFfWOXWcJgJb0aYj/D9eHHRAACMY3kCAIiIBgAgIhoAgIhoAAAiogEAiIgGACByodGwXq9LTwGoqqpqmqZpmtKzAKoqODheaDQAAOcSDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABEVqUnUMw33/9UegpA9fj4WFXVq1e/l54IL9MXn31YegovyuVGww/vfik9BQDeL9EwLcsTAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAERGRkNd19POAwCYuVX3qK7rzWbT3/b8FQBYluefch3aRlsNDwGAJVMJUxlentg1Wv23EwMODqt7+uOPPR78cQBAEdGZhv46xd6axbFNu8cnBo/7cQBwrv5HUMeU/yKKhmO/4r0jevgv0cXE8z/P+nsAYJDL9SY0/pZLv3cAuCjjo2F3emDCqQAAc/ZPNOxFQHIiYXQ39Ncjnl/6AABT8fl2Qv+6pqEfAedeoHBia//p2HkCwBiORBO6atu29BwKWK/XX333a+lZAPB+vX3zUHoKS7Jer+/v708M8N0TAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRVegLFvH3zUHoKQNU0TVVVt7e3pScCDHOmAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIhctW1beg4AwAI40wAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAkb8A/N5+b6pDTxIAAAAASUVORK5CYII="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFsUlEQVR4nO3dMY7jVADHYQ/KNLM3mCm28AWQhpqCAyCNxA2QOAQ9tNsj0VGirbnAdkSiRxESKC4okYZmClNEGJNJ4n+Ml2dPvq9YJfHzztOssv7Fz1au2ratAACGfFB6AgDAMogGACAiGgCAiGgAACKiAQCIiAYAICIazlPX9bEXD246sRcALItomMxmsxncpB4AWC7RcJ7NZrN34K/r+kQuAMCLsSo9gTn6+tsf91758vOPBvfq6qFfFd0rXW10W/f6Q3kAMHOi4YCff/vj6empe3p9fb3dbu/u7pJ990489J/uKqG/VHFsJADMkOWJw/7sqaqqaZpuU/8MweCRPu8AxQDAzImGie2SIrngMR8JAHNgeWJ6/SsbkvMQyUgAKE40HHZzc3Nia7dCMXibZXKlQj4SAAoSDQc8fFI32+24ffNjv0oAYFlEwwGffvy6ql6P2/f0jZT9rW65BGBZrtq2LT0HAGAB3D0BAEREAwAQEQ0AQEQ0AACRi7t7wg0LMBPejDAr/Zv7jo25rGjwHVEwE96MMCvhe9DyBFCARID5yKv9ss40AADPhcuFogEoJllDBf4H4XKhaACK6f5jck0DLIJrGgCAiGgACugvoAJLcXFfWOXWcJgJb0aYj/D9eHHRAACMY3kCAIiIBgAgIhoAgIhoAAAiogEAiIgGACByodGwXq9LTwGoqqpqmqZpmtKzAKoqODheaDQAAOcSDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABEVqUnUMw33/9UegpA9fj4WFXVq1e/l54IL9MXn31YegovyuVGww/vfik9BQDeL9EwLcsTAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAERGRkNd19POAwCYuVX3qK7rzWbT3/b8FQBYluefch3aRlsNDwGAJVMJUxlentg1Wv23EwMODqt7+uOPPR78cQBAEdGZhv46xd6axbFNu8cnBo/7cQBwrv5HUMeU/yKKhmO/4r0jevgv0cXE8z/P+nsAYJDL9SY0/pZLv3cAuCjjo2F3emDCqQAAc/ZPNOxFQHIiYXQ39Ncjnl/6AABT8fl2Qv+6pqEfAedeoHBia//p2HkCwBiORBO6atu29BwKWK/XX333a+lZAPB+vX3zUHoKS7Jer+/v708M8N0TAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRVegLFvH3zUHoKQNU0TVVVt7e3pScCDHOmAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIhctW1beg4AwAI40wAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAkb8A/N5+b6pDTxIAAAAASUVORK5CYII="
height="200"
width="700"
margin="0 auto"/>
@@ -1324,7 +1324,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF2UlEQVR4nO3dP2rkVgDHcTnYjfcGdrGFLhBw6hQ5QMCQGwRyiPRJu30gXcqwdS6QLgPpwxBIGBUpA07jQikMQqvxvPmhmVmNNJ9PtaM/9sPD7PuiJ9lXbdtWAAD7fDL1AACAeRANAEBENAAAEdEAAEREAwAQEQ0AQORyo6Gu610bX91VOAsALsHlRkPBer3eu0s9AHBpLjca1uv1YOKv67qQCwBw4a6nHsBpff/jb4Mt33792d6zunroV0W3pauNbu+gP5QHAIu08Gj44+9/n5+fu5c3Nzebzeb+/j45d3Dhof/ypRL6SxW7jgSAxVj+8sR/PVVVNU3T7epfIdg70+cdoBgAWKTlR8NoL0mR3PCYHwkA87Xw5YkD9e9sSK5DJEcCwEwtPxpub28Le7sVir2PWSZ3KuRHAsDsLDwaHr+om81m3Ln53K8SALgEC4+GLz9/W1Vvx51bfpCyv9cjlwBcgqu2baceAwAwA56eAAAiogEAiIgGACAiGgCAyIyfnvDAApw/n1OYi/4jgbuOmWs0+BtRcP58TmEuwo+n5QngVCQCzEIe9HO90gAAHEu4kigagNNKFkqBaYUriaIBOK3ufx/3NMDcuacBAIiIBuBU+qukwALM+A9Wef4bzp/PKcxC+FGdcTQAAB+T5QkAICIaAICIaAAAIqIBAIiIBgAgIhoAgMjso2G1Wk09BGCPpmmappl6FMAee6fU2UcDAPBxiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAItdTD+AIfvj596mHAJQ8PT1VVfXmzT9TD4RL8c1Xn049hGVaQjT88uufUw8BgDMiGk7E8gQAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAESuB6/ruq6qar1eD7a86La/urF/yvbG7RN3fc3wuwDALoXphtE+iIaXyb7/gx5M/90B2xv7Lwvfb/CedQdvd0b5uwBAmVnj6D5Yngh/voXDCgGxHRPdwYIAAM7fcHniENtzf3dZYm8WWIkA4LjMLEd3aDSMvlowOH57JWKwUOL9BiBXXvJmnPHRUL5lsnt7kssMu76+exoA4HyMjIZXVyJe3ZvcOwkAnL8xv6fBlA/AmSs/ysc4w0cu+/8o3FgweDMKv5Vhe5Fi1/2Sg6/mngYARjOJnMJV27ZTj+Egq9Xqu5/+mnoUAJyR9+8epx7CLK1Wq4eHh8IBfo00ABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAELmeegBH8P7d49RDAEqapqmq6u7ubuqBAAdxpQEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIXLVtO/UYAIAZcKUBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACL/A8r4vHqOth9eAAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -1392,7 +1392,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1462,7 +1462,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAI/0lEQVR4nO3dW2xkdR3A8f85M51el12uLrsY0DEiIImAFwICkReQeAlxQ3zSEBOVkBgNxgeJJD6okcWg8U0lvuhGI/GJBxLRAIJitITLw6rsiOyyA2730r20u+20c3yolqGw09+23Z3OzOfzsOnMnGl/bTJ7vj3/czpZURQJAGA5eacHAAC6g2gAAEJEAwAQIhoAgBDRAACEiAYAIKTfo6FarZ7szrd9qM2zAKC39Xs0tFGr1ZZ9SD0A0D/6PRpqtdqSHX+1Wm2TCwDQt8qdHuBM+O5Df1tyzze/8MFln7VYD61VsXjPYm0sPrqkP5QHAD2mL6LhpT1HGo3G4s2BgYG9e/du3bo18twlBx5aby5UQutSxcm2BIAe0C/LE9MtUkr1en3xodYjBMvu6eMdoBgA6DH9Eg0rtpAUkRMe41sCQDfqi+WJVWo9syFyHCKyJQB0nX6JhpGRkTaPLq5QLHuZZeRMhfiWANBF+iIabr+5Wt+7d2XPje/7VQIAva0vouFTN16c0sUre277CylbH3XJJQC9LSuKotMzAABdwNUTAECIaAAAQkQDABAiGgCAkK6/esIFC7DOeZFCV2i9GPBk23R3NHiPKFjnvEihKwRfm5YngNNIIsD6F6/57j7SAACsXnAZUTQAp11krRTooOAyomgATrvF/4Cc0wBdzTkNAECIaABOo9aFUqDbdf0bVrkEHNY5L1JY/4Kv066PBgDgzLA8AQCEiAYAIEQ0AAAhogEACBENAECIaAAAQnokGsbHxzs9AtBOvV6v1+udngJoZ9mdaY9EAwBwuokGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAkHKnB1gzP3n4uU6PAJzU1NRUSml0dF+nB6FffHHbBzo9Qg/qnWh49OmXOz0CAOvFFdXzrr/qok5P0WssTwAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAId0QDTNPFId/0OkhAKDflTs9wDKKmRezI9uzudlU+Uga/minxwGA/rVmRxqq1Wq1Wl3lJynmporZA633ZId/muZm0vx8OrC9mP3XKj8/ALBibxxpWLLLr9Vq1Wq1VqtFPkt8yzaKxlT22B3FlXelueE0MpouuDbNv5oO/zmVhlJWSelY9vq3igvuS5WLsnx0lV8LgJ731l9lV7+r6nNvWp5Y8tM80z/cx76f/j6eTf+4OPha86bvvfqX4weebM4cuveCD//p3Tc+lWVjKZvI9v+8GLk4nXPXGR0MgO6kEtZWu+WJhUZr/Tf9fxmidTFicYPWD966wVs/blXs35s98at0pJxefj7L982Of+OFB2r1Z0aO/OPaf+64+/H7vz57KE+zpTT5fDr2x9T49+q+awDglIVOhFxcfViyDLFws3Uho/0GbVYxsmcfT5N52lBO5w+kwTTcmPz4V27ZuevLO3/31crcwGW3PJONNIr9g2lDSjOHiulnso2XrObbBqAftP6m6qjD6r0pGk72wz0DP+hiVy07NpQmsuJdJ7JNxczQ2bsmPra7efmhkaGh+ewPD3zt87/5RPHa+Wmmko3NpBO708bTPREA3W3JzmtNTr/rc+3OaXhbK7tEYtnTKpv7itKxwTSfZ4+Ud9849sNf70jnnj08Who+a35kOs03ByZ2nnN+c644PFp6x2Qanl3BDADAapzy32lYWaYtuzwxl72zdGwwNUppsDzx/Ob/NF6vlKePptGhvHJWo5Ea8+dkteZrl+bnThYH8mx4bAUzAACrsaq/07D6P8ywqLjyqrnJDenoUDo6dPXEnvPGXpja//rU4frhyT37Dky897IdlYPN0vGj2dTxYvdAqrx/rb4uAL1qDXdSLDi1Iw0LRwtab0Y2WDzA0OZgw+Atlx/69vs2Hnspn5nNjg/cP/zLHbM3PDf5nlSZveHCFz5zyWPprxfmo83m1MBcvrmy9bpTGhuAPrTsPotTlRVF0ekZ/mf6oaeP3/fQ2LlHS6XZvDSXDcxm5RMpb6ZyOeVFGk7NjdmJ+bMGv3RX6abbljx3fHz8O7/Y3ZGxAViH7vnch66/6qJOT9FlxsfHr7nmmjYbrKP3nhi+87qZZ185+PDvRzfNVAbm80Yjyzbk+VzKm1k23ziYnXhlZOiOm0s33NrpSQGgH62jaMjybNOPPju1ZdPBBx/JS8fLg5XKQDPPm83UnGvkqVnZcPcnK/d8OuXd8M6cANBz1lE0pJSycj52720j264++rOnph99cWrPgSw1By45b+TWK0bvvCm/dHOnBwSA/rW+omFBfunmjdu3bdy+rdODAABvcKgfAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgpd3qANfPbB2/v9AjASdXr9ZTSli1bOj0IsHKONAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACFZURSdngEA6AKONAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIOS/F6GNUpu86ZAAAAAASUVORK5CYII="
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1491,7 +1491,7 @@
&nbsp;Bounce Rate&nbsp;&nbsp;
</th>
<th style="border-bottom:1px solid rgb(231,231,231);font-size: 15px;text-align: left;font-weight:normal;padding:13px 0 13px 10px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif; text-align:right;">
- &nbsp;Conversion Rate&nbsp;&nbsp;
+ &nbsp;Revenue&nbsp;&nbsp;
</th>
</thead>
<tbody>
@@ -1517,7 +1517,7 @@
20%
</td>
<td style="padding:17px 15px; text-align:right;;border-bottom:1px solid rgb(231,231,231);font-size: 15px;font-variant-numeric: tabular-nums;padding:17px 15px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif;">
- 80%
+ $13,361.11
</td>
</tr>
</tbody>
@@ -1532,7 +1532,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJE0lEQVR4nO3dW4xcdR3A8f85Mzt7LS1XS6sBHSOCkigYJUQg8gISLyE2xDdDTFRCYjQaHySS+KBGikHjm0p80UYj4YkHEtGAgmJ0CZcHVBiRlg7Y7WV72W13Z3eOD9Vl2HZ3f93bmdn9fB6a7sw5s/+dzfR8+/+fM5MVRZEAAJaSlz0AAKA3iAYAIEQ0AAAhogEACBENAECIaAAAQkTDStXr9YVuPOtdi+wFAN1MNKyhRqOx5F3qAYBeIRpWqtFozDvw1+v1RXIBAHpUtewB9IbvPvi3ebd88/MfWnKvuXrorIq5W+ZqY+7eef2hPADoKqIh5KV9x1qt1tyXfX19+/fv37lzZ2TfeRMPnV+eroTOpYqFtgSA0lmeiJrskFJqNptzd3XOECx5pI93gGIAoKuIhjV3OikiJzzGtwSA9Wd5Yj10ntkQmYeIbAkA60w0RA0NDS1y79wKxZKXWUbOVIhvCQDrRjSE3H5zvbl///L2jR/7VQIA3Uw0hHzqxstSumx5+y5+IWXnvS65BKCbZUVRlD0GAKAHuHoCAAgRDQBAiGgAAEJEAwAQ4uqJs3yaFLCevAahG3ReyrfQNps9GnxGFJTLaxC6QfClZ3kCKJNEgNLFY32zzzQAAMFVQtEAlC+ymAqsneAqoWgAyjf3L5RzGqCbOacBAAgRDUCZOldSgS7nA6tcIw4l8xqE0gVfhqIBAAixPAEAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEw/+Mjo6WPQTY1JrNZrPZLHsUsKkteSgUDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIqZY9gC7yk4eeLXsIsHlNTEyklIaHD5Q9EDaaL+z6QNlD2DhEw5sefeqVsocAwCoTDavI8gQAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAELI5omHqieLoD8oeBAD0tmrZA1hzxdQL2bHd2cx0qn0kDX607OEAQK9atZmGer1er9dX69GWrZiZKKYPdd6SHf1pmplKs7Pp0O5i+l9lDQwAet2bMw3zDvmNRqNerzcajcijxLdcaPfO77v4Not8o6I1kT12R3H1XWlmMA0Np0uuS7OvpaN/TpWBlNVSOpG98a3ikntT7e1ZPrzs0QLQW878P+1Kjlmb2VuWJ+Y9ievznM4LjrP2RzRKHvt++vtoNvnj4vDr7Zu+99pfTh76Q3vqyD2XfPhP77rxySwbSdlYdvDnxdBl6YK7VvenAKCbqYRVsdjyxOk06/wz/X8ZonMxYm6Dzr+cucGZfz9tyV9ksBiKg/uzJ36VjlXTK89l+YHp0W88f3+j+fTQsX9c9889dz9+39enj+RpupLGn0sn/pha/17yAQGATqETIecO22edFehcyFh8g2WvYkTWL7JnHk/jedpSTRf3pf402Br/+JdvefHlL73426/UZvquvOXpbKhVHOxPW1KaOlJMPp1tvXwZIwGgF0WOIyzpLdGw0HO6Ds/v4qcsLLl+kVIqXm5kJwbSWFa881S2rZgaOP/lsY/tbV91ZGhgYDb7/f1f/dxvPlG8fnGaqmUjU+nU3rR1jX4UALrLvKPGCs/D28wWO6fhrJZ3icSS0wxzdy37d9k+UFRO9KfZPHukuvfGkR/+ek+68PzB4crgebNDk2m23Tf24gUXt2eKo8OVt42nwellfAsA2MzO+X0alr2+sJLliYiZ7B2VE/2pVUn91bHntv+n9UatOnk8DQ/ktfNardSavSBrtF+/Ir9wvDiUZ4MjazQMANioVvQ+DavyxgwLPci5Pnhx9Qdnxrek4wPp+MA1Y/suGnl+4uAbE0ebR8f3HTg09p4r99QOtysnj2cTJ4u9fan2/pWPHICe0A1vI7QxnNtMw+nZgs4vIxvMTTCcdbJheY95pv5brjry7fduPfFSPjWdney7b/CXe6ZveHb83ak2fcOlz3/m8sfSXy/Nh9vtib6ZfHtt5/Xn9IMD0LuCxxGWlBVFUfYYVs3kg0+dvPfBkQuPVyrTeWUm65vOqqdS3k7VasqLNJjaW7NTs+f1f/Guyk23zdt3dHT0O7/YW8qwAVg7Dz9we9lD6Bmjo6PXXnvtIhtsqM+eGLzz+qlnXj380O+Gt03V+mbzVivLtuT5TMrbWTbbOpydenVo4I6bKzfcWvZIAaD3bKhoyPJs248+O7Fj2+EHHskrJ6v9tVpfO8/b7dSeaeWpXdty9ydrX/t0yjfHZ3sCwKraUNGQUsqq+cg9tw3tuub4z56cfPSFiX2HstTuu/yioVvfN3znTfkV28seIAD0qo0WDaflV2zfunvX1t27yh4IAGwcJuoBgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgJBq2QPoIg8/cHvZQ4DNq9lsppR27NhR9kCABZlpAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQrKiKMoeAwDQA8w0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAg5L+q0r8XH/d12QAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -1602,7 +1602,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1670,7 +1670,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1740,7 +1740,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAGHUlEQVR4nO3dsWrjdgDHcackS14hww16gYI7d+gDFAJ9g0Ifonu73l7o1rHc3BfoVsHNLeLgjmQ56FBKlwzqYNApiiz/Ijv+K/HnM4SzJct/yMn65i8pOWvbdgUAsMtnpQcAADwPogEAiIgGACAiGgCAiGgAACKiAQCIiIYDq6pq25OjiyZeBQCLIhqOp2manYvUAwCLJRoOrGmawYG/qqqJXACA5+K89ACepR9//mPwzPfffrHzVV099Kuie6arjW7poD+UBwBliYY5/vrwz93dXffw4uLi5ubm6uoqee1g4qH/cFMJ/VMV29YEgONzemKm/3pWq9Xt7W23qD9DsPNIn3eAYgCgLNFwbJukSC54zNcEgCNweqKA/pUNyTxEsiYAPDXRMNPl5eXE0u4Mxc7bLJMrFfI1AeDpiIY5rr+qbm9u5r02P/arBAAWRTTM8fWXr1arV/NeO30jZX+pWy4BWJSztm1LjwEAeAbcPQEAREQDABARDQBARDQAABF3Twy5YQFKsfdBQf1797atIxru8TeioBR7HxQU7nFOTwCLIBGglLzRzTQAwKkLTw6KBmBBkrOqwMGFJwdFA7Ag3UeVaxpggVzTAABERAOwCP1TqsAy+YNVQ+4Uh1LsfVBKuPeJBgAg4vQEABARDQBARDQAABHRAABERAMAEBENAEBENIyr67r0EOBE2fuglJ17n2gAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAIDIeekBLNdPv74tPQQ4RR8//l2/s/dxSN9983npIbwQomGr335/V3oIcKr+/Lf0CHhRRMOhOD0BAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQOVg0VFVV5LX9jTxqOwd5UwA4HeeDx/1DadM0RxhBVVWbNxocxZum6RblG8k9avsAwL1oGBxEj39MHbydIzoAB/FwdtkhZoZP0fAwEbqHo9MPE3MSo5MHo9+e6S7ZLO1/Hd3m5pnN182aD1foD7v7t8kGgNPh035/w9MTD41OP0wca/tH90PNW0xvc5AUEytIBACYbTwauh/WH3uI3fOovG1mwpEegD0d/6K9l2c8GgYnAsIbDfb/OT55+by7HkwzAJyybafReZTdpydWcZEd58A8b/tOTwDAnj79nobBJYTbTK8TbuRQ/K4FADiaezMNo4f80fsRRp/sr99dfji6zsOVw+Hu3Ob03RODtzPxAHAifOAfxFnbtmVHUPAbOfHWdV3/8Mv7I48HgKfw5vX1yoWQgbqu1+v1xArRNQ1PqtSlBqoT4KT4zN/fIv5gVZFvpP89APAoi4gGAGD5RAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAkfPSA1iuN6+vSw8BTlFd1+v1uvQogBFmGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAIDIWdu2pccAADwDZhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAIPI/NEcSpRpxr6oAAAAASUVORK5CYII="
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1808,7 +1808,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1971,7 +1971,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAIPklEQVR4nO3dP28caR0H8AlyAJmQ0ERKYqRTvMXhXEskKopr6JBoeAPwDqigPlHR0J5EyQuhuSaIlkiwssTJK0XRHZhYhCiRlsJoPd6/X3ueZzwjfz7VzszOb3+7ntn9euaZ3Tvz+bwBANjlGzfdAAAwDkIDABARGgCAiNAAAESEBgAgIjQAAJH+QsNkMtk0c+2iLWsBAP0bxJGG6XS6c5H0AAA3q7/QMJ1Olz74J5PJlrgAAAzKXtlyv/3Dn5fm/OYXP9y51iI9tFPFYs4ibSyWLuUPyQMAelA4NPzty3+/f/9+MXn37t2Tk5ODg4Nk3aUDD+3J85TQPlWx6Z4AQCXlT0/8p6VpmtlstljUPkKw85M+zwESAwD0YBADIc+dR4pkwGN+TwCglMKnJzpqj2xIjkMk9wQAiigfGvb397csXZyh2HmZZTJSIb8nANBR4dDws08ns5OT662bf/ZLCQDQv8Kh4ac//qhpPrreutsvpGwvdcklAPTvznw+v+keAIARGNDVEwDAkAkNAEBEaAAAIkIDABARGgCAyPIll+3LGntvBgAYrkuhwZcmAQCbXJyekBgAgC2WjzQsbgsQAEDbpdDQDgqLAw8nl39L4tWrV48ePeqnOQBgOFw9AQBEdv9g1cHBwZZJAOCWcKQBAIhc+pVLAyEBgE38NDYAEHF6AgCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIns33QAwPv9689+C1b733W8XrAbUIzQAV/PZ51/85a+vChb89S9/9PyTxwULApU4PQEARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQGSvPTGZTBa3p9Np780AAMN1ERomk0k7KCxNAgC33MXpCREBANjCmAYAILK3NL0Y1rA48HB6etq+w9nZ2f3793voDBimDx8+lC349u3bN2/elK0J1LAcGhZZYTGmYTabte9wfHzcHi8J3Dbv3r0rW/Drr76ezd6XrQnUsBwaVh0dHW2ZBG6b7/zpq6Y5K1jw4PsHH3/8uGBBoJKLMQ2OHwAAW1wcaZhOp76nAQDY5NLpCUEBANjEJZcAQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAInvticlksrg9nU57bwYAGK6L0DCZTNpBYWkSALjlnJ4AACJCAwAQ2dt9lxWfff7F6dm7Uh38/Cc/eP7J47//45+//+OLUjW/9c293/3q00arWtVqhVZr8KpqVaujaPXOfD4/n940puHFi0sP+fLly2fPniUPcHx8/PDhw3v37pXquGmas7Oz169fP336tGDNRqta1apWtapVrQZ2H2l4/vz5lskt9vf3nzx58uDBg/D+idPT09lsdnR0VLBmo1WtalWrWtWqVgPGNAAAkYsjDdPp1Pc0AACbXDo9ISgAAJs4PQEARC6ungAA2OI639Ow1trxEN0HSWyqcD6/YM1KrXYsu331a3/V92rZ9pxND3fVmkvzB97qMDeAZt2mXqPmppkdyw7z6a8t215UpNXuG+raskvFB97qMDcAn1adys5LODw8XJ1cO7N72U31u9Ss1GrHsttXPzw8rPcKFKlZr+zOmVetOcwNYG2dGjU3zexYdphPf23Z9qJSNTtu/JvKdq+8829d6RUYyAbg06pj2VGOaSg+YLPSCNB6A0tH8XNiPTQ5itehixrPbm3N7g+0WmGYNbcU6bI59fYe0n2b3776tev3tq0OsOaWsl0errdd9Upli52eoDeVPilrXHDrIl7GosZuVWn7t1txg4SGZcXfOzqefVyt1kP6LvUoVX9svWBBX1JSW9m/ftl9qqmzW1Xap5qau1XZasPfrer9A1YjgNY47LT68xHnN7aUFRoudB8ItlZ7mEmp3NC+PcBdcXQ2/fBKR0tvmrdTjd2q+D7V2K0qqLFbldqnKr3b1yjb27DlJtuzhIb/G8vbRNX/3UdkLM9906jvW2Kkf6ZR9FzcWJ54933KAYYuFUY5ELK4HkYJDNyIWh2psbwjF1R7lMDAjajVkbreBiYxbCobrl7sy51u6nLSa1Sucen/2rKbZnas2V46nGt/e94Auh+XW625OrNg2e41m3Wba8e/1Nqapcp2361qPP1NZdtLa7yqw98Aun8UrS27NKdgzSIv6WrZ61VOyl618tqaxXer5oqvgG+EBAAiTk8AABGhAQCI/A/drgNhpxvGcgAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIPklEQVR4nO3dP28caR0H8AlyAJmQ0ERKYqRTvMXhXEskKopr6JBoeAPwDqigPlHR0J5EyQuhuSaIlkiwssTJK0XRHZhYhCiRlsJoPd6/X3ueZzwjfz7VzszOb3+7ntn9euaZ3Tvz+bwBANjlGzfdAAAwDkIDABARGgCAiNAAAESEBgAgIjQAAJH+QsNkMtk0c+2iLWsBAP0bxJGG6XS6c5H0AAA3q7/QMJ1Olz74J5PJlrgAAAzKXtlyv/3Dn5fm/OYXP9y51iI9tFPFYs4ibSyWLuUPyQMAelA4NPzty3+/f/9+MXn37t2Tk5ODg4Nk3aUDD+3J85TQPlWx6Z4AQCXlT0/8p6VpmtlstljUPkKw85M+zwESAwD0YBADIc+dR4pkwGN+TwCglMKnJzpqj2xIjkMk9wQAiigfGvb397csXZyh2HmZZTJSIb8nANBR4dDws08ns5OT662bf/ZLCQDQv8Kh4ac//qhpPrreutsvpGwvdcklAPTvznw+v+keAIARGNDVEwDAkAkNAEBEaAAAIkIDABARGgCAyPIll+3LGntvBgAYrkuhwZcmAQCbXJyekBgAgC2WjzQsbgsQAEDbpdDQDgqLAw8nl39L4tWrV48ePeqnOQBgOFw9AQBEdv9g1cHBwZZJAOCWcKQBAIhc+pVLAyEBgE38NDYAEHF6AgCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIns33QAwPv9689+C1b733W8XrAbUIzQAV/PZ51/85a+vChb89S9/9PyTxwULApU4PQEARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQGSvPTGZTBa3p9Np780AAMN1ERomk0k7KCxNAgC33MXpCREBANjCmAYAILK3NL0Y1rA48HB6etq+w9nZ2f3793voDBimDx8+lC349u3bN2/elK0J1LAcGhZZYTGmYTabte9wfHzcHi8J3Dbv3r0rW/Drr76ezd6XrQnUsBwaVh0dHW2ZBG6b7/zpq6Y5K1jw4PsHH3/8uGBBoJKLMQ2OHwAAW1wcaZhOp76nAQDY5NLpCUEBANjEJZcAQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAInvticlksrg9nU57bwYAGK6L0DCZTNpBYWkSALjlnJ4AACJCAwAQ2dt9lxWfff7F6dm7Uh38/Cc/eP7J47//45+//+OLUjW/9c293/3q00arWtVqhVZr8KpqVaujaPXOfD4/n940puHFi0sP+fLly2fPniUPcHx8/PDhw3v37pXquGmas7Oz169fP336tGDNRqta1apWtapVrQZ2H2l4/vz5lskt9vf3nzx58uDBg/D+idPT09lsdnR0VLBmo1WtalWrWtWqVgPGNAAAkYsjDdPp1Pc0AACbXDo9ISgAAJs4PQEARC6ungAA2OI639Ow1trxEN0HSWyqcD6/YM1KrXYsu331a3/V92rZ9pxND3fVmkvzB97qMDeAZt2mXqPmppkdyw7z6a8t215UpNXuG+raskvFB97qMDcAn1adys5LODw8XJ1cO7N72U31u9Ss1GrHsttXPzw8rPcKFKlZr+zOmVetOcwNYG2dGjU3zexYdphPf23Z9qJSNTtu/JvKdq+8829d6RUYyAbg06pj2VGOaSg+YLPSCNB6A0tH8XNiPTQ5itehixrPbm3N7g+0WmGYNbcU6bI59fYe0n2b3776tev3tq0OsOaWsl0errdd9Upli52eoDeVPilrXHDrIl7GosZuVWn7t1txg4SGZcXfOzqefVyt1kP6LvUoVX9svWBBX1JSW9m/ftl9qqmzW1Xap5qau1XZasPfrer9A1YjgNY47LT68xHnN7aUFRoudB8ItlZ7mEmp3NC+PcBdcXQ2/fBKR0tvmrdTjd2q+D7V2K0qqLFbldqnKr3b1yjb27DlJtuzhIb/G8vbRNX/3UdkLM9906jvW2Kkf6ZR9FzcWJ54933KAYYuFUY5ELK4HkYJDNyIWh2psbwjF1R7lMDAjajVkbreBiYxbCobrl7sy51u6nLSa1Sucen/2rKbZnas2V46nGt/e94Auh+XW625OrNg2e41m3Wba8e/1Nqapcp2361qPP1NZdtLa7yqw98Aun8UrS27NKdgzSIv6WrZ61VOyl618tqaxXer5oqvgG+EBAAiTk8AABGhAQCI/A/drgNhpxvGcgAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -2568,7 +2568,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3165,7 +3165,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3377,7 +3377,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIRklEQVR4nO3dMYskaQHH4R6ZRdhkTddFBqxQMGnhMoNNTETY3ESM/ACeIIaeoRMamW28kXAYiF/ADg9BKcE7ZncFD85DDu5WaIOB2tqq6u5/99T0W139PFF3dXX1y8721G/et2vmYr1eLwAAdvla6QEAAKdBNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0TCgqqpNGwcf2vIsAJgN0bCfuq53PqQeAJgl0TCgruvOib+qqi25AADn4LL0AIr5ze//0tnyy59+b+ezmnpoV0WzpamN5tFOfygPAE7X+UbD3z/5/M2bN83dBw8e3NzcPHnyJHluZ+Khffe2EtpLFZv2BIDTctbLE1+0LBaLly9fNg+1Zwh2nunzDlAMAJyus46Gg90mRfKBx3xPAJi4812euKP2JxuSeYhkTwCYsrOOhocPH255tFmh2HmZZfJJhXxPAJim842GZ0+rlzc3hz03P/erBABm43yj4Uffv1osrg577vYLKduPuuQSgNm4WK/XpccAAJwAV08AABHRAABERAMAEBENAEBknldPuGABpsl7Eyarfd3fpn1mGA3+RhRMk/cmTFb4frQ8ARyJRIBpygt+hjMNAMBewqVD0QAcVbJuChxZuHQoGoCjar4Z+UwDnByfaQAAIqIBOJL2oilwiub5B6tcCw7T5L0J0xS+N+cZDQDA6CxPAAAR0QAAREQDABARDQBARDQAABHRAABE5hwNq9Wq9BCAAd6bME0735tzjgYAYESiAQCIiAYAICIaAIDIZekB3K/6k89KDwHoevXpV96bHEH1rW+UHsLczDwafv7bP5ceAjDkw9elR8D8Xb//9Orxo9KjmBXLEwBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBA5JC/cllVVV3Xow8FAMZVVVVni/PXXbyNhn4KjBUHzdesfzRfTgDuldPKiA6ZadhXXdeb+qOfKUcYDwBwgLfR0Dm1d243+zT7dzqguds+8Q+GwqaJh8FXbHa7fTR/FQBYOF+MKpppGCyJQZtKYsuW/vYtOdK5EY4KgPN0T8vuZ2sSV0+EX0VfaQAo6J2Zhmb+v/+jfH7E7TvfHnyxqwB8uAEApmb38sSmjxpssnM+YPtaQ3gQANjJesS4xrl6YlNM7PsZiIP3AYC+Znq7uVtwMDPQjYb+2kTnX3xwe3vRYfDCh0Xr8of2Q4tecNR1vfNr7D8BACHniBFdrNfr0mO4L6vV6oPnH5ceBQBlXL//9Orxo9KjOCWr1Wq5XG7ZYRJXTwAA0ycaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAIDIZekB3K8X189KDwHo2vnnd4FpMtMAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEJn5r5H+2a//WHoIQNeXX3719Q//XXoUzN/vfvWD0kOYm5lHw78+/aL0EIAh//1f6REwf/989Z+rx49Kj2JWLE8AABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBAZCAaqqoa3NLf3t44+Ogm1ZD86QDA8e3xVy7rug435oeqquqwIwDATv2fSJ107mIgGuq6bp/Lm9vtG50921MRnX3aWzpH7uu/bvv4i3dro3N8AOhzjhjRHjMNtwbP+ps6o3P3sHmFTSWxfUgAwLj2joa72Hlqb08tNDsLAgAOZmZ6RMPRMHjybj+0KP1P74OTAOzUOVWZmb6jQ2Ya7rLWMBZfdQA4ssn9noadH5bsM+sAAEewcaZh08m7fyFDe//bG+3rHfp77qt/qHGPD8BcWY8Y17bliX4WbNq4/famLZs2jvVEAM6cHzLHddSrJxKqEIAROaeMaIqfadhyFwAoZXLRAABMk2gAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAyOT+NPa4Xlw/Kz0EoGu1Wi2Xy9KjAPZmpgEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgMvNfI/38Dx+VHgLQ9fr1Z3995b25nx//8DulhwBzj4YXf/pb6SEAQz76vPQIToxoYAosTwAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAkbfRUFVV57HbLf3t7Y2Dj25SVVVn/72eDsAt3zwpYvdMQ13X4UYAjkAxUMplc6uu66qqmhpobrdvdPZsT0V09mlvaR+58yqN9sH7x+k8OvhCAOeg/e0Xjuxy9y6LxaKVDm2bOqNzd/C5/UN1njV42E6CbBkbwPz4dkdZx/ggZOe/uEYGOIBioLh3Zhra6w6bzvSj/JcdnC3Y6wiyAzhD7W99GoLjS5cnFu9+RmHcQXQWIPLBAJwPy7IUV+z3NIy4SGHWAQCOoDvTEF7d0Nn/9kanA/IK3jcgDn4hAOBgF+v1uvQY7stqtfrg+celRwEwghfXz0oPgflbrVbL5XLLDn6NNAAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AACRy9IDuF+/+Ml7pYcAdNX/qKtvV6VHAext5tHw3ne/WXoIQNflm1dL7004QZYnAICIaAAAIqIBAIiIBgAgcrFer0uPAQA4AWYaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACDyf2/ylJ93mih6AAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -3491,7 +3491,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3585,7 +3585,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -3639,7 +3639,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3703,7 +3703,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3755,7 +3755,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3833,7 +3833,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3885,7 +3885,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJVElEQVR4nO3dP48kRx0G4Dm0CUhoJSQT7BHRcuZsySAissjuK0DGRyBAyJJJnSMgcogcIr4AGROQkFhjJFs3GRJnpBNEQzBo6Ou/78z2dHXPPo8sa66vu+pXvbPbb1f13L44HA4bAIAx3yhdAACwDkIDABARGgCAiNAAAESEBgAgIjTAdVVVddb25G+fqHrX9Tpq9ztbX8A13JUuAOiw2+1ma7+qqmt31+4UWCMzDfDc7XY7cwBAwkwDlHS8y69fs4+34/W7/8YV/bh/4669c//L7uzbxfSV0dddX3nDRTb+tv26rzBgNkIDTODXv/tLY8svfvaD8NjGJXb0j3lrF6w79PXeV8Zl3V1w1PBpAeZheQIm8PlXX//ti3+c/vv8q69fv34dHjtw8Tv30tjYP1x3qB/V2V1fGX3dNfodvt63i2zPvrRJDFCEmQaYxtu3b0+v7+/v9/v9y5cv5y8jfDphYKr/rOcbLnsYovOo4WWXeiK5oEdgEkID3JTwmtq327mrIX3tnBJA5yzFZRf++pMNogMUYXkC+J8lPCjQnlpo2O12Pu4BpQgNMI1v1dS3d17hwstz++GAzt3qn0RoPx+QFH9Ws2F3A9MMfUcNzElICbAElidgAq9+XO37n3xsXybzG/r6sX1PGnbuc25HebNP7+6Co54yLmAqLw6HQ+kagNQSVhCWUwYwM8sTwLiBj1ACz4flCWBcY0mibDFAKZYnAICI5QkAICI0AAARoQEAiAgNAEDEpydghH9TiJl5y1HQ8GeqhQYYMvxrnWFy3nIUNPrvtVueAFgQEYFSkoQqNADAcxfOaQkNAAtlbYJ55O80zzQALM7p15mWLoTnIvz9MkIDwLKYYGBm+bO3licAFkRiYMnMNMCQ+m933JguZhaNj71517EcfsslABCxPAEARIQGACAiNAAAEaEBAIgIDQBARGgAACJCA0S2223pEnhe9vv9fr8vXQXPy+gPOqEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAIHJXugBYjT/9+YvSJfCMvHnzZrPZ3P/936ULWaUPf/j90iXcJqEBUr/5w19LlwBEvvfdb3/w/nulq7hBlicAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDUSqqpqnnaqqpuoLgGkJDYvQvkwet6z38nlZ5VVV7Xa73W430ML1zsl6zzbQqaopXcuNuCtdAEOOl0/qnBMgcbwJ6fsjlxEaFmG329Xf0KfX9Rf1nTfvfgP0va5vObVQP3yg/U3P/EfnN2Hj8Po0Sd93aeeIGts7W6hX3hhU2EXnSUhqBlbEN/I1CA0r8PS8PJpI2u23N4blbVoZKBxRX3I6a1ADVW3ezUONsY/WDIBnGtaqfnPceN25c7hxRSapf+0nARh2eqbBN/skzDQsRX2evP3mvr2neIqM6PZOIzAsn7wkITSsw+291+cfUWM5Y+beAW6A5Yn1qT/NN8+SfOcldsLrrks4MDk/WK7BTMOC9F346x8T2Fx0jz58eGf7jc8mnD5WMLyxfXjf4xSjIxpuYVS7i8aWyXsEFuXpPzlpe3E4HErXwHVZyZvEdrv9+NMvS1cBRD76+Y8+eP+90lWsz3a7fXx8HNjB8gQAEBEabp9pBgAmITQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAyF3pAmA1PvvkVekSeEb2+/1ms3l4eChdCPyfmQYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARO5KFwCr8dNf/rF0Cav0+49+UroEYBpCA6T++a//lC4BoCTLEwBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAIDITKGhqqp5Ohq2kDImd41xndvmrZ5bAE5GQsNTrgTTXkWqd03Y8nCn83SUO5VU5CSs/cwv8AsKsCJ3A39XVdVutzv+f7aCBtTLWE5VMys76rWf87XXv2rHxOZLAKs2FBraTjHi+MfT93/9Bu648bil8WMiPDBPKo2d261tum4uG433Hd45hPA89PU+UGdnee3X9a5HT2+9zfbQNu+e874C6h21a+g8OQOj69yhXU9jdMlXtm/PRs1Jgy5sk2u8Z4CVOi80bPovY40d+raPHrhpXcPCejpba29MxnU0nF06L+2jA+yrMxzsQG19UaN+SLjncEfDjYyOLqmt0Wn+lQ3fUUmDTMu5hdvQ+0xD/UI4eu+YyA88q4tSP4yu1299IqHxukg9S+juidZVLcBinT3TMK2zpisnyS5XFQ7ntidpLxjd6CGTn7F2g6d8tsy3FsASjDwIee3uVzGpEGo/CtBn4QN5onNHl5y3yc9YZ4MXrI4BPCvdyxOnpeWTGQLEtbvobH+2m/6+jjq315fYZ15un/aEXOP0dj7ZOm2DAHSaYHmi76GH0fneqZ6WGGit8ZB//VMAAxvbh3c+CTjQV7uk4Y6eMt6n54nOOoc76hvC6OjaO3RG0nqnl31lO3sfKNJHJwBGvTgcDqVrWJ/Lbv1vZt57gQOZoaTtdvvxp19etYtb9dknrzo/H8uw/X6/2WweHh5KF8Izst1uHx8fB3Yo/CDkzVv+w5vr5dyuiC8Q3Aah4RJX+vjoWixkUAspA+D58FsuAYCI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAid6ULgNX47a8+LF0CQElCA6S+c//N0iUAlGR5AgCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACDy4nA4lK4BAFgBMw0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIj8FzeXgiQ9kv5rAAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -3949,7 +3949,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4223,7 +4223,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4333,7 +4333,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4443,7 +4443,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJV0lEQVR4nO3dTYgcCRkG4JrsJJOETCCj5IcQh0wNjhPIQWIQPAi7oAcRwYsHD3vxoF73tKw3WffiZV3Yo3hZBO8i7EUWPUl2T0I2bNKGIczEiTghTtbJJCbjodmemuru6i/dNV3V1c9zGKqrq7q/+qjqebv+emZvby8BABjkSNUFAACTQWgAAEKEBgAgRGgAAEKEBgAgRGgAAELGFxrSNO03sudTBXMBAONXiz0NrVZr4FPSAwBUa3yhodVq5f7xp2laEBcAgFqZLffl3vntx7kxb/3kGwPn6qSHbKrojOmkjc6zufwheQDAGJQcGm7f+8+zZ886D48ePbq+vn7x4sXIvLkdD9mH7ZSQPVTRb0oA4JCUf3jivxlJkmxsbHSeyu4hGPifPp4DJAYAGINanAjZ1o4UkRMe41MCAGUp+fDEiLJnNkT2Q0SmBABKUX5oOHnyZMGznSMUAy+zjJypEJ8SABhRyaHhh6+lG+vrw80b/98vJQDA+JUcGn7w7cUkWRxu3uILKbPPuuQSAMZvZm9vr+oaAIAJUKOrJwCAOhMaAIAQoQEACBEaAIAQoQEACOkdGtyhGQDI6REaJAYAoFs+NLjZIgDQ04HQIDEAAP3s30a6X2JYP/hbEpubm+fPnz/0ugCAmjnw2xPZsxnsdQAAsnr/9oTEAADkuE8DABAiNAAAIX4aGwAIsacBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAkNmh5/zz39ZKrGM4r31zseoSAGBaDBka3nz3o8/WHpZbyhCEBgAYG4cnAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACBEaAIAQoQEACJnNPkjTtDPcarXGXgwAUF/7oSFN02xQyD0EAKbc/uEJEQEAKOCcBgAgZLbn2OyxiUePHmWfevz48enTp58/f37opQVsb29nH356d6uqSjpWLy9UXQIAHIp8aGifC5k9VLGxsZGd4O7du2maPn36bAzFDZSt7Ze/u7Wz+6LCYtp+9dPVIzMzVVcBAOXLXz3RfWbD6upq98MTJ+4nyc5hFzfQyspKZ/iVV24nSfWhYeWrK0eOCA0ANND+OQ0ulwAACvS9T0PiegoAIGM/NIgIAEABl1wCACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAwAQMpt9kKZpZ7jVao29GACgvvZDQ5qm2aCQewgATDmHJwCAEKEBAAiZHTwJQ9n+/OnP3v6w6iqSmZmZD975fnv49trWe7//pNp6kiQ5Pjf76zdebQ//5ZN7f/rrP6qtJ0mSswsn33j9env4Dx9++vfP/lVtPUmSXEm//OPvXWkP/+aDj//578+rrSdJku9+6/Kr17/SHn7z3Y92dv9XbT1Jkvz8R1//2uUvtYdf/8Uf9/aqLSdJkuT9t75z+tRc4hOgP58AEbX9BJjZ+2I763dOw40bN7Kz3bp168qVK6O//f379+fm5hYWFkZ/qQa7c+fOpUuX5ubmqi6kvnZ3d+/du7e8vFx1IbW2tbW1u7t74cKFqguptbW1tYWFhfn5+aoLqbWbN2+W8i+gwba3t7e2thYXF6su5FAM3tNw/fr1godDW1tbO378+Llz50p5taY6duzY8vLyiRMnqi6kvnZ2dubn569evVp1IbW2ubn55MmTpn6KleXUqVNnz549c+ZM1YXU2osXL65du1Z1FbX28OHDBw8erKysVF3IoXBOAwAQsr+nodVquU8DANDPgcMTggIA0I/DEwBAyP7VEwAABUq+T0P7rIjgYY6ed6rujGzefaxf9pSRaetPcrBFbQOXUZeSKe5SZJsq+FAKLviEdq9fczrjey5UbkxnGXu+VMFb17Bj3WtCcYuK16jcXPGRxRXWsG95e+VZWlrq/C3r1RojtzijL13D+tNW+kI1sks5U7suRbapgg+lpaWlUha8nt3r15ziagt6WDzNKLWNR/eaUNyifkX2nCs+chQ1WdPKPKehOARlM1d7uDMm/ULuqc7IBoh8F8wNv1R/stM0mC7l9Ptqkhue2i4VfFmMfI+c3O6NsmflZU1Ex+ILXjxliQ2ciL51q/420j3X4/b1n7XYFVO1SH+a1KvsNhBfqGnr0nB0qW24ZWxG9wZuX8NtgP3eqwEdG7+a9218oaGzzNO8lnQ2yIJ1Ypr7k1vw7lboUla/JuhSgYE9aV73sgvS87cCOgZugD01r2NBIy7vhPat+j0NnZtKTVDXhjZEToz0Z6p62JMuRTSsS62D96NrK8jl3dMkTd8SI8VEOjacSexYT90tOtSaa9636kNDkjlBt87rTYUi/dHDaevScEvRsC7lvjcngc/Q4q/akXknpXvx/QSHV8Nkdayf4XbAjP6O9ezbWG/uNHH7YUoUOV1lmvvTpktlmbYulbuwDeje0OdtDPd2DehYkDWtzD0N2bM6k5e5W0N7oOfR6/jr1FxuV2p8oSL9ObwdjGOmS0Ej/ktoTJcGVjvch9JLvVdtu5dLAK1Wa+D21XOCZmyV3WtCv+UauM4EG9uMvnVzR0gAIMRvTwAAIUIDABDyf8r4X77Z3BX2AAAAAElFTkSuQmCC"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4630,7 +4630,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4780,7 +4780,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4938,7 +4938,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -5088,7 +5088,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5192,7 +5192,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5302,7 +5302,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJ20lEQVR4nO3dTYicdx0H8NlmC3Fr1sQubF42luxjWDa+IWkoRRGR4kVRJEcPChLwoOJRGi+CtIK3HtSDXkQPggdBCmqhB6HUmkIP1hAs41Y2u3Fr0iTdZFu6SdbDkGefPDPzzG9mntlnXj4fQnie2Wf+83t+Oy/fed52amdnpwYA0MlDVRcAAIwGoQEACBEaAIAQoQEACBEaAIAQoQEACJne+4dMkiSdrtfre19AS0mSDE8xADCEpvb4Og25z2Yf1QAwKvY0NIgIADC6St498cyvXs3d8vS3Hm9MdEwM6W6LdLHGXZp3ZzQPlb2leJx0hIIx45W0HAoAxlLJoeGN1Xe2t7fT2Ycffnhtbe3YsWMd75j7zG453Tzb2zjFY3Z1L3tbAJgc5Z89sZVRq9XW19c73iX3WZv9Tt/yMzj3pT+9e7fjNP+otxFaDgUAY6aCsycGKhsm2sntquhHiUMBwJAb1dCQ7hpo3jYQvHvtfsLo8/O+xKEAYJiVv3tiJiN7e26fwjCo1+tlVVXiUAAwnEoODV/7QvLZjx9I/z2xtD/70+aP1fQLestjFIq13MzQcvycgo/2biuREgCYHCXvnvjK5x6r1R4rWKDdiYvdHnLY7fjxZbqqJPJwADAe9vqKkADAiPIHqwCAEKEBAAgRGgCAEKEBAAgRGgCAkAdOuXT2IADQzm5o8AcbAYACu7snRAQAoIBjGgCAkNaXkc7um1hbW8v+aGNj4/Dhw7Va7fmXLg+6uK586TML2dmhKi9XGwCMonxoCP6J59/+6d8v/+N/gyqqJyeOfPDU4sHG9Hd++kq1xeQIDQCMgfzZE81x4dixY82zMzP/HXRl3frwo48ePTpfdRWtHT16tOoSAKBfu8c0OF0CACjQ9joNNedTAAAZu6FBRAAACjjlEgAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgBChAQAIERoAgJB8aEiSJEmSSkoBAIbZA6EhSZJ6vV5VKQDAMHsgNEgMAEA7jmkAAEKmOy5x8+bN7OytW7dmZ2e3t7cHVlKP3n13a3Nzs+oqWhvawgAgrnNoWF9fz86urKwkSbK1tTWwknp07drb64+8X3UVreV6CACjqHNoWF5ebp790Gu3a7UbgyqqJwsLC0tL8/fnLlZZSpOlpaWqSwCAfjmmAQAIeWBLQ3qFhsaEkykAgNQDoUFKAADasXsCAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAEKEBAAgRGgCAkOnsTJIk6XS9Xt/zYgCA4bUbGpIkyQaF3CwAMOHsngAAQoQGACBkuvMilOrFV/7zwt/erLqKXUfmHvne1x9PZ88/99fb721XWE/OubOf+lgy15hee2vzR794qdp6sqb3PfSz819MZ3/9x9f/9ebbFdaT8+nl+bNPLaWz3/jh8zs7OxXWk/PcD546eGB/Y/rvr1/5/V8uVVtP1sED+58+92Q6++wvX77+znsV1pNz9qmlJz55tDG9efv9b//4z9XWkzU1NfWbZ76czv7hxTde/eeVCuvJ+ehHDn3zq59IZ7/77Avbd+5VWE/O+XNPHj8825i+tHLt5797rdp6sj6wf/on3/98rVabSt9H2h3TcOHChew9L126dOrUqbLqWF1dPXjw4IEDB8oacHJcvXr17t278/PzVRcyera2tjY2Nk6cOFF1ISPp4sWLJb4DTJSVlZX5+fmZmZmqCxk9Gxsb+/btm5ubq7qQ0bO5uXnjxo3jx4+XNWDnLQ1nzpwpmO3T7Ozs3NzcoUOHShxzQly5cuXOnTslPhUmx+bm5uXLl5eXl6suZCTdu3fv9OnTVVcxkmZmZhYWFnxH6sHq6ur09PSRI0eqLmT0XL9+/erVqydPnixrQMc0AAAhu1sa6vW66zQAAO08sHtCUAAA2rF7AgAImRqqs7AAgKE1kOs0NI6NCO7saHm96vTGybmadbcHlOhbQ7ZvDR1XXOsatK6jyKuy4O0u2JBx6mq7jqW3t1zT3C3pirccquChx6CNzU+n4pb2uVK9NG2nbIuLi+n/ZY029nKr2f9aT0jfdgawppPTuhzPupzIq7Lg7W5xcbGUhoxQV9t1rHgVChpbvEw/tQ2n5qdTcUsHvVItxy//mIbi4JMNTY3p9JbkvtyP0hvHWOQbXm66q75ll5k0WhfR7gtHblrrcgo2PxRvmchOj01X+9nc0q2xbGO8UQVLFqxUKU0blstIt3xiNc4CHYltSlWJ9G3se5h9JcTXVOt6pnXFelv3Me5qx1doby/hdo81rm0cnK6attehIa3Dr61Z+sop+P3pW06uG8390bqO2nVG63rQsVcT0tXs2rX8AwWpji/hliakjeUqpWnDsqUhvbTUJP/6ewjCkb7pbUta17MJaV3uencNBcm+eZnaRL6WIxVG2tibsWljt5p3PdTCK9hV04YlNNQyR8yO0y9yD0T6prctaV2t11WbkNb1cLB68bfqyH1Huqvx7QSDq2EM2tiDPne+xJtWwcWdbFBqFjkeR99a0rqB0rqGcpswrl3t+WCO3h5uXNs4UP03rfwtDdkjLWvdXK2hMdFyh3R8nBGV2xAaX9lI3wa3JXAYaF0/+nyXH/vWdVyL3t7uunqs0epqLgHU6/WOr9CWC0zm67r56dSuDyU+8WpdNs0VIQGAEH97AgAIERoAgJD/Ayz70EyKh9/wAAAAAElFTkSuQmCC"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5436,7 +5436,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJdUlEQVR4nO3dTYgceRkH4BozmUmWzISMko8ZY1hqIBLMQWIQVIQV9KAiePHgYS9e9LonWa+yFz2o4NFbELyrsDdRPGX3JOZjN20cspM4ESdgXCdjZGcPzfZUqqur3u7p7qqufh6WpaqnqvqtN9Xdv65/d/XCwcFBAgBQ5WN1FwAAzAahAQAIERoAgBChAQAIERoAgBChAQAIWZz+XaZp2pvudDrTL6BQmqbNKQYAGmhhytdpyL02e6kGgFkx1dAgIgDA7Brz8MQbv3ord8vr3/tcd6IyMfSGLXqLdVfpH87o31T2lvLt9LZQss14JYWbAoBWGnNoePfBv58/f96bPX78+Pb29sbGRuWKudfswun+2dG2U77NodYy2gLA/Bj/tyf+m5EkycOHDytXyb3WZt/TF74G597091Yfdjv9fxptC4WbAoCWqeHbExOVDROD5IYqjmKMmwKAhpvV0NAbGug/NxBcPfkoYRzx9X6MmwKAJhv/8MRLGdnbc2MKTdDpdMZV1Rg3BQDNNObQ8O2vpF/6zErvv89fPpH9a//Lau8NeuFnFMoVnmYo3H5OyUv7sJVICQDMjzEPT3zry5eS5FLJAoO+uDjsRw6H3X58maEqidwdALTDtK8ICQDMKD9YBQCECA0AQIjQAACECA0AQIjQAACEFIcGlx8AAHIKQoPEAAD0y4cGP+4MABR6ITRIDADAIIeXkR6UGLa3t7OzOzs758+fT5Lkd39+b9LFVfrGFz9ZdwkAMC9e+O2J+G81/fTGX//+6D8TrCtGaACAqTkMDdmIkE0MGxsb2RW6s0tL70ylvArr6+t1lwAA88J1GgCAEKEBAAgpDg2+QwEA5DjTAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0A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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJdUlEQVR4nO3dTYgceRkH4BozmUmWzISMko8ZY1hqIBLMQWIQVIQV9KAiePHgYS9e9LonWa+yFz2o4NFbELyrsDdRPGX3JOZjN20cspM4ESdgXCdjZGcPzfZUqqur3u7p7qqufh6WpaqnqvqtN9Xdv65/d/XCwcFBAgBQ5WN1FwAAzAahAQAIERoAgBChAQAIERoAgBChAQAIWZz+XaZp2pvudDrTL6BQmqbNKQYAGmhhytdpyL02e6kGgFkx1dAgIgDA7Brz8MQbv3ord8vr3/tcd6IyMfSGLXqLdVfpH87o31T2lvLt9LZQss14JYWbAoBWGnNoePfBv58/f96bPX78+Pb29sbGRuWKudfswun+2dG2U77NodYy2gLA/Bj/tyf+m5EkycOHDytXyb3WZt/TF74G597091Yfdjv9fxptC4WbAoCWqeHbExOVDROD5IYqjmKMmwKAhpvV0NAbGug/NxBcPfkoYRzx9X6MmwKAJhv/8MRLGdnbc2MKTdDpdMZV1Rg3BQDNNObQ8O2vpF/6zErvv89fPpH9a//Lau8NeuFnFMoVnmYo3H5OyUv7sJVICQDMjzEPT3zry5eS5FLJAoO+uDjsRw6H3X58maEqidwdALTDtK8ICQDMKD9YBQCECA0AQIjQAACECA0AQIjQAACEFIcGlx8AAHIKQoPEAAD0y4cGP+4MABR6ITRIDADAIIeXkR6UGLa3t7OzOzs758+fT5Lkd39+b9LFVfrGFz9ZdwkAMC9e+O2J+G81/fTGX//+6D8TrCtGaACAqTkMDdmIkE0MGxsb2RW6s0tL70ylvArr6+t1lwAA88J1GgCAEKEBAAgpDg2+QwEA5DjTAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACE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"
height="200"
width="700"
margin="0 auto"/>
@@ -5578,7 +5578,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5648,7 +5648,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJt0lEQVR4nO3dTWiceR0H8Mk2hRpNbCWQtkm7NI8lpL4h3bIsiogUDyqK7NGDC1LwoOJRtl4E2RW87UE96EW8CAqC7EEXFhEWXVvYy1qDy5CVNCmR7LbdtGWxL/Ew9MmTZ2ae+c3Mkzzz8vlQyvNMnvnP7/llXr7zvGViZ2enBgDQyRNVFwAADAehAQAIERoAgBChAQAIERoAgBChAQAImTz4h0ySJJ2u1+sHX0BLSZIMTjEAMIAmDvg6DbnPZh/VADAsDjQ0iAgAMLxK3j3xwq+u5m55/ltPNSY6JoZ0t0W6WOMuzbszmofK3lI8TjpCwZjxSloOBQAjqeTQ8Nbae/fv309nDx8+vL6+Pj8/3/GOuc/sltPNs72NUzxmV/eytwWA8VH+2RP3Mmq12sbGRse75D5rs9/pW34G5770p3fvdpzmH/U2QsuhAGDEVHD2xL7Khol2crsq+lHiUAAw4IY1NKS7Bpq3DQTvXnucMPr8vC9xKAAYZOXvnpjKyN6e26cwCOr1ellVlTgUAAymkkPD17+QfPbj0+m/p5eOZH/a/LGafkFveYxCsZabGVqOn1Pw0d5tJVICAOOj5N0TX/3ck7XakwULtDtxsdtDDrsdP75MV5VEHg4ARsNBXxESABhS/mAVABAiNAAAIUIDABAiNAAAIUIDABCy55RLZw8CAO3shgZ/sBEAKLC7e0JEAAAKOKYBAAhpfRnp7L6J9fX17I82NzePHz++73X17eXXrlddwq4vf2ah6hIAoF/50DAaf+L5Oz99veoS9hAaABgB+bMnmuPC/Px8wSwRJ0+erLoEAOjX7jENTpcAAAq0vU5Dbfh3UgAAJdoNDSICAFDAKZcAQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACE5ENDkiRJklRSCgAwyPaEhiRJ6vV6VaUAAINsT2iQGACAdhzTAACETHZc4vbt29nZO3fuzMzM1Gq1f62+u19F9WT5zEeqLqGt7e3tqksAgH51Dg0bGxvZ2dXV1SRJfv+Xjasrt/atql4896XTS6c/VHUVreV6CADDqHNoWF5ebp798Bt3a7XBCg0LCwtLS3OP565VWUqTpaWlqksAgH45pgEACNmzpSG9QkNjwskUAEBqT2iQEgCAduyeAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIGQyO5MkSTpdr9cPvBgAYHDthoYkSbJBITcLAIw5uycAgBChAQAImey8CKV69fX/vPL3t6uuYteJ2Q9+7xtPpbOXX/rr3ffvV1hPzqVnP/WxZLYxvf7f7R/94rVq68maPPTEzy5/MZ399R/f/Pfb71ZYT86nl+eevbiUzn7zhy/v7OxUWE/OSz+4eHT6SGP6H2/e+N2fV6qtJ+vo9JHnLz2Tzr74y7/dfO/9CuvJefbi0tOfPNmY3r77v2//+E/V1pM1MTHxmxe+ks7+4dW3rv7zRoX15Hz09LHnvvaJdPa7L75y/8GjCuvJuXzpmVPHZxrTK6vv/Py3b1RbT9YHjkz+5Pufr9VqE+n7SLtjGq5cuZK958rKyrlz58qqY21t7ejRo9PT02UNOD62trYePnw4NzdXdSHD5969e5ubm2fOnKm6kKF07dq1Et8Bxsrq6urc3NzU1FTVhQyfzc3NQ4cOzc7OVl3I8Nne3r5169apU6fKGrDzloYLFy4UzPZpZmZmdnb22LFjJY45Jm7cuPHgwYMSnwrjY3t7+/r168vLy1UXMpQePXp0/vz5qqsYSlNTUwsLC74j9WBtbW1ycvLEiRNVFzJ8bt68ubW1dfbs2bIGdEwDABCyu6WhXq+7TgMA0M6e3ROCAgDQjt0TAEDIxECdhQUADKx9uU5D49iI4M6OlterTm8cn6tZd3tAib41ZPvW0HHFta5B6zqKvCoL3u6CDRmlrrbrWHp7yzXN3ZKueMuhCh56BNrY/HQqbmmfK9VL03bKtri4mP5f1mgjL7ea/a/1mPRtZx/WdHxal+NZlxN5VRa83S0uLpbSkCHqaruOFa9CQWOLl+mntsHU/HQqbul+r1TL8cs/pqE4+GRDU2M6vSV5LPej9MYRFvmGl5vuqm/ZZcaN1kW0+8KRm9a6nILND8VbJrLTI9PVfja3dGsk2xhvVMGSBStVStMG5TLSLZ9YjbNAh2KbUlUifRv5HmZfCfE11bqeaV2x3tZ9hLva8RXa20u43WONahv3T1dNO+jQkNbh19YsfeUU/P70LSfXjeb+aF1H7TqjdT3o2Ksx6Wp27Vr+gYJUx5dwS2PSxnKV0rRB2dKQXlpqnH/9PQThSN/0tiWt69mYtC53vbuGgmTfvExtLF/LkQojbezNyLSxW827HmrhFeyqaYMSGmqZI2ZH6Rd5ACJ909uWtK7W66qNSet6OFi9+Ft15L5D3dX4doL9q2EE2tiDPne+xJtWwcWdbFBqFjkeR99a0rp9pXUN5TZhVLva88EcvT3cqLZxX/XftPK3NGSPtKx1c7WGxkTLHdLxcYZUbkNofGUjfdu/LYGDQOv60ee7/Mi3ruNa9PZ219VjDVdXcwmgXq93fIW2XGA8X9fNT6d2fSjxiVfrsmmuCAkAhPjbEwBAiNAAAIT8H+pnvyiTVnbGAAAAAElFTkSuQmCC"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJt0lEQVR4nO3dTWiceR0H8Mk2hRpNbCWQtkm7NI8lpL4h3bIsiogUDyqK7NGDC1LwoOJRtl4E2RW87UE96EW8CAqC7EEXFhEWXVvYy1qDy5CVNCmR7LbdtGWxL/Ew9MmTZ2ae+c3Mkzzz8vlQyvNMnvnP7/llXr7zvGViZ2enBgDQyRNVFwAADAehAQAIERoAgBChAQAIERoAgBChAQAImTz4h0ySJJ2u1+sHX0BLSZIMTjEAMIAmDvg6DbnPZh/VADAsDjQ0iAgAMLxK3j3xwq+u5m55/ltPNSY6JoZ0t0W6WOMuzbszmofK3lI8TjpCwZjxSloOBQAjqeTQ8Nbae/fv309nDx8+vL6+Pj8/3/GOuc/sltPNs72NUzxmV/eytwWA8VH+2RP3Mmq12sbGRse75D5rs9/pW34G5770p3fvdpzmH/U2QsuhAGDEVHD2xL7Khol2crsq+lHiUAAw4IY1NKS7Bpq3DQTvXnucMPr8vC9xKAAYZOXvnpjKyN6e26cwCOr1ellVlTgUAAymkkPD17+QfPbj0+m/p5eOZH/a/LGafkFveYxCsZabGVqOn1Pw0d5tJVICAOOj5N0TX/3ck7XakwULtDtxsdtDDrsdP75MV5VEHg4ARsNBXxESABhS/mAVABAiNAAAIUIDABAiNAAAIUIDABCy55RLZw8CAO3shgZ/sBEAKLC7e0JEAAAKOKYBAAhpfRnp7L6J9fX17I82NzePHz++73X17eXXrlddwq4vf2ah6hIAoF/50DAaf+L5Oz99veoS9hAaABgB+bMnmuPC/Px8wSwRJ0+erLoEAOjX7jENTpcAAAq0vU5Dbfh3UgAAJdoNDSICAFDAKZcAQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACE5ENDkiRJklRSCgAwyPaEhiRJ6vV6VaUAAINsT2iQGACAdhzTAACETHZc4vbt29nZO3fuzMzM1Gq1f62+u19F9WT5zEeqLqGt7e3tqksAgH51Dg0bGxvZ2dXV1SRJfv+Xjasrt/atql4896XTS6c/VHUVreV6CADDqHNoWF5ebp798Bt3a7XBCg0LCwtLS3OP565VWUqTpaWlqksAgH45pgEACNmzpSG9QkNjwskUAEBqT2iQEgCAduyeAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoAABChAYAIGQyO5MkSTpdr9cPvBgAYHDthoYkSbJBITcLAIw5uycAgBChAQAImey8CKV69fX/vPL3t6uuYteJ2Q9+7xtPpbOXX/rr3ffvV1hPzqVnP/WxZLYxvf7f7R/94rVq68maPPTEzy5/MZ399R/f/Pfb71ZYT86nl+eevbiUzn7zhy/v7OxUWE/OSz+4eHT6SGP6H2/e+N2fV6qtJ+vo9JHnLz2Tzr74y7/dfO/9CuvJefbi0tOfPNmY3r77v2//+E/V1pM1MTHxmxe+ks7+4dW3rv7zRoX15Hz09LHnvvaJdPa7L75y/8GjCuvJuXzpmVPHZxrTK6vv/Py3b1RbT9YHjkz+5Pufr9VqE+n7SLtjGq5cuZK958rKyrlz58qqY21t7ejRo9PT02UNOD62trYePnw4NzdXdSHD5969e5ubm2fOnKm6kKF07dq1Et8Bxsrq6urc3NzU1FTVhQyfzc3NQ4cOzc7OVl3I8Nne3r5169apU6fKGrDzloYLFy4UzPZpZmZmdnb22LFjJY45Jm7cuPHgwYMSnwrjY3t7+/r168vLy1UXMpQePXp0/vz5qqsYSlNTUwsLC74j9WBtbW1ycvLEiRNVFzJ8bt68ubW1dfbs2bIGdEwDABCyu6WhXq+7TgMA0M6e3ROCAgDQjt0TAEDIxECdhQUADKx9uU5D49iI4M6OlterTm8cn6tZd3tAib41ZPvW0HHFta5B6zqKvCoL3u6CDRmlrrbrWHp7yzXN3ZKueMuhCh56BNrY/HQqbmmfK9VL03bKtri4mP5f1mgjL7ea/a/1mPRtZx/WdHxal+NZlxN5VRa83S0uLpbSkCHqaruOFa9CQWOLl+mntsHU/HQqbul+r1TL8cs/pqE4+GRDU2M6vSV5LPej9MYRFvmGl5vuqm/ZZcaN1kW0+8KRm9a6nILND8VbJrLTI9PVfja3dGsk2xhvVMGSBStVStMG5TLSLZ9YjbNAh2KbUlUifRv5HmZfCfE11bqeaV2x3tZ9hLva8RXa20u43WONahv3T1dNO+jQkNbh19YsfeUU/P70LSfXjeb+aF1H7TqjdT3o2Ksx6Wp27Vr+gYJUx5dwS2PSxnKV0rRB2dKQXlpqnH/9PQThSN/0tiWt69mYtC53vbuGgmTfvExtLF/LkQojbezNyLSxW827HmrhFeyqaYMSGmqZI2ZH6Rd5ACJ909uWtK7W66qNSet6OFi9+Ft15L5D3dX4doL9q2EE2tiDPne+xJtWwcWdbFBqFjkeR99a0rp9pXUN5TZhVLva88EcvT3cqLZxX/XftPK3NGSPtKx1c7WGxkTLHdLxcYZUbkNofGUjfdu/LYGDQOv60ee7/Mi3ruNa9PZ219VjDVdXcwmgXq93fIW2XGA8X9fNT6d2fSjxiVfrsmmuCAkAhPjbEwBAiNAAAIT8H+pnvyiTVnbGAAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -5782,7 +5782,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5924,7 +5924,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -6128,7 +6128,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAKsklEQVR4nO3dv8skSRkH8NlzD2RBMN/ggg4NXzPBQExUEDa+wMDAP0ERBVHOxGBBMBBRDM7QBYMzMhBBBLlGDARR+oKVd8EfIG6wiBuMwXC9tdXd1c/0O9M90/35RDc11dXP7Dv31ne6que9t9/vdwAAY95YugAA4DoIDQBAiNAAAIQIDQBAiNAAAIQIDQBAiNDArKqqGmrsfapwFAAzExq4FE3TjD4lPQAsSGhgVk3TZBN/VVWFuADA5bi/dAGs0Hd//H7W8vUvf3L0qDY9pKmibWnTRvtslj8kD4BzExo4vb/+7fnLly/bh2+++ebt7e3Dhw8jx2YXHtKHh5SQLlUM9QTgHCxPcBYvErvd7tmzZ+1T6RWC0Zk+ngMkBoBzExq4LIdIEdnwGO8JwElYnuDipDsbItchIj0BuDuhgbN48OBB4dl2hWL0NsvIToV4TwDuQmjg9B59pnp2ezvt2PjcLyUAzExo4PS++Om3dru3ph1bvpEyfdYtlwAzu7ff75euAQC4Au6eAABChAYAIERoAABChAYAIMTdExzHDQtsh3c7G1S+m11o4Aj+RhTb4d3OBo1+Mb/lCYAeIgJbE0nGQgMAbF3wWprQADDC2gTrFn+H29MAMMjfUGUj0t0MhQwhNAD0c4GBjYjv+bU8AdBDYoAuVxo4gj8syaZkt595w4O/cgkAhFieAABChAYAIERoAABChAYAIERoAABChAYAIERoYIq6rpcuAWbi3c52jL7bhQYAIERoAABCfI00E/3svT8tXcIWvf2FTyxdArBdQgMT/fxXf1m6hC0SGoAFWZ4AAEKEBgAgRGgAAEKEBgAgRGgAAEKEhrWpEm1L1qHbmLZ0R+DS+OkAi3DL5apUVdU0zdDD3pZjR2Bxhx+K0ADMz5WGNTs2MXQP4QL5GQFLERq2wjUDAO7I8sSqZFet25QwLTHIGQCkhIa16d2RcAgT8QRwSB4SAwApyxNbEd86d4gXEgMAGaFhVcqxIM0NWYZor0NYkgBgiOWJVRna05B1SNcsuj2z5CFDXJrsGzj8gIDZCA1r0xsUhh6OduYC+RkBS7E8AQCECA0AQIjQAACECA0AQIjQAACECA0AQIjQAACE+J4GJnry+NHSJQAwK1caAIAQoQEACBEaAIAQoQEACBEaAIAQd08w0e/+eLt0CTCHD56++N9973Y24YOnL25uSh2EBib63k9/v3QJMJff/GvpCmAmbxfvprc8AQCECA0AQIjQAACECA0AQIjQAACECA0rV1XVgocDcNWyWeBaQ0OVaFuyDt3Go1qqjt7zBsccehWRbic8EACCunPNVX5PQ1VVTdMMPextmaZ3kLaxPUvTNOkZ42efXORJXh0ADDnMZVluuMrQkLljYpg85R8l+9c/nKI9V/pTGWrpHa075m7gOkTvgKONAGzQ0FS4htCQOtOUPyqdwocKGIomo1dKjhqze+zQgMHG8RcPwIoUJp2rDA3ZBZPzXSTIpszsGkB2rnJi6PY/CesUAJxctm+vnWuuMjTsXp8sh/YWHDVa7+fswp6Gc38EP/n4o2sWALAbmGEPrjU0DJmcGy7tRCcfubypEwBGXeUtl+XPx9newKFrLFfk5HdmBq86uA4BQOoqrzQM7WnIOqRrFkM9ew9p9e5pKB8yQffljL7A4Gjtf/cOONrYvdkGgE3JJqB7+/1+qVK4XnVdv/Pu06WrAODEnjx+VHj2KpcnAID5CQ0AQIjQAACECA0AQIjQAACECA0AQMhVfk8Dl6B8Ww6sRl3XNzc3S1cBc6jrutzBlQYAIERoAABChAYAIERoAABChAYAIERoYKJ//vvF0iUAMCuhgYm++vjXS5cAwKyEBgAgRGgAAEKEBgAgRGgAAEKEBgAgRGgAAEJW+1cuq6pqmiZ9uNvtspb24eHZg97G9Nls5Haobv+sMTsqqy3t0y2+cN5IS7y23p69ZQ8VD8BarTM0DM2yhc7dh+k8GpwOe7uVxxk6e6Flmnht8dONFg/AmmxoeaL3A3d3nuvtNpszJQYAuLsNhYarIzEAcFFWuDyRri9k8258zWL0FJH2doNC+jBT2Fswrc6719bbEwBWGBrKTpIbuosIve1pY2HJY2hHxbQ6716blABAr3UuT1QfWrqQVyZslZhtd8Wy2zgAuBZrCw2HT+ep8t2G3Q4z7yQoz9aFUu14AGBmm1ue6Ap+m0JE+Tp/74rD6NnTo7IMcaba4qsVJ/ynA+Dy3dvv90vXwPWp6/oHv/j7T779+aULgbOr6/rm5mbpKmAOo+/2tS1PAABnIjQAACFCAwAQIjQAACFCAwAQIjQAACFCAxN95I17S5cAwKyEBib60bc+t3QJAMxKaAAAQoQGACBEaAAAQoQGACBEaAAAQoQGJvrSN95bugQAZiU0MJE/qg6wNUIDABAiNAAAIUIDABAiNAAAIUIDABByf+kC1qmqqm5j0zRpe9M0WeesQ9onG7N7bLf/UD2HPlVVZYMfzp6N0G0ZHRmAtRIaziKd1LOptPtUNlt35/LuOKP9U4VjC0dFjI4MwJpYnrgCvckjcjGj16kSAwBbIzRsmsQAQJzlibmlOxjmOWNhL4XEAECc0DC3do/CUIdzbC3s3XnQu/MRAIYIDcsoTNhzzuJyAwBx9jRcge72xqGZfujuieDg2YnkCQBSrjQspv2Uf5inyzP00L6EXWA5o3BsVsmukyEiL6F8dgBWQ2g4r6EvaUgfpo3l3BBsjHQrFHbU3C8oAGyH5QkAIERoAABChAYAIERoAABChAYAIERoAABChAYAIERoYKLvf+2zS5cAwKyEBib6+Mc+unQJAMxKaAAAQoQGACBEaAAAQoQGACDEX7lkou/88LdLlwBz+M/z579837t9Ad/8yqeWLoGc0MBEf/jzP5YuAeby7L9LVwAXwfIEABAiNAAAIUIDABAiNAAAIUIDABDy2t0TVVW1/900zaHl8B9th6ZpssZut3SoQ/92wKH+Q0+lJWWDDHXuLbg8SPep4FDpCxwaf/RcQy+kt6Tu2YfGzyosn673LIUXAjAPv5QuyqvQUJ5XelsKerPFqN5QUpje4mcpD9L7VGSo0fFT5fahV922D9XcW8aEf/zuUdMGATgVv5QuzeDyxF0SQ+9ovR+CTy5yorZP90Wlh0+uuffAZd/raUnZJZO2sPK/BsD8RIRLE9rTINwBAK+WJ7KPlXe80N01upSQXocfXWUf6hw50R1rju9giBh91eIasHF+H16O1zZC9i4dnXsOjhzVreocJwoONc+7tl0yOO2w5/ixApzVyT/EMlnob0/MNsEcNUeuZrm98EJOnn66p/Z/IABBg3dPZNLZq3sh/di7KrrtR92sEelc2MRX+LTde9Jj9wMWBhkt+9yzeHcdp1ChSAEsy2+hSzO+pyHrkE63Qz13H356PsnP+yQ36Q4NMvqqy0Pt+tYRCvdDTngtc64jTKsQ4Ez8Uro09/b7/dI1cH3qun7n3adLVwGs2ZPHj5YuYXPqur65uSl08DXSAECI0AAAhAgNAECI0AAAhAgNAECI0AAAhAgNAEBI6Gukocst1GzE6J3rsB2uNAAAIUIDABAiNAAAIf72BAAQ4koDABAiNAAAIUIDABAiNAAAIUIDABAiNAAAIUIDABAiNAAAIf8HRWL41cQq55IAAAAASUVORK5CYII="
height="200"
width="700"
margin="0 auto"/>
@@ -6306,7 +6306,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -6588,7 +6588,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -6650,7 +6650,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJRUlEQVR4nO3dTYicdx0H8NlkA3E1IbELmzSJJTuGkviGpKUURUSKF8W3Hj0oSMGLojdpvAjSevHSg3rQi+hBKChIQS30IJSqKXiwhmAZU9ls42o0oUtDMWnWw9Cns8+8fWf22X3m5fMhhOeZnfnP7/nNPDPfeZ5nnlnY2tpqAAAMs6/uAgCA6SA0AAARoQEAiAgNAEBEaAAAIkIDABBZ3Pu7bDabxXSr1dr7AnpqNpuTUwwATKCFPT5PQ+m92Vs1AEyLPQ0NIgIATK+Kd0888ZMXS5c8/pUH2hNDE0Ox26K4Wvsm3bszuofqvGTwOMUIA8bMK+k5FADMpIpDw8trr92+fbuYPXDgwPr6+okTJ4besPSe3XO6e3a8cQaPOdKt7G0BYH5U/+2JWx0ajcarr7469Cal99rOz/Q934NLH/qLm486Tvefxhuh51AAMGNq+PbEruoME/2UdlXsRIVDAcCEm9bQUOwa6N42EN688VbC2OH7fYVDAcAkq373xFKHzstL+xQmQavVqqqqCocCgMlUcWj4/CeaH33/oeLfQ/cf7Pxr99tq8QG95zEKg/XczNBz/JIBb+2jViIlADA/Kt498ZmP3ddo3DfgCv2+uDjqIYejjp9fZ6RKkrsDgNmw12eEBACmlB+sAgAiQgMAEBEaAICI0AAARIQGACBSDg3NZtO5BwCAbttCgx9pBAD62RYaJAYAoB/HNAAAkeGnkV5fX++c3djYOHbsWKPReOb5q7tV1Fg+9ZGTdZcAALNszN+e+Plv/v7CX/5dbSk7dPr4u86tHqm7CgCYWcNDw4kTJ7pnl5b+uVsVjevd99xz770rdVcBADPLMQ0AQGTblobiDA3tCV+mAAAK20KDlAAA9GP3BAAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgsds40m81iutVq7XkxAMDkejs0NJvNzqBQmgUA5pzdEwBARGgAACKLw68yhb7wzV/WXcI2T3//c/v2LbSnn/vjP579wyu1lrPN8eV3fv2LDxSzF576/etv3K6xnpLHHv3Q+5rL7en1f21+50fP11tPp8X9+35w4ZPF7E9//dLfXvlvjfWUfPjsyqOP3F/Mfunbz2xtbdVYT8lT33rkyKGD7ek/vXTt6d9drreeTkcOHXz8sYeL2Sd//MKN196osZ6SRx+5/6EP3tue3nz9f1/97m/rrafTwsLCz574dDH7q+defvGv12qsp+S97zn65c9+oJj92pPP3r5zt8Z6Si489vCpY4fb05ev/OeHv/hzvfV0esfBxe994+ONRmOheB3pd0zDxYsXO295+fLlc+fOVVXH2trakSNHDh06VNWA8+P69etvvvnmyspK3YVMn1u3bm1sbJw+fbruQqbSpUuXKnwFmCtXrlxZWVlZWlqqu5Dps7GxsX///uXl5boLmT6bm5s3b948depUVQMO39Lw4IMPDpjdocOHDy8vLx89erTCMefEtWvX7ty5U+FTYX5sbm5evXr17NmzdRcyle7evXv+/Pm6q5hKS0tLJ0+e9BlpDGtra4uLi8ePH6+7kOlz48aN69evnzlzpqoBHdMAAETe3tLQarWcpwEA6Gfb7glBAQDox+4JACCyMFHfwgIAJtaunKehfWxEuLOj5/mqiwvn52zWox5Qom9tnX1rG7rgWtemdUMla+WAl7uwIbPU1X4dKy7vuaSlS4oF7znUgLuegTZ2P50Gt3SHCzVO07aqtrq6Wvxf1Wgzr7SYO1/qOenb1i4s6fy0rsSzriRZKwe83K2urlbSkCnqar+ODV6EAY0dfJ2d1DaZup9Og1u62wvVc/zqj2kYHHw6Q1N7urik+ZbSn4oLZ1jyCa80PVLfOq8zb7Qu0e8DR2la60oGbH4YvGWic3pmurqTzS2jmsk25o0acM0BC1VJ0yblNNI9n1jtb4FOxTaluiR9m/kedq4J+ZJq3di0brDxln2Guzp0DR1vFe53X7Paxt0zUtP2OjQUdXjYuhVrzoDHT99KSt3o7o/WDdWvM1o3hqG9mpOudi5dzx8oKAxdhXuakzZWq5KmTcqWhuLUUvP88I8RhJO+6W1PWje2OWld6Xx3bQOSffd1GnO5LicVJm0cz8y0cVTdux4a8QKO1LRJCQ2NjiNmZ+mB3ANJ3/S2J61rjLtoc9K6MQ5WH/ypOrntVHc1306wezXMQBvHsMOdL3nTaji5kw1K3ZLjcfStJ63bVVrXVm0TZrWrYx/MMd7dzWobd9XOm1b9lobOIy0bo5ytoT3Rc4d0Ps6UKm0IzRc26dvubQmcBFq3Ezt8lZ/51g1divFe7ka6r+nqaikBtFqtoWtozyvM53rd/XTq14cKn3iNEZvmjJAAQMRvTwAAEaEBAIj8H403iUR6A51xAAAAAElFTkSuQmCC"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJRUlEQVR4nO3dTYicdx0H8NlkA3E1IbELmzSJJTuGkviGpKUURUSKF8W3Hj0oSMGLojdpvAjSevHSg3rQi+hBKChIQS30IJSqKXiwhmAZU9ls42o0oUtDMWnWw9Cns8+8fWf22X3m5fMhhOeZnfnP7/nNPDPfeZ5nnlnY2tpqAAAMs6/uAgCA6SA0AAARoQEAiAgNAEBEaAAAIkIDABBZ3Pu7bDabxXSr1dr7AnpqNpuTUwwATKCFPT5PQ+m92Vs1AEyLPQ0NIgIATK+Kd0888ZMXS5c8/pUH2hNDE0Ox26K4Wvsm3bszuofqvGTwOMUIA8bMK+k5FADMpIpDw8trr92+fbuYPXDgwPr6+okTJ4besPSe3XO6e3a8cQaPOdKt7G0BYH5U/+2JWx0ajcarr7469Cal99rOz/Q934NLH/qLm486Tvefxhuh51AAMGNq+PbEruoME/2UdlXsRIVDAcCEm9bQUOwa6N42EN688VbC2OH7fYVDAcAkq373xFKHzstL+xQmQavVqqqqCocCgMlUcWj4/CeaH33/oeLfQ/cf7Pxr99tq8QG95zEKg/XczNBz/JIBb+2jViIlADA/Kt498ZmP3ddo3DfgCv2+uDjqIYejjp9fZ6RKkrsDgNmw12eEBACmlB+sAgAiQgMAEBEaAICI0AAARIQGACBSDg3NZtO5BwCAbttCgx9pBAD62RYaJAYAoB/HNAAAkeGnkV5fX++c3djYOHbsWKPReOb5q7tV1Fg+9ZGTdZcAALNszN+e+Plv/v7CX/5dbSk7dPr4u86tHqm7CgCYWcNDw4kTJ7pnl5b+uVsVjevd99xz770rdVcBADPLMQ0AQGTblobiDA3tCV+mAAAK20KDlAAA9GP3BAAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgsds40m81iutVq7XkxAMDkejs0NJvNzqBQmgUA5pzdEwBARGgAACKLw68yhb7wzV/WXcI2T3//c/v2LbSnn/vjP579wyu1lrPN8eV3fv2LDxSzF576/etv3K6xnpLHHv3Q+5rL7en1f21+50fP11tPp8X9+35w4ZPF7E9//dLfXvlvjfWUfPjsyqOP3F/Mfunbz2xtbdVYT8lT33rkyKGD7ek/vXTt6d9drreeTkcOHXz8sYeL2Sd//MKN196osZ6SRx+5/6EP3tue3nz9f1/97m/rrafTwsLCz574dDH7q+defvGv12qsp+S97zn65c9+oJj92pPP3r5zt8Z6Si489vCpY4fb05ev/OeHv/hzvfV0esfBxe994+ONRmOheB3pd0zDxYsXO295+fLlc+fOVVXH2trakSNHDh06VNWA8+P69etvvvnmyspK3YVMn1u3bm1sbJw+fbruQqbSpUuXKnwFmCtXrlxZWVlZWlqqu5Dps7GxsX///uXl5boLmT6bm5s3b948depUVQMO39Lw4IMPDpjdocOHDy8vLx89erTCMefEtWvX7ty5U+FTYX5sbm5evXr17NmzdRcyle7evXv+/Pm6q5hKS0tLJ0+e9BlpDGtra4uLi8ePH6+7kOlz48aN69evnzlzpqoBHdMAAETe3tLQarWcpwEA6Gfb7glBAQDox+4JACCyMFHfwgIAJtaunKehfWxEuLOj5/mqiwvn52zWox5Qom9tnX1rG7rgWtemdUMla+WAl7uwIbPU1X4dKy7vuaSlS4oF7znUgLuegTZ2P50Gt3SHCzVO07aqtrq6Wvxf1Wgzr7SYO1/qOenb1i4s6fy0rsSzriRZKwe83K2urlbSkCnqar+ODV6EAY0dfJ2d1DaZup9Og1u62wvVc/zqj2kYHHw6Q1N7urik+ZbSn4oLZ1jyCa80PVLfOq8zb7Qu0e8DR2la60oGbH4YvGWic3pmurqTzS2jmsk25o0acM0BC1VJ0yblNNI9n1jtb4FOxTaluiR9m/kedq4J+ZJq3di0brDxln2Guzp0DR1vFe53X7Paxt0zUtP2OjQUdXjYuhVrzoDHT99KSt3o7o/WDdWvM1o3hqG9mpOudi5dzx8oKAxdhXuakzZWq5KmTcqWhuLUUvP88I8RhJO+6W1PWje2OWld6Xx3bQOSffd1GnO5LicVJm0cz8y0cVTdux4a8QKO1LRJCQ2NjiNmZ+mB3ANJ3/S2J61rjLtoc9K6MQ5WH/ypOrntVHc1306wezXMQBvHsMOdL3nTaji5kw1K3ZLjcfStJ63bVVrXVm0TZrWrYx/MMd7dzWobd9XOm1b9lobOIy0bo5ytoT3Rc4d0Ps6UKm0IzRc26dvubQmcBFq3Ezt8lZ/51g1divFe7ka6r+nqaikBtFqtoWtozyvM53rd/XTq14cKn3iNEZvmjJAAQMRvTwAAEaEBAIj8H403iUR6A51xAAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -6826,7 +6826,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAI9UlEQVR4nO3dTYgcaR0H4BpJMsmSETJKvsYYlh6IDJuDxCCoCCvoQUXw4sHDXrzodU+yXmUvenAFj96C4F2FvYniKbsnMYbdtDjESZyIEzCuyRjJeGi20+mP6l/3dE9VVz8Py1Ld0/X2W/9UV/36fburVw4ODgoAgHE+UnUHAIDFIDQAABGhAQCICA0AQERoAAAiQgMAEDl29E/ZarW6y+12++g7MFSr1apPZwCghlaO+DoNfedmp2oAWBRHGhpEBABYXDOennjz5+/03fPGdz7TWRibGLrTFt2HdVYZnM4YbKr3nvJ2ui2UtJn3ZGhTANBIMw4N79/919OnT7s3jx8/vrOzs7GxMXbFvnP20OXBm9O1U97mRGuZbQFgecz+2xP/6VEUxb1798au0neu7X1PP/Qc3Pemv7v6pO0M/mm6FoY2BQANU8G3J+aqN0yM0jdVcRgzbAoAam5RQ0N3amBwbCBcvfgwYRzyfD/DpgCgzmY/PfFSj977++YU6qDdbs+qVzNsCgDqacah4Ztfan3hlbXuf5+9crL3r4On1e4b9KGfUSg3dJhhaPt9Sk7tk/ZESgBgecx4euIbX7xcFJdLHjDqi4uTfuRw0vbzx0zUk+TpAKAZjvqKkADAgvKDVQBARGgAACJCAwAQERoAgIjQAABE+kNDq9Vy7QEAYNALocGPNAIAo7wQGiQGAGAUn2kAACLjLyO9s7PTe3N3d/f8+fNFUfz6D3+bV6diX/v8J6ruAgAsiyl/e+LHN/701/v/nm1XpiA0AMCRGR8aNjY2Bm+eOPHevHo0iYsXL1bdBQBYFj7TAABEXhhp6F6hobPgyxQAQNcLoUFKAABGMT0BAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AACRY703Wq1Wd7ndbh95ZwCA+noeGlqtVm9Q6LsJACw50xMAQERoAAAix8Y/ZEG89oNfHRxU3Ymi+NkbX/7o6dWiKB598N/v/vDtqrtTrKys3Hjz653l97f3fvqLd6vtT1EUJ1eP/ej1VzvLv3v37m9+/5dq+1MUxdn1l15/7Xpn+Zdv//mP7/2j2v4URbHV+vi3v7rVWX7rxjt//+cH1fanKIqvfO7lV69/srP8/Z/89vH+/6rtT1EU3/vWpz/18sc6y44AQzkCJBwBEp0jwMrBh6+zUZ9puHnzZu9qt2/f3traOvzT379/f3V1dX19/fBNNdidO3cuXbq0urpadUfqa39//+7du5ubm1V3pNb29vb29/cvXLhQdUdqbXt7e319fW1treqO1NqtW7dmcgposEePHu3t7V2+fLnqjszF+JGG69evl9yc2vb29smTJ8+dOzeT1prqxIkTm5ubp06dqroj9fX48eO1tbWrV69W3ZFa293dffLkSVOPYrNy+vTps2fPnjlzpuqO1NqzZ8+uXbtWdS9q7eHDhw8ePLhy5UrVHZkLn2kAACLPRxra7bbrNAAAo7wwPSEoAACjmJ4AACLPvz0BAFCimpGG3g9PMIoqjaVECVU6JAWciHJNZ1HqNrOLO/kQZUKVcn79pFx3X1ryKiWvqc5jhv61wbvZqMqUVKNvxe5jmnHgGtzw6UpUvtbQFZu0m80mNPixq4Qq5RYldFfFztORvKY6dw7doxq8m42qTEk1hq5Y0tRiGdzw6UpUvtaoVWayCTVxdJeRLn/RDta99x+j9zGLK+m/KhXBi7bkzmUoUXLUVqWukkN5g3ezUc9e3qupA0H9yzXY/nQlmnS8qnm72RGFhsF01lkYrEX5is2mSsW4bVGijvLhYlUay242yhQzEctcrq6hdWvkblavH6zqJLLu/6vuzhwdZgMbXKVZbVGDS9Qxk+HiBlSpPdUl6ZZnN5vi/ej8ZiLqXK5JuzRY2MG6NXU3qzg0jJ3s6R4U6lCsmZhic5aqSiWTjuFaQzWpRFNrXpWGTjAnZ8ol2c2St7zzG+heiHIlHSiJCGPHEnqXm7GbVRka+qZqRj1scF5ncU2xFUtVpene5SxViaa2PFUa23O7Wa859XMhyhU+79QjeZM+UbEIdavgOg3lMao+gzAzN9F2LW2VckqUUKVDWtACjn23Wsnz1qpc0/VkToVdoLrNZqRh7Mxi35hhd2hl7D/A/IbOKtG3vX0bpUpjKVHh5dYj+UxD9wH5iG4DCjiqMuXVGLpWM/a3oRs+9IA8jxINtRB1G1THy0jXJ1LVmSqNpUQJVTokBZyIck2nPnWr3Q9W1ac0daZKYylRQpUOSQEnolzTqVXd6jjSAADUUO1GGgCAehIaAIDI/wFj/VGPceQk8wAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -7013,7 +7013,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -7075,7 +7075,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJRUlEQVR4nO3dTYicdx0H8NlkA3E1IbELmzSJJTuGkviGpKUURUSKF8W3Hj0oSMGLojdpvAjSevHSg3rQi+hBKChIQS30IJSqKXiwhmAZU9ls42o0oUtDMWnWw9Cns8+8fWf22X3m5fMhhOeZnfnP7/nNPDPfeZ5nnlnY2tpqAAAMs6/uAgCA6SA0AAARoQEAiAgNAEBEaAAAIkIDABBZ3Pu7bDabxXSr1dr7AnpqNpuTUwwATKCFPT5PQ+m92Vs1AEyLPQ0NIgIATK+Kd0888ZMXS5c8/pUH2hNDE0Ox26K4Wvsm3bszuofqvGTwOMUIA8bMK+k5FADMpIpDw8trr92+fbuYPXDgwPr6+okTJ4besPSe3XO6e3a8cQaPOdKt7G0BYH5U/+2JWx0ajcarr7469Cal99rOz/Q934NLH/qLm486Tvefxhuh51AAMGNq+PbEruoME/2UdlXsRIVDAcCEm9bQUOwa6N42EN688VbC2OH7fYVDAcAkq373xFKHzstL+xQmQavVqqqqCocCgMlUcWj4/CeaH33/oeLfQ/cf7Pxr99tq8QG95zEKg/XczNBz/JIBb+2jViIlADA/Kt498ZmP3ddo3DfgCv2+uDjqIYejjp9fZ6RKkrsDgNmw12eEBACmlB+sAgAiQgMAEBEaAICI0AAARIQGACBSDg3NZtO5BwCAbttCgx9pBAD62RYaJAYAoB/HNAAAkeGnkV5fX++c3djYOHbsWKPReOb5q7tV1Fg+9ZGTdZcAALNszN+e+Plv/v7CX/5dbSk7dPr4u86tHqm7CgCYWcNDw4kTJ7pnl5b+uVsVjevd99xz770rdVcBADPLMQ0AQGTblobiDA3tCV+mAAAK20KDlAAA9GP3BAAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgsds40m81iutVq7XkxAMDkejs0NJvNzqBQmgUA5pzdEwBARGgAACKLw68yhb7wzV/WXcI2T3//c/v2LbSnn/vjP579wyu1lrPN8eV3fv2LDxSzF576/etv3K6xnpLHHv3Q+5rL7en1f21+50fP11tPp8X9+35w4ZPF7E9//dLfXvlvjfWUfPjsyqOP3F/Mfunbz2xtbdVYT8lT33rkyKGD7ek/vXTt6d9drreeTkcOHXz8sYeL2Sd//MKN196osZ6SRx+5/6EP3tue3nz9f1/97m/rrafTwsLCz574dDH7q+defvGv12qsp+S97zn65c9+oJj92pPP3r5zt8Z6Si489vCpY4fb05ev/OeHv/hzvfV0esfBxe994+ONRmOheB3pd0zDxYsXO295+fLlc+fOVVXH2trakSNHDh06VNWA8+P69etvvvnmyspK3YVMn1u3bm1sbJw+fbruQqbSpUuXKnwFmCtXrlxZWVlZWlqqu5Dps7GxsX///uXl5boLmT6bm5s3b948depUVQMO39Lw4IMPDpjdocOHDy8vLx89erTCMefEtWvX7ty5U+FTYX5sbm5evXr17NmzdRcyle7evXv+/Pm6q5hKS0tLJ0+e9BlpDGtra4uLi8ePH6+7kOlz48aN69evnzlzpqoBHdMAAETe3tLQarWcpwEA6Gfb7glBAQDox+4JACCyMFHfwgIAJtaunKehfWxEuLOj5/mqiwvn52zWox5Qom9tnX1rG7rgWtemdUMla+WAl7uwIbPU1X4dKy7vuaSlS4oF7znUgLuegTZ2P50Gt3SHCzVO07aqtrq6Wvxf1Wgzr7SYO1/qOenb1i4s6fy0rsSzriRZKwe83K2urlbSkCnqar+ODV6EAY0dfJ2d1DaZup9Og1u62wvVc/zqj2kYHHw6Q1N7urik+ZbSn4oLZ1jyCa80PVLfOq8zb7Qu0e8DR2la60oGbH4YvGWic3pmurqTzS2jmsk25o0acM0BC1VJ0yblNNI9n1jtb4FOxTaluiR9m/kedq4J+ZJq3di0brDxln2Guzp0DR1vFe53X7Paxt0zUtP2OjQUdXjYuhVrzoDHT99KSt3o7o/WDdWvM1o3hqG9mpOudi5dzx8oKAxdhXuakzZWq5KmTcqWhuLUUvP88I8RhJO+6W1PWje2OWld6Xx3bQOSffd1GnO5LicVJm0cz8y0cVTdux4a8QKO1LRJCQ2NjiNmZ+mB3ANJ3/S2J61rjLtoc9K6MQ5WH/ypOrntVHc1306wezXMQBvHsMOdL3nTaji5kw1K3ZLjcfStJ63bVVrXVm0TZrWrYx/MMd7dzWobd9XOm1b9lobOIy0bo5ytoT3Rc4d0Ps6UKm0IzRc26dvubQmcBFq3Ezt8lZ/51g1divFe7ka6r+nqaikBtFqtoWtozyvM53rd/XTq14cKn3iNEZvmjJAAQMRvTwAAEaEBAIj8H403iUR6A51xAAAAAElFTkSuQmCC"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJRUlEQVR4nO3dTYicdx0H8NlkA3E1IbELmzSJJTuGkviGpKUURUSKF8W3Hj0oSMGLojdpvAjSevHSg3rQi+hBKChIQS30IJSqKXiwhmAZU9ls42o0oUtDMWnWw9Cns8+8fWf22X3m5fMhhOeZnfnP7/nNPDPfeZ5nnlnY2tpqAAAMs6/uAgCA6SA0AAARoQEAiAgNAEBEaAAAIkIDABBZ3Pu7bDabxXSr1dr7AnpqNpuTUwwATKCFPT5PQ+m92Vs1AEyLPQ0NIgIATK+Kd0888ZMXS5c8/pUH2hNDE0Ox26K4Wvsm3bszuofqvGTwOMUIA8bMK+k5FADMpIpDw8trr92+fbuYPXDgwPr6+okTJ4besPSe3XO6e3a8cQaPOdKt7G0BYH5U/+2JWx0ajcarr7469Cal99rOz/Q934NLH/qLm486Tvefxhuh51AAMGNq+PbEruoME/2UdlXsRIVDAcCEm9bQUOwa6N42EN688VbC2OH7fYVDAcAkq373xFKHzstL+xQmQavVqqqqCocCgMlUcWj4/CeaH33/oeLfQ/cf7Pxr99tq8QG95zEKg/XczNBz/JIBb+2jViIlADA/Kt498ZmP3ddo3DfgCv2+uDjqIYejjp9fZ6RKkrsDgNmw12eEBACmlB+sAgAiQgMAEBEaAICI0AAARIQGACBSDg3NZtO5BwCAbttCgx9pBAD62RYaJAYAoB/HNAAAkeGnkV5fX++c3djYOHbsWKPReOb5q7tV1Fg+9ZGTdZcAALNszN+e+Plv/v7CX/5dbSk7dPr4u86tHqm7CgCYWcNDw4kTJ7pnl5b+uVsVjevd99xz770rdVcBADPLMQ0AQGTblobiDA3tCV+mAAAK20KDlAAA9GP3BAAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgsds40m81iutVq7XkxAMDkejs0NJvNzqBQmgUA5pzdEwBARGgAACKLw68yhb7wzV/WXcI2T3//c/v2LbSnn/vjP579wyu1lrPN8eV3fv2LDxSzF576/etv3K6xnpLHHv3Q+5rL7en1f21+50fP11tPp8X9+35w4ZPF7E9//dLfXvlvjfWUfPjsyqOP3F/Mfunbz2xtbdVYT8lT33rkyKGD7ek/vXTt6d9drreeTkcOHXz8sYeL2Sd//MKN196osZ6SRx+5/6EP3tue3nz9f1/97m/rrafTwsLCz574dDH7q+defvGv12qsp+S97zn65c9+oJj92pPP3r5zt8Z6Si489vCpY4fb05ev/OeHv/hzvfV0esfBxe994+ONRmOheB3pd0zDxYsXO295+fLlc+fOVVXH2trakSNHDh06VNWA8+P69etvvvnmyspK3YVMn1u3bm1sbJw+fbruQqbSpUuXKnwFmCtXrlxZWVlZWlqqu5Dps7GxsX///uXl5boLmT6bm5s3b948depUVQMO39Lw4IMPDpjdocOHDy8vLx89erTCMefEtWvX7ty5U+FTYX5sbm5evXr17NmzdRcyle7evXv+/Pm6q5hKS0tLJ0+e9BlpDGtra4uLi8ePH6+7kOlz48aN69evnzlzpqoBHdMAAETe3tLQarWcpwEA6Gfb7glBAQDox+4JACCyMFHfwgIAJtaunKehfWxEuLOj5/mqiwvn52zWox5Qom9tnX1rG7rgWtemdUMla+WAl7uwIbPU1X4dKy7vuaSlS4oF7znUgLuegTZ2P50Gt3SHCzVO07aqtrq6Wvxf1Wgzr7SYO1/qOenb1i4s6fy0rsSzriRZKwe83K2urlbSkCnqar+ODV6EAY0dfJ2d1DaZup9Og1u62wvVc/zqj2kYHHw6Q1N7urik+ZbSn4oLZ1jyCa80PVLfOq8zb7Qu0e8DR2la60oGbH4YvGWic3pmurqTzS2jmsk25o0acM0BC1VJ0yblNNI9n1jtb4FOxTaluiR9m/kedq4J+ZJq3di0brDxln2Guzp0DR1vFe53X7Paxt0zUtP2OjQUdXjYuhVrzoDHT99KSt3o7o/WDdWvM1o3hqG9mpOudi5dzx8oKAxdhXuakzZWq5KmTcqWhuLUUvP88I8RhJO+6W1PWje2OWld6Xx3bQOSffd1GnO5LicVJm0cz8y0cVTdux4a8QKO1LRJCQ2NjiNmZ+mB3ANJ3/S2J61rjLtoc9K6MQ5WH/ypOrntVHc1306wezXMQBvHsMOdL3nTaji5kw1K3ZLjcfStJ63bVVrXVm0TZrWrYx/MMd7dzWobd9XOm1b9lobOIy0bo5ytoT3Rc4d0Ps6UKm0IzRc26dvubQmcBFq3Ezt8lZ/51g1divFe7ka6r+nqaikBtFqtoWtozyvM53rd/XTq14cKn3iNEZvmjJAAQMRvTwAAEaEBAIj8H403iUR6A51xAAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -7209,7 +7209,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAI9UlEQVR4nO3dTYgcaR0H4BpJMsmSETJKvsYYlh6IDJuDxCCoCCvoQUXw4sHDXrzodU+yXmUvenAFj96C4F2FvYniKbsnMYbdtDjESZyIEzCuyRjJeGi20+mP6l/3dE9VVz8Py1Ld0/X2W/9UV/36fburVw4ODgoAgHE+UnUHAIDFIDQAABGhAQCICA0AQERoAAAiQgMAEDl29E/ZarW6y+12++g7MFSr1apPZwCghlaO+DoNfedmp2oAWBRHGhpEBABYXDOennjz5+/03fPGdz7TWRibGLrTFt2HdVYZnM4YbKr3nvJ2ui2UtJn3ZGhTANBIMw4N79/919OnT7s3jx8/vrOzs7GxMXbFvnP20OXBm9O1U97mRGuZbQFgecz+2xP/6VEUxb1798au0neu7X1PP/Qc3Pemv7v6pO0M/mm6FoY2BQANU8G3J+aqN0yM0jdVcRgzbAoAam5RQ0N3amBwbCBcvfgwYRzyfD/DpgCgzmY/PfFSj977++YU6qDdbs+qVzNsCgDqacah4Ztfan3hlbXuf5+9crL3r4On1e4b9KGfUSg3dJhhaPt9Sk7tk/ZESgBgecx4euIbX7xcFJdLHjDqi4uTfuRw0vbzx0zUk+TpAKAZjvqKkADAgvKDVQBARGgAACJCAwAQERoAgIjQAABE+kNDq9Vy7QEAYNALocGPNAIAo7wQGiQGAGAUn2kAACLjLyO9s7PTe3N3d/f8+fNFUfz6D3+bV6diX/v8J6ruAgAsiyl/e+LHN/701/v/nm1XpiA0AMCRGR8aNjY2Bm+eOPHevHo0iYsXL1bdBQBYFj7TAABEXhhp6F6hobPgyxQAQNcLoUFKAABGMT0BAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AACRY703Wq1Wd7ndbh95ZwCA+noeGlqtVm9Q6LsJACw50xMAQERoAAAix8Y/ZEG89oNfHRxU3Ymi+NkbX/7o6dWiKB598N/v/vDtqrtTrKys3Hjz653l97f3fvqLd6vtT1EUJ1eP/ej1VzvLv3v37m9+/5dq+1MUxdn1l15/7Xpn+Zdv//mP7/2j2v4URbHV+vi3v7rVWX7rxjt//+cH1fanKIqvfO7lV69/srP8/Z/89vH+/6rtT1EU3/vWpz/18sc6y44AQzkCJBwBEp0jwMrBh6+zUZ9puHnzZu9qt2/f3traOvzT379/f3V1dX19/fBNNdidO3cuXbq0urpadUfqa39//+7du5ubm1V3pNb29vb29/cvXLhQdUdqbXt7e319fW1treqO1NqtW7dmcgposEePHu3t7V2+fLnqjszF+JGG69evl9yc2vb29smTJ8+dOzeT1prqxIkTm5ubp06dqroj9fX48eO1tbWrV69W3ZFa293dffLkSVOPYrNy+vTps2fPnjlzpuqO1NqzZ8+uXbtWdS9q7eHDhw8ePLhy5UrVHZkLn2kAACLPRxra7bbrNAAAo7wwPSEoAACjmJ4AACLPvz0BAFCimpGG3g9PMIoqjaVECVU6JAWciHJNZ1HqNrOLO/kQZUKVcn79pFx3X1ryKiWvqc5jhv61wbvZqMqUVKNvxe5jmnHgGtzw6UpUvtbQFZu0m80mNPixq4Qq5RYldFfFztORvKY6dw7doxq8m42qTEk1hq5Y0tRiGdzw6UpUvtaoVWayCTVxdJeRLn/RDta99x+j9zGLK+m/KhXBi7bkzmUoUXLUVqWukkN5g3ezUc9e3qupA0H9yzXY/nQlmnS8qnm72RGFhsF01lkYrEX5is2mSsW4bVGijvLhYlUay242yhQzEctcrq6hdWvkblavH6zqJLLu/6vuzhwdZgMbXKVZbVGDS9Qxk+HiBlSpPdUl6ZZnN5vi/ej8ZiLqXK5JuzRY2MG6NXU3qzg0jJ3s6R4U6lCsmZhic5aqSiWTjuFaQzWpRFNrXpWGTjAnZ8ol2c2St7zzG+heiHIlHSiJCGPHEnqXm7GbVRka+qZqRj1scF5ncU2xFUtVpene5SxViaa2PFUa23O7Wa859XMhyhU+79QjeZM+UbEIdavgOg3lMao+gzAzN9F2LW2VckqUUKVDWtACjn23Wsnz1qpc0/VkToVdoLrNZqRh7Mxi35hhd2hl7D/A/IbOKtG3vX0bpUpjKVHh5dYj+UxD9wH5iG4DCjiqMuXVGLpWM/a3oRs+9IA8jxINtRB1G1THy0jXJ1LVmSqNpUQJVTokBZyIck2nPnWr3Q9W1ac0daZKYylRQpUOSQEnolzTqVXd6jjSAADUUO1GGgCAehIaAIDI/wFj/VGPceQk8wAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -7351,7 +7351,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAANyElEQVR4nO3d728k910H8O/Zdz7Hdz7/2j1fkva4q0tLEwriaJrQtAlVkkqI9kEjJB5AhYSEBII+yINWhKLKRRQhFTWqEBKI/6EVolEQoCoKFNpGFQIpVXhgTg0cwbnL+VLHPnvttXkwrrO33tmd3Znx7n3n9Xr03b2Zz45n52beOzPf+Z7Y398PLZaWlkIIKysrAQCgxVjri6WlJXEBAOjojtAgMQAAacZ6TwIAEMLJnlNcu3at9eXq6uqFCxe6TL+1tTU2NjYxMZF30YhUs9nc2to6c+bMsBeE0bWxsTE5OTk+Pj7sBWFENRqNvb29ycnJYS9IVH7vK98NIfzJ7/zcubOpR/DizzQ0Go3d3d3CyxKNZrPZaDSGvRSMtEaj0Ww2h70UjK7d3V27kWI19/bbGh31PtNw//33d3l51P7+/unTp2u1Ws/KVNPGxsbe3t5999037AVhdG1tbdXrdaejSHPjxo3t7W27kQLdWNtMGg/+1OUuk7mnAQCq7vra7SyT3XGmIXlIQ/C0BgCoki/8+UshhE89vtR9sjtCg5QAAJU1d67HvaUuTwAAIQgNAEBGtdl7uk8gNAAAIYRQn5vqPkHvLpdlO7z7MozSTRWG4QCgIja3dpLG3EyPMw1DDg1tx+bROVSPyGIAQNkOH9Jw6mSP6w/DvDxxNCI4VAPAMcv4kIYwxDMNPU8qHF62OJwsmeXo5YyjpVrf6V7nsEKXmtmXpGMpABhlX/7rfw0h/MpT7+855fDvaeio7ZjdsX305WB1utfsa66RvdoCAN3N9+pvGQoJDU8/843sE3/9uU/3nKbtWNt6MO54DG47Wh+2+61zONnAS9KlFACMsvnZYwkNfVleXl5eXj62j2u9WJCm7VJFHgWWAoDjVJ/t0d8yFBIavv7cp5eXly9fPhgXa21t7eTJk9PT0x0nvno1/wd2cHgO4Oi5gYyzh4JG3CiwFAAcm/PzxxIaQgitJw+uXbuWZWjsowf4oUu7rXK4pQCgPGs/2koaZ6Ymek48zC6XbR0QQssP9Nb3Mx56O55m6Fi/TZdLGP0uSZarIQAwOt64uZF94iH3nkjruNj6fp4f62n1s0/T15Jk+TgAGB3Pfu2lEMIvP5bpR+/wu1ymHVmPvt/znbRMkPOdvqYXFAC46/Qc3zJhwCoAqLoFoQEAyGK+16DYCaEBAKquNic0AADpGjvNpLHQa1DshNAAABV12N9y4tR4lumFBgCoqBuZB8VOCA0AUFF/9Ff/EkJ4+on3ZZxeaACASsv4kIYgNABAxS3MCA0AQAa1DONbJoQGAKi0+pzQAACk+9Hb20nj7D2nMs4iNABAFb1xczNpjI9nDQNCAwBU0eefezGE8ImPXMo+i9AAANU1n7m/ZRAaAKDK5rONOpEQGgCgumrZBsVOCA0AUF3Z+1sGoQEAKmhvbz9p1DM/2SkIDQBQQf0Oip0QGgCgclbf3BxgLqEBACrnS3/57RDCJx9f6msuoQEAKmp+uo+HNAShAQAqqzbXR3/LIDQAQGX11XUiCA0AUFn1WaEBAEi3ubWTNGamT/c1o9AAANXy+vW3k0b2QbETQgMAVMvnvvpiCOGxn39XvzMKDQBQRQv9DFWVEBoAoIr6Gt8yITQAQBX1Nb5lQmgAgCoSGgCAbg4HxT4/f6bfeYUGAKiQN28djG95eqKPQbETQgMAVMjqzYPQMDZ2ot95hQYAqJAv/sU/hxCeePjiAPMKDQBQOQPcBRmEBgCooH4HxU4IDQBQOQN0nQhCAwBUx2F/y8V5lycAgHTbjWbSWJgVGgCAdG/c3EgaA/S3DEIDAFTHM1/5VgjhygcWB5tdaACAahlgUOyE0AAA1XJhYZCuE0FoAICquVATGgCADM4P1N8yCA0AUBHN5l7SuLd+drAKQgMAVMJb69tJY2ry1GAVhAYAqITrtzZzVhAaAKASnv3aSyGEj11518AVhAYAqJCB74IMQgMAVMpg41smhAYAqBBnGgCATBYXhAYAIF1j52BQbJcnAIBurt886G852KDYB/MWtDAAwOj67J/+Ywjhwz99b54iQgMAVMXAg2InhAYAqIr6nNAAAGRQnxu860QQGgCgOhYXBu86EYQGAIje4aDYeZ7sFIQGAIje27d3ksa5s6fz1BEaACBy19fyDoqdEBoAIHKf/+qLIYSPf/hizjpCAwBUQi3fQxqC0AAAFVGbzXUXZBAaAKAicj7ZKQgNAFARNaEBAOiikEGxE0IDAMTszbduJ42JU+M5SwkNABCz3/3yPxRVSmgAgPh98rGl/EWEBgCI33zuhzQEoQEAqqA2IzQAABnU54UGACCD/P0tg9AAABHb2Gwkjblzk/mrCQ0AEK3PfOH5AqsJDQAQuScfuVRIHaEBACI3X8S1iSA0AED05meFBgAgg4UiHtIQhAYAiF4996DYCaEBAOK0s7uXNGpzU4UUFBoAIE5rPx4Ue2ryVCEFhQYAiNNv//HfF1tQaACAmH3q8fcWVUpoAICYzc2cLqqU0AAAMavNFnMXZBAaACBuRT2kIQgNABC3oh7SEIQGAIjS5tZO0ihkUOyE0AAAEfr1Z7+ZNMbHCzvWCw0AEK2nfuFSgdWEBgCI1ux0Yf0tg9AAABEr8IaGIDQAQMQWZgvrOhGEBgCI2PmCxrdMCA0AEJtm88eDYjvTAAB0cWt9O2mcmZoosKzQAACx+a0v/V0ZZYUGAIhTgYNiJ4QGAIjT7LkiH9IQhAYAiFWxD2kIQgMAxKpWaH/LIDQAQKzqs840AADpbm/vJo25c0U+pCEIDQAQmV/7/b9NGhOnxoutLDQAQISefORS4TWFBgCI0MzZIp8FmRAaACBCxY5vmRAaACBChT+kIQgNABClYse3TAgNABChetFPdgpCAwDE5Nb6VtI4W+ig2AmhAQDi8ZtffCFpjI2dKLy40AAAsfmlj76njLJCAwDEZr6ErhNBaACA+MzNCA0AQAYLM8X3twxCAwDEp4z+lkFoAIBo7OzuJY3anDMNAEC6X/3c3ySNwgfFTggNABCVX/zQu0uqLDQAQFRmy+lvGYQGAIhMGeNbJoQGAIhKGeNbJoQGAIiK0AAAZHJ+vpSHNAShAQDisL7RSBplDIqdEBoAIAa/8YfPJ43x8bIO7kIDAMTjyUd+orziQgMAxKO8/pZBaACAmJQ0vmVCaACAeNTLGaoqITQAQDxq82fKKy40AEA8Fkt7SEMQGgAgAk8/842kUdKg2AmhAQAi8fAH7y21vtAAAJEotb9lEBoAIBq1MrtOBKEBAKJRmy3xLsggNABANM470wAAdLG3t580anPlnmk42fpiaWnpsL2yslLqBwMAhbi9vZs0yr4R8p3QsLS01BoU2l4CAKPpM3/wzaRR3qDYCZcnACAGH/nZ+8r+CKEBAGJQ9g0Noe2ehkJ89s++V3hNYvTvw14AgKjUZ8vtOhGyhIaXX3659eWrr776wAMPlLY8AMAg3rr5+ve//1apH9E7NDz00ENdXh71xKtbe/tjF++v5Vmsb333hx98X31hJldoev6fVp58+FKeCq9fX/+f1fWPXnl3niI/+K8bjZ3mlQ9cyFPkO//xv7XZe957cS5PkaLW6sc/dHFs7MTAFV57/dYPr6099ehP5lkMa7XN/11/+7/fWP9YLNvqCy/958+8f/He+kyeItZqm5i21X/7wbWtxs6jVy7nKTIia7XZbL7w7as5j1Zb27vn56c+8eh7Tp0s966DE/v7B507i+o9cfXq1ampqcXFxWIWkOisr6+/9tprDz744LAXhNH1yiuvXLx4cXp6etgLwohaXV3d3Ny8fDlXaGAA75xpWFlZ8ZwGACDNHZcnBAUAII0ulwBAJu/c0wAA0MUdj5EOd16hKOQWh5xlO06cVqGkP+Fu13G15PxCEwVuFX0tm63ieOR8lnz+9Xyc+4q0N2lleAEOQkOyKbT+ByukM0XOsh0nTqtQ0p9Aq5K2itZ/GmwZbBWjJv96Ps59Rdqb1dH2hxceFnMmyLToP3CpLPOKoR0dhIajf1Uhf2fOIn3NHtkXU6yjO9DE0f8ArZOVdEBNq5lxr22rGIq2XW3bl1XSDiS7/FuFTaWQNdBXejt+2T9aDE1T/GOkuVuMzv/koX86PR2NkseQLxmu7r+qw/GGxdZjdtvxOC3RHv3dn33xxNA0PUJD9jM5ZbNXyintZEPaZB0nXinnYR4Df7m2iiHKsuaHsgOxVRSi+6/qjtMMS/dE28r9TPn1CA1dNo6OZ10yHpP6WcI4LwsNRcbc0EXPkxODbRVtM2a/F9JWcWwGO8uaZwdiX3HMMh5Qs6/ewy+9pB8bXaR9xGDnVkckG42IwS9PDLwSO57mSuPbursM9mX1+z/ZVnHM2n5cFlIzyzdoX3Gcut/z1Je29FbUj43D8JFl9kKIoUelhoZj+B/Y8zSXvUDhMt5pOCJr3lZx9yr2a7KvGIpju2hY1OnPYtODjaqjd7pctjZWVlYKOaF0tGzrm/2ete6+YCX9CREbYP2Ut1UMVuFwMWwVpRrgSkGxm0rZ+4q0NzmU8Qha9oG2jOJiaF9G5YmQviGOslUM12iu/9Fcqrtd2oHzsN0WrVrfTJslbcbBfid0Oa63Fe+yhaSFyJx/SMfV0nNd3aVGIjTYC3CUrWLoRvArGMFF4m5no+rLSIQGYKQ4RU9FSAz9EhoAgEwMjQ0AZCI0AACZCA0AQCb/D8pwR24BKq3zAAAAAElFTkSuQmCC"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -7413,7 +7413,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJRUlEQVR4nO3dTYicdx0H8NlkA3E1IbELmzSJJTuGkviGpKUURUSKF8W3Hj0oSMGLojdpvAjSevHSg3rQi+hBKChIQS30IJSqKXiwhmAZU9ls42o0oUtDMWnWw9Cns8+8fWf22X3m5fMhhOeZnfnP7/nNPDPfeZ5nnlnY2tpqAAAMs6/uAgCA6SA0AAARoQEAiAgNAEBEaAAAIkIDABBZ3Pu7bDabxXSr1dr7AnpqNpuTUwwATKCFPT5PQ+m92Vs1AEyLPQ0NIgIATK+Kd0888ZMXS5c8/pUH2hNDE0Ox26K4Wvsm3bszuofqvGTwOMUIA8bMK+k5FADMpIpDw8trr92+fbuYPXDgwPr6+okTJ4besPSe3XO6e3a8cQaPOdKt7G0BYH5U/+2JWx0ajcarr7469Cal99rOz/Q934NLH/qLm486Tvefxhuh51AAMGNq+PbEruoME/2UdlXsRIVDAcCEm9bQUOwa6N42EN688VbC2OH7fYVDAcAkq373xFKHzstL+xQmQavVqqqqCocCgMlUcWj4/CeaH33/oeLfQ/cf7Pxr99tq8QG95zEKg/XczNBz/JIBb+2jViIlADA/Kt498ZmP3ddo3DfgCv2+uDjqIYejjp9fZ6RKkrsDgNmw12eEBACmlB+sAgAiQgMAEBEaAICI0AAARIQGACBSDg3NZtO5BwCAbttCgx9pBAD62RYaJAYAoB/HNAAAkeGnkV5fX++c3djYOHbsWKPReOb5q7tV1Fg+9ZGTdZcAALNszN+e+Plv/v7CX/5dbSk7dPr4u86tHqm7CgCYWcNDw4kTJ7pnl5b+uVsVjevd99xz770rdVcBADPLMQ0AQGTblobiDA3tCV+mAAAK20KDlAAA9GP3BAAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgsds40m81iutVq7XkxAMDkejs0NJvNzqBQmgUA5pzdEwBARGgAACKLw68yhb7wzV/WXcI2T3//c/v2LbSnn/vjP579wyu1lrPN8eV3fv2LDxSzF576/etv3K6xnpLHHv3Q+5rL7en1f21+50fP11tPp8X9+35w4ZPF7E9//dLfXvlvjfWUfPjsyqOP3F/Mfunbz2xtbdVYT8lT33rkyKGD7ek/vXTt6d9drreeTkcOHXz8sYeL2Sd//MKN196osZ6SRx+5/6EP3tue3nz9f1/97m/rrafTwsLCz574dDH7q+defvGv12qsp+S97zn65c9+oJj92pPP3r5zt8Z6Si489vCpY4fb05ev/OeHv/hzvfV0esfBxe994+ONRmOheB3pd0zDxYsXO295+fLlc+fOVVXH2trakSNHDh06VNWA8+P69etvvvnmyspK3YVMn1u3bm1sbJw+fbruQqbSpUuXKnwFmCtXrlxZWVlZWlqqu5Dps7GxsX///uXl5boLmT6bm5s3b948depUVQMO39Lw4IMPDpjdocOHDy8vLx89erTCMefEtWvX7ty5U+FTYX5sbm5evXr17NmzdRcyle7evXv+/Pm6q5hKS0tLJ0+e9BlpDGtra4uLi8ePH6+7kOlz48aN69evnzlzpqoBHdMAAETe3tLQarWcpwEA6Gfb7glBAQDox+4JACCyMFHfwgIAJtaunKehfWxEuLOj5/mqiwvn52zWox5Qom9tnX1rG7rgWtemdUMla+WAl7uwIbPU1X4dKy7vuaSlS4oF7znUgLuegTZ2P50Gt3SHCzVO07aqtrq6Wvxf1Wgzr7SYO1/qOenb1i4s6fy0rsSzriRZKwe83K2urlbSkCnqar+ODV6EAY0dfJ2d1DaZup9Og1u62wvVc/zqj2kYHHw6Q1N7urik+ZbSn4oLZ1jyCa80PVLfOq8zb7Qu0e8DR2la60oGbH4YvGWic3pmurqTzS2jmsk25o0acM0BC1VJ0yblNNI9n1jtb4FOxTaluiR9m/kedq4J+ZJq3di0brDxln2Guzp0DR1vFe53X7Paxt0zUtP2OjQUdXjYuhVrzoDHT99KSt3o7o/WDdWvM1o3hqG9mpOudi5dzx8oKAxdhXuakzZWq5KmTcqWhuLUUvP88I8RhJO+6W1PWje2OWld6Xx3bQOSffd1GnO5LicVJm0cz8y0cVTdux4a8QKO1LRJCQ2NjiNmZ+mB3ANJ3/S2J61rjLtoc9K6MQ5WH/ypOrntVHc1306wezXMQBvHsMOdL3nTaji5kw1K3ZLjcfStJ63bVVrXVm0TZrWrYx/MMd7dzWobd9XOm1b9lobOIy0bo5ytoT3Rc4d0Ps6UKm0IzRc26dvubQmcBFq3Ezt8lZ/51g1divFe7ka6r+nqaikBtFqtoWtozyvM53rd/XTq14cKn3iNEZvmjJAAQMRvTwAAEaEBAIj8H403iUR6A51xAAAAAElFTkSuQmCC"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJRUlEQVR4nO3dTYicdx0H8NlkA3E1IbELmzSJJTuGkviGpKUURUSKF8W3Hj0oSMGLojdpvAjSevHSg3rQi+hBKChIQS30IJSqKXiwhmAZU9ls42o0oUtDMWnWw9Cns8+8fWf22X3m5fMhhOeZnfnP7/nNPDPfeZ5nnlnY2tpqAAAMs6/uAgCA6SA0AAARoQEAiAgNAEBEaAAAIkIDABBZ3Pu7bDabxXSr1dr7AnpqNpuTUwwATKCFPT5PQ+m92Vs1AEyLPQ0NIgIATK+Kd0888ZMXS5c8/pUH2hNDE0Ox26K4Wvsm3bszuofqvGTwOMUIA8bMK+k5FADMpIpDw8trr92+fbuYPXDgwPr6+okTJ4besPSe3XO6e3a8cQaPOdKt7G0BYH5U/+2JWx0ajcarr7469Cal99rOz/Q934NLH/qLm486Tvefxhuh51AAMGNq+PbEruoME/2UdlXsRIVDAcCEm9bQUOwa6N42EN688VbC2OH7fYVDAcAkq373xFKHzstL+xQmQavVqqqqCocCgMlUcWj4/CeaH33/oeLfQ/cf7Pxr99tq8QG95zEKg/XczNBz/JIBb+2jViIlADA/Kt498ZmP3ddo3DfgCv2+uDjqIYejjp9fZ6RKkrsDgNmw12eEBACmlB+sAgAiQgMAEBEaAICI0AAARIQGACBSDg3NZtO5BwCAbttCgx9pBAD62RYaJAYAoB/HNAAAkeGnkV5fX++c3djYOHbsWKPReOb5q7tV1Fg+9ZGTdZcAALNszN+e+Plv/v7CX/5dbSk7dPr4u86tHqm7CgCYWcNDw4kTJ7pnl5b+uVsVjevd99xz770rdVcBADPLMQ0AQGTblobiDA3tCV+mAAAK20KDlAAA9GP3BAAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgsds40m81iutVq7XkxAMDkejs0NJvNzqBQmgUA5pzdEwBARGgAACKLw68yhb7wzV/WXcI2T3//c/v2LbSnn/vjP579wyu1lrPN8eV3fv2LDxSzF576/etv3K6xnpLHHv3Q+5rL7en1f21+50fP11tPp8X9+35w4ZPF7E9//dLfXvlvjfWUfPjsyqOP3F/Mfunbz2xtbdVYT8lT33rkyKGD7ek/vXTt6d9drreeTkcOHXz8sYeL2Sd//MKN196osZ6SRx+5/6EP3tue3nz9f1/97m/rrafTwsLCz574dDH7q+defvGv12qsp+S97zn65c9+oJj92pPP3r5zt8Z6Si489vCpY4fb05ev/OeHv/hzvfV0esfBxe994+ONRmOheB3pd0zDxYsXO295+fLlc+fOVVXH2trakSNHDh06VNWA8+P69etvvvnmyspK3YVMn1u3bm1sbJw+fbruQqbSpUuXKnwFmCtXrlxZWVlZWlqqu5Dps7GxsX///uXl5boLmT6bm5s3b948depUVQMO39Lw4IMPDpjdocOHDy8vLx89erTCMefEtWvX7ty5U+FTYX5sbm5evXr17NmzdRcyle7evXv+/Pm6q5hKS0tLJ0+e9BlpDGtra4uLi8ePH6+7kOlz48aN69evnzlzpqoBHdMAAETe3tLQarWcpwEA6Gfb7glBAQDox+4JACCyMFHfwgIAJtaunKehfWxEuLOj5/mqiwvn52zWox5Qom9tnX1rG7rgWtemdUMla+WAl7uwIbPU1X4dKy7vuaSlS4oF7znUgLuegTZ2P50Gt3SHCzVO07aqtrq6Wvxf1Wgzr7SYO1/qOenb1i4s6fy0rsSzriRZKwe83K2urlbSkCnqar+ODV6EAY0dfJ2d1DaZup9Og1u62wvVc/zqj2kYHHw6Q1N7urik+ZbSn4oLZ1jyCa80PVLfOq8zb7Qu0e8DR2la60oGbH4YvGWic3pmurqTzS2jmsk25o0acM0BC1VJ0yblNNI9n1jtb4FOxTaluiR9m/kedq4J+ZJq3di0brDxln2Guzp0DR1vFe53X7Paxt0zUtP2OjQUdXjYuhVrzoDHT99KSt3o7o/WDdWvM1o3hqG9mpOudi5dzx8oKAxdhXuakzZWq5KmTcqWhuLUUvP88I8RhJO+6W1PWje2OWld6Xx3bQOSffd1GnO5LicVJm0cz8y0cVTdux4a8QKO1LRJCQ2NjiNmZ+mB3ANJ3/S2J61rjLtoc9K6MQ5WH/ypOrntVHc1306wezXMQBvHsMOdL3nTaji5kw1K3ZLjcfStJ63bVVrXVm0TZrWrYx/MMd7dzWobd9XOm1b9lobOIy0bo5ytoT3Rc4d0Ps6UKm0IzRc26dvubQmcBFq3Ezt8lZ/51g1divFe7ka6r+nqaikBtFqtoWtozyvM53rd/XTq14cKn3iNEZvmjJAAQMRvTwAAEaEBAIj8H403iUR6A51xAAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -7547,7 +7547,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAI9UlEQVR4nO3dTYgcaR0H4BpJMsmSETJKvsYYlh6IDJuDxCCoCCvoQUXw4sHDXrzodU+yXmUvenAFj96C4F2FvYniKbsnMYbdtDjESZyIEzCuyRjJeGi20+mP6l/3dE9VVz8Py1Ld0/X2W/9UV/36fburVw4ODgoAgHE+UnUHAIDFIDQAABGhAQCICA0AQERoAAAiQgMAEDl29E/ZarW6y+12++g7MFSr1apPZwCghlaO+DoNfedmp2oAWBRHGhpEBABYXDOennjz5+/03fPGdz7TWRibGLrTFt2HdVYZnM4YbKr3nvJ2ui2UtJn3ZGhTANBIMw4N79/919OnT7s3jx8/vrOzs7GxMXbFvnP20OXBm9O1U97mRGuZbQFgecz+2xP/6VEUxb1798au0neu7X1PP/Qc3Pemv7v6pO0M/mm6FoY2BQANU8G3J+aqN0yM0jdVcRgzbAoAam5RQ0N3amBwbCBcvfgwYRzyfD/DpgCgzmY/PfFSj977++YU6qDdbs+qVzNsCgDqacah4Ztfan3hlbXuf5+9crL3r4On1e4b9KGfUSg3dJhhaPt9Sk7tk/ZESgBgecx4euIbX7xcFJdLHjDqi4uTfuRw0vbzx0zUk+TpAKAZjvqKkADAgvKDVQBARGgAACJCAwAQERoAgIjQAABE+kNDq9Vy7QEAYNALocGPNAIAo7wQGiQGAGAUn2kAACLjLyO9s7PTe3N3d/f8+fNFUfz6D3+bV6diX/v8J6ruAgAsiyl/e+LHN/701/v/nm1XpiA0AMCRGR8aNjY2Bm+eOPHevHo0iYsXL1bdBQBYFj7TAABEXhhp6F6hobPgyxQAQNcLoUFKAABGMT0BAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AACRY703Wq1Wd7ndbh95ZwCA+noeGlqtVm9Q6LsJACw50xMAQERoAAAix8Y/ZEG89oNfHRxU3Ymi+NkbX/7o6dWiKB598N/v/vDtqrtTrKys3Hjz653l97f3fvqLd6vtT1EUJ1eP/ej1VzvLv3v37m9+/5dq+1MUxdn1l15/7Xpn+Zdv//mP7/2j2v4URbHV+vi3v7rVWX7rxjt//+cH1fanKIqvfO7lV69/srP8/Z/89vH+/6rtT1EU3/vWpz/18sc6y44AQzkCJBwBEp0jwMrBh6+zUZ9puHnzZu9qt2/f3traOvzT379/f3V1dX19/fBNNdidO3cuXbq0urpadUfqa39//+7du5ubm1V3pNb29vb29/cvXLhQdUdqbXt7e319fW1treqO1NqtW7dmcgposEePHu3t7V2+fLnqjszF+JGG69evl9yc2vb29smTJ8+dOzeT1prqxIkTm5ubp06dqroj9fX48eO1tbWrV69W3ZFa293dffLkSVOPYrNy+vTps2fPnjlzpuqO1NqzZ8+uXbtWdS9q7eHDhw8ePLhy5UrVHZkLn2kAACLPRxra7bbrNAAAo7wwPSEoAACjmJ4AACLPvz0BAFCimpGG3g9PMIoqjaVECVU6JAWciHJNZ1HqNrOLO/kQZUKVcn79pFx3X1ryKiWvqc5jhv61wbvZqMqUVKNvxe5jmnHgGtzw6UpUvtbQFZu0m80mNPixq4Qq5RYldFfFztORvKY6dw7doxq8m42qTEk1hq5Y0tRiGdzw6UpUvtaoVWayCTVxdJeRLn/RDta99x+j9zGLK+m/KhXBi7bkzmUoUXLUVqWukkN5g3ezUc9e3qupA0H9yzXY/nQlmnS8qnm72RGFhsF01lkYrEX5is2mSsW4bVGijvLhYlUay242yhQzEctcrq6hdWvkblavH6zqJLLu/6vuzhwdZgMbXKVZbVGDS9Qxk+HiBlSpPdUl6ZZnN5vi/ej8ZiLqXK5JuzRY2MG6NXU3qzg0jJ3s6R4U6lCsmZhic5aqSiWTjuFaQzWpRFNrXpWGTjAnZ8ol2c2St7zzG+heiHIlHSiJCGPHEnqXm7GbVRka+qZqRj1scF5ncU2xFUtVpene5SxViaa2PFUa23O7Wa859XMhyhU+79QjeZM+UbEIdavgOg3lMao+gzAzN9F2LW2VckqUUKVDWtACjn23Wsnz1qpc0/VkToVdoLrNZqRh7Mxi35hhd2hl7D/A/IbOKtG3vX0bpUpjKVHh5dYj+UxD9wH5iG4DCjiqMuXVGLpWM/a3oRs+9IA8jxINtRB1G1THy0jXJ1LVmSqNpUQJVTokBZyIck2nPnWr3Q9W1ac0daZKYylRQpUOSQEnolzTqVXd6jjSAADUUO1GGgCAehIaAIDI/wFj/VGPceQk8wAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
diff --git a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_only__ScheduledReports.generateReport_week.original.html b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_only__ScheduledReports.generateReport_week.original.html
index 2accb6a21d..72e54efacf 100644
--- a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_only__ScheduledReports.generateReport_week.original.html
+++ b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_html_tables_only__ScheduledReports.generateReport_week.original.html
@@ -1393,7 +1393,7 @@
&nbsp;Bounce Rate&nbsp;&nbsp;
</th>
<th style="border-bottom:1px solid rgb(231,231,231);font-size: 15px;text-align: left;font-weight:normal;padding:13px 0 13px 10px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif; text-align:right;">
- &nbsp;Conversion Rate&nbsp;&nbsp;
+ &nbsp;Revenue&nbsp;&nbsp;
</th>
</thead>
<tbody>
@@ -1419,7 +1419,7 @@
20%
</td>
<td style="padding:17px 15px; text-align:right;;border-bottom:1px solid rgb(231,231,231);font-size: 15px;font-variant-numeric: tabular-nums;padding:17px 15px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif;">
- 80%
+ $13,361.11
</td>
</tr>
</tbody>
diff --git a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_csv__ScheduledReports.generateReport_week.original.csv b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_csv__ScheduledReports.generateReport_week.original.csv
index 9d46c7c8f6..5707fd0dea 100644
--- a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_csv__ScheduledReports.generateReport_week.original.csv
+++ b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_csv__ScheduledReports.generateReport_week.original.csv
@@ -55,8 +55,8 @@ label,nb_visits,nb_actions,conversion_rate,nb_actions_per_visit,avg_time_on_site
Windows XP,5,16,80%,3.2,00:22:49,20%
Browsers
-label,nb_visits,nb_actions,conversion_rate,nb_actions_per_visit,avg_time_on_site,bounce_rate
-Firefox,5,16,80%,3.2,00:22:49,20%
+label,nb_visits,nb_actions,revenue,nb_actions_per_visit,avg_time_on_site,bounce_rate
+Firefox,5,16,"$13,361.11",3.2,00:22:49,20%
Browser version
label,nb_visits,nb_actions,conversion_rate,nb_actions_per_visit,avg_time_on_site,bounce_rate
diff --git a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_week.original.pdf b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_week.original.pdf
index 80ef261d97..4e8aa24665 100644
--- a/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_week.original.pdf
+++ b/plugins/Ecommerce/tests/System/expected/test_ecommerceOrderWithItems_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_week.original.pdf
Binary files differ
diff --git a/plugins/Events/Events.php b/plugins/Events/Events.php
index b7e993cce7..aecab5a91f 100644
--- a/plugins/Events/Events.php
+++ b/plugins/Events/Events.php
@@ -19,7 +19,7 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable\AllColumns;
class Events extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/Events/VisitorDetails.php b/plugins/Events/VisitorDetails.php
index 7f9af081ef..af94b23ff1 100644
--- a/plugins/Events/VisitorDetails.php
+++ b/plugins/Events/VisitorDetails.php
@@ -24,7 +24,7 @@ class VisitorDetails extends VisitorDetailsAbstract
$action['icon'] = 'plugins/Morpheus/images/event.png';
$action['iconSVG'] = 'plugins/Morpheus/images/event.svg';
$action['title'] = Piwik::translate('Events_Event');
- $action['subtitle'] = Piwik::translate('Event_Category') . ': "' . $action['eventCategory'] . "'";
+ $action['subtitle'] = Piwik::translate('Events_Category') . ': "' . $action['eventCategory'] . "'";
if (!empty($action['eventName'])) {
$action['subtitle'] .= ', ' . Piwik::translate('General_Name') . ': "' . $action['eventName'] . '"';
@@ -65,6 +65,7 @@ class VisitorDetails extends VisitorDetailsAbstract
}
$view = new View('@Events/_actionEvent.twig');
+ $view->sendHeadersWhenRendering = false;
$view->action = $action;
$view->previousAction = $previousAction;
$view->visitInfo = $visitorDetails;
diff --git a/plugins/ExampleLogTables/plugin.json b/plugins/ExampleLogTables/plugin.json
index 3e6442de06..c51c261e29 100644
--- a/plugins/ExampleLogTables/plugin.json
+++ b/plugins/ExampleLogTables/plugin.json
@@ -4,7 +4,7 @@
"version": "0.1.0",
"theme": false,
"require": {
- "piwik": ">=3.0.0-b1,<4.0.0-b1"
+ "piwik": ">=4.0.0-b1,<5.0.0-b1"
},
"authors": [
{
diff --git a/plugins/ExampleLogTables/tests/Fixtures/VisitsWithUserIdAndCustomData.php b/plugins/ExampleLogTables/tests/Fixtures/VisitsWithUserIdAndCustomData.php
index 5482b096ca..f5e0f742ef 100644
--- a/plugins/ExampleLogTables/tests/Fixtures/VisitsWithUserIdAndCustomData.php
+++ b/plugins/ExampleLogTables/tests/Fixtures/VisitsWithUserIdAndCustomData.php
@@ -19,7 +19,7 @@ class VisitsWithUserIdAndCustomData extends Fixture
private static $countryCodes = ['CA', 'CN', 'DE', 'ES', 'FR', 'IE', 'IN', 'IT', 'MX', 'PT', 'RU', 'GB', 'US'];
- public function setUp()
+ public function setUp(): void
{
if (!self::siteCreated($idSite = 1)) {
self::createWebsite($this->dateTime);
diff --git a/plugins/ExamplePlugin/plugin.json b/plugins/ExamplePlugin/plugin.json
index 54bece1d44..1a1d6ad78c 100644
--- a/plugins/ExamplePlugin/plugin.json
+++ b/plugins/ExamplePlugin/plugin.json
@@ -4,7 +4,7 @@
"version": "0.1.0",
"theme": false,
"require": {
- "piwik": ">=3.0.0-b1,<4.0.0-b1"
+ "piwik": ">=4.0.0-b1,<5.0.0-b1"
},
"authors": [
{
diff --git a/plugins/ExamplePlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php b/plugins/ExamplePlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php
index 89d99a7005..2d157a44e4 100644
--- a/plugins/ExamplePlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php
+++ b/plugins/ExamplePlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php
@@ -20,14 +20,14 @@ class SimpleFixtureTrackFewVisits extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
$this->trackFirstVisit();
$this->trackSecondVisit();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/ExamplePlugin/tests/Integration/SimpleTest.php b/plugins/ExamplePlugin/tests/Integration/SimpleTest.php
index 1ccc775838..1612e30d6b 100644
--- a/plugins/ExamplePlugin/tests/Integration/SimpleTest.php
+++ b/plugins/ExamplePlugin/tests/Integration/SimpleTest.php
@@ -18,14 +18,14 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
class SimpleTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
// set up your test here if needed
}
- public function tearDown()
+ public function tearDown(): void
{
// clean up your test here if needed
diff --git a/plugins/ExamplePlugin/tests/Unit/SimpleTest.php b/plugins/ExamplePlugin/tests/Unit/SimpleTest.php
index 657e08ff46..0369d0316c 100644
--- a/plugins/ExamplePlugin/tests/Unit/SimpleTest.php
+++ b/plugins/ExamplePlugin/tests/Unit/SimpleTest.php
@@ -13,14 +13,14 @@ namespace Piwik\Plugins\ExamplePlugin\tests\Unit;
* @group SimpleTest
* @group Plugins
*/
-class SimpleTest extends \PHPUnit_Framework_TestCase
+class SimpleTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
// set up here if needed
}
- public function tearDown()
+ public function tearDown(): void
{
// tear down here if needed
}
diff --git a/plugins/ExampleTheme/ExampleTheme.php b/plugins/ExampleTheme/ExampleTheme.php
index a391f0daca..e39c69b955 100644
--- a/plugins/ExampleTheme/ExampleTheme.php
+++ b/plugins/ExampleTheme/ExampleTheme.php
@@ -13,7 +13,7 @@ use Piwik\Plugin;
class ExampleTheme extends Plugin
{
- public function getListHooksRegistered()
+ public function registerEvents()
{
return [
'Theme.configureThemeVariables' => 'configureThemeVariables',
diff --git a/plugins/ExampleTheme/plugin.json b/plugins/ExampleTheme/plugin.json
index 5a6c26bcdd..aa27c67db5 100644
--- a/plugins/ExampleTheme/plugin.json
+++ b/plugins/ExampleTheme/plugin.json
@@ -4,7 +4,7 @@
"version": "0.1.0",
"theme": true,
"require": {
- "piwik": ">=3.0.0-b1,<4.0.0-b1"
+ "piwik": ">=4.0.0-b1,<5.0.0-b1"
},
"stylesheet": "stylesheets/theme.less",
"homepage": "",
diff --git a/plugins/ExampleUI/Reports/GetPlanetRatios.php b/plugins/ExampleUI/Reports/GetPlanetRatios.php
index df18f9027c..22c6d60c44 100644
--- a/plugins/ExampleUI/Reports/GetPlanetRatios.php
+++ b/plugins/ExampleUI/Reports/GetPlanetRatios.php
@@ -8,7 +8,6 @@
namespace Piwik\Plugins\ExampleUI\Reports;
-use Piwik\Plugin\Report;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugins\CoreVisualizations\Visualizations\Cloud;
use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Pie;
@@ -33,7 +32,7 @@ class GetPlanetRatios extends Base
public function getDefaultTypeViewDataTable()
{
- return PIE::ID;
+ return Pie::ID;
}
public function configureWidgets(WidgetsList $widgetsList, ReportWidgetFactory $factory)
@@ -56,7 +55,7 @@ class GetPlanetRatios extends Base
{
$view->config->addTranslation('value', 'times the diameter of Earth');
- if ($view->isViewDataTableId(PIE::ID)) {
+ if ($view->isViewDataTableId(Pie::ID)) {
$view->config->columns_to_display = array('value');
$view->config->selectable_columns = array('value');
diff --git a/plugins/ExampleUI/Reports/GetTemperatures.php b/plugins/ExampleUI/Reports/GetTemperatures.php
index cf14b0a2e6..adc2e3fbda 100644
--- a/plugins/ExampleUI/Reports/GetTemperatures.php
+++ b/plugins/ExampleUI/Reports/GetTemperatures.php
@@ -9,12 +9,10 @@
namespace Piwik\Plugins\ExampleUI\Reports;
use Piwik\Piwik;
-use Piwik\Plugin\Report;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Bar;
use Piwik\Plugin\Manager as PluginManager;
use Piwik\Report\ReportWidgetFactory;
-use Piwik\View;
use Piwik\Widget\WidgetsList;
/**
@@ -57,7 +55,7 @@ class GetTemperatures extends Base
public function configureView(ViewDataTable $view)
{
- if ($view->isViewDataTableId(BAR::ID)) {
+ if ($view->isViewDataTableId(Bar::ID)) {
$view->config->y_axis_unit = '°C';
$view->config->show_footer = false;
diff --git a/plugins/Feedback/API.php b/plugins/Feedback/API.php
index fdfe0adc43..de32971f16 100644
--- a/plugins/Feedback/API.php
+++ b/plugins/Feedback/API.php
@@ -9,10 +9,10 @@
namespace Piwik\Plugins\Feedback;
use Piwik\Common;
use Piwik\Config;
+use Piwik\Container\StaticContainer;
use Piwik\IP;
use Piwik\Mail;
use Piwik\Piwik;
-use Piwik\Translate;
use Piwik\Url;
use Piwik\Version;
@@ -80,11 +80,13 @@ class API extends \Piwik\Plugin\API
private function getEnglishTranslationForFeatureName($featureName)
{
- if (Translate::getLanguageLoaded() == 'en') {
+ $translator = StaticContainer::get('Piwik\Translation\Translator');
+
+ if ($translator->getCurrentLanguage() == 'en') {
return $featureName;
}
- $translationKeyForFeature = Translate::findTranslationKeyForTranslation($featureName);
+ $translationKeyForFeature = $translator->findTranslationKeyForTranslation($featureName);
return Piwik::translate($translationKeyForFeature, array(), 'en');
}
diff --git a/plugins/Feedback/Feedback.php b/plugins/Feedback/Feedback.php
index 834cff1c02..f129597d64 100644
--- a/plugins/Feedback/Feedback.php
+++ b/plugins/Feedback/Feedback.php
@@ -23,7 +23,7 @@ class Feedback extends \Piwik\Plugin
const NEVER_REMIND_ME_AGAIN = "-1";
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/Feedback/lang/zh-cn.json b/plugins/Feedback/lang/zh-cn.json
index f3a156683c..d14b3bbfef 100644
--- a/plugins/Feedback/lang/zh-cn.json
+++ b/plugins/Feedback/lang/zh-cn.json
@@ -1,13 +1,47 @@
{
"Feedback": {
"DoYouHaveBugReportOrFeatureRequest": "您有bug报告或要新增功能?",
+ "HowToCreateTicket": "请阅读有关编写良好的%1$s错误报告%2$s或%3$s功能请求%4$s的建议。 然后注册或登录%5$s我们的问题跟踪器%6$s并创建%7$s个新问题%8$s。",
"IWantTo": "我想要:",
"LearnWaysToParticipate": "了解所有您可以 %1$s 参与%2$s 的方法",
"ManuallySendEmailTo": "请手动发送信息至",
+ "PluginDescription": "将您的反馈意见发送给Matomo小组。 分享您的想法和建议,使Matomo成为世界上最好的分析平台!",
+ "PrivacyClaim": "Matomo尊重您的%1$s隐私%2$s,并赋予您对数据的完全控制权。",
+ "RateFeatureLeaveMessageDislike": "得知您不喜欢我们,我们深感抱歉! 请让我们知道我们如何改进。",
+ "RateFeatureLeaveMessageLike": "我们很高兴您喜欢它! 请让我们知道您最喜欢的是什么,或者您是否有功能要求。",
+ "RateFeatureSendFeedbackInformation": "您的Matomo平台会向我们(Matomo团队)发送一封电子邮件(包括您的电子邮件地址),因此如果您有任何疑问,我们可以与您联系。",
+ "RateFeatureThankYouTitle": "感谢您对“ %s”的评价!",
+ "RateFeatureTitle": "您喜欢“ %s”功能吗? 请评分并发表评论",
"SendFeedback": "提交反馈",
"ThankYou": "感谢您帮助我们改进 Matomo !",
"TopLinkTooltip": "告诉我们您的想法,或者寻求专业技术支持。",
+ "ViewAnswersToFAQ": "查看%1$s个常见问题的答案%2$s",
+ "FAQs": "常见问题",
+ "ViewUserGuides": "通过我们的%1$s用户指南%2$s了解如何配置Matomo以及如何有效地分析数据",
+ "UserGuides": "用户指南",
+ "CommunityHelp": "社区帮助",
+ "ProfessionalHelp": "专业的帮助",
+ "ProfessionalServicesIntro": "通过Matomo内部支持订阅,我们经验丰富的团队可以在线帮助您利用Matomo Analytics来发展业务。",
+ "ProfessionalServicesOfferIntro": "您可以从哪些服务中受益?",
+ "ProfessionalServicesDedicatedSupport": "Matomo专业团队成员的支持",
+ "ProfessionalServicesOnboarding": "入职调查表并与Matomo支持成员会面",
+ "ProfessionalServicesSupport": "24小时\/7全天候在线服务",
+ "ProfessionalServicesTraining": "独家观看Matomo培训视频",
+ "ProfessionalServicesEmailAlerts": "有关Matomo安全发布的电子邮件警报",
"ContactUs": "联系我们",
- "Forums": "论坛"
+ "VisitTheForums": "访问%1$s论坛%2$s并从Matomo用户社区获得帮助",
+ "Forums": "论坛",
+ "ReviewMatomoTitle": "相信Matomo?",
+ "PleaseLeaveExternalReviewForMatomo": "在其中一个站点上分享您的想法,并激发其他人加入我们的数据革命。",
+ "RemindMeLater": "稍后提醒我",
+ "NeverAskMeAgain": "再也不问我",
+ "HowCanWeHelp": "我们能帮你什么吗?",
+ "NotTrackingVisits": "Matomo不会跟踪任何访问",
+ "TrackMultipleSites": "我需要跟踪多个站点或子域",
+ "RemoveOtherLabel": "我想查看我的“其他”数据",
+ "PurgeOldData": "我想删除一些旧数据",
+ "SearchHelpResources": "搜索matomo.org帮助资源",
+ "PopularHelpTopics": "热门帮助主题",
+ "SearchOnMatomo": "在Matomo.org上搜索“ %1$s”"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/lang/zh-tw.json b/plugins/Feedback/lang/zh-tw.json
index d0bc192437..5158515295 100644
--- a/plugins/Feedback/lang/zh-tw.json
+++ b/plugins/Feedback/lang/zh-tw.json
@@ -21,14 +21,27 @@
"UserGuides": "使用者指南",
"CommunityHelp": "社區協助",
"ProfessionalHelp": "專業協助",
+ "ProfessionalServicesIntro": "訂閱 Matomo 即時付費服務後,我們的專業團隊能在線上協助你使用 Matomo 分析,擴展你的生意。",
"ProfessionalServicesOfferIntro": "你可以獲得哪些服務?",
+ "ProfessionalServicesDedicatedSupport": "每一步都有專任的 Matomo 團隊成員幫助你。",
+ "ProfessionalServicesOnboarding": "問卷培訓,並與 Matomo 專員會議。",
+ "ProfessionalServicesSupport": "全年無休線上客服",
+ "ProfessionalServicesTraining": "獨佔的 Matomo 教學影片",
+ "ProfessionalServicesEmailAlerts": "Matomo 安全更新的 Email 通知",
"ContactUs": "聯絡我們",
"VisitTheForums": "訪問%1$s論壇%2$s從社區中的 Matomo 使用者中取得協助。",
"Forums": "論壇",
"ReviewMatomoTitle": "信任 Matomo 嗎?",
"PleaseLeaveExternalReviewForMatomo": "在這些網站上分享你的評價,讓更多人加入我們的資料革命。",
+ "RemindMeLater": "稍後再提醒我",
+ "NeverAskMeAgain": "永遠不再詢問",
"HowCanWeHelp": "我們如何協助你?",
+ "NotTrackingVisits": "Matomo 沒有任何訪客紀錄",
+ "TrackMultipleSites": "我想要追蹤多個網站或是網域",
+ "RemoveOtherLabel": "我想要看「其他」類資料",
+ "PurgeOldData": "我想要移除一些舊資料",
"SearchHelpResources": "搜尋 matomo.org 上的說明資源",
- "PopularHelpTopics": "熱門的說明主題"
+ "PopularHelpTopics": "熱門的說明主題",
+ "SearchOnMatomo": "於 Matomo.org 搜尋「%1$s」"
}
} \ No newline at end of file
diff --git a/plugins/Feedback/tests/Fixtures/FeedbackPopupFixture.php b/plugins/Feedback/tests/Fixtures/FeedbackPopupFixture.php
index e2ceaeb164..182582034c 100644
--- a/plugins/Feedback/tests/Fixtures/FeedbackPopupFixture.php
+++ b/plugins/Feedback/tests/Fixtures/FeedbackPopupFixture.php
@@ -9,14 +9,14 @@ use Piwik\Tests\Fixtures\UITestFixture;
class FeedbackPopupFixture extends UITestFixture
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$yesterday = Date::yesterday();
Option::set('Feedback.nextFeedbackReminder.superUserLogin', $yesterday->toString('Y-m-d'));
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
Option::delete('Feedback.nextFeedbackReminder.superUserLogin');
diff --git a/plugins/Feedback/tests/Integration/ControllerTest.php b/plugins/Feedback/tests/Integration/ControllerTest.php
index fa39b28bfd..acd95512e3 100644
--- a/plugins/Feedback/tests/Integration/ControllerTest.php
+++ b/plugins/Feedback/tests/Integration/ControllerTest.php
@@ -6,7 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Plugins\Feedback\tests\Unit;
+namespace Piwik\Plugins\Feedback\tests\Integration;
use Piwik\Date;
use Piwik\NoAccessException;
@@ -26,7 +26,7 @@ class ControllerTest extends IntegrationTestCase
private $now;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->controller = new Controller();
@@ -47,7 +47,7 @@ class ControllerTest extends IntegrationTestCase
Date::$now = Date::factory('2019-05-31')->getTimestamp();
}
- public function tearDown()
+ public function tearDown(): void
{
Option::deleteLike('Feedback.nextFeedbackReminder.%');
$this->userModel->deleteUserOnly('user1');
@@ -84,9 +84,9 @@ class ControllerTest extends IntegrationTestCase
public function test_updateFeedbackReminder_notLoggedIn()
{
+ $this->expectException(NoAccessException::class);
FakeAccess::$identity = null;
FakeAccess::$superUser = false;
- $this->setExpectedException(NoAccessException::class);
$this->controller->updateFeedbackReminderDate();
}
} \ No newline at end of file
diff --git a/plugins/Feedback/tests/Integration/FeedbackTest.php b/plugins/Feedback/tests/Integration/FeedbackTest.php
index 02031e31f0..072a12186b 100644
--- a/plugins/Feedback/tests/Integration/FeedbackTest.php
+++ b/plugins/Feedback/tests/Integration/FeedbackTest.php
@@ -26,11 +26,11 @@ class FeedbackTest extends IntegrationTestCase
private $now;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- $this->feedback = $this->getMock(Feedback::class, ['isDisabledInTestMode']);
+ $this->feedback = $this->createPartialMock(Feedback::class, ['isDisabledInTestMode']);
$this->feedback->method('isDisabledInTestMode')->willReturn(false);
$this->userModel = new Model();
@@ -48,7 +48,7 @@ class FeedbackTest extends IntegrationTestCase
$this->now = Date::$now;
}
- public function tearDown()
+ public function tearDown(): void
{
Option::deleteLike('Feedback.nextFeedbackReminder.%');
$this->userModel->deleteUserOnly('user1');
diff --git a/plugins/Feedback/tests/UI/FeedbackPopup_spec.js b/plugins/Feedback/tests/UI/FeedbackPopup_spec.js
index d642984ed1..5073ff9594 100644
--- a/plugins/Feedback/tests/UI/FeedbackPopup_spec.js
+++ b/plugins/Feedback/tests/UI/FeedbackPopup_spec.js
@@ -37,6 +37,10 @@ describe("FeedbackPopup", function () {
await page.goto(url);
await page.waitForNetworkIdle();
- expect(await page.screenshotSelector('#root')).to.matchImage('dashboard_no_popup');
+ // check dashboard is present
+ await page.waitForSelector('#dashboardWidgetsArea');
+
+ // check modal isn't opened
+ await page.waitForFunction("$('.modal.open').length == 0");
});
}); \ No newline at end of file
diff --git a/plugins/Feedback/tests/UI/expected-screenshots/FeedbackPopup_dashboard_no_popup.png b/plugins/Feedback/tests/UI/expected-screenshots/FeedbackPopup_dashboard_no_popup.png
deleted file mode 100644
index c466f6b4a8..0000000000
--- a/plugins/Feedback/tests/UI/expected-screenshots/FeedbackPopup_dashboard_no_popup.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a54d878a3f34c20e8945ee28d54d9bb35344952d77e07625b21589d3cc1627d1
-size 409579
diff --git a/plugins/GeoIp2/Columns/Region.php b/plugins/GeoIp2/Columns/Region.php
deleted file mode 100644
index 934251b60e..0000000000
--- a/plugins/GeoIp2/Columns/Region.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-/**
- * Matomo - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\GeoIp2\Columns;
-
-class Region extends \Piwik\Plugins\UserCountry\Columns\Region
-{
- protected $columnType = 'char(3) DEFAULT NULL';
- protected $segmentName = '';
-
- public function uninstall()
- {
- // do not remove region column when plugin is deactivated
- }
-} \ No newline at end of file
diff --git a/plugins/GeoIp2/Controller.php b/plugins/GeoIp2/Controller.php
new file mode 100644
index 0000000000..2de183067e
--- /dev/null
+++ b/plugins/GeoIp2/Controller.php
@@ -0,0 +1,200 @@
+<?php
+namespace Piwik\Plugins\GeoIp2;
+
+use Piwik\Common;
+use Piwik\DataTable\Renderer\Json;
+use Piwik\Http;
+use Piwik\Piwik;
+use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
+use Piwik\Plugins\UserCountry\UserCountry;
+use Piwik\View;
+
+class Controller extends \Piwik\Plugin\ControllerAdmin
+{
+ /**
+ * Starts or continues download of DBIP-City.mmdb.
+ *
+ * To avoid a server/PHP timeout & to show progress of the download to the user, we
+ * use the HTTP Range header to download one chunk of the file at a time. After each
+ * chunk, it is the browser's responsibility to call the method again to continue the download.
+ *
+ * Input:
+ * 'continue' query param - if set to 1, will assume we are currently downloading & use
+ * Range: HTTP header to get another chunk of the file.
+ *
+ * Output (in JSON):
+ * 'current_size' - Current size of the partially downloaded file on disk.
+ * 'expected_file_size' - The expected finished file size as returned by the HTTP server.
+ * 'next_screen' - When the download finishes, this is the next screen that should be shown.
+ * 'error' - When an error occurs, the message is returned in this property.
+ */
+ public function downloadFreeDBIPLiteDB()
+ {
+ $this->dieIfGeolocationAdminIsDisabled();
+ Piwik::checkUserHasSuperUserAccess();
+
+ if ($_SERVER["REQUEST_METHOD"] == "POST") {
+ $this->checkTokenInUrl();
+ Json::sendHeaderJSON();
+ $outputPath = GeoIp2::getPathForGeoIpDatabase('DBIP-City.mmdb') . '.gz';
+ try {
+ $result = Http::downloadChunk(
+ $url = GeoIp2::getDbIpLiteUrl(),
+ $outputPath,
+ $continue = Common::getRequestVar('continue', true, 'int')
+ );
+
+ // if the file is done
+ if ($result['current_size'] >= $result['expected_file_size']) {
+ try {
+ GeoIP2AutoUpdater::unzipDownloadedFile($outputPath, 'loc', $url, $unlink = true);
+ } catch (\Exception $e) {
+ // remove downloaded file on error
+ unlink($outputPath);
+ throw $e;
+ }
+
+ // setup the auto updater
+ GeoIP2AutoUpdater::setUpdaterOptions(array(
+ 'loc' => GeoIp2::getDbIpLiteUrl(),
+ 'period' => GeoIP2AutoUpdater::SCHEDULE_PERIOD_MONTHLY,
+ ));
+
+ $result['settings'] = GeoIP2AutoUpdater::getConfiguredUrls();
+ }
+
+ return json_encode($result);
+ } catch (\Exception $ex) {
+ return json_encode(array('error' => $ex->getMessage()));
+ }
+ }
+ }
+
+ /**
+ * Sets the URLs used to download new versions of the installed GeoIP databases.
+ *
+ * Input (query params):
+ * 'loc_db' - URL for a GeoIP location database.
+ * 'isp_db' - URL for a GeoIP ISP database (optional).
+ * 'org_db' - URL for a GeoIP Org database (optional).
+ * 'period' - 'weekly' or 'monthly'. Determines how often update is run.
+ *
+ * Output (json):
+ * 'error' - if an error occurs its message is set as the resulting JSON object's
+ * 'error' property.
+ */
+ public function updateGeoIPLinks()
+ {
+ $this->dieIfGeolocationAdminIsDisabled();
+ Piwik::checkUserHasSuperUserAccess();
+ if ($_SERVER["REQUEST_METHOD"] == "POST") {
+ Json::sendHeaderJSON();
+ try {
+ $this->checkTokenInUrl();
+
+ GeoIP2AutoUpdater::setUpdaterOptionsFromUrl();
+
+ // if there is a updater URL for a database, but its missing from the misc dir, tell
+ // the browser so it can download it next
+ $info = $this->getNextMissingDbUrlInfoGeoIp2();
+
+ if ($info !== false) {
+ return json_encode($info);
+ } else {
+ $view = new View("@GeoIp2/_updaterNextRunTime");
+ $view->nextRunTime = GeoIP2AutoUpdater::getNextRunTime();
+ $nextRunTimeHtml = $view->render();
+ return json_encode(array('nextRunTime' => $nextRunTimeHtml));
+ }
+ } catch (\Exception $ex) {
+ return json_encode(array('error' => $ex->getMessage()));
+ }
+ }
+ }
+
+ /**
+ * Starts or continues a download for a missing GeoIP database. A database is missing if
+ * it has an update URL configured, but the actual database is not available in the misc
+ * directory.
+ *
+ * Input:
+ * 'url' - The URL to download the database from.
+ * 'continue' - 1 if we're continuing a download, 0 if we're starting one.
+ *
+ * Output:
+ * 'error' - If an error occurs this describes the error.
+ * 'to_download' - The URL of a missing database that should be downloaded next (if any).
+ * 'to_download_label' - The label to use w/ the progress bar that describes what we're
+ * downloading.
+ * 'current_size' - Size of the current file on disk.
+ * 'expected_file_size' - Size of the completely downloaded file.
+ */
+ public function downloadMissingGeoIpDb()
+ {
+ $this->dieIfGeolocationAdminIsDisabled();
+ Piwik::checkUserHasSuperUserAccess();
+
+ if ($_SERVER["REQUEST_METHOD"] == "POST") {
+ try {
+ $this->checkTokenInUrl();
+
+ Json::sendHeaderJSON();
+
+ // based on the database type (provided by the 'key' query param) determine the
+ // url & output file name
+ $key = Common::getRequestVar('key', null, 'string');
+
+ $url = GeoIP2AutoUpdater::getConfiguredUrl($key);
+ $filename = GeoIP2AutoUpdater::getZippedFilenameToDownloadTo($url, $key, GeoIP2AutoUpdater::getGeoIPUrlExtension($url));
+ $outputPath = GeoIp2::getPathForGeoIpDatabase($filename);
+
+ // download part of the file
+ $result = Http::downloadChunk(
+ $url, $outputPath, Common::getRequestVar('continue', true, 'int'));
+
+ // if the file is done
+ if ($result['current_size'] >= $result['expected_file_size']) {
+ GeoIP2AutoUpdater::unzipDownloadedFile($outputPath, $key, $url, $unlink = true);
+
+ $info = $this->getNextMissingDbUrlInfoGeoIp2();
+ if ($info !== false) {
+ return json_encode($info);
+ }
+ }
+
+ return json_encode($result);
+ } catch (\Exception $ex) {
+ return json_encode(array('error' => $ex->getMessage()));
+ }
+ }
+ }
+
+ /**
+ * Gets information for the first missing GeoIP2 database (if any).
+ *
+ * @return array|bool
+ */
+ private function getNextMissingDbUrlInfoGeoIp2()
+ {
+ $missingDbs = GeoIP2AutoUpdater::getMissingDatabases();
+ if (!empty($missingDbs)) {
+ $missingDbKey = $missingDbs[0];
+ $url = GeoIP2AutoUpdater::getConfiguredUrl($missingDbKey);
+
+ $link = '<a href="' . $url . '">' . $url . '</a>';
+
+ return [
+ 'to_download' => $missingDbKey,
+ 'to_download_label' => Piwik::translate('GeoIp2_DownloadingDb', $link) . '...',
+ ];
+ }
+ return false;
+ }
+
+ private function dieIfGeolocationAdminIsDisabled()
+ {
+ if (!UserCountry::isGeoLocationAdminEnabled()) {
+ throw new \Exception('Geo location setting page has been disabled.');
+ }
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/GeoIP2AutoUpdater.php b/plugins/GeoIp2/GeoIP2AutoUpdater.php
index 423256be83..212a4bfaee 100644
--- a/plugins/GeoIp2/GeoIP2AutoUpdater.php
+++ b/plugins/GeoIp2/GeoIP2AutoUpdater.php
@@ -11,6 +11,7 @@ namespace Piwik\Plugins\GeoIp2;
require_once PIWIK_INCLUDE_PATH . "/core/ScheduledTask.php"; // for the tracker which doesn't include this file
use Exception;
+use GeoIp2\Database\Reader;
use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\Date;
@@ -21,7 +22,6 @@ use Piwik\Option;
use Piwik\Piwik;
use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2 AS LocationProviderGeoIp2;
use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2\Php;
-use Piwik\Plugins\UserCountry\GeoIPAutoUpdater;
use Piwik\Scheduler\Scheduler;
use Piwik\Scheduler\Task;
use Piwik\Scheduler\Timetable;
@@ -200,7 +200,7 @@ class GeoIP2AutoUpdater extends Task
$content = $unzip->listContent();
if (empty($content)) {
- throw new Exception(Piwik::translate('UserCountry_CannotListContent',
+ throw new Exception(Piwik::translate('GeoIp2_CannotListContent',
array("'$path'", $unzip->errorInfo())));
}
@@ -253,7 +253,7 @@ class GeoIP2AutoUpdater extends Task
$success = $unzip->extract($outputPath);
if ($success !== true) {
- throw new Exception(Piwik::translate('UserCountry_CannotUnzipDatFile',
+ throw new Exception(Piwik::translate('General_CannotUnzipFile',
array("'$path'", $unzip->errorInfo())));
}
@@ -263,7 +263,7 @@ class GeoIP2AutoUpdater extends Task
}
} else {
$ext = end(explode(basename($path), '.', 2));
- throw new Exception(Piwik::translate('UserCountry_UnsupportedArchiveType', "'$ext'"));
+ throw new Exception(Piwik::translate('GeoIp2_UnsupportedArchiveType', "'$ext'"));
}
try {
@@ -286,11 +286,11 @@ class GeoIP2AutoUpdater extends Task
Log::info("GeoIP2AutoUpdater: Encountered exception when testing newly downloaded" .
" GeoIP 2 database: %s", $e->getMessage());
- throw new Exception(Piwik::translate('UserCountry_ThisUrlIsNotAValidGeoIPDB'));
+ throw new Exception(Piwik::translate('GeoIp2_ThisUrlIsNotAValidGeoIPDB'));
}
if (empty($location)) {
- throw new Exception(Piwik::translate('UserCountry_ThisUrlIsNotAValidGeoIPDB'));
+ throw new Exception(Piwik::translate('GeoIp2_ThisUrlIsNotAValidGeoIPDB'));
}
// delete the existing GeoIP database (if any) and rename the downloaded file
@@ -403,7 +403,7 @@ class GeoIP2AutoUpdater extends Task
&& $period != self::SCHEDULE_PERIOD_WEEKLY
) {
throw new Exception(Piwik::translate(
- 'UserCountry_InvalidGeoIPUpdatePeriod',
+ 'GeoIp2_InvalidGeoIPUpdatePeriod',
array("'$period'", "'" . self::SCHEDULE_PERIOD_MONTHLY . "', '" . self::SCHEDULE_PERIOD_WEEKLY . "'")
));
}
@@ -415,9 +415,6 @@ class GeoIP2AutoUpdater extends Task
$scheduler->rescheduleTaskAndRunTomorrow(new GeoIP2AutoUpdater());
}
-
- // clear option for GeoIP as not needed if GeoIP2 is set up
- GeoIPAutoUpdater::clearOptions();
}
/**
@@ -559,7 +556,7 @@ class GeoIP2AutoUpdater extends Task
&& $ext != 'gz'
&& $ext != 'mmdb.gz'
) {
- throw new \Exception(Piwik::translate('UserCountry_UnsupportedArchiveType', "'$ext'"));
+ throw new \Exception(Piwik::translate('GeoIp2_UnsupportedArchiveType', "'$ext'"));
}
}
@@ -592,9 +589,13 @@ class GeoIP2AutoUpdater extends Task
// test the provider. on error, we rename the broken DB.
try {
+ // check database directly, as location provider ignores invalid database errors
+ $pathToDb = LocationProviderGeoIp2::getPathToGeoIpDatabase($customNames);
+ $reader = new Reader($pathToDb);
+
$location = $provider->getLocation(array('ip' => LocationProviderGeoIp2::TEST_IP));
} catch (\Exception $e) {
- if($logErrors) {
+ if ($logErrors) {
Log::error("GeoIP2AutoUpdater: Encountered exception when performing redundant tests on GeoIP2 "
. "%s database: %s", $type, $e->getMessage());
}
@@ -673,7 +674,7 @@ class GeoIP2AutoUpdater extends Task
}
/**
- * See {@link Piwik\Scheduler\Schedule\Schedule::getRescheduledTime()}.
+ * See {@link \Piwik\Scheduler\Schedule\Schedule::getRescheduledTime()}.
*/
public function getRescheduledTime()
{
diff --git a/plugins/GeoIp2/GeoIp2.php b/plugins/GeoIp2/GeoIp2.php
index 62562d8924..ffba09bd98 100644
--- a/plugins/GeoIp2/GeoIp2.php
+++ b/plugins/GeoIp2/GeoIp2.php
@@ -15,6 +15,14 @@ use Piwik\Plugins\UserCountry\LocationProvider;
*/
class GeoIp2 extends \Piwik\Plugin
{
+ public function registerEvents()
+ {
+ return array(
+ 'AssetManager.getJavaScriptFiles' => 'getJsFiles',
+ 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
+ );
+ }
+
public function isTrackerPlugin()
{
return true;
@@ -27,4 +35,19 @@ class GeoIp2 extends \Piwik\Plugin
LocationProvider::setCurrentProvider(LocationProvider\DefaultProvider::ID);
}
}
+
+ public function getJsFiles(&$jsFiles)
+ {
+ $jsFiles[] = "plugins/GeoIp2/angularjs/geoip2-updater/geoip2-updater.controller.js";
+ $jsFiles[] = "plugins/GeoIp2/angularjs/geoip2-updater/geoip2-updater.directive.js";
+ }
+
+ public function getClientSideTranslationKeys(&$translationKeys)
+ {
+ $translationKeys[] = "GeoIp2_FatalErrorDuringDownload";
+ $translationKeys[] = "GeoIp2_SetupAutomaticUpdatesOfGeoIP";
+ $translationKeys[] = "General_Done";
+ $translationKeys[] = "General_Save";
+ $translationKeys[] = "General_Continue";
+ }
}
diff --git a/plugins/GeoIp2/LocationProvider/GeoIp2.php b/plugins/GeoIp2/LocationProvider/GeoIp2.php
index e4e9a7efa3..3a17da686d 100644
--- a/plugins/GeoIp2/LocationProvider/GeoIp2.php
+++ b/plugins/GeoIp2/LocationProvider/GeoIp2.php
@@ -245,7 +245,7 @@ abstract class GeoIp2 extends LocationProvider
*/
protected function getIpFromInfo($info)
{
- $ip = \Piwik\Network\IP::fromStringIP($info['ip']);
+ $ip = \Matomo\Network\IP::fromStringIP($info['ip']);
return $ip->toString();
}
diff --git a/plugins/GeoIp2/LocationProvider/GeoIp2/Php.php b/plugins/GeoIp2/LocationProvider/GeoIp2/Php.php
index 310a273dc4..6a92f4f409 100644
--- a/plugins/GeoIp2/LocationProvider/GeoIp2/Php.php
+++ b/plugins/GeoIp2/LocationProvider/GeoIp2/Php.php
@@ -11,11 +11,17 @@ namespace Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
use GeoIp2\Database\Reader;
use GeoIp2\Exception\AddressNotFoundException;
use MaxMind\Db\Reader\InvalidDatabaseException;
+use Piwik\Date;
use Piwik\Common;
use Piwik\Log;
use Piwik\Piwik;
+use Piwik\Plugin\Manager;
+use Piwik\Plugins\GeoIp2\GeoIP2AutoUpdater;
use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
use Piwik\Plugins\Marketplace\Api\Exception;
+use Piwik\Plugins\UserCountry\LocationProvider;
+use Piwik\SettingsPiwik;
+use Piwik\View;
/**
* A LocationProvider that uses the PHP implementation of GeoIP 2.
@@ -391,16 +397,16 @@ class Php extends GeoIp2
}
if (isset($availableInfo[self::ISP_KEY]) && $availableInfo[self::ISP_KEY]) {
- $availableDatabaseTypes[] = Piwik::translate('UserCountry_ISPDatabase');
+ $availableDatabaseTypes[] = Piwik::translate('GeoIp2_ISPDatabase');
}
if (!empty($availableDatabaseTypes)) {
$extraMessage = '<strong>' . Piwik::translate('General_Note') . '</strong>:&nbsp;'
- . Piwik::translate('UserCountry_GeoIPImplHasAccessTo') . ':&nbsp;<strong>'
+ . Piwik::translate('GeoIp2_GeoIPImplHasAccessTo') . ':&nbsp;<strong>'
. implode(', ', $availableDatabaseTypes) . '</strong>.';
} else {
$extraMessage = '<strong>' . Piwik::translate('General_Note') . '</strong>:&nbsp;'
- . Piwik::translate('UserCountry_GeoIPNoDatabaseFound');
+ . Piwik::translate('GeoIp2_GeoIPNoDatabaseFound');
}
return array('id' => self::ID,
@@ -411,6 +417,67 @@ class Php extends GeoIp2
'order' => 2);
}
+ public function renderConfiguration()
+ {
+ $view = new View('@GeoIp2/configuration.twig');
+ $today = Date::today();
+
+ $urls = GeoIP2AutoUpdater::getConfiguredUrls();
+ $view->geoIPLocUrl = $urls['loc'];
+ $view->geoIPIspUrl = $urls['isp'];
+ $view->geoIPUpdatePeriod = GeoIP2AutoUpdater::getSchedulePeriod();
+
+ $view->hasGeoIp2Provider = Manager::getInstance()->isPluginActivated('GeoIp2');
+
+ $geoIPDatabasesInstalled = $view->hasGeoIp2Provider ? GeoIp2::isDatabaseInstalled() : false;
+
+ $view->geoIPDatabasesInstalled = $geoIPDatabasesInstalled;
+ $view->updatePeriodOptions = [
+ 'month' => Piwik::translate('Intl_PeriodMonth'),
+ 'week' => Piwik::translate('Intl_PeriodWeek')
+ ];
+
+
+ // if using a server module, they are working and there are no databases
+ // in misc, then the databases are located outside of Matomo, so we cannot update them
+ $view->showGeoIPUpdateSection = true;
+ $currentProviderId = LocationProvider::getCurrentProviderId();
+ if (!$geoIPDatabasesInstalled
+ && in_array($currentProviderId, [GeoIp2\ServerModule::ID])
+ && LocationProvider::getCurrentProvider()->isWorking()
+ && LocationProvider::getCurrentProvider()->isAvailable()
+ ) {
+ $view->showGeoIPUpdateSection = false;
+ }
+
+ $view->isInternetEnabled = SettingsPiwik::isInternetEnabled();
+
+
+ $view->dbipLiteUrl = GeoIp2::getDbIpLiteUrl();
+ $view->dbipLiteFilename = "dbip-city-lite-{$today->toString('Y-m')}.mmdb";
+ $view->dbipLiteDesiredFilename = "DBIP-City.mmdb";
+ $view->nextRunTime = GeoIP2AutoUpdater::getNextRunTime();
+
+ $lastRunTime = GeoIP2AutoUpdater::getLastRunTime();
+
+ if ($lastRunTime !== false) {
+ $view->lastTimeUpdaterRun = '<strong>' . $lastRunTime->toString() . '</strong>';
+ }
+ return $view->render();
+ }
+
+ public function renderSetUpGuide()
+ {
+ $today = Date::today();
+ $view = new View('@GeoIp2/setupguide.twig');
+
+ $view->dbipLiteUrl = GeoIp2::getDbIpLiteUrl();
+ $view->dbipLiteFilename = "dbip-city-lite-{$today->toString('Y-m')}.mmdb";
+ $view->dbipLiteDesiredFilename = "DBIP-City.mmdb";
+
+ return $view->render();
+ }
+
/**
* Returns a GeoIP2 reader instance. Creates it if necessary.
*
diff --git a/plugins/GeoIp2/LocationProvider/GeoIp2/ServerModule.php b/plugins/GeoIp2/LocationProvider/GeoIp2/ServerModule.php
index 5e2facc549..5ebe6114ce 100644
--- a/plugins/GeoIp2/LocationProvider/GeoIp2/ServerModule.php
+++ b/plugins/GeoIp2/LocationProvider/GeoIp2/ServerModule.php
@@ -159,11 +159,11 @@ class ServerModule extends GeoIp2
// if not available return message w/ extra info
if (!function_exists('apache_get_modules')) {
- return Piwik::translate('General_Note') . ':&nbsp;' . Piwik::translate('UserCountry_AssumingNonApache');
+ return Piwik::translate('General_Note') . ':&nbsp;' . Piwik::translate('GeoIp2_AssumingNonApache');
}
$message = "<strong>" . Piwik::translate('General_Note') . ':&nbsp;'
- . Piwik::translate('UserCountry_FoundApacheModules')
+ . Piwik::translate('GeoIp2_FoundApacheModules')
. "</strong>:<br/><br/>\n<ul style=\"list-style:disc;margin-left:24px\">\n";
foreach (apache_get_modules() as $name) {
$message .= "<li>$name</li>\n";
@@ -187,7 +187,7 @@ class ServerModule extends GeoIp2
|| array_key_exists($settings[self::CITY_NAME_KEY], $_SERVER);
if (!$available) {
- return Piwik::translate("UserCountry_CannotFindGeoIPServerVar", $settings[self::COUNTRY_CODE_KEY] . ' $_SERVER');
+ return Piwik::translate('GeoIp2_CannotFindGeoIPServerVar', $settings[self::COUNTRY_CODE_KEY] . ' $_SERVER');
}
return true;
@@ -209,24 +209,24 @@ class ServerModule extends GeoIp2
if (function_exists('apache_note')) {
$serverDesc = 'Apache';
} else {
- $serverDesc = Piwik::translate('UserCountry_HttpServerModule');
+ $serverDesc = Piwik::translate('GeoIp2_HttpServerModule');
}
$title = sprintf(self::TITLE, $serverDesc);
$desc = Piwik::translate('GeoIp2_LocationProviderDesc_ServerModule', array('<strong>', '</strong>'))
. '<br/><br/>'
- . Piwik::translate('UserCountry_GeoIpLocationProviderDesc_ServerBasedAnonWarn')
+ . Piwik::translate('GeoIp2_GeoIPLocationProviderDesc_ServerBasedAnonWarn')
. '<br/><br/>'
. Piwik::translate('GeoIp2_LocationProviderDesc_ServerModule2',
array('<strong>', '</strong>', '<strong>', '</strong>'));
$installDocs =
'<a rel="noreferrer" target="_blank" href="https://maxmind.github.io/mod_maxminddb/">'
- . Piwik::translate('UserCountry_HowToInstallApacheModule')
+ . Piwik::translate('GeoIp2_HowToInstallApacheModule')
. '</a><br/>'
. '<a rel="noreferrer" target="_blank" href="https://github.com/leev/ngx_http_geoip2_module/blob/master/README.md#installing">'
- . Piwik::translate('UserCountry_HowToInstallNginxModule')
+ . Piwik::translate('GeoIp2_HowToInstallNginxModule')
. '</a>';
$geoipServerVars = array();
@@ -237,9 +237,9 @@ class ServerModule extends GeoIp2
}
if (empty($geoipServerVars)) {
- $extraMessage = '<strong>' . Piwik::translate('UserCountry_GeoIPNoServerVars', '$_SERVER') . '</strong>';
+ $extraMessage = '<strong>' . Piwik::translate('GeoIp2_GeoIPNoServerVars', '$_SERVER') . '</strong>';
} else {
- $extraMessage = '<strong>' . Piwik::translate('UserCountry_GeoIPServerVarsFound', '$_SERVER')
+ $extraMessage = '<strong>' . Piwik::translate('GeoIp2_GeoIPServerVarsFound', '$_SERVER')
. ":</strong><br/><br/>\n<ul style=\"list-style:disc;margin-left:24px\">\n";
foreach ($geoipServerVars as $key) {
$extraMessage .= '<li>' . $key . "</li>\n";
diff --git a/plugins/UserCountry/angularjs/location-provider-updater/location-provider-updater.controller.js b/plugins/GeoIp2/angularjs/geoip2-updater/geoip2-updater.controller.js
index 677acec8a3..d52224d75a 100644
--- a/plugins/UserCountry/angularjs/location-provider-updater/location-provider-updater.controller.js
+++ b/plugins/GeoIp2/angularjs/geoip2-updater/geoip2-updater.controller.js
@@ -5,11 +5,11 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
(function () {
- angular.module('piwikApp').controller('LocationProviderUpdaterController', LocationProviderUpdaterController);
+ angular.module('piwikApp').controller('Geoip2UpdaterController', Geoip2UpdaterController);
- LocationProviderUpdaterController.$inject = ['piwikApi', '$window'];
+ Geoip2UpdaterController.$inject = ['piwikApi', '$window'];
- function LocationProviderUpdaterController(piwikApi, $window) {
+ function Geoip2UpdaterController(piwikApi, $window) {
// remember to keep controller very simple. Create a service/factory (model) if needed
var self = this;
@@ -25,7 +25,7 @@
piwikApi.withTokenInUrl();
piwikApi.post({
- module: 'UserCountry',
+ module: 'GeoIp2',
action: action,
'continue': cont ? 1 : 0
}, data).then(function (response) {
@@ -44,7 +44,7 @@
}
}
}, function () {
- callback({error: _pk_translate('UserCountry_FatalErrorDuringDownload')});
+ callback({error: _pk_translate('GeoIp2_FatalErrorDuringDownload')});
});
};
@@ -56,7 +56,7 @@
// start download of free dbs
downloadNextChunk(
- 'downloadFreeGeoIPDB',
+ 'downloadFreeDBIPLiteDB',
'geoipdb-screen2-download',
'progressFreeDownload',
false,
@@ -81,7 +81,7 @@
this.geoipDatabaseInstalled = true;
// todo we need to replace this the proper way eventually
- $('#geoip-db-mangement .card-title').text(_pk_translate('UserCountry_SetupAutomaticUpdatesOfGeoIP'));
+ $('#geoip-db-mangement .card-title').text(_pk_translate('GeoIp2_SetupAutomaticUpdatesOfGeoIP'));
}
this.saveGeoIpLinks = function () {
@@ -135,7 +135,7 @@
piwikApi.withTokenInUrl();
piwikApi.post({
period: this.updatePeriod,
- module: 'UserCountry',
+ module: 'GeoIp2',
action: 'updateGeoIPLinks'
}, {
loc_db: this.locationDbUrl,
diff --git a/plugins/UserCountry/angularjs/location-provider-updater/location-provider-updater.directive.js b/plugins/GeoIp2/angularjs/geoip2-updater/geoip2-updater.directive.js
index 441689f714..9b21145feb 100644
--- a/plugins/UserCountry/angularjs/location-provider-updater/location-provider-updater.directive.js
+++ b/plugins/GeoIp2/angularjs/geoip2-updater/geoip2-updater.directive.js
@@ -7,19 +7,19 @@
/**
* Usage:
- * <div piwik-location-provider-selection>
+ * <div piwik-geoip2-updater>
*/
(function () {
- angular.module('piwikApp').directive('piwikLocationProviderUpdater', piwikLocationProviderUpdater);
+ angular.module('piwikApp').directive('piwikGeoip2Updater', piwikGeoip2Updater);
- piwikLocationProviderUpdater.$inject = ['piwik'];
+ piwikGeoip2Updater.$inject = ['piwik'];
- function piwikLocationProviderUpdater(piwik){
+ function piwikGeoip2Updater(piwik){
return {
restrict: 'A',
transclude: true,
- controller: 'LocationProviderUpdaterController',
+ controller: 'Geoip2UpdaterController',
controllerAs: 'locationUpdater',
template: '<div ng-transclude></div>',
compile: function (element, attrs) {
diff --git a/plugins/GeoIp2/lang/ar.json b/plugins/GeoIp2/lang/ar.json
new file mode 100644
index 0000000000..2443ef77e2
--- /dev/null
+++ b/plugins/GeoIp2/lang/ar.json
@@ -0,0 +1,12 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "لم أجد دالة apache_get_modules ، أفترض أن خادم ويب ليس Apache.",
+ "CannotFindGeoIPServerVar": "لم يتم وضع قيمة للمتغير %s . يبدو أن الخادوم لديك ضبطه غير صحيح .",
+ "CannotListContent": "لم أتمكن من سرد محتويات %1$s: %2$s",
+ "DownloadingDb": "سحب %s",
+ "DownloadNewDatabasesEvery": "تحديث قاعدة البيانات كلّ",
+ "FoundApacheModules": "وجد Matomo بريمجات Apache التالية",
+ "GeoIPImplHasAccessTo": "إصدار GeoIP هذا يمكنه الوصول إلى الأنواع التالية من قواعد البيانات",
+ "GeoIPDatabases": "قواعد بيانات GeoIP"
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/bg.json b/plugins/GeoIp2/lang/bg.json
new file mode 100644
index 0000000000..2cd23ae97c
--- /dev/null
+++ b/plugins/GeoIp2/lang/bg.json
@@ -0,0 +1,28 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "Не може да бъде намерена apache_get_modules функцията, което предполага, че това не е Apache сървър.",
+ "CannotFindGeoIPServerVar": "Променливата %s не е зададена. Възможно е сървърът да не е настроен правилно.",
+ "CannotListContent": "Съдържанието за %1$s: %2$s не може да бъде заредено",
+ "DownloadingDb": "Сваляне %s",
+ "DownloadNewDatabasesEvery": "Обновяване на базата от данни на всеки",
+ "FoundApacheModules": "Matomo откри следните Apache модули",
+ "GeoIPImplHasAccessTo": "Тази реализация на GeoIP има достъп до следните типове бази данни",
+ "GeoIPDatabases": "GeoIP база данни",
+ "GeoIPNoServerVars": "Matomo не може да намери GeoIP %s променливи.",
+ "GeoIPServerVarsFound": "Matomo засече следните GeoIP %s променливи",
+ "HowToSetupGeoIPIntro": "Изглежда, че настройката, за определяне на местоположението, не е направена. Това е полезна функция и без нея няма да се вижда точна и пълна информация за местоположението на посетителите. Ето и начин, по който може бързо да започнете да го използвате:",
+ "HowToInstallApacheModule": "Как да инсталирам GeoIP модул за Apache?",
+ "HowToInstallNginxModule": "Как се инсталира GeoIP модул за Nginx?",
+ "HttpServerModule": "HTTP сървърен модул",
+ "InvalidGeoIPUpdatePeriod": "Невалиден период за обновяването на GeoIP: %1$s. Валидните стойности са %2$s.",
+ "ISPDatabase": "ISP база данни",
+ "LocationDatabase": "Местоположение база данни",
+ "LocationDatabaseHint": "Базата от данни указваща местоположение е или за държава, регион или град.",
+ "UnsupportedArchiveType": "Типът архив %1$s не се поддържа.",
+ "UpdaterHasNotBeenRun": "Не е пускана до момента задача за обновяване.",
+ "UpdaterIsNotScheduledToRun": "Не е планирано да се изпълнява в бъдеще.",
+ "UpdaterScheduledForNextRun": "Ще бъде пуснато при следващото изпълнение на archive.php cron.",
+ "UpdaterWasLastRun": "Задача за проверка за обновления е стартирана последно на %s.",
+ "UpdaterWillRunNext": "Следващото пускане е планирано за %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/ca.json b/plugins/GeoIp2/lang/ca.json
new file mode 100644
index 0000000000..9c75a53f7e
--- /dev/null
+++ b/plugins/GeoIp2/lang/ca.json
@@ -0,0 +1,24 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "No s'ha pogut trobar la funció apache_get_modules, s'asumeix que s'utilitza un servidor web diferent del Apache.",
+ "CannotFindGeoIPServerVar": "La variable %s no està definida. Pot ser que el vostre servidor web no estigui configurat correctament.",
+ "CannotListContent": "No s'ha pogut llistar el contingut de %1$s: %2$s",
+ "DownloadingDb": "Descarregant %s",
+ "DownloadNewDatabasesEvery": "Actualitza la base de dades cada",
+ "FoundApacheModules": "El Matomo ha trobat els següents mòduls d'Apache",
+ "GeoIPImplHasAccessTo": "Aquesta implementació de GeoIP té accés als següents tipus de bases de dades",
+ "GeoIPDatabases": "Base de dades GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Nota: L'anonimització IP no té cap efecte amb les localitzacions reportades per aquest proveïdor. Abans d'utilitzar amb l'anonimització IP, assegureu-vos que no viola cap llei de privacitat a la que podeu estar subjectes.",
+ "GeoIPNoServerVars": "El Matomo no ho pogut trobar cap variable GeoIP a %s",
+ "GeoIPServerVarsFound": "El Matomo detecta les següents variables GeoIP a %s",
+ "HowToSetupGeoIPIntro": "Sembla que no teniu configurada la Geolocalització. Es tracta d'una característica molt útil, i sense ella no podreu veure de forma acurada la localització completa dels vostres visitants. Tot seguit us expliquem com podeu començar a fer-la servir:",
+ "HowToInstallApacheModule": "Com instal·lo el módul GeoIP per l'Apache?",
+ "HowToInstallNginxModule": "Com instal·lo el modul GeoIP per Nginx?",
+ "HttpServerModule": "Mòdul del Servidor HTTP",
+ "InvalidGeoIPUpdatePeriod": "Període invàlid de l'actualització GeoIP: %1$s. Els valors vàlids són %2$s.",
+ "ISPDatabase": "Base de dades de ISP",
+ "LocationDatabase": "Base de dades de Localització",
+ "LocationDatabaseHint": "Una base de dades de localització és una base de dades de països, regions o ciutats.",
+ "UnsupportedArchiveType": "S'ha trobat un tipus de fitxer no soportat %1$s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/cs.json b/plugins/GeoIp2/lang/cs.json
new file mode 100644
index 0000000000..929f6e309e
--- /dev/null
+++ b/plugins/GeoIp2/lang/cs.json
@@ -0,0 +1,30 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "Nelze nalézt funkci apache_get_modules,př edpokládám jiný server než Apache.",
+ "CannotFindGeoIPServerVar": "Proměnná %s není nastavena. Váš webový server nemusí být správně nakonfigurován.",
+ "CannotListContent": "Nepodařilo se vypsat obsah pro %1$s: %2$s",
+ "DownloadingDb": "Stahování %s",
+ "DownloadNewDatabasesEvery": "Aktualizovat databáze každých",
+ "FoundApacheModules": "Matomo našel tyto Apache moduly",
+ "GeoIPImplHasAccessTo": "Tato implementace GeoIP má přístup kn následujícím typům databází.",
+ "GeoIPDatabases": "Databáze GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Poznámka: Anonimizace IP adres nemá vliv na umístění hlášené tímto poskytovatelem. Před jeho používáním ověřte, že to neodporuje žádným zákonům.",
+ "GeoIPLocationProviderNotRecommended": "Geolokace funguje, ale nepoužíváte doporučeného poskytovatele umístění.",
+ "GeoIPNoServerVars": "Matomo nemůže najít žádné GeoIP %s proměnné",
+ "GeoIPServerVarsFound": "Matomo detekuje následující GeoIP %s proměnné",
+ "HowToSetupGeoIPIntro": "Vypadá to, že nemáte nastavenou přesnou geolokaci. Je to užitečná vlastnost a bez ní neuvidíte přesné a kompletní informace o umístění vašich návštěvníků. Zde je, jak s ní můžete rychle začít:",
+ "HowToInstallApacheModule": "Jak nainstalovat GeoIP modul na Apache?",
+ "HowToInstallNginxModule": "Jak nainstalovat GeoIP modul pro Nginx?",
+ "HttpServerModule": "Modul HTTP serveru",
+ "InvalidGeoIPUpdatePeriod": "Neplatná doba pro aktualizovač GeoIP databáze: %1$s. Platné hodnoty jsou %2$s.",
+ "ISPDatabase": "Databáze ISP",
+ "LocationDatabase": "Databáze umístění",
+ "LocationDatabaseHint": "Databáze umístění je databáze zemí, regionů, nebo měst.",
+ "UnsupportedArchiveType": "Nalezen nepodporovaný typ archivu %1$s.",
+ "UpdaterHasNotBeenRun": "Aktualizátor nebyl nikdy spuštěn.",
+ "UpdaterIsNotScheduledToRun": "Není plánováno, že v budoucnu poběží.",
+ "UpdaterScheduledForNextRun": "Je plánováno, že poběží při příštím provedení cron příkazu core:archive.",
+ "UpdaterWasLastRun": "Aktualizátor byl naposledy spuštěn v %s.",
+ "UpdaterWillRunNext": "Další spuštění je naplánováno na %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/da.json b/plugins/GeoIp2/lang/da.json
new file mode 100644
index 0000000000..4f32698a6d
--- /dev/null
+++ b/plugins/GeoIp2/lang/da.json
@@ -0,0 +1,31 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "Kan ikke finde apache_get_modules funktion, antager ikke-Apache webserver.",
+ "CannotFindGeoIPServerVar": "%s variablen er ikke sat. Din server er måske ikke konfigureret korrekt.",
+ "CannotListContent": "Kunne ikke vise indholdet af %1$s: %2$s",
+ "DownloadingDb": "Henter %s",
+ "DownloadNewDatabasesEvery": "Opdater databaser hver",
+ "FoundApacheModules": "Matomo fandt følgende Apache moduler",
+ "GeoIPImplHasAccessTo": "GeoIP implementering har adgang til følgende typer af databaser",
+ "GeoIPDatabases": "GeoIP databaser",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Bemærk: IP anonymisering har ingen effekt på de lokationer som rapporteres af denne tjeneste. Før du bruger den på IP anonymisering, så vær sikker på, at det ikke strider mod de gældende regler for privatliv.",
+ "GeoIPLocationProviderNotRecommended": "Geolocation virker, men du bruger ikke en af ​​de anbefalede udbydere.",
+ "GeoIPNoDatabaseFound": "Denne GeoIP implementering kunne ikke finde nogen database.",
+ "GeoIPNoServerVars": "Matomo kan ikke finde nogen GeoIP %s variable.",
+ "GeoIPServerVarsFound": "Matomo registrerer følgende GeoIP %s variabler",
+ "HowToSetupGeoIPIntro": "Det lader ikke til at du har geolokalisering til at være nøjagtig. Det er en nyttig funktion, og uden den vil du ikke se nøjagtige og fuldstændige lokaliseringsoplysninger om dine besøgende. Sådan kan du hurtigt begynde at bruge det:",
+ "HowToInstallApacheModule": "Hvordan installerer jeg GeoIP-modulet til Apache?",
+ "HowToInstallNginxModule": "Hvordan installerer jeg GeoIP-modulet til Nginx?",
+ "HttpServerModule": "HTTP servermodul",
+ "InvalidGeoIPUpdatePeriod": "Ugyldig periode for GeoIP opdateringen: %1$s. Gyldige værdier er %2$s.",
+ "ISPDatabase": "Internetudbyder (ISP) database",
+ "LocationDatabase": "Lokationsdatabase",
+ "LocationDatabaseHint": "En lokationsdatabase er enten en land-, region- eller by-database.",
+ "UnsupportedArchiveType": "Ikke understøttet arkivtype %1$s fundet.",
+ "UpdaterHasNotBeenRun": "Opdateringsprogrammet har aldrig været kørt.",
+ "UpdaterIsNotScheduledToRun": "Det er ikke planlagt til at køre i fremtiden.",
+ "UpdaterScheduledForNextRun": "Planlagt til at køre i løbet af den næste archive.php cron udførelse.",
+ "UpdaterWasLastRun": "Opdateringen blev sidst blev kørt den %s.",
+ "UpdaterWillRunNext": "Næste planlagte kørsel %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/de.json b/plugins/GeoIp2/lang/de.json
index e9591713b5..7303dc2486 100644
--- a/plugins/GeoIp2/lang/de.json
+++ b/plugins/GeoIp2/lang/de.json
@@ -1,15 +1,56 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Die apache_get_modules Funktion wurde nicht gefunden. Es wird daher von einem Nicht-Apache Webserver ausgegangen.",
"CannotFindGeoIPDatabaseInArchive": "Im TAR Archiv %1$s konnte keine gültige DBIP \/ GeoIP Datenbank gefunden werden!",
+ "CannotFindGeoIPServerVar": "Die %s Variable ist nicht gesetzt. Ihr Server ist möglicherweise nicht korrekt konfiguriert.",
+ "CannotListContent": "Kann keinen Inhalt auflisten für %1$s: %2$s",
+ "CannotSetupGeoIPAutoUpdating": "Ihre Geolocation-Datenbanken scheinen außerhalb von Matomo gespeichert zu sein (es konnten keine Datenbanken innerhalb des 'misc'-Unterordners gefunden werden, dennoch funktioniert die Standorterkennung). Matomo kann in diesem Fall keine automatischen Aktualisierungen vornehmen.",
"CannotUnzipGeoIPFile": "Konnte GeoIP-Datei in %1$s nicht entpacken: %2$s",
+ "DownloadingDb": "%s wird heruntergeladen",
+ "DownloadNewDatabasesEvery": "Aktualisiere Datenbanken alle",
+ "FatalErrorDuringDownload": "Ein fataler Fehler trat während dem Herunterladen der Datei auf. Es könnte ein Fehler mit Ihrer Internet Verbindung, der Geolocation-Datenbank die Sie herunterladen wollten oder Matomo vorliegen. Führen Sie den Download und die Installation der Datei manuell durch.",
+ "FoundApacheModules": "Matomo hat folgende Apache-Module erkannt",
+ "GeoIPImplHasAccessTo": "Die GeoIP Implementierung hat Zugriff auf die folgenden Datenbanktypen",
+ "GeoIPDatabases": "GeoIP Datenbanken",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Hinweis: IP-Anonymisierung hat keinen Einfluss auf diese Art der Standortbestimmung. Stellen Sie sicher, dass die Benutzung mit IP-Anonymisierung nicht im Widerspruch zu Privatsphärebestimmungen steht, die für Sie gelten.",
+ "GeoIPLocationProviderNotRecommended": "Standorterkennung funktioniert, aber Sie nutzen keinen der empfohlenen Anbieter.",
+ "GeoIPNoDatabaseFound": "Die GeoIP Implementierung konnte keine Datenbank finden.",
+ "GeoIPNoServerVars": "Matomo konnte keine GeoIP %s Variablen finden.",
+ "GeoIPServerVarsFound": "Matomo hat folgende GeoIP %s Variablen erkannt",
+ "GeoIPUpdaterInstructions": "Bitte geben Sie unten die Downloadlinks für Ihre Datenbank an. Falls Sie Ihre Datenbank von %3$sDBIP%4$s oder %1$sMaxMind%2$s beziehen können Sie diese Links in ihrem DBIP oder Maxmind Benutzerkonto finden. Falls Sie Probleme haben auf diese zuzugreifen, kontaktieren Sie bitte den Anbieter ihrer Geolocation-Datenbank.",
+ "GeoIPUpdaterIntro": "Matomo verwaltet derzeit die Aktualisierungen für folgende Datenbanken",
+ "GeoIPVariablesConfigurationHere": "Sie können benutze Servervariablen %1$shier%2$s konfigurieren.",
+ "GeoLiteCityLink": "Falls Sie die DBIP City Lite Datenbank verwenden, benutzen Sie diesen Link: %1$s%2$s%3$s.",
+ "HowToSetupGeoIP": "Wie richtet man eine genaue Standorterkennung mit DBIP ein",
+ "HowToSetupGeoIP_Step1": "Die DBIP City Lite Datenbank von %3$sDBIP%4$s %1$sherunterladen%2$s.",
+ "HowToSetupGeoIP_Step2": "Entpacken Sie die Datei und kopieren den Inhalt %1$s in das %2$smisc%3$s Matomo Unterverzeichnis und benennen Sie diesen in %4$s um (dies ist z.B. mit FTP oder SSH möglich).",
+ "HowToSetupGeoIP_Step3": "Laden Sie diese Ansicht neu. Der %1$sDBIP \/ GeoIP (PHP)%2$s Provider wird nun %3$sinstalliert%4$s. Wählen Sie ihn aus.",
+ "HowToSetupGeoIP_Step4": "Und fertig! Sie haben gerade Matomo konfiguriert DBIP zu verwenden. Dies bedeutet, dass Sie nun in der Lage sind die Regionen und Städte zusammen mit einer sehr genauen Angabe der Länder ihrer Besucher zu sehen.",
+ "HowToSetupGeoIPIntro": "Anscheinend wurde die Standorterkennung noch nicht vollständig konfiguriert. Dies ist ein nützliches Feature und ohne es ist es nicht möglich, komplett vollständige und umfangreiche Informationen über die Besucher zu erhalten. Nachfolgend alle Informationen, um schnell damit zu beginnen:",
+ "HowToInstallApacheModule": "Wie wird das GeoIP-Modul für Apache installiert?",
+ "HowToInstallNginxModule": "Wie wird das GeoIP Modul für Nginx installiert?",
+ "HttpServerModule": "HTTP-Server-Modul",
+ "InvalidGeoIPUpdatePeriod": "Ungültiger Zeitraum für die GeoIP-Aktualisierung: %1$s. Gültige Werte sind %2$s.",
+ "IPurchasedGeoIPDBs": "Ich habe genauere Datenbanken von %3$sDBIP%4$s oder %1$sMaxMind%2$s erworben und möchte automatische Aktualisierungen einrichten.",
+ "ISPDatabase": "Internet Anbieter Datenbank",
+ "IWantToDownloadFreeGeoIP": "Ich möchte die kostenlose DBIP Datenbank herunterladen...",
"PluginDescription": "Liefert DBIP \/ GeoIP2 Standorterkennungsdienste.",
+ "LocationDatabase": "Standortdatenbank",
+ "LocationDatabaseHint": "Eine Standortdatenbank ist entweder eine Datenbank mit Ländern, Regionen oder Städten",
"LocationProviderDesc_Php": "Dieser Location Provider ist am einfachsten zu installieren, da er keine Server-Konfiguration benötigt (ideal für Shared Hosting!). Er nutzt eine DBIP oder GeoIP 2 Datenbank und MaxMind's PHP API um den Standort Ihrer Besucher akkurat zu bestimmen.",
"LocationProviderDesc_Php_WithExtension": "Dieser Standorterkennungsdienst wird durch die installierte %1$smaxminddb%2$s Erweiterung beschleunigt.",
"LocationProviderDesc_ServerModule": "Diese Art der Standortbestimmung verwendet das GeoIP2-Modul das auf ihrem HTTP-Server installiert ist. Diese ist am schnellsten und genauesten, aber %1$skann nur bei normalem Browser-Tracking benutzt werden%2$s",
"LocationProviderDesc_ServerModule2": "Falls Sie Protokolldateien oder andere Dinge importieren welche IP-Adressen enthalten sollten Sie die %3$sPHP GeoIP 2 Implementierung%4$s nutzen und die %1$smaxminddb Erweiterung%2$s installieren.",
- "ServerBasedVariablesConfiguration": "Einstellungen für die Servervariablen die vom GeoIP 2 HTTP-Server-Modul benutzt werden.",
- "GeoIPVariablesConfigurationHere": "Sie können benutze Servervariablen %1$shier%2$s konfigurieren.",
+ "UnsupportedArchiveType": "Nicht unterstützter Archivtyp erkannt: %1$s",
+ "UpdaterHasNotBeenRun": "Es hat noch keine Aktualisierung stattgefunden.",
+ "UpdaterIsNotScheduledToRun": "Keine zukünftige Ausführung geplant.",
+ "UpdaterScheduledForNextRun": "Ausführung für den nächsten archive.php cron Durchlauf geplant.",
+ "UpdaterWasLastRun": "Die Aktualisierung wurde zuletzt ausgeführt am %s.",
+ "UpdaterWillRunNext": "Nächste Ausführung geplant für %s.",
"ShowCustomServerVariablesConfig": "Ich benutze das Geoip2 Server-Modul (Nginx, Apache...) und möchte die Server-Variablen konfigurieren",
- "ServerVariableFor": "Servervariable für %s"
+ "ServerBasedVariablesConfiguration": "Einstellungen für die Servervariablen die vom GeoIP 2 HTTP-Server-Modul benutzt werden.",
+ "ServerVariableFor": "Servervariable für %s",
+ "SetupAutomaticUpdatesOfGeoIP": "Automatische Aktualisierungen für Geolocation-Datenbanken einrichten",
+ "ThisUrlIsNotAValidGeoIPDB": "Die heruntergeladene Datei ist keine gültige Geolocation-Datenbank. Bitte überprüfen Sie die URL oder laden Sie die Datei manuell herunter."
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/el.json b/plugins/GeoIp2/lang/el.json
index 93350e25ca..69111045ff 100644
--- a/plugins/GeoIp2/lang/el.json
+++ b/plugins/GeoIp2/lang/el.json
@@ -1,15 +1,57 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Αδύνατη η εύρεση της συνάρτησης apache_get_modules, υποθέτουμε ότι ο διακομιστής δεν είναι Apache.",
"CannotFindGeoIPDatabaseInArchive": "Δεν βρέθηκε έγκυρη βάση DBIP \/ GeoIP στο αρχείο tar %1$s!",
+ "CannotFindGeoIPServerVar": "Η μεταβλητή %s δεν έχει οριστεί. Ο διακομιστής σας ενδέχεται να μην έχει παραμετροποιηθεί σωστά.",
+ "CannotListContent": "Αδύνατη η δημιουργία λίστας του περιεχομένου για %1$s: %2$s",
+ "CannotSetupGeoIPAutoUpdating": "Φαίνεται ότι αποθηκεύετε τις GeoIP βάσεις δεδομένων σας εκτός της εγκατάστασης του Matomo (αφού δεν υπάρχουν βάσεις δεδομένων στο misc υποκατάλογο, αλλά το GeoIP λειτουργεί). Το Matomo δεν μπορεί να ενημερώσει αυτόματα τις GeoIP βάσεις δεδομένων σας αν βρίσκονται εκτός του καταλόγου misc.",
"CannotUnzipGeoIPFile": "Δεν ήταν δυνατή η αποσυμπίεση του αρχείου GeoIP στο %1$s: %2$s",
+ "DownloadingDb": "Λήψη του %s",
+ "DownloadNewDatabasesEvery": "Ενημέρωση βάσεων δεδομένων κάθε",
+ "FatalErrorDuringDownload": "Παρουσιάστηκε ανεπανόρθωτο σφάλμα κατά την λήψη αυτού του αρχείου. Μπορεί να υπάρχει κάποιο λάθος με τη σύνδεσή σας με το διαδίκτυο, με τη βάση δεδομένων γεωτοποθεσίας που έχετε κατεβάσει ή με το Matomo. Προσπαθήστε να κάνετε λήψη και να το εγκαταστήσετε με χειροκίνητο τρόπο.",
+ "FoundApacheModules": "Το Matomo βρήκε τα ακόλουθα πρόσθετα Apache",
+ "GeoIPImplHasAccessTo": "Αυτή η υλοποίηση GeoIP έχει πρόσβαση στους ακόλουθους τύπους βάσεων δεδομένων",
+ "GeoIPDatabases": "Βάσεις δεδομένων GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Σημείωση: Η ανωνυμοποίηση IP διευθύνσεων δεν έχει καμία επίδραση στις τοποθεσίες που αναφέρονται από αυτόν τον πάροχο. Πριν το χρησιμοποιήσετε μαζί με την ανωνυμοποίηση IP, βεβαιωθείτε ότι αυτό δεν παραβιάζει κανένα νόμο περί προσωπικών δεδομένων που ενδέχεται να ισχύει στη χώρα σας.",
+ "GeoIPLocationProviderNotRecommended": "Η Γεωτοποθεσία δουλεύει, αλλά δεν χρησιμοποιείτε κάποιον από τους προτεινόμενους παρόχους.",
+ "GeoIPNoDatabaseFound": "Η υλοποίηση της GeoIP δεν μπόρεσε να βρει κάποια βάση δεδομένων.",
+ "GeoIPNoServerVars": "Το Matomo δεν μπορεί να βρει καμιά μεταβλητή %s GeoIP.",
+ "GeoIPServerVarsFound": "Το Matomo ανίχνευσε τις ακόλουθες μεταβλητές GeoIP %s",
+ "GeoIPUpdaterInstructions": "Εισάγετε παρακάτω τους συνδέσμους λήψης για τις βάσεις δεδομένων σας. Αν έχετε αγοράσει βάσεις δεδομένων από το %3$sdbip%4$s ή το %1$sMaxMind%2$s, μπορείτε να βρείτε τους συνδέσμους λήψης στο λογαριασμό σας στο dbip ή στο MaxMind. Παρακαλούμε επικοινωνήστε με τον πάροχο γεωτοποθεσίας σας αν έχετε πρόβλημα με την πρόσβαση στους συνδέσμους.",
+ "GeoIPUpdaterIntro": "Το Matomo επί του παρόντος διαχειρίζεται τις ενημερώσεις για τις ακόλουθες βάσεις δεδομένων",
+ "GeoIPVariablesConfigurationHere": "Μπορείτε να παραμετροποιήσετε τις μεταβλητές διακομιστή που χρησιμοποιούνται %1$sεδώ%2$s.",
+ "GeoLiteCityLink": "Αν χρησιμοποιείτε τη βάση δεδομένων πόλεων του dbip, χρησιμοποιήστε τον παρακάτω σύνδεσμο: %1$s%2$s%3$s",
+ "HowToSetupGeoIP": "Πως εγκαθιστώ ακριβή γεωτοποθεσία με το dbip",
+ "HowToSetupGeoIP_Step1": "%1$sΛήψη%2$s της βάσης δεδομένων πόλεων του DBIP από %3$sdbip%4$s.",
+ "HowToSetupGeoIP_Step2": "Αποσυμπιέστε το αρχείο και αντιγράψτε το αποτέλεσμα, %1$s μέσα στον υποκατάλογο %2$smisc%3$s του Matomo και μετονομάστε το σε %4$s (μπορείτε να το κάνετε αυτό μέσω FTP ή SSH).",
+ "HowToSetupGeoIP_Step3": "Επαναφόρτωση της οθόνης. Ο πάροχος %1$sDBIP \/ GeoIP (PHP)%2$s θα %3$sεγκατασταθεί%4$s. Επιλέξτε τον.",
+ "HowToSetupGeoIP_Step4": "Και είστε έτοιμοι! Μόλις εγκαταστήσατε το Matomo να χρησιμοποιεί το DBIP που σημαίνει ότι θα μπορείτε να βλέπετε τις περιοχές και τις πόλεις των επισκεπτών σας μαζί με αρκετά έγκυρη πληροφορία σχετικά με τις χώρες.",
+ "HowToSetupGeoIPIntro": "Δεν φαίνεται να έχετε εγκατεστημένη τη Γεωτοποθεσία. Αποτελεί ένα χρήσιμο χαρακτηριστικό και χωρίς αυτό δε θα έχετε έγκυρη και πλήρη πληροφορία για τις τοποθεσίες των επισκεπτών σας. Δείτε πως μπορείτε να ξεκινήσετε να τη χρησιμοποιείτε γρήγορα:",
+ "HowToInstallApacheModule": "Πώς εγκαθιστώ την επέκταση GeoIP για τον Apache;",
+ "HowToInstallNginxModule": "Πώς εγκαθιστώ την επέκταση GeoIP για το Nginx;",
+ "HttpServerModule": "Επέκταση Διακομιστή HTTP",
+ "InvalidGeoIPUpdatePeriod": "Μη έγκυρη περίοδος για την ενημέρωση του GeoIP: %1$s. Έγκυρες τιμές είναι %2$s.",
+ "IPurchasedGeoIPDBs": "Αγόρασα βάσεις δεδομένων με μεγαλύτερη ακρίβεια από το %3$sdbip%4$s ή το %1$sMaxMind%2$s και θέλω να εγκαταστήσω τις αυτόματες ενημερώσεις.",
+ "ISPDatabase": "Βάση δεδομένων Παρόχων",
+ "IWantToDownloadFreeGeoIP": "Θέλω να λάβω τη δωρεάν βάση δεδομένων DBIP...",
"PluginDescription": "Παρέχει τους παρόχους τοποθεσίας DBIP \/ GeoIP2.",
+ "LocationDatabase": "Βάση δεδομένων τοποθεσιών",
+ "LocationDatabaseHint": "Μια βάση δεδομένων τοποθεσιών είναι μια βάση δεδομένων χωρών, περιοχών ή πόλεων.",
"LocationProviderDesc_Php": "Αυτός ο πάροχος τοποθεσίας είναι ο απλούστερος στην εγκατάσταση καθώς δεν απαιτεί παραμετροποίηση στο διακομιστή (ιδανικός για διαμοιραζόμενη φιλοξενία!). Χρησιμοποιεί μια βάση δεδομένων γεωτοποθεσίας DBIP ή GeoIP 2 για τον ακριβή καθορισμό της τοποθεσίας των επισκεπτών σας.",
"LocationProviderDesc_Php_WithExtension": "Αυτός ο πάροχος τοποθεσίας αυξάνει την ταχύτητά του με την εγκατεστημένη επέκταση %1$smaxminddb%2$s.",
"LocationProviderDesc_ServerModule": "Αυτός ο πάροχος τοποθεσίας χρησιμοποιεί το άρθρωμα GeoIP 2 που έχει εγκατασταθεί στον διακομιστή ιστού σας. Ο πάροχος είναι γρήγορος και ακριβής, αλλά %1$sμπορεί να χρησιμοποιηθεί μόνο με την κλασική παρακολούθηση μέσω του φυλλομετρητή σας.%2$s",
"LocationProviderDesc_ServerModule2": "Αν επιθυμείτε να εισαγάγετε αρχεία καταγραφής ή να κάνετε κάτι άλλο που απαιτεί τον ορισμό διευθύνσεων IP, χρησιμοποιήστε την %3$sPHP GeoIP 2 υλοποίηση%4$s και εγκαταστήστε την %1$sεπέκταση maxminddb%2$s.",
- "ServerBasedVariablesConfiguration": "Παραμετροποίηση των μεταβλητών διακομιστή που χρησιμοποιούνται από τα αρθρώματα GeoIP 2 του διακομιστή",
- "GeoIPVariablesConfigurationHere": "Μπορείτε να παραμετροποιήσετε τις μεταβλητές διακομιστή που χρησιμοποιούνται %1$sεδώ%2$s.",
+ "NotManagingGeoIPDBs": "Το Matomo δεν διαχειρίζεται αυτή τη στιγμή τυχόν βάσεις δεδομένων DBIP ή MaxMind.",
+ "UnsupportedArchiveType": "Παρουσιάστηκε μη υποστηριζόμενος τύπος συμπιεσμένου αρχείου %1$s.",
+ "UpdaterHasNotBeenRun": "Το πρόγραμμα ενημέρωσης δεν εκτελέστηκε ποτέ.",
+ "UpdaterIsNotScheduledToRun": "Δεν είναι προγραμματισμένο να εκτελεστεί στο μέλλον.",
+ "UpdaterScheduledForNextRun": "Είναι προγραμματισμένο για εκτέλεση κατά την εκτέλεση της επόμενης εντολής του cron core:archive.",
+ "UpdaterWasLastRun": "Το πρόγραμμα ενημέρωσης εκτελέστηκε τελευταία στις %s.",
+ "UpdaterWillRunNext": "Είναι προγραμματισμένο για εκτέλεση στις %s.",
"ShowCustomServerVariablesConfig": "Χρησιμοποιώ το άρθρωμα διακομιστή Geoip2 (Nxing, Apache...) και θέλω να παραμετροποιήσω τις μεταβλητές διακομιστή",
- "ServerVariableFor": "Μεταβλητή διακομιστή για %s"
+ "ServerBasedVariablesConfiguration": "Παραμετροποίηση των μεταβλητών διακομιστή που χρησιμοποιούνται από τα αρθρώματα GeoIP 2 του διακομιστή",
+ "ServerVariableFor": "Μεταβλητή διακομιστή για %s",
+ "SetupAutomaticUpdatesOfGeoIP": "Εγκατάσταση αυτόματων ενημερώσεων των βάσεων δεδομένων γεωτοποθεσίας",
+ "ThisUrlIsNotAValidGeoIPDB": "Το κατεβασμένο αρχείο δεν είναι έγκυρη βάση δεδομένων γεωτοποθεσίας. Παρακαλούμε διπλοελέγξτε τη διεύθυνση URL ή κατεβάστε το αρχείο χειροκίνητα."
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/en.json b/plugins/GeoIp2/lang/en.json
index d0559328eb..158028266e 100644
--- a/plugins/GeoIp2/lang/en.json
+++ b/plugins/GeoIp2/lang/en.json
@@ -1,15 +1,57 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Cannot find apache_get_modules function, assuming non-Apache webserver.",
"CannotFindGeoIPDatabaseInArchive": "No valid DBIP / GeoIP database could be found in tar archive %1$s!",
+ "CannotFindGeoIPServerVar": "The %s variable is not set. Your server may not be configured correctly.",
+ "CannotListContent": "Couldn't list content for %1$s: %2$s",
+ "CannotSetupGeoIPAutoUpdating": "It seems like you're storing your geolocation databases outside of Matomo (we can tell since there are no databases in the misc subdirectory, but your GeoIP is working). Matomo cannot automatically update your geolocation databases if they are located outside of the misc directory.",
"CannotUnzipGeoIPFile": "Could not unzip GeoIP file in %1$s: %2$s",
+ "DownloadingDb": "Downloading %s",
+ "DownloadNewDatabasesEvery": "Update databases every",
+ "FatalErrorDuringDownload": "A fatal error occurred while downloading this file. There might be something wrong with your internet connection, with the geolocation database you downloaded or Matomo. Try downloading and installing it manually.",
+ "FoundApacheModules": "Matomo found the following Apache modules",
+ "GeoIPImplHasAccessTo": "This GeoIP implementation has access to the following types of databases",
+ "GeoIPDatabases": "GeoIP Databases",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Note: IP anonymization has no effect on the locations reported by this provider. Before using it with IP anonymization, make sure this does not violate any privacy laws you may be subject to.",
+ "GeoIPLocationProviderNotRecommended": "Geolocation works, but you are not using one of the recommended providers.",
+ "GeoIPNoDatabaseFound": "This GeoIP implementation was not able to find any database.",
+ "GeoIPNoServerVars": "Matomo cannot find any GeoIP %s variables.",
+ "GeoIPServerVarsFound": "Matomo detects the following GeoIP %s variables",
+ "GeoIPUpdaterInstructions": "Enter the download links for your databases below. If you've purchased databases from %3$sdbip%4$s or %1$sMaxMind%2$s, you can find these links in your dbip or MaxMind account. Please contact your geolocation database provider if you have trouble accessing them.",
+ "GeoIPUpdaterIntro": "Matomo is currently managing updates for the following databases",
+ "GeoIPVariablesConfigurationHere": "You can configure used server variables %1$shere%2$s.",
+ "GeoLiteCityLink": "If you're using the dbip city lite database, use this link: %1$s%2$s%3$s",
+ "HowToSetupGeoIP": "How to setup accurate geolocation with dbip",
+ "HowToSetupGeoIP_Step1": "%1$sDownload%2$s the DBIP City Lite database from %3$sdbip%4$s.",
+ "HowToSetupGeoIP_Step2": "Extract this file and copy the result, %1$s into the %2$smisc%3$s Matomo subdirectory and rename it to %4$s (you can do this either by FTP or SSH).",
+ "HowToSetupGeoIP_Step3": "Reload this screen. The %1$sDBIP / GeoIP (PHP)%2$s provider will now be %3$sInstalled%4$s. Select it.",
+ "HowToSetupGeoIP_Step4": "And you're done! You've just setup Matomo to use DBIP which means you'll be able to see the regions and cities of your visitors along with very accurate country information.",
+ "HowToSetupGeoIPIntro": "You do not appear to have accurate Geolocation setup. This is a useful feature and without it you will not see accurate and complete location information for your visitors. Here's how you can quickly start using it:",
+ "HowToInstallApacheModule": "How do I install the GeoIP module for Apache?",
+ "HowToInstallNginxModule": "How do I install the GeoIP module for Nginx?",
+ "HttpServerModule": "HTTP Server Module",
+ "InvalidGeoIPUpdatePeriod": "Invalid period for the GeoIP updater: %1$s. Valid values are %2$s.",
+ "IPurchasedGeoIPDBs": "I purchased more accurate databases from %3$sdbip%4$s or %1$sMaxMind%2$s and want to setup automatic updates.",
+ "ISPDatabase": "ISP Database",
+ "IWantToDownloadFreeGeoIP": "I want to download the free DBIP database...",
"PluginDescription": "Provides DBIP / GeoIP2 location providers.",
+ "LocationDatabase": "Location Database",
+ "LocationDatabaseHint": "A location database is either a country, region or city database.",
"LocationProviderDesc_Php": "This location provider is the simplest to install as it does not require server configuration (ideal for shared hosting!). It uses a DBIP or GeoIP 2 database and MaxMind's PHP API to accurately determine the location of your visitors.",
"LocationProviderDesc_Php_WithExtension": "This location provider is speeded up by the installed %1$smaxminddb%2$s extension.",
"LocationProviderDesc_ServerModule": "This location provider uses the GeoIP 2 module that has been installed in your HTTP server. This provider is fast and accurate, but %1$scan only be used with normal browser tracking.%2$s",
"LocationProviderDesc_ServerModule2": "If you have to import log files or do something else that requires setting IP addresses, use the %3$sPHP GeoIP 2 implementation%4$s and install %1$smaxminddb extension%2$s.",
- "ServerBasedVariablesConfiguration": "Configuration for server variables used by GeoIP 2 server modules",
- "GeoIPVariablesConfigurationHere": "You can configure used server variables %1$shere%2$s.",
+ "NotManagingGeoIPDBs": "Matomo is currently not managing any DBIP or MaxMind databases.",
+ "UnsupportedArchiveType": "Encountered unsupported archive type %1$s.",
+ "UpdaterHasNotBeenRun": "The updater has never been run.",
+ "UpdaterIsNotScheduledToRun": "It is not scheduled to run in the future.",
+ "UpdaterScheduledForNextRun": "It is scheduled to run during the next cron core:archive command execution.",
+ "UpdaterWasLastRun": "The updater was last run on %s.",
+ "UpdaterWillRunNext": "It is next scheduled to run on %s.",
"ShowCustomServerVariablesConfig": "I use the Geoip2 server module (Nginx, Apache...) and want to configure server variables",
- "ServerVariableFor": "Server variable for %s"
+ "ServerBasedVariablesConfiguration": "Configuration for server variables used by GeoIP 2 server modules",
+ "ServerVariableFor": "Server variable for %s",
+ "SetupAutomaticUpdatesOfGeoIP": "Setup automatic updates of geolocation databases",
+ "ThisUrlIsNotAValidGeoIPDB": "The downloaded file is not a valid geolocation database. Please re-check the URL or download the file manually."
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/es-ar.json b/plugins/GeoIp2/lang/es-ar.json
index 74bfe3b0fb..07c0e2ace5 100644
--- a/plugins/GeoIp2/lang/es-ar.json
+++ b/plugins/GeoIp2/lang/es-ar.json
@@ -1,15 +1,56 @@
{
"GeoIp2": {
+ "AssumingNonApache": "No se puede encontrar la función \"apache_get_modules\", asumiendo que se posee un servidor de internet no-Apache.",
"CannotFindGeoIPDatabaseInArchive": "¡No se pudo encontrar una base de datos válida de DBIP \/ GeoIP en el archivo tar %1$s!",
+ "CannotFindGeoIPServerVar": "La variable %s no está especificada. Tu servidor puede no estar configurado correctamente.",
+ "CannotListContent": "No se pudo enumerar el contenido de %1$s: %2$s",
+ "CannotSetupGeoIPAutoUpdating": "Parece que estás guardando tus bases de datos de geolocalización por fuera de Matomo (nos damos cuenta porque no hay base de datos en el subdirectorio \"misc\", pero tu GeoIP está funcionando). Matomo no puede actualizar automáticamente tus bases de datos de geolocalización si están ubicadas fuera del directorio \"misc\".",
"CannotUnzipGeoIPFile": "No se pudo descomprimir el archivo GeoIP en %1$s: %2$s",
+ "DownloadingDb": "Descargando %s",
+ "DownloadNewDatabasesEvery": "Actualizar bases de datos cada",
+ "FatalErrorDuringDownload": "Ocurrió un error fatal al descargar este archivo. Puede ser que haya algo malo con tu conexión de Internet, con la base de datos de geolocalización que descargaste o con Matomo. Intentá descargarla e instalarla manualmente.",
+ "FoundApacheModules": "Matomo encontró los siguientes módulos Apache",
+ "GeoIPImplHasAccessTo": "Esta implementación GeoIP tiene acceso a los siguientes tipos de bases de datos",
+ "GeoIPDatabases": "Bases de datos GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Nota: La anonimización de las direcciónes IP no tiene efecto en las ubicaciones informadas por este proveedor. Antes de utilizarlo con anonimización de IP, asegurate de que no viola leyes de privacidad a las que podés estar sujeto.",
+ "GeoIPLocationProviderNotRecommended": "La geolocalización funciona, pero no estás usando uno de nuestros proveedores recomendados.",
+ "GeoIPNoDatabaseFound": "Esta implementación GeoIP no pudo encontrar ninguna base de datos.",
+ "GeoIPNoServerVars": "Matomo no puede encontrar ninguna variable GeoIP de %s.",
+ "GeoIPServerVarsFound": "Matomo detecta las siguientes variables GeoIP de %s",
+ "GeoIPUpdaterInstructions": "Ingresá abajo los enlaces de descarga de tus base de datos. Si compraste bases de datos a %3$sdbip%4$s o %1$sMaxMind%2$s, podés encontrar esos enlaces en tu cuenta de dbip o MaxMind. Por favor, contactá con tu proveedor de geolocalización si tenés problemas para acceder a ellos.",
+ "GeoIPUpdaterIntro": "Matomo actualmente está administrando actualizaciones para las siguientes bases de datos",
+ "GeoIPVariablesConfigurationHere": "Podés configurar las variables de servidor usadas %1$sacá%2$s.",
+ "GeoLiteCityLink": "Si estás usando la base de datos liviana de ciudades de dbip, usá este enlace: %1$s%2$s%3$s.",
+ "HowToSetupGeoIP": "Cómo configurar una geolocalización precisa con dbip",
+ "HowToSetupGeoIP_Step1": "%1$sDescargá%2$s la base de datos liviana de ciudades de DBIP desde %3$sdbip%4$s.",
+ "HowToSetupGeoIP_Step2": "Extraé este archivo y copiá el resultado, %1$s en el subdirectorio %2$smisc%3$s de Matomo y renombralo a %4$s (podés hacerlo por FTP o SSH).",
+ "HowToSetupGeoIP_Step3": "Refrescar esta pantalla. El proveedor %1$sDBIP \/ GeoIP (PHP)%2$s ahora será %3$sinstalado%4$s. Seleccionalo.",
+ "HowToSetupGeoIP_Step4": "¡Listo! Acabás de configurar Matomo para que use DBIP, lo que significa que vas a poder ver las regiones y ciudades de tus visitantes con información muy precisa por país.",
+ "HowToSetupGeoIPIntro": "Parece ser que la configuración de la geolocalización no es confiable. Esta es una función útil y sin ella no verás una información precisa y completa de la ubicación de tus visitantes. Aquí un rápido vistazo de cómo utilizarla:",
+ "HowToInstallApacheModule": "¿Cómo instalo el módulo GeoIP en Apache?",
+ "HowToInstallNginxModule": "¿Cómo instalo el módulo GeoIP en Nginx?",
+ "HttpServerModule": "Módulo servidor HTTP",
+ "InvalidGeoIPUpdatePeriod": "Período no válido para el actualizador GeoIP: %1$s. Los valores correctos son %2$s.",
+ "IPurchasedGeoIPDBs": "Compré más base de datos precisas de %3$sdbip%4$s o %1$sMaxMind%2$s y quiero configurar las actualizaciones automáticas.",
+ "ISPDatabase": "Base de datos de ISP",
+ "IWantToDownloadFreeGeoIP": "Quiero descargar la base de datos gratuita de DBIP…",
"PluginDescription": "Ofrece proveedores de geolocalización DBIP \/ GeoIP2.",
+ "LocationDatabase": "Base de datos de ubicaciones",
+ "LocationDatabaseHint": "Una base de datos de ubicación es una base de datos, ya sea de país, región o ciudad.",
"LocationProviderDesc_Php": "Este proveedor de ubicación es el más sencillo de instalar ya que no requiere de configuración del servidor (¡es ideal para el hospedaje compartido!). Usa una base de datos DBIP o GeoIP2 y la API PHP de MaxMind para determinar con precisión la ubicación de tus visitantes.",
"LocationProviderDesc_Php_WithExtension": "Este proveedor de ubicación se acelera al instalar la extensión %1$sMaxMindDB%2$s.",
"LocationProviderDesc_ServerModule": "Este proveedor de ubicación utiliza el módulo GeoIP2 que se instaló en tu servidor HTTP. Este proveedor es fiable y rápido, pero %1$ssólo puede ser usado con el rastreo común de los navegadores web.%2$s",
"LocationProviderDesc_ServerModule2": "Si tenés que importar archivos de registro o cualquier otra acción que requiera configurar direcciones IP, usá la %3$simplementación GeoIP2 PHP%4$s e instalá la extensión %1$sMaxMindDB%2$s.",
- "ServerBasedVariablesConfiguration": "Configuración para variables de servidor usadas por los módulos de servidor GeoIP2",
- "GeoIPVariablesConfigurationHere": "Podés configurar las variables de servidor usadas %1$sacá%2$s.",
+ "UnsupportedArchiveType": "Se encontró un tipo de archivo %1$s no soportado.",
+ "UpdaterHasNotBeenRun": "Nunca se ejecutó el actualizador.",
+ "UpdaterIsNotScheduledToRun": "No está programado para ejecutarse en el futuro.",
+ "UpdaterScheduledForNextRun": "Está programado para ejecutarse durante la próxima ejecución de comando cron \"core:archive\".",
+ "UpdaterWasLastRun": "El actualizador se ejecutó por última vez: %s.",
+ "UpdaterWillRunNext": "Está programado para ejecutarse: %s.",
"ShowCustomServerVariablesConfig": "Uso el módulo de servidor GeoIP2 (Nginx, Apache, etc.) y quiero configurar las variables de servidor",
- "ServerVariableFor": "Variable de servidor para %s"
+ "ServerBasedVariablesConfiguration": "Configuración para variables de servidor usadas por los módulos de servidor GeoIP2",
+ "ServerVariableFor": "Variable de servidor para %s",
+ "SetupAutomaticUpdatesOfGeoIP": "Configurar actualizaciones automáticas de tus base de datos de geolocalización",
+ "ThisUrlIsNotAValidGeoIPDB": "El archivo descargado no es una base de datos válida de geolocalizació. Por favor, verificá la dirección web o descargá el archivo manualmente."
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/es.json b/plugins/GeoIp2/lang/es.json
index fc6335fdcf..1d062ab512 100644
--- a/plugins/GeoIp2/lang/es.json
+++ b/plugins/GeoIp2/lang/es.json
@@ -1,12 +1,39 @@
{
"GeoIp2": {
+ "AssumingNonApache": "No se puede encontrar la función apache_get_modules, asumiendo que posee un servidor de internet no-Apache.",
+ "CannotFindGeoIPServerVar": "La variable %s no está especificada. Su servidor puede no estar configurado correctamente.",
+ "CannotListContent": "No se pudo enumerar el contenido de %1$s: %2$s",
"CannotUnzipGeoIPFile": "No se pudo descomprimir archivo GeoIP en %1$s: %2$s",
+ "DownloadingDb": "Descargando %s",
+ "DownloadNewDatabasesEvery": "Actualizar bases de datos cada",
+ "FoundApacheModules": "Matomo ha encontrado los siguientes módulos Apache",
+ "GeoIPImplHasAccessTo": "Esta implementación GeoIP tiene acceso a los siguientes tipos de bases de datos",
+ "GeoIPDatabases": "Bases de datos GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Nota: La anonimización de las direcciónes IP no tiene efecto en las ubicaciones suministradas por este proveedor. Antes de utilizarlo con anonimización de IP, asegúrese que no viola leyes de privacidad al que puede estar sujeto.",
+ "GeoIPLocationProviderNotRecommended": "La geolocalización funciona pero no está utilizando uno de los proveedores recomendados.",
+ "GeoIPNoDatabaseFound": "Esta implementación GeoIP no pudo encontrar ninguna base de datos.",
+ "GeoIPNoServerVars": "Matomo no puede encontrar ninguna de las variables GeoIp %s.",
+ "GeoIPServerVarsFound": "Matomo detecta las siguientes variables GeoIP %s",
+ "GeoIPVariablesConfigurationHere": "Puede configurar las variables de servidor usadas %1$saquí%2$s",
+ "HowToSetupGeoIPIntro": "Parece ser que la configuración de la Geolocalización no es confiable. Esta es una función útil y sin ella no verá una información precisa y completa de la ubicación de sus visitantes. Aquí un rápido vistazo de como utilizarla:",
+ "HowToInstallApacheModule": "¿Cómo instalar el módulo GeoIP en Apache?",
+ "HowToInstallNginxModule": "¿Cómo instalo el módulo GeoIP en Nginx?",
+ "HttpServerModule": "Módulo servidor HTTP",
+ "InvalidGeoIPUpdatePeriod": "Período inválido para el actualizador GeoIP: %1$s. Los valores correctos son %2$s.",
+ "ISPDatabase": "Base de dato ISP",
+ "LocationDatabase": "Base de datos de ubicaciones",
+ "LocationDatabaseHint": "Una base de datos de ubicación es una base de datos sea un país, región o ciudad.",
"LocationProviderDesc_Php_WithExtension": "Este proveedor de ubicación se acelera con la extensión %1$smaxminddb%2$s instalada.",
"LocationProviderDesc_ServerModule": "Este proveedor de ubicación utiliza el módulo GeoIP 2 que se ha instalado en su servidor HTTP. Este proveedor es rápido y preciso, pero %1$ssolo se puede utilizar con la función de rastreo normal de su navegador.%2$s",
"LocationProviderDesc_ServerModule2": "Si tiene que importar archivos de registro u otras tareas que requieran configurar direcciones IP, use la %3$simplementación de PHP GeoIP 2%4$s e instale la %1$sextensión maxminddb%2$s.",
- "ServerBasedVariablesConfiguration": "Configuración para variables de servidor utilizadas por los módulos de servidor GeoIP 2",
- "GeoIPVariablesConfigurationHere": "Puede configurar las variables de servidor usadas %1$saquí%2$s",
+ "UnsupportedArchiveType": "Se encontró un tipo de archivo %1$s no respaldado.",
+ "UpdaterHasNotBeenRun": "El actualizador nunca se ha ejecutado.",
+ "UpdaterIsNotScheduledToRun": "No está programada la ejecución en el futuro.",
+ "UpdaterScheduledForNextRun": "Está previsto ser activado durante la próxima ejecución del comando cron core:archive.",
+ "UpdaterWasLastRun": "El actualizador se ejecutó por última vez en %s.",
+ "UpdaterWillRunNext": "Está programada la ejecución para el %s.",
"ShowCustomServerVariablesConfig": "Uso el módulo de servidor Geoip2 (Nginx, Apache...) y deseo configurar las variables del servidor",
+ "ServerBasedVariablesConfiguration": "Configuración para variables de servidor utilizadas por los módulos de servidor GeoIP 2",
"ServerVariableFor": "Variable del servidor para %s"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/et.json b/plugins/GeoIp2/lang/et.json
new file mode 100644
index 0000000000..6b3ddcb59d
--- /dev/null
+++ b/plugins/GeoIp2/lang/et.json
@@ -0,0 +1,10 @@
+{
+ "GeoIp2": {
+ "DownloadingDb": "Laen alla %s",
+ "DownloadNewDatabasesEvery": "Uuenda andmebaasi iga",
+ "GeoIPDatabases": "GeoIP andmebaas",
+ "ISPDatabase": "ISP andmebaas",
+ "LocationDatabase": "Asukoha andmebaas",
+ "UpdaterWasLastRun": "Uuendaja käivitus viimati %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/fa.json b/plugins/GeoIp2/lang/fa.json
new file mode 100644
index 0000000000..2c6cb1029f
--- /dev/null
+++ b/plugins/GeoIp2/lang/fa.json
@@ -0,0 +1,17 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "نمی توان فانکشن apache_get_modules را پیدا نمود, فرض کنید روی وبسرور غیر آپاچی است.",
+ "CannotListContent": "مطالب قابل فهرست شدن نمی باشد برای %1$s:%2$s",
+ "DownloadingDb": "در حال بارگزاری %s",
+ "DownloadNewDatabasesEvery": "پایگاه های داده را بروزرسانی کن در هر",
+ "FoundApacheModules": "پیویک ماژول های آپاچی زیر را یافت",
+ "GeoIPDatabases": "پایگاه های داده GeoIP",
+ "HowToInstallApacheModule": "چگونه ماژول GeoIP را برای آپاچی نصب کنم؟",
+ "HttpServerModule": "ماژول HTTP سرور",
+ "ISPDatabase": "پایگاه داده ISP",
+ "LocationDatabase": "پایگاه داده محلی",
+ "LocationDatabaseHint": "منظور از یک پایگاه داده محلی ، یک پایگاه داده ی کشوری ، منطقه ای یا شهری است.",
+ "UpdaterHasNotBeenRun": "به روز رسانی شده است هرگز اجرا شده است.",
+ "UpdaterWasLastRun": "آخرین بار بروزکننده در %s اجرا شده است."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/fi.json b/plugins/GeoIp2/lang/fi.json
index 8f99dcb9cc..58dc517c79 100644
--- a/plugins/GeoIp2/lang/fi.json
+++ b/plugins/GeoIp2/lang/fi.json
@@ -1,6 +1,33 @@
{
"GeoIp2": {
+ "AssumingNonApache": "apache_get_modules-toimintoa ei löydy, oletettavasti verkkopalvelin on muu kuin Apache-ohjelmisto.",
+ "CannotFindGeoIPServerVar": "Muuttujaa %s ei ole asetettu. Palvelimesi ei ehkä ole oikein konfiguroitu.",
+ "CannotListContent": "Sisältöä %1$s: %2$s ei voitu listata",
"CannotUnzipGeoIPFile": "GeoIP-tiedoston purkaminen epäonnistui: %1$s: %2$s",
+ "DownloadingDb": "Ladataan %s",
+ "DownloadNewDatabasesEvery": "Päivitä tietokanta joka",
+ "FoundApacheModules": "Matomo löysi seuraavat Apache-moduulit",
+ "GeoIPImplHasAccessTo": "Tällä GeoIP-sovelluksella on pääsy seuraavanlaisiin tietokantoihin",
+ "GeoIPDatabases": "GeoIP-tietokannat",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Huom: IP-osoitteen piilottamisella ei ole vaikutusta tämän palvelun raportoimaan sijaintiin. Varmista, ettet riko yksityisyyden suojaa ennen kuin käytät sitä piilotetun IP-osoitteen kanssa.",
+ "GeoIPLocationProviderNotRecommended": "Geopaikannus toimii, mutta et käytä suositeltua tuottajaa.",
+ "GeoIPNoDatabaseFound": "GeoIP-toteutus ei löytänyt yhtäkään tietokantaa.",
+ "GeoIPNoServerVars": "Matomo ei löydä yhtään GeoIP %s -muuttujaa.",
+ "GeoIPServerVarsFound": "Matomo on löytänyt seuraavat GeoIP %s -muuttujat",
+ "HowToSetupGeoIPIntro": "Vaikuttaa, ettei sinulla ole tarkkaa Geopaikannus asennusta. Ilman tätä hyödyllistä toimintoa et näe tarkkoja tietoja kävijöidesi sijannista. Näin voit aloittaa Geopaikannuksen käytön nopeasti:",
+ "HowToInstallApacheModule": "Miten asennan GeoIP-moduulin Apachelle?",
+ "HowToInstallNginxModule": "Miten asennan GeoIP-moduulin Nginx:lle?",
+ "HttpServerModule": "HTTP-palvelimen moduuli",
+ "InvalidGeoIPUpdatePeriod": "Virheellinen ajanjakso GeoIP-päivityksille: %1$s. Kelvolliset arvot ovat %2$s.",
+ "ISPDatabase": "ISP:n tietokanta",
+ "LocationDatabase": "Sijantitietokanta",
+ "LocationDatabaseHint": "Sijaintietokanta on joko maa-, alue- tai kaupunkitietokanta.",
+ "UnsupportedArchiveType": "Havaittiin tiedostomuoto %1$s, jota ei ole tuettu.",
+ "UpdaterHasNotBeenRun": "Päivitystä ei ole ajettu koskaan.",
+ "UpdaterIsNotScheduledToRun": "Ei ole asetettu ajettavaksi tulevaisuudessa.",
+ "UpdaterScheduledForNextRun": "Ajastettu suoritettavaksi seuraavan cron core:archive -komennon suorituksen aikana.",
+ "UpdaterWasLastRun": "Päivitys ajettiin viimeksi %s.",
+ "UpdaterWillRunNext": "Asetettu ajettavaksi seuraavan kerran %s.",
"ServerBasedVariablesConfiguration": "Palvelimen muuttujat GeoIP2-palvelinmoduulille",
"ServerVariableFor": "Palvelimen muuttuja %s:lle"
}
diff --git a/plugins/GeoIp2/lang/fr.json b/plugins/GeoIp2/lang/fr.json
index e4a0537fbf..bf4ab94853 100644
--- a/plugins/GeoIp2/lang/fr.json
+++ b/plugins/GeoIp2/lang/fr.json
@@ -1,12 +1,39 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Impossible de trouver la fonction apache_get_modules, nous supposons que le serveur web n'est pas Apache.",
+ "CannotFindGeoIPServerVar": "La variable %s n'est pas définie. Votre serveur peut ne pas être configuré correctement.",
+ "CannotListContent": "Impossible d'afficher le contenu de %1$s: %2$s",
"CannotUnzipGeoIPFile": "Impossible de décompresser le fichier GeoIP dans %1$s: %2$s",
+ "DownloadingDb": "Téléchargement de %s",
+ "DownloadNewDatabasesEvery": "Mettre à jour les bases de données tous (toutes) les",
+ "FoundApacheModules": "Matomo a trouvé les modules Apache suivants",
+ "GeoIPImplHasAccessTo": "Cette implémentation GeoIP a accès aux types de bases de données suivants",
+ "GeoIPDatabases": "Base de donnéees GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Note : L'anonymisation de l'adresse IP n'a aucun effet sur les localisations communiquées par ce fournisseur. Avant de l'utiliser avec l'anonymisation d'IP, assurez-vous que cela ne transgresse aucune loi sur la vie privées à laquelle vous pourriez être assujetti.",
+ "GeoIPLocationProviderNotRecommended": "La géolocalisation fonctionne, mais vous n'utilisez pas un des fournisseurs recommandés.",
+ "GeoIPNoDatabaseFound": "Cette implémentation de GeoIP n'a trouvé aucune base de données.",
+ "GeoIPNoServerVars": "Matomo ne parvient à trouver aucune variable GeoIP %s.",
+ "GeoIPServerVarsFound": "Matomo a détecté les variables de GeoIP suivantes %s",
+ "GeoIPVariablesConfigurationHere": "Vous pouvez configurer les variables serveur utilisées %1$sici%2$s.",
+ "HowToSetupGeoIPIntro": "Il ne semble pas que vous ayez une configuration de géolocalisation très précise. C'est une fonctionnalité utile et sans elle vous ne verrez pas de manière précise et complète les informations de localisation de vos visiteurs. Voici comment vous pouvez rapidement commencer à l'utiliser :",
+ "HowToInstallApacheModule": "Comment puis-je récupérer le module GeoIP pour Apache ?",
+ "HowToInstallNginxModule": "Comment puis-je installer le module GeoIP pour Nginx ?",
+ "HttpServerModule": "Module du serveur HTTP",
+ "InvalidGeoIPUpdatePeriod": "Période invalide pour la mise à jour de GeoIP: %1$s. Les valeurs valides sont %2$s.",
+ "ISPDatabase": "Base de données ISP",
+ "LocationDatabase": "Base de données de localisation",
+ "LocationDatabaseHint": "Une base de données de localisation est une base de données de pays, villes ou régions.",
"LocationProviderDesc_Php_WithExtension": "Ce service de localisation est plus performant grâce à l'installation de l'extension %1$smaxminddb%2$s.",
"LocationProviderDesc_ServerModule": "Ce service de localisation utilise le module GeoIP 2 qui peut être installé sur votre serveur HTTP. Ce service est rapide est précis mais %1$speut uniquement être utilisé avec le système de suivi du navigateur classique. %2$s",
"LocationProviderDesc_ServerModule2": "Si vous devez importer des fichiers de journaux ou bien effectuer quoi que ce soit d'autre qui requiert la définition des adresses IP, utilisez %3$sl'implémentation PHP GeoIP 2%4$s et installez %1$sl'extension maxminddb%2$s.",
- "ServerBasedVariablesConfiguration": "Configuration des variables serveur utilisées par le module GeoIP 2.",
- "GeoIPVariablesConfigurationHere": "Vous pouvez configurer les variables serveur utilisées %1$sici%2$s.",
+ "UnsupportedArchiveType": "Type d'archive non supporté %1$s.",
+ "UpdaterHasNotBeenRun": "L'outil de mise a jour n'a jamais été exécuté.",
+ "UpdaterIsNotScheduledToRun": "N'est pas planifié pour une exécution future.",
+ "UpdaterScheduledForNextRun": "Est planifié pour un traitement durant la prochaine exécution du cron de archive.php.",
+ "UpdaterWasLastRun": "La dernière mise à jour a été effectuée le %s.",
+ "UpdaterWillRunNext": "Est planifié pour s'exécuter le %s.",
"ShowCustomServerVariablesConfig": "J'utilise le module serveur Goip2 (Nginx, Apache...) et je veux configurer les variables de serveur",
+ "ServerBasedVariablesConfiguration": "Configuration des variables serveur utilisées par le module GeoIP 2.",
"ServerVariableFor": "Variable serveur pour %s"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/gl.json b/plugins/GeoIp2/lang/gl.json
new file mode 100644
index 0000000000..c118882ff8
--- /dev/null
+++ b/plugins/GeoIp2/lang/gl.json
@@ -0,0 +1,11 @@
+{
+ "GeoIp2": {
+ "DownloadingDb": "A descargar %s",
+ "DownloadNewDatabasesEvery": "Actualizar as bases de datos cada",
+ "UpdaterHasNotBeenRun": "O actualizador non foi executado nunca.",
+ "UpdaterIsNotScheduledToRun": "Non está planificado para ser executado no futuro.",
+ "UpdaterScheduledForNextRun": "Está planificado para ser executado durante a próxima execución da orde core:archive de cron.",
+ "UpdaterWasLastRun": "O actualizador foi executado por última vez o %s.",
+ "UpdaterWillRunNext": "Está planificado para ser executado o %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/he.json b/plugins/GeoIp2/lang/he.json
new file mode 100644
index 0000000000..f792af072c
--- /dev/null
+++ b/plugins/GeoIp2/lang/he.json
@@ -0,0 +1,5 @@
+{
+ "GeoIp2": {
+ "GeoIPDatabases": "מסד נתונים GeoIP"
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/hi.json b/plugins/GeoIp2/lang/hi.json
new file mode 100644
index 0000000000..7ebf63894b
--- /dev/null
+++ b/plugins/GeoIp2/lang/hi.json
@@ -0,0 +1,28 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "गैर अपाचे वेबसर्वर मानते हुए, apache_get_modules फ़ंक्शन नहीं मिल सकता है.",
+ "CannotFindGeoIPServerVar": "%s के चर स्थापित नहीं है. आपका सर्वर ठीक से कॉन्फ़िगर नहीं किया जा सकता है.",
+ "CannotListContent": "%1$s के लिए सामग्री की सूची नहीं कर सका: %2$s",
+ "DownloadingDb": "अधीभारण %s",
+ "DownloadNewDatabasesEvery": "हर डेटाबेस का अद्यतन",
+ "FoundApacheModules": "Matomo को निम्नलिखित अपाचे मॉड्यूल ने पाया",
+ "GeoIPImplHasAccessTo": "इस GeoIP कार्यान्वयन का डेटाबेस के निम्नलिखित प्रकार के लिए उपयोग किया है",
+ "GeoIPDatabases": "GeoIP डेटाबेस",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "नोट: आईपी अनोंय्मिज़ इस प्रदाता द्वारा रिपोर्ट किए गए स्थानों पर कोई प्रभाव नहीं है. आईपी ​​अनोंय्मिज़ के साथ प्रयोग करने से पहले,आप के लिए विषय हो सकता है यह किसी भी गोपनीयता कानून का उल्लंघन नहीं करता है सुनिश्चित करें",
+ "GeoIPServerVarsFound": "Matomo निम्नलिखित GeoIP चर %s का पता लगाता है",
+ "HowToSetupGeoIPIntro": "आप सही जियोलोकेशन सेटअप प्रकट नहीं करते हैं. यह एक उपयोगी सुविधा है और इसके बिना आप अपने दर्शकों के लिए सही और पूरी स्थान की जानकारी नहीं देख सकेंगे. यहाँ है कैसे आपको जल्दी से यह प्रयोग शुरू कर सकते हैं:",
+ "HowToInstallApacheModule": "कैसे मैं अपाचे के लिए GeoIP मॉड्यूल स्थापित करूँ?",
+ "HowToInstallNginxModule": "कैसे मैं nginx के लिए GeoIP मॉड्यूल स्थापित करूँ?",
+ "HttpServerModule": "HTTP सर्वर मॉड्यूल",
+ "InvalidGeoIPUpdatePeriod": "GeoIP updater के लिए अमान्य अवधि:%1$s. मान्य %2$s मान रहे हैं.",
+ "ISPDatabase": "आईएसपी डाटाबेस",
+ "LocationDatabase": "स्थान डाटाबेस",
+ "LocationDatabaseHint": "एक स्थान डेटाबेस या तो एक देश, क्षेत्र या शहर डेटाबेस है.",
+ "UnsupportedArchiveType": "असमर्थित संग्रह प्रकार का सामना करना पड़ा %1$s.",
+ "UpdaterHasNotBeenRun": "updater कभी नहीं चलाया गया",
+ "UpdaterIsNotScheduledToRun": "यह भविष्य में चलाने के लिए निर्धारित नहीं है।",
+ "UpdaterScheduledForNextRun": "संग्रह आदेश निष्पादन: यह अगले क्रॉन कोर के दौरान चलाने के लिए निर्धारित है।",
+ "UpdaterWasLastRun": "Updater %s पर अंतिम रन था.",
+ "UpdaterWillRunNext": "यह अगले %s पर चलने के लिए निर्धारित किया गया है।"
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/id.json b/plugins/GeoIp2/lang/id.json
new file mode 100644
index 0000000000..8b955afaf3
--- /dev/null
+++ b/plugins/GeoIp2/lang/id.json
@@ -0,0 +1,26 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "Tidak dapat menemukan fungsi apache_get_modules, sehingga diduga sebagai peladen non-Apache.",
+ "CannotFindGeoIPServerVar": "Variabel %s tidak diatur. Peladen Anda mungkin tidak diatur secara benar.",
+ "CannotListContent": "Tidak dapat menemukan isi untuk %1$s: %2$s",
+ "DownloadingDb": "Mengunduh %s",
+ "DownloadNewDatabasesEvery": "Perbarui basisdata setiap",
+ "FoundApacheModules": "Matomo menemukan modul Apache berikut",
+ "GeoIPImplHasAccessTo": "Penerapan GeoIP ini memiliki akses terhadap jenis-jenis basisdata berikut",
+ "GeoIPDatabases": "Basisdata GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Catatan: anonimasi IP tidak berdampak dalam laporan berdasar penyedia ini. Sebelum menggunakan ini dengan anonimasi IP, pastikan bahwa Anda tidak melanggar peraturan privasi yang mungkin dikenakan kepada Anda.",
+ "GeoIPNoServerVars": "Matomo tidak dapat menemukan variabel GeoIP %s apapun.",
+ "GeoIPServerVarsFound": "Matomo mendeteksi variabel GeoIP berikut %s",
+ "HowToSetupGeoIPIntro": "Anda tidak tampak memiliki pemasangan Lokasi-geo yang teliti. Fitur ini sangat berguna dan tanpa ini Anda tidak akan melihat lokasi lengkap dan akurat untuk pengunjung Anda. Di sini bagaimana Anda dapat dengan mudah memulai ini:",
+ "HowToInstallApacheModule": "Bagaimana saya memasang modul GeoIP untuk Apache?",
+ "HowToInstallNginxModule": "Bagaimana saya memasang modul GeoIP untuk Nginx?",
+ "HttpServerModule": "Modul Peladen HTTP",
+ "InvalidGeoIPUpdatePeriod": "Periode tak sahih untuk pembaruan GeoIP: %1$s. Nilai sahih adalah %2$s.",
+ "ISPDatabase": "Basisdata Penyedia Layanan Internet",
+ "LocationDatabase": "Basisdata Lokasi",
+ "LocationDatabaseHint": "Sebuah basisdata lokasi merupakan salah satu basisdata suatu negara, wilayah, atau kota.",
+ "UnsupportedArchiveType": "Mengandung arsip tak didukung jenis %1$s.",
+ "UpdaterHasNotBeenRun": "Pembaruan belum pernah berjalan.",
+ "UpdaterWasLastRun": "Pembaruan terakhir berjalan dalam %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/it.json b/plugins/GeoIp2/lang/it.json
index 60354ed97f..c1bbd6f689 100644
--- a/plugins/GeoIp2/lang/it.json
+++ b/plugins/GeoIp2/lang/it.json
@@ -1,12 +1,39 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Impossibile trovare la funzione apache_get_modules, si suppone che sia un server non-Apache.",
+ "CannotFindGeoIPServerVar": "La variabile %s non è impostata. Il tuo server potrebbe non essere correttamente configurato.",
+ "CannotListContent": "Impossibile elencare il contenuto per %1$s: %2$s",
"CannotUnzipGeoIPFile": "impossibile scompattare il file geoIP in %1$s: %2$s",
+ "DownloadingDb": "Sto scaricando %s",
+ "DownloadNewDatabasesEvery": "Aggiorna il database ogni",
+ "FoundApacheModules": "Matomo ha trovato i seguenti moduli Apache",
+ "GeoIPImplHasAccessTo": "Questa implementazione GeoIP ha accesso ai seguenti tipi di database",
+ "GeoIPDatabases": "Database GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Nota: l'anonimizzazione IP non ha alcun effetto sui luoghi segnalati da questo fornitore. Prima di utilizzarlo con la trasformazione in forma anonima degli IP, assicurati che questo non violi alcuna legge sulla privacy a cui puoi essere soggetto.",
+ "GeoIPLocationProviderNotRecommended": "La geolocalizzazione sta funzionando ma tu non stai utilizzando uno dei provider raccomandati.",
+ "GeoIPNoDatabaseFound": "Questa implementazione GeoIP non ha potuto trovare un database.",
+ "GeoIPNoServerVars": "Matomo non riesce a trovare nessuna delle variabili %s GeoIP.",
+ "GeoIPServerVarsFound": "Matomo rileva le seguenti %s variabili GeoIP.",
+ "GeoIPVariablesConfigurationHere": "Puoi configurare %1$squi%2$s le variabili del server utilizzate.",
+ "HowToSetupGeoIPIntro": "Sembra che tu non abbia una configurazione di Geolocalizzazione accurata. Questa è una funzionalità utile, e senza di essa non si avranno informazioni accurate e complete sulla localizzazione dei tuoi visitatori. Ecco come puoi iniziare a usarla rapidamente:",
+ "HowToInstallApacheModule": "Come posso installare il modulo GeoIP per Apache?",
+ "HowToInstallNginxModule": "Come posso installare il modulo GeoIP per Nginx?",
+ "HttpServerModule": "Modulo Server HTTP",
+ "InvalidGeoIPUpdatePeriod": "Periodo non valido per l'updater GeoIP: %1$s. I valori validi sono: %2$s.",
+ "ISPDatabase": "Database ISP",
+ "LocationDatabase": "Database Località",
+ "LocationDatabaseHint": "Un database località è un database di nazioni, regioni o città.",
"LocationProviderDesc_Php_WithExtension": "Questo provider di posizione viene velocizzato dall'estensione installata %1$smaxminddb%2$s.",
"LocationProviderDesc_ServerModule": "Questo provider di posizione utilizza il modulo GeoIP 2 che è stato installato nel tuo server HTTP. Questo provider è veloce e accurato, ma %1$s può solo essere utilizzato con il normale tracciamento del browser.%2$s",
"LocationProviderDesc_ServerModule2": "Se devi importare i file di log o fare qualcos'altro che richiede l'impostazione di indirizzi IP, usa %3$sl'implementazione PHP geoIP 2%4$s e installa %1$sl'estensione maxminddb%2$s.",
- "ServerBasedVariablesConfiguration": "Configurazione per le variabili del server utilizzate dai moduli server di GeoIP 2",
- "GeoIPVariablesConfigurationHere": "Puoi configurare %1$squi%2$s le variabili del server utilizzate.",
+ "UnsupportedArchiveType": "Si è incontrato un archivio di tipo non supportato %1$s.",
+ "UpdaterHasNotBeenRun": "Il programma di aggiornamento non è mai stato eseguito.",
+ "UpdaterIsNotScheduledToRun": "Non è pianificato un suo futuro avvio.",
+ "UpdaterScheduledForNextRun": "È programmato un suo avvio durante l'esecuzione del prossimo cron.job core:archive.",
+ "UpdaterWasLastRun": "Il programma di aggiornamento è stato eseguito per l'ultima volta il %s.",
+ "UpdaterWillRunNext": "È programmato per essere eseguito il %s.",
"ShowCustomServerVariablesConfig": "Io utilizzo il modulo server GeoIP2 (Nginx, Apache...) e voglio configurare le variabili del server",
+ "ServerBasedVariablesConfiguration": "Configurazione per le variabili del server utilizzate dai moduli server di GeoIP 2",
"ServerVariableFor": "Variabili del server per %s"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/ja.json b/plugins/GeoIp2/lang/ja.json
index b5e29cf5bf..6e068d5aba 100644
--- a/plugins/GeoIp2/lang/ja.json
+++ b/plugins/GeoIp2/lang/ja.json
@@ -1,12 +1,39 @@
{
"GeoIp2": {
+ "AssumingNonApache": "非 Apache ウェブサーバーを想定して apache_get_modules ファンクションを見つける事ができません。",
+ "CannotFindGeoIPServerVar": "%s 変数が設定されていません。お使いのサーバーは、正しく構成されていない可能性があります。",
+ "CannotListContent": "%1$s の内容が一覧表示できません。%2$s",
"CannotUnzipGeoIPFile": "%1$s の GeoIP ファイルを解凍できません: %2$s",
+ "DownloadingDb": "ダウンロード中 %s",
+ "DownloadNewDatabasesEvery": "各データベースをアップデート",
+ "FoundApacheModules": "Matomo は次の Apache モジュールを見つけました",
+ "GeoIPImplHasAccessTo": "この GeoIP 実装は、次の種類のデータベースへのアクセスを含みます。",
+ "GeoIPDatabases": "GeoIP データベース",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "注)このプロバイダーにより報告された位置情報は、IP の匿名化による影響を受けません。IP 匿名化をご利用になる前に、必ず利用者が遵守すべきあらゆるプライバシーに関する法律に違反しないことをご確認ください。",
+ "GeoIPLocationProviderNotRecommended": "位置情報探索機能は作動していますが、ご利用中のプロバイダーは推奨プロバイダーではありません。",
+ "GeoIPNoDatabaseFound": "この GeoIP 実装は、データベースを見つけることができませんでした。",
+ "GeoIPNoServerVars": "任意の GeoIP %s 変数を見つける事ができません。",
+ "GeoIPServerVarsFound": "Matomo は、次の GeoIP %s 変数を検知します。",
+ "GeoIPVariablesConfigurationHere": "%1$sこちら%2$s で使用しているサーバー変数の設定ができます。",
+ "HowToSetupGeoIPIntro": "正確な位置情報のセットアップが完了していないようです。位置情報探索機能は、役立つ機能です。セットアップを完了させることで、サイト訪問者についての正確で完全な位置情報を確認することができるようになります。それをすぐに使い始めることができる方法はこれです。",
+ "HowToInstallApacheModule": "GeoIP モジュールを Apache にインストールする方法は?",
+ "HowToInstallNginxModule": "GeoIP モジュールを Nginx にインストールする方法は?",
+ "HttpServerModule": "HTTP サーバーモジュール",
+ "InvalidGeoIPUpdatePeriod": "GeoIP アップデーターに対する無効な期間は、%1$s です。有効な値は、%2$s です。",
+ "ISPDatabase": "ISP データベース",
+ "LocationDatabase": "位置情報データベース",
+ "LocationDatabaseHint": "位置情報データベースは、国、地域、都市データベースのいづれかです。",
"LocationProviderDesc_Php_WithExtension": "この位置情報プロバイダーは、インストールされている%1$smaxminddb%2$s 拡張機能により高速化されています。",
"LocationProviderDesc_ServerModule": "このロケーションプロバイダーは、HTTP サーバーにインストールされている GeoIP2 モジュールを使用します。 このプロバイダは高速で正確ですが、%1$s通常のブラウザトラッキングでのみ使用できます。%2$s",
"LocationProviderDesc_ServerModule2": "ログファイルをインポートやIPアドレスの設定が必要な場合は、 %3$sPHP GeoIP2 実装%4$s を使用し、%1$smaxminddb 拡張モジュール%2$sをインストールしてください。",
- "ServerBasedVariablesConfiguration": "GeoIP2 サーバーモジュールで使用されるサーバー変数の設定",
- "GeoIPVariablesConfigurationHere": "%1$sこちら%2$s で使用しているサーバー変数の設定ができます。",
+ "UnsupportedArchiveType": "サポートされていないアーカイブタイプ %1$s が見つかりました。",
+ "UpdaterHasNotBeenRun": "アップデーターは実行されませんでした。",
+ "UpdaterIsNotScheduledToRun": "これは、将来実行されるようにスケジュールされていません。",
+ "UpdaterScheduledForNextRun": "これは、次のクーロン core:archive コマンド実行の間に実行するようスケジュールされています。",
+ "UpdaterWasLastRun": "アップデーターは、%s の最後に実行されました。",
+ "UpdaterWillRunNext": "それは次に %s で実行されるようスケジュールされています。",
"ShowCustomServerVariablesConfig": "Geoip2サーバーモジュール(Nginx,Apacheなど)を使いサーバーの設定を調整します。",
+ "ServerBasedVariablesConfiguration": "GeoIP2 サーバーモジュールで使用されるサーバー変数の設定",
"ServerVariableFor": "%s のサーバー変数"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/ko.json b/plugins/GeoIp2/lang/ko.json
new file mode 100644
index 0000000000..2469b3a2cb
--- /dev/null
+++ b/plugins/GeoIp2/lang/ko.json
@@ -0,0 +1,30 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "아파치 웹서버가 아니어서 apache_get_modules을 찾을 수 없습니다.",
+ "CannotFindGeoIPServerVar": "%s에 변수가 설정되어 있지 않습니다. 서버가 올바르게 구성되지 않았을 수 있습니다.",
+ "CannotListContent": "%1$s에 대한 내용을 나열 할 수 없습니다: %2$s",
+ "DownloadingDb": "다운로드 중 %s",
+ "DownloadNewDatabasesEvery": "모든 데이터베이스 업데이트",
+ "FoundApacheModules": "Matomo은 다음의 아파치 모듈을 찾을 수 없음",
+ "GeoIPImplHasAccessTo": "이 GeoIP 구현에서 접근하는 데이터베이스 유형은",
+ "GeoIPDatabases": "GeoIP 데이터베이스",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "참고: IP를 익명화하면 공급자가 보고있는 위치에 아무런 영향을 미치지 않습니다. IP를 익명화 하지 않으면, 개인 정보 보호법을 위반이 될수 있으므로 주의하세요.",
+ "GeoIPLocationProviderNotRecommended": "지리적 위치 플러그인은 동작하지만, 현재 당신은 추천하는 공급자를 사용하고 있지 않습니다.",
+ "GeoIPNoServerVars": "Matomo은 GeoIP %s 변수를 찾을 수 없습니다.",
+ "GeoIPServerVarsFound": "Matomo은 다음의 GeoIP %s 변수를 감지함",
+ "HowToSetupGeoIPIntro": "위치 정보를 정확하게 설정하지 않으면 방문자의 위치 정보 및 이와 관련한 유용한 기능이 표시되지 않습니다. 다음 방법을 참고하여 어서 이 기능을 사용하세요:",
+ "HowToInstallApacheModule": "아파치의 GeoIP 모듈을 설치하려면 어떻게해야합니까?",
+ "HowToInstallNginxModule": "Nginx에 GeoIP 모듈을 설치하려면 어떻게해야합니까?",
+ "HttpServerModule": "HTTP 서버 모듈",
+ "InvalidGeoIPUpdatePeriod": "GeoIP 업데이터의 잘못된 기간: %1$s. 유효한 값은 %2$s 입니다.",
+ "ISPDatabase": "ISP 데이터베이스",
+ "LocationDatabase": "위치 데이터베이스",
+ "LocationDatabaseHint": "위치 데이터베이스는 국가, 지역 또는 도시 데이터베이스를 말합니다.",
+ "UnsupportedArchiveType": "지원되지 않는 압축 형식 %1$s 입니다.",
+ "UpdaterHasNotBeenRun": "업데이터가 한 번도 실행되지 않았습니다.",
+ "UpdaterIsNotScheduledToRun": "향후 실행할 계획이 없습니다.",
+ "UpdaterScheduledForNextRun": "다음 cron core:archive 명령 수행시 실행됩니다.",
+ "UpdaterWasLastRun": "%s에 마지막 업데이트 확인",
+ "UpdaterWillRunNext": "%s에 실행이 계획되어 있습니다."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/lt.json b/plugins/GeoIp2/lang/lt.json
index 7bb640ab05..455a5bdde6 100644
--- a/plugins/GeoIp2/lang/lt.json
+++ b/plugins/GeoIp2/lang/lt.json
@@ -1,5 +1,13 @@
{
"GeoIp2": {
- "CannotUnzipGeoIPFile": "Nepavyko išpakuoti GeoIP failo ties %1$s: %2$s"
+ "AssumingNonApache": "Nepavyksta rasti apache_get_modules funkcijos, numanoma, kad tai ne Apache saityno serveris.",
+ "CannotUnzipGeoIPFile": "Nepavyko išpakuoti GeoIP failo ties %1$s: %2$s",
+ "DownloadingDb": "Atsiunčiama %s",
+ "FoundApacheModules": "Matomo rado šiuos Apache modulius",
+ "GeoIPDatabases": "GeoIP duomenų bazės",
+ "GeoIPNoServerVars": "Matomo nepavyko rasti jokių GeoIP %s kintamųjų.",
+ "GeoIPServerVarsFound": "Matomo aptinka šiuos GeoIP %s kintamuosius",
+ "HowToInstallApacheModule": "Kaip man įdiegti Apache skirtą GeoIP modulį?",
+ "UnsupportedArchiveType": "Susidurta su nepalaikomu archyvo tipu %1$s."
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/nb.json b/plugins/GeoIp2/lang/nb.json
new file mode 100644
index 0000000000..210e659098
--- /dev/null
+++ b/plugins/GeoIp2/lang/nb.json
@@ -0,0 +1,16 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "Kan ikke finne apache_get_modules-funksjonen. Antar at det ikke er en Apache webserver.",
+ "CannotListContent": "Kunne ikke vise innhold for %1$s: %2$s",
+ "DownloadingDb": "Laster ned %s",
+ "DownloadNewDatabasesEvery": "Oppdater databasene hver",
+ "FoundApacheModules": "Matomo fant følgende Apache-moduler",
+ "GeoIPDatabases": "GeoIP-databaser",
+ "GeoIPNoServerVars": "Matomo kan ikke finne noen GeoIP %s variabler.",
+ "HowToInstallApacheModule": "Hvordan installerer jeg GeoIP-modulen for Apache?",
+ "HowToInstallNginxModule": "Hvordan installerer jeg GeoIP-modulen for Nginx?",
+ "HttpServerModule": "HTTP Server-modul",
+ "ISPDatabase": "ISP-database",
+ "LocationDatabase": "Lokasjonsdatabase"
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/nl.json b/plugins/GeoIp2/lang/nl.json
index a7ec8648ed..5f82db2b98 100644
--- a/plugins/GeoIp2/lang/nl.json
+++ b/plugins/GeoIp2/lang/nl.json
@@ -1,8 +1,32 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Kan de functie apache_get_modules niet vinden, uitgegaan van non-Apache webserver.",
+ "CannotFindGeoIPServerVar": "De %s variabele is niet ingesteld. Je server is waarschijnlijk niet correct geconfigureerd",
+ "CannotListContent": "Kon geen lijst maken van de inhoud voor %1$s: %2$s",
"CannotUnzipGeoIPFile": "Kan het GeoIP-bestand niet uitpakken in %1$s:%2$s",
- "ServerBasedVariablesConfiguration": "Configuratie voor servervariabelen die worden gebruikt door GeoIP 2-servermodules",
+ "DownloadingDb": "%s aan het downloaden",
+ "DownloadNewDatabasesEvery": "Update databases elke",
+ "FoundApacheModules": "Matomo vond de volgende Apache-modules",
+ "GeoIPImplHasAccessTo": "Deze GeoIP implementatie heeft toegang tot de volgende database types",
+ "GeoIPDatabases": "GeoIP Databases",
+ "GeoIPLocationProviderNotRecommended": "Geografische locatie bepaling werkt, maar je gebruikt niet één van de aanbevolen leveranciers.",
+ "GeoIPNoServerVars": "Matomo kan geen GeoIP %s variabelen vinden.",
+ "GeoIPServerVarsFound": "Matomo detecteert de volgende GeoIP %s variabelen",
"GeoIPVariablesConfigurationHere": "Je kunt %1$s gebruikte servervariabelen hier %2$sconfigureren.",
+ "HowToInstallApacheModule": "Hoe installeer ik de GeoIP module voor Apache?",
+ "HowToInstallNginxModule": "Hoe installeer ik de GeoIP-module voor Nginx?",
+ "HttpServerModule": "HTTP Server Module",
+ "InvalidGeoIPUpdatePeriod": "Ongeldige periode voor de GeoIP updater: %1$s. Geldige waardes zijn %2$s.",
+ "ISPDatabase": "ISP-database",
+ "LocationDatabase": "Locatiedatabase",
+ "LocationDatabaseHint": "Een locatie database is of een land of een regio of een stad database.",
+ "UnsupportedArchiveType": "Niet ondersteund archieftype aangetroffen %1$s.",
+ "UpdaterHasNotBeenRun": "De updater is nog niet eerder uitgevoerd.",
+ "UpdaterIsNotScheduledToRun": "Het is niet gepland om te worden uitgevoerd in de toekomst.",
+ "UpdaterScheduledForNextRun": "Het is ingepland om uitgevoerd te worden tijdens de volgende commando core:archive.",
+ "UpdaterWasLastRun": "De updater is voor het laatst uitgevoerd op %s.",
+ "UpdaterWillRunNext": "De volgende run is gepland om %s",
+ "ServerBasedVariablesConfiguration": "Configuratie voor servervariabelen die worden gebruikt door GeoIP 2-servermodules",
"ServerVariableFor": "Server variabele voor %s"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/pl.json b/plugins/GeoIp2/lang/pl.json
index 1751c6fa21..7c1bf89889 100644
--- a/plugins/GeoIp2/lang/pl.json
+++ b/plugins/GeoIp2/lang/pl.json
@@ -1,11 +1,38 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Nie można znaleźć funkcji apache_get_modules co oznacza, że zainstalowano serwer inny niż Apache.",
+ "CannotFindGeoIPServerVar": "Zmienna %s nie została ustawiona. Twój serwer mógł zostać niepoprawnie skonfigurowany.",
+ "CannotListContent": "Błąd wyświetlenia zawartości %1$s: %2$s",
"CannotUnzipGeoIPFile": "Nie udało się rozpakować pliku GeoIP %1$s: %2$s",
+ "DownloadingDb": "Pobieranie %s",
+ "DownloadNewDatabasesEvery": "Zaktualizuj bazę danych co",
+ "FoundApacheModules": "Matomo znalazł następujące moduły Apache",
+ "GeoIPImplHasAccessTo": "Ta implementacja GeoIP ma dostęp do następujących typów baz danych",
+ "GeoIPDatabases": "Bazy danych GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "NOTKA: Anonimizacja IP nie wywiera żadnego efektu gdy jest używana z tym dostawcą. Przed użyciem anonimizacji adresów IP, upewnij się, iż nie narusza ono żadnych praw do prywatności, który może podlegać.",
+ "GeoIPLocationProviderNotRecommended": "Geolokacja działa, ale nie używasz rekomendowanego dostawcy.",
+ "GeoIPNoDatabaseFound": "Ta implementacja GeoIP nie znalazła bazy danych geolokalizacyjnych.",
+ "GeoIPNoServerVars": "Matomo nie może znaleźć żadnych zmiennych %s GeoIP",
+ "GeoIPServerVarsFound": "Matomo wykrył następujące zmienne GeoIP %s",
+ "GeoIPVariablesConfigurationHere": "Tu możesz skonfigurować wykorzystywane %1$szmienne serwera%2$s",
+ "HowToSetupGeoIPIntro": "Wygląda na to, że nie skonfigurowałeś dokładnej Geolokalizacji. To przydatna funkcjonalność, bez której nie zobaczysz dokładnych i kompletnych informacji o swoich odwiedzających. Zobacz, jak szybko rozpocząć korzystanie z niej:",
+ "HowToInstallApacheModule": "W jaki sposób zainstaluję moduł GeoIP dla Apache?",
+ "HowToInstallNginxModule": "W jaki sposób zainstaluję moduł GeoIP dla Nginx?",
+ "HttpServerModule": "Moduł Serwera HTTP",
+ "InvalidGeoIPUpdatePeriod": "Błędny przedział dla aktualizatora GeoIP: %1$s. Prawidłowe wartości to %2$s.",
+ "ISPDatabase": "Baza dostawców internetowych",
+ "LocationDatabase": "Baza lokalizacji",
+ "LocationDatabaseHint": "Baza lokalizacji to baza krajów, regionów lub miast.",
"LocationProviderDesc_Php_WithExtension": "Ten dostawca lokalizacji przyspiesza dzięki zainstalowanemu rozszerzeniu %1$smaxminddb%2$s.",
"LocationProviderDesc_ServerModule": "Ten dostawca lokalizacji wykorzystuje moduł GeoIP2 zainstalowany w Twoim serwerze WWW. Działa szybko i dokładnie, ale %1$smoże być wykorzystany przy śledzeniu ruchu przeglądarek.%2$s",
"LocationProviderDesc_ServerModule2": "Jeśli musisz zaimportować pliki logów lub zrobić coś innego, co wymaga ustawienia adresu IP, użyj %3$simplementacji PHP dla GeoIP2%4$s i zainstaluj %1$srozszerzenie maxminddb%2$s.",
+ "UnsupportedArchiveType": "Napotkano nieobsługiwany typ archiwum %1$s.",
+ "UpdaterHasNotBeenRun": "Aktualizacja nie była jeszcze uruchamiana.",
+ "UpdaterIsNotScheduledToRun": "Nie zaplanowano kolejnego przebiegu.",
+ "UpdaterScheduledForNextRun": "Zostało zaplanowane kolejne wykonanie skryptu podczas najbliższego wykonania polecenia core:archive.",
+ "UpdaterWasLastRun": "Ostatnia aktualizacja odbyła się %s.",
+ "UpdaterWillRunNext": "Następna aktualizacja zaplanowana na %s.",
"ServerBasedVariablesConfiguration": "Konfiguracja zmiennych serwera używanych przez moduł GeoIP2",
- "GeoIPVariablesConfigurationHere": "Tu możesz skonfigurować wykorzystywane %1$szmienne serwera%2$s",
"ServerVariableFor": "Zmienna serwera określająca %s"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/pt-br.json b/plugins/GeoIp2/lang/pt-br.json
index b4bf4b78d3..14ad1a2fda 100644
--- a/plugins/GeoIp2/lang/pt-br.json
+++ b/plugins/GeoIp2/lang/pt-br.json
@@ -1,15 +1,57 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Não é possível encontrar a função apache_get_modules, assumindo servidor web não-Apache.",
"CannotFindGeoIPDatabaseInArchive": "Nenhuma base de dados DBIP \/ GeoIP válida pôde ser encontrada no arquivo tar %1$s!",
+ "CannotFindGeoIPServerVar": "A variável %s não está definida. O servidor pode não estar configurado corretamente.",
+ "CannotListContent": "Não foi possível listar o conteúdo para %1$s: %2$s",
+ "CannotSetupGeoIPAutoUpdating": "Parece que você está armazenando suas bases de dados de geolocalização fora do Matomo (nós percebemos pois não há bases de dados no subdiretório misc, mas o seu GeoIP está funcionando). O Matomo não pode atualizar automaticamente suas bases de dados de geolocalização se elas estiverem localizadas fora do diretório misc.",
"CannotUnzipGeoIPFile": "Não foi possível descompactar o arquivo GeoIP em %1$s:%2$s",
+ "DownloadingDb": "Baixando %s",
+ "DownloadNewDatabasesEvery": "Atualizar o banco de dados a cada",
+ "FatalErrorDuringDownload": "Um erro fatal ocorreu ao baixar este arquivo. Pode haver algo errado com a sua conexão Internet, com a base de dados de geolocalização que você baixou, ou com o Matomo. Tente baixá-la e instalá-la manualmente.",
+ "FoundApacheModules": "Matomo encontrou os seguintes módulos do Apache",
+ "GeoIPImplHasAccessTo": "Esta implementação GeoIP tem acesso aos seguintes tipos de bancos de dados",
+ "GeoIPDatabases": "Bases de dados GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Nota: anonimização IP não tem efeito sobre os locais relatados por este fornecedor. Antes de usá-lo com anonimização IP, certifique-se isso não viole as leis de privacidade que você pode estar sujeito.",
+ "GeoIPLocationProviderNotRecommended": "Geolocalização funciona, mas você não está usando um dos provedores recomendados.",
+ "GeoIPNoDatabaseFound": "Esta implementação GeoIP não encontrou nenhuma base de dados.",
+ "GeoIPNoServerVars": "Matomo não pode encontrar nenhuma variável GeoIP %s.",
+ "GeoIPServerVarsFound": "Matomo detecta as seguintes variáveis GeoIP %s",
+ "GeoIPUpdaterInstructions": "Insira abaixo os links de download para as suas bases de dados. Se você adquiriu bases de dados da %3$sdbip%4$s ou da %1$sMaxMind%2$s, você pode encontrar estes links em sua conta dbip ou MaxMind. Por favor entre em contato com o seu provedor de base de dados de geolocalização se você tiver dificuldade em encontrá-los.",
+ "GeoIPUpdaterIntro": "O Matomo está atualmente gerenciando atualizações para as seguintes bases de dados",
+ "GeoIPVariablesConfigurationHere": "Você pode configurar as variáves de servidor usadas %1$s aqui %2$s,",
+ "GeoLiteCityLink": "Se você está usando a base de dados dbip city lite, use este link: %1$s%2$s%3$s",
+ "HowToSetupGeoIP": "Como configurar geolocalização precisa com dbip",
+ "HowToSetupGeoIP_Step1": "%1$sBaixar%2$s a base de dados DBIP City Lite da %3$sdbip%4$s.",
+ "HowToSetupGeoIP_Step2": "Extraia este arquivo e copie o resultado %1$s para dentro do subdiretório %2$smisc%3$s do Matomo e renomeie-o para %4$s (você pode fazer isto por FTP ou SSH).",
+ "HowToSetupGeoIP_Step3": "Recarregue esta tela. O provedor %1$sDBIP \/ GeoIP (PHP)%2$s será %3$sinstalado%4$s agora. Selecione-o.",
+ "HowToSetupGeoIP_Step4": "E tudo pronto! Você acabou de configurar o Matomo para usar DBIP, o que significa que você poderá ver as regiões e as cidades dos seus visitantes junto com informações bem precisas dos países.",
+ "HowToSetupGeoIPIntro": "Aparentemente você não possui configurações precisas de geolocalização. Este é um recurso útil e sem ele você não verá as informações de localização precisas e completas para os seus visitantes. Veja como você pode rapidamente começar a usá-lo:",
+ "HowToInstallApacheModule": "Como faço para instalar o módulo GeoIP para o Apache?",
+ "HowToInstallNginxModule": "Como faço para instalar o módulo GeoIP para Nginx?",
+ "HttpServerModule": "Módulo do servidor HTTP",
+ "InvalidGeoIPUpdatePeriod": "Período inválido para o atualizador GeoIP: %1$s. Os valores válidos são %2$s.",
+ "IPurchasedGeoIPDBs": "Eu adquiri bases de dados mais precisas da %3$sdbip%4$s ou da %1$sMaxMind%2$s e quero configurar atualizações automáticas.",
+ "ISPDatabase": "Base de dados de provedores de Internet",
+ "IWantToDownloadFreeGeoIP": "Quero baixar a base de dados DBIP grátis...",
"PluginDescription": "Fornece provedores de localização DBIP \/ GeoIP.",
+ "LocationDatabase": "Base de dados de localização",
+ "LocationDatabaseHint": "Uma base de dados de localização é uma base de dados de país, região ou cidade.",
"LocationProviderDesc_Php": "Este provedor de localização é o mais simples de instalar pois não requer configuração do servidor (ideal para hospedagem compartilhada!). Ele usa uma base de dados DBIP ou GeoIP 2 e a API PHP da MaxMind para determinar com precisão a localização dos seus visitantes.",
"LocationProviderDesc_Php_WithExtension": "Este provedor de localização é acelerado pela extensão %1$s maxminddb %2$s.",
"LocationProviderDesc_ServerModule": "Este provedor de localização usa o módulo GeoIP2 que foi instalado no seu servidor HTTP. Este provedor é rápido e preciso, mas %1$ssó pode ser usado com o rastreamento normal do navegador. %2$s",
"LocationProviderDesc_ServerModule2": "Se você precisa importar arquivos de log ou fazer algo que requeira definir endereços IP, use a implementação %3$s GeoIP2 PHP %4$s e instale a extensão %1$s maxminddb %2$s.",
- "ServerBasedVariablesConfiguration": "Configuração para as variáveis de servidor usadas pelos módulos GeoIP2 do servidor.",
- "GeoIPVariablesConfigurationHere": "Você pode configurar as variáves de servidor usadas %1$s aqui %2$s,",
+ "NotManagingGeoIPDBs": "No momento o Matomo não está gerenciando nenhuma base de dados DBIP ou MaxMind.",
+ "UnsupportedArchiveType": "Encontrado tipo de arquivo não suportado %1$s.",
+ "UpdaterHasNotBeenRun": "O atualizador nunca foi executado.",
+ "UpdaterIsNotScheduledToRun": "Não está agendado para ser executado no futuro.",
+ "UpdaterScheduledForNextRun": "Está programado para ser executado durante a próxima execução do cron job archive.php",
+ "UpdaterWasLastRun": "O atualizador foi executado pela última vez em %s.",
+ "UpdaterWillRunNext": "A próxima execução está programada para ser executada em %s.",
"ShowCustomServerVariablesConfig": "Eu uso o módulo GeoIP2 para servidor (Nginx, Apache...) e quero configurar variáveis de servidor",
- "ServerVariableFor": "Variável de servidor para %s"
+ "ServerBasedVariablesConfiguration": "Configuração para as variáveis de servidor usadas pelos módulos GeoIP2 do servidor.",
+ "ServerVariableFor": "Variável de servidor para %s",
+ "SetupAutomaticUpdatesOfGeoIP": "Configurar atualizações automáticas das bases de dados de geolocalização",
+ "ThisUrlIsNotAValidGeoIPDB": "O arquivo baixado não é uma base de dados de geolocalização válida. Por favor verifique novamente a URL ou baixe o arquivo manualmente."
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/pt.json b/plugins/GeoIp2/lang/pt.json
index a2691a2371..9fb5312c85 100644
--- a/plugins/GeoIp2/lang/pt.json
+++ b/plugins/GeoIp2/lang/pt.json
@@ -1,12 +1,40 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Não foi possível encontrar a função apache_get_modules; assumindo um servidor web não-Apache.",
+ "CannotFindGeoIPDatabaseInArchive": "Não foi encontrada uma base de dados DBIP \/ GeoIP válida no arquivo tar %1$s!",
+ "CannotFindGeoIPServerVar": "A variável %s não está definida. O seu servidor pode não estar configurado corretamente.",
+ "CannotListContent": "Não foi possível listar o conteúdo para %1$s: %2$s",
"CannotUnzipGeoIPFile": "Não foi possível extrair o ficheiro GeoIP em %1$s: %2$s",
+ "DownloadingDb": "A descarregar %s",
+ "DownloadNewDatabasesEvery": "Atualizar bases de dados todos\/todas",
+ "FoundApacheModules": "O Matomo encontrou os seguintes módulos Apache",
+ "GeoIPImplHasAccessTo": "Esta implementação do GeoIP tem acesso aos seguintes tipos de bases de dados",
+ "GeoIPDatabases": "Bases de dados GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Nota: a anonimização de IP não tem qualquer efeito nas localizações reportadas por este fornecedor. Antes de o utilizar com a anonimização de IP, confirme que este não viola quaisquer leis de privacidade aplicáveis.",
+ "GeoIPLocationProviderNotRecommended": "A geolocalização funciona, mas não está a utilizar um dos fornecedores recomendados.",
+ "GeoIPNoDatabaseFound": "Esta implementação do GeoIP não conseguiu encontrar qualquer base de dados.",
+ "GeoIPNoServerVars": "O Matomo não consegue encontrar quaisquer variáveis GeoIP %s.",
+ "GeoIPServerVarsFound": "O Matomo deteta as seguintes variáveis GeoIP %s",
+ "GeoIPVariablesConfigurationHere": "Pode configurar as variáveis de servidor utilizadas %1$saqui%2$s.",
+ "HowToSetupGeoIPIntro": "Não parece ter uma configuração de Geolocalização precisa. Esta é uma funcionalidade útil e sem a mesma, não poderá ver informação de localização dos seus visitantes de forma precisa e completa. Eis como pode rapidamente começar a utilizá-la:",
+ "HowToInstallApacheModule": "Como instalo o módulo GeoIP para o Apache?",
+ "HowToInstallNginxModule": "Como instalo o módulo GeoIP para o Nginx?",
+ "HttpServerModule": "Módulo do servidor HTTP",
+ "InvalidGeoIPUpdatePeriod": "Período inválido para o atualizador GeoIP: %1$s. Os valores válidos são %2$s.",
+ "ISPDatabase": "Base de dados de ISP",
+ "LocationDatabase": "Base de dados de localização",
+ "LocationDatabaseHint": "Uma base de dados de localização é uma base de dados de um país, região ou cidade.",
"LocationProviderDesc_Php_WithExtension": "Este fornecedor de localização é acelerado pela extensão %1$smaxminddb%2$s instalada.",
"LocationProviderDesc_ServerModule": "Este fornecedor de localização utiliza o módulo GeoIP 2 que foi instalado no seu servidor HTTP. Este fornecedor é rápido e preciso, mas %1$ssó pode ser utilizado para um acompanhamento normal de navegadores.%2$s",
"LocationProviderDesc_ServerModule2": "Se tiver de importar ficheiros de registo ou fazer algo mais que necessite da definição de endereços de IP, utilize a %3$simplementação PHP do GeoIP 2%4$s e instale a %1$sextensão maxminddb%2$s.",
- "ServerBasedVariablesConfiguration": "Configuração para variáveis do servidor utilizadas pelos módulos do servidor GeoIP 2",
- "GeoIPVariablesConfigurationHere": "Pode configurar as variáveis de servidor utilizadas %1$saqui%2$s.",
+ "UnsupportedArchiveType": "Encontrado um tipo de arquivo não suportado %1$s.",
+ "UpdaterHasNotBeenRun": "A ferramenta de atualização nunca foi executada.",
+ "UpdaterIsNotScheduledToRun": "Não está agendada para ser executada no futuro.",
+ "UpdaterScheduledForNextRun": "Está agendada para ser executada durante a próxima execução do comando cron core:archive.",
+ "UpdaterWasLastRun": "A ferramenta de atualização foi executada pela última vez a %s.",
+ "UpdaterWillRunNext": "Está agendada para ser executada a %s.",
"ShowCustomServerVariablesConfig": "Eu utilizo o módulo do servidor Geoip2 (Nginx, Apache...) e pretendo configurar variáveis do servidor",
+ "ServerBasedVariablesConfiguration": "Configuração para variáveis do servidor utilizadas pelos módulos do servidor GeoIP 2",
"ServerVariableFor": "Variável do servidor para %s"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/ro.json b/plugins/GeoIp2/lang/ro.json
new file mode 100644
index 0000000000..e416b2e4ab
--- /dev/null
+++ b/plugins/GeoIp2/lang/ro.json
@@ -0,0 +1,30 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "Nu pot găsifuncție apache_obtine_module , presupunând non-server de web Apache.",
+ "CannotFindGeoIPServerVar": "Variabila %s nu este setata. Server-ul dvs. ar putea să nu fie configurat corect.",
+ "CannotListContent": "Nu s-a putut lista continutul pentru: %1$s %2$s",
+ "DownloadingDb": "Se descarcă %s",
+ "DownloadNewDatabasesEvery": "Actializează baza de date fiecare",
+ "FoundApacheModules": "Matomo a găsit următoarele module Apache",
+ "GeoIPImplHasAccessTo": "Aceasta implementare GeoIP are acces la următoarele tipuri de baze de date",
+ "GeoIPDatabases": "Bazele de date GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Notă: anonimizare IP nu are nici un efect asupra locațiilor raportate de acest furnizor. Înainte de al utiliza cu anonimizare, IP, asigurați-vă că aceasta nu încalcă legile privind confidențialitatea ar putea fi supuse.",
+ "GeoIPLocationProviderNotRecommended": "Geolocation funcționează, dar nu utilizați unul dintre furnizorii recomandati.",
+ "GeoIPNoServerVars": "Matomo nu poate găsi nici un GeoIP %s variabile.",
+ "GeoIPServerVarsFound": "Matomo detectează următoarele GeoIP %s variabile",
+ "HowToSetupGeoIPIntro": "Nu pare a avea o configurare exacte Geolocation. Aceasta este o caracteristică utilă și fără ea nu se vor vedea informatii corecte si complete de locație pentru vizitatori. Iată cum puteți începe rapid folosind-o:",
+ "HowToInstallApacheModule": "Cum instalez modulul GeoIP pentru Apache?",
+ "HowToInstallNginxModule": "Cum instalez modulul GeoIP pentru Nginx?",
+ "HttpServerModule": "Module HTTP Server",
+ "InvalidGeoIPUpdatePeriod": "Perioada de valabilitate pentru updater GeoIP:%1$s. Valorile valide sunt %2$s.",
+ "ISPDatabase": "Baza de date provideri internet",
+ "LocationDatabase": "Locatie baza de date",
+ "LocationDatabaseHint": "O locatie bază de date este fie o țară, regiune sau oraș baza de date.",
+ "UnsupportedArchiveType": "Arhiva neacceptata tip întâlnit %1$s.",
+ "UpdaterHasNotBeenRun": "Updater-ul nu a fost rulat.",
+ "UpdaterIsNotScheduledToRun": "Acesta nu este programata să ruleze în viitor.",
+ "UpdaterScheduledForNextRun": "Acesta este programat să ruleze în următoarea executare archive.php cron.",
+ "UpdaterWasLastRun": "Programul de actualizare a fost lasat sa ruleze %s.",
+ "UpdaterWillRunNext": "Programarea urmatoare trebuie sa ruleze pe %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/ru.json b/plugins/GeoIp2/lang/ru.json
index e3c6fc6067..eb38ed1ccf 100644
--- a/plugins/GeoIp2/lang/ru.json
+++ b/plugins/GeoIp2/lang/ru.json
@@ -1,11 +1,33 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Не удается найти apache_get_modules функцию, видимо, это не веб-сервер Apache.",
+ "CannotFindGeoIPServerVar": "Переменная %s не установлена. Ваш сервер не может быть сконфигурирован правильно.",
+ "CannotListContent": "Не удалось перечислить содержимое для %1$s: %2$s",
"CannotUnzipGeoIPFile": "Не получилось распаковать файл GeoIP за %1$s:%2$s",
+ "DownloadingDb": "Загрузка %s",
+ "DownloadNewDatabasesEvery": "Обновлять базу раз в",
+ "FoundApacheModules": "Matomo нашёл следующие модули Apache",
+ "GeoIPImplHasAccessTo": "Этот вариант реализации GeoIP имеет доступ к следующим базам данных",
+ "GeoIPDatabases": "Базы данных GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Подсказка: анонимизация IP не оказывает на эффект на получение локации пользователей таким способом. Перед тем, как использовать его с анонимизацией IP, убедитесь, что это не противоречит законодательству вашей страны.",
+ "GeoIPLocationProviderNotRecommended": "Геолокация работает, но вы не используете один из рекомендованных провайдеров.",
+ "GeoIPNoServerVars": "Matomo не может найти GeoIP %s переменные.",
+ "GeoIPServerVarsFound": "Matomo нашёл следующие переменные GeoIP: %s",
+ "GeoIPVariablesConfigurationHere": "Вы можете сконфигурировать используемые серверные переменные %1$s здесь %2$s.",
+ "HowToSetupGeoIPIntro": "Кажется, что у вас не настроено определено локации посетителей с помощью GeoIP. Это полезная \"штука\" - без нее вы не сможете достаточно точно определять местонахождение посетителей. И вот как вы можете быстро все настроить:",
+ "HowToInstallApacheModule": "Как установить GeoIP модуль для Apache?",
+ "HowToInstallNginxModule": "Как установить GeoIP модуль для Nginx?",
+ "HttpServerModule": "HTTP Серверный модуль",
+ "ISPDatabase": "База провайдеров",
+ "LocationDatabase": "Расположение базы данных",
+ "LocationDatabaseHint": "Расположение базы данных страны, региона или города.",
"LocationProviderDesc_Php_WithExtension": "Этот механизм определения местонахождения ускорен установленным расширением %1$smaxminddb%2$s.",
"LocationProviderDesc_ServerModule": "Этот механизм определения местонахождения использует модуль GeoIP 2, установленный на ваш HTTP-сервер. Он быстр и точен, но %1$s может быть использован только при отслеживании обычных браузеров.%2$s",
"LocationProviderDesc_ServerModule2": "Если вам нужно импортировать лог-файлы или сделать что-то еще, требующее использование IP-адресов, используйте %3$sPHP GeoIp 2%4$s и установите расширение %1$smaxminddb%2$s.",
+ "UnsupportedArchiveType": "Встретился неподдерживаемый тип архива %1$s.",
+ "UpdaterHasNotBeenRun": "Обновления никогда не производились.",
+ "UpdaterScheduledForNextRun": "Это запланированный запуск команды core:archive при следующем выполнении cron-задачи.",
"ServerBasedVariablesConfiguration": "Конфигурация серверных переменных, использованная модулями сервера GeoIP 2.",
- "GeoIPVariablesConfigurationHere": "Вы можете сконфигурировать используемые серверные переменные %1$s здесь %2$s.",
"ServerVariableFor": "Серверная переменная для %s"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/sk.json b/plugins/GeoIp2/lang/sk.json
new file mode 100644
index 0000000000..01d3886e96
--- /dev/null
+++ b/plugins/GeoIp2/lang/sk.json
@@ -0,0 +1,5 @@
+{
+ "GeoIp2": {
+ "UpdaterWasLastRun": "Aktualizátor bol naposledy spustený %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/sq.json b/plugins/GeoIp2/lang/sq.json
index cbbe901fcf..862e1af668 100644
--- a/plugins/GeoIp2/lang/sq.json
+++ b/plugins/GeoIp2/lang/sq.json
@@ -1,15 +1,57 @@
{
"GeoIp2": {
+ "AssumingNonApache": "S’gjendet dot funksioni apache_get_modules function, po merret i mirëqenë si shërbyes non-Apache.",
"CannotFindGeoIPDatabaseInArchive": "S’u gjet dot bazë e vlefshme të dhënash DBIP \/ GeoIP te arkivi tar %1$s!",
+ "CannotFindGeoIPServerVar": "Ndryshorja %s s’është rregulluar. Shërbyesi juaj mund të mos jetë formësuar si duhet.",
+ "CannotListContent": "S’paraqet dot lëndën për %1$s: %2$s",
+ "CannotSetupGeoIPAutoUpdating": "Duket se bazat tuaja të të dhënave GeoIP i depozitoni jashtë Matomo-s (e dimë, ngaqë s’ka baza të dhënash te nëndrejtoria misc, por GeoIP-ja juaj funksionon). Matomo s’i përditëson dot vetvetiu bazat tuaja të të dhënave për gjeovendëzim, nëse gjenden jashtë drejtorisë misc.",
"CannotUnzipGeoIPFile": "S’u shzipua dot kartela GeoIP te %1$s: %2$s",
+ "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 për gjeovendëzim që shkarkuat ose me Matomo-n. Provoni ta shkarkoni dhe instaloni dorazi.",
+ "FoundApacheModules": "Matomo gjeti modulet Apache vijues",
+ "GeoIPImplHasAccessTo": "Ky sendërtim i GeoIP-së mund të përdorë llojet vijuese të bazave të të dhënave",
+ "GeoIPDatabases": "Baza të dhënash GeoIP",
+ "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.",
+ "GeoIPLocationProviderNotRecommended": "Gjeovendëzimi funksionon, por nuk po përdorni një nga furnizuesit e këshilluar.",
+ "GeoIPNoDatabaseFound": "Ky sendërtim i GeoIP-së s’qe në gjendje të gjente ndonjë bazë të dhënash.",
+ "GeoIPNoServerVars": "Matomo s’gjen dot ndryshore GeoIP %s.",
+ "GeoIPServerVarsFound": "Matomo pikas 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$sdbip%4$s ose %1$sMaxMind%2$s, këto lidhje mund t’i gjeni te llogaria juaj dbip ose MaxMind. Nëse keni probleme me hyrjen në to, ju lutemi, lidhuni me furnizuesin tuaj të bazës së të dhënave të gjeovendëzimit.",
+ "GeoIPUpdaterIntro": "Matomo po administron përditësime për bazat vijuese të të dhënave",
+ "GeoIPVariablesConfigurationHere": "Ndryshoret e shërbyesit që përdoren mund t’i formësoni nga %1$skëtu%2$s.",
+ "GeoLiteCityLink": "Nëse përdorni bazën e të dhënave Dbip City Lite, përdorni këtë lidhje: %1$s%2$s%3$s",
+ "HowToSetupGeoIP": "Si të rregullohet gjeovendëzim i saktë me dbip?",
+ "HowToSetupGeoIP_Step1": "%1$sShkarkoni%2$s bazën e të dhënave DBIP City Lite prej %3$sdbip%4$s.",
+ "HowToSetupGeoIP_Step2": "Përftojeni këtë kartelë dhe kopjojeni përfundimin, %1$s te nëndrejtoria %2$smisc%3$s e Matomo-s dhe riemërtojeni si %4$s (këtë mund ta bëni me FTP ose SSH).",
+ "HowToSetupGeoIP_Step3": "Ringarkoni këtë skenë. Furnizuesi %1$sDBIP \/ GeoIP (PHP)%2$s tani do të jetë %3$sinstaluar%4$s. Përzgjidheni.",
+ "HowToSetupGeoIP_Step4": "Dhe mbaruat! Sapo e rregulluat Matomo-n të përdorë DBIP, 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:",
+ "HowToInstallApacheModule": "Si ta instaloj modulin GeoIP për Apache?",
+ "HowToInstallNginxModule": "Si ta instaloj modulin GeoIP për Nginx?",
+ "HttpServerModule": "Modul Shërbyesi HTTP",
+ "InvalidGeoIPUpdatePeriod": "Periudhë e pavlefshme për përditësuesin GeoIP: %1$s. Vlera të vlefshme janë %2$s.",
+ "IPurchasedGeoIPDBs": "Bleva baza të dhënash më të sakta nga %3$sdbip%4$s ose %1$sMaxMind%2$s dhe dua të rregulloj përditësime të vetvetishme.",
+ "ISPDatabase": "Bazë të Dhënash MShI",
+ "IWantToDownloadFreeGeoIP": "Dua të shkarkoj bazën DBIP falas të të dhënave…",
"PluginDescription": "Furnizon shërbime vendndodhjesh DBIP \/ GeoIP2.",
+ "LocationDatabase": "Bazë të dhënash Vendi",
+ "LocationDatabaseHint": "Një bazë të dhënash vendi është bazë të dhënash vendesh, rajonesh ose qytetesh.",
"LocationProviderDesc_Php": "Ky furnizues vendndodhjesh sh ë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ër të përcaktuar saktë vendin e vizitorëve tuaj, përdor një bazë të dhënash DBIP ose GeoIP 2 dhe API-n PHP të MaxMind-it.",
"LocationProviderDesc_Php_WithExtension": "Ky furnizues vendndodhjesh përshpejtohet nga zgjerimi %1$smaxminddb%2$s i instaluar.",
"LocationProviderDesc_ServerModule": "Ky furnizues vendndodhjesh përdor modulin GeoIP 2 që është instaluar te shërbyesi juaj HTTP. Ky furnizues është i shpejtë dhe i përpiktë, por %1$smund të përdoret vetëm me ndjekje të zakonshme të shfletimit.%2$s",
"LocationProviderDesc_ServerModule2": "Nëse ju duhet të importoni kartela regjistër ose të bëni diçka tjetër që lyp caktim adresash IP, përdorni %3$ssendërtimin PHP GeoIP 2%4$s dhe instaloni %1$szgjerimin maxminddb%2$s.",
- "ServerBasedVariablesConfiguration": "Formësim për ndryshore shërbyesi të përdorura nga module GeoIP 2 shërbyesi",
- "GeoIPVariablesConfigurationHere": "Ndryshoret e shërbyesit që përdoren mund t’i formësoni nga %1$skëtu%2$s.",
+ "NotManagingGeoIPDBs": "Matomo hëpërhë s’administron ndonjë bazë të dhënash DBIP ose MaxMind.",
+ "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.",
+ "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.",
"ShowCustomServerVariablesConfig": "Përdor modulin e shërbyesit Geoip2 (Nginx, Apache…) dhe dua të formësoj ndryshore shërbyesi",
- "ServerVariableFor": "Ndryshore shërbyesi për %s"
+ "ServerBasedVariablesConfiguration": "Formësim për ndryshore shërbyesi të përdorura nga module GeoIP 2 shërbyesi",
+ "ServerVariableFor": "Ndryshore shërbyesi për %s",
+ "SetupAutomaticUpdatesOfGeoIP": "Rregulloni përditësime të vetvetishme të bazave të të dhënave për gjeovendëzim",
+ "ThisUrlIsNotAValidGeoIPDB": "Kartela e shkarkuar s’është bazë të dhënash gjeovendëzimi e vlefshme. Ju lutemi, rikontrolloni URL-në ose shkarkojeni kartelën dorazi."
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/sr.json b/plugins/GeoIp2/lang/sr.json
new file mode 100644
index 0000000000..c222155c02
--- /dev/null
+++ b/plugins/GeoIp2/lang/sr.json
@@ -0,0 +1,30 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "Ne mogu da nađem funkciju apache_get_modules, pretpostavljam da imate server koji nije Apache.",
+ "CannotFindGeoIPServerVar": "Promenljiva %s nije postavljena. Vaš server možda nije valjano podešen.",
+ "CannotListContent": "Ne mogu da pročitam sadržaj %1$s: %2$s",
+ "DownloadingDb": "Preuzimanje %s",
+ "DownloadNewDatabasesEvery": "Ažuriraj bazu svakih",
+ "FoundApacheModules": "Matomo je našao sledeće Apache module",
+ "GeoIPImplHasAccessTo": "Ova GeoIP implementacija ima pristup sledećim tipovima baza",
+ "GeoIPDatabases": "GeoIP baza",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Pažnja: anonimizacija IP adresa ne utiče na lokacije koje obezbeđuje ovaj provajder. Proverite da li ovo nije u suprotnosti sa zakonom o privatnosti pod koji pripadate.",
+ "GeoIPLocationProviderNotRecommended": "Geolokacija funkcioniše ali vi ne koristite jednog od preporučenih provajdera.",
+ "GeoIPNoServerVars": "Matomo ne može da nađe nijednu GeoIP %s promenljivu",
+ "GeoIPServerVarsFound": "Matomo je pronašao sledeće GeoIP %s promenljive",
+ "HowToSetupGeoIPIntro": "Izgleda da nemate dobro podešeno geolociranje. Ovo je korisna opcija i bez nje nećete videti kompletne i precizne informacije o lokacijama vaših posetilaca. Evo kako brzo možete da počnete da je koristite:",
+ "HowToInstallApacheModule": "Kako da instaliram GeoIP modul za Apache?",
+ "HowToInstallNginxModule": "Kako da instaliram GeoIP modul za Nginx?",
+ "HttpServerModule": "HTTP server modul",
+ "InvalidGeoIPUpdatePeriod": "Period GeoIP osvežavanje %1$s nije validan. Validne vrednosti su %2$s.",
+ "ISPDatabase": "ISP baza",
+ "LocationDatabase": "Baza lokacija",
+ "LocationDatabaseHint": "Baza lokacija je baza zemalja, regija ili gradova.",
+ "UnsupportedArchiveType": "Tip arhive %1$s nije prepoznat.",
+ "UpdaterHasNotBeenRun": "Program za nadogradnju nije nikada ranije pokretan.",
+ "UpdaterIsNotScheduledToRun": "Nije zakazano buduće izvršenje.",
+ "UpdaterScheduledForNextRun": "Zakazano je da bude pokrenuto prilikom sledećeg izvršenja archive.php posla.",
+ "UpdaterWasLastRun": "Poslednja provera je izvršena %s.",
+ "UpdaterWillRunNext": "Sledeće izvršenje je zakazano za %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/sv.json b/plugins/GeoIp2/lang/sv.json
index 88680359e1..a2020f0229 100644
--- a/plugins/GeoIp2/lang/sv.json
+++ b/plugins/GeoIp2/lang/sv.json
@@ -1,11 +1,38 @@
{
"GeoIp2": {
+ "AssumingNonApache": "Kan inte hitta funktionen apache_get_modules, förutsätter att Apache inte används som webbserver.",
+ "CannotFindGeoIPServerVar": "Variabeln %s är inte inställd. Möjligtvis är din server inte rätt konfigurerad.",
+ "CannotListContent": "Kunde inte lista innehåll för %1$s: %2$s",
"CannotUnzipGeoIPFile": "Kan inte packa upp GeoIP-filen i %1$s: %2$s",
+ "DownloadingDb": "Laddar ner %s",
+ "DownloadNewDatabasesEvery": "Uppdatera databasen varje",
+ "FoundApacheModules": "Matomo hittade följande Apache-moduler",
+ "GeoIPImplHasAccessTo": "Den här GeoIP-tjänsten har tillgång till följande typer av databaser",
+ "GeoIPDatabases": "GeoIP-databaser",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Notera: Anonymisering av IP-adresser har ingen effekt på platserna som rapporteras av den här tjänsten. Kontrollera så att du inte bryter mot några sekretesslagar innan du använder den med anonyma IP-adresser.",
+ "GeoIPLocationProviderNotRecommended": "Geografisk lokalisering fungerar, men du använder inte något av de rekommenderade verktygen.",
+ "GeoIPNoDatabaseFound": "Denna GeoIP-tjänst kunde inte hitta någon databas.",
+ "GeoIPNoServerVars": "Matomo hittar inga GeoIP %s variabler.",
+ "GeoIPServerVarsFound": "Matomo har hittat följande variabler för GeoIP %s",
+ "GeoIPVariablesConfigurationHere": "Du kan konfigurera de använda servervariablerna %1$shär%2$s.",
+ "HowToSetupGeoIPIntro": "Det verkar inte som att du har ställt in träffsäker Geolocation. Detta är en användbar funktion, utan den kan du inte se komplett information om dina användare. Så här kommer du snabbt igång och kan börja använda det:",
+ "HowToInstallApacheModule": "Hur installerar jag GeoIP modulen för Apache?",
+ "HowToInstallNginxModule": "Hur installerar jag GeoIP-modulen för Nginx?",
+ "HttpServerModule": "HTTP-server modul",
+ "InvalidGeoIPUpdatePeriod": "Perioden för uppdateringar av GeoIP är ogiltig: Invalid period for the GeoIP updater: %1$s. Giltiga värden är %2$s.",
+ "ISPDatabase": "ISP-databas",
+ "LocationDatabase": "Platsdatabas",
+ "LocationDatabaseHint": "En platsdatabas är antingen en lands-, region, eller stadsdatabas.",
"LocationProviderDesc_Php_WithExtension": "Den här platstjänsten kan göras snabbare med det installerade %1$smaxminddb%2$s-tillägget.",
"LocationProviderDesc_ServerModule": "Den här platstjänsten använder GeoIP 2-modulen som installerats på din HTTP-server. Den här tjänsten är snabb och träffsäker, men %1$skan endast användas tillsammans med normal webbläsarspårning.%2$s",
"LocationProviderDesc_ServerModule2": "Om du behöver importera loggfiler eller göra något annat som kräver IP-adresser: Använd %1$sPECL GeoIP (rekommenderas)%2$s eller %3$sPHP GeoIP%4$s.",
+ "UnsupportedArchiveType": "En arkivtyp som ej stöds påträffades %1$s.",
+ "UpdaterHasNotBeenRun": "Uppdateringen har aldrig körts.",
+ "UpdaterIsNotScheduledToRun": "Den är inte planerad att köras i fortsättningen.",
+ "UpdaterScheduledForNextRun": "Den är planerad att köras under den nästa archive.php tidssession.",
+ "UpdaterWasLastRun": "Sensate uppdateringen gjordes den %s.",
+ "UpdaterWillRunNext": "Den är planerar att köras på %s.",
"ServerBasedVariablesConfiguration": "Konfigurering av servervariabler som används av GeoIP 2-servermoduler",
- "GeoIPVariablesConfigurationHere": "Du kan konfigurera de använda servervariablerna %1$shär%2$s.",
"ServerVariableFor": "Servervariabel för %s"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/th.json b/plugins/GeoIp2/lang/th.json
new file mode 100644
index 0000000000..f8788a75b3
--- /dev/null
+++ b/plugins/GeoIp2/lang/th.json
@@ -0,0 +1,7 @@
+{
+ "GeoIp2": {
+ "DownloadingDb": "กำลังดาวน์โหลด %s",
+ "ISPDatabase": "ฐานข้อมูล ISP",
+ "UpdaterWasLastRun": "ตัวปรับปรุงทำงานครั้งล่าสุดเมื่อ %s"
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/tl.json b/plugins/GeoIp2/lang/tl.json
new file mode 100644
index 0000000000..c46a898467
--- /dev/null
+++ b/plugins/GeoIp2/lang/tl.json
@@ -0,0 +1,30 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "Hindi mahanap ang apache_get_modules function sa pag-aakala na hindi Apache webserver.",
+ "CannotFindGeoIPServerVar": "Ang %s variable ay hindi naka-set. Ang iyong server ay maaaring hindi naka-configure nang tama.",
+ "CannotListContent": "Hindi ma-ilista ang nilalaman para sa %1$s: %2$s.",
+ "DownloadingDb": "Downloading %s",
+ "DownloadNewDatabasesEvery": "I-update ang mga bawat database",
+ "FoundApacheModules": "Matomo nahanap ang mga sumusunod na Apache modules.",
+ "GeoIPImplHasAccessTo": "Ang pagpapatupad ng GeoIP na ito ay may access sa mga sumusunod na uri ng database",
+ "GeoIPDatabases": "GeoIP ng mga Database",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Tandaan: IP anonymization ay walang epekto sa mga lokasyon na inulat ng provider na ito. Bago ito gamitin na may IP anonymization siguraduhin na ito ay hindi lumalabag sa mga batas ng privacy na maaring sumailalim sa.",
+ "GeoIPLocationProviderNotRecommended": "Gumagana ang Geolocation ngunit hindi ka gumagamit ng isa sa mga inirerekomendang provider.",
+ "GeoIPNoServerVars": "Hindi mahanap ng Matomo ang kahit na anong %s variable ng GeoIP.",
+ "GeoIPServerVarsFound": "Nakita ng Matomo ang mga sumusunod na %s variable ng GeoIP",
+ "HowToSetupGeoIPIntro": "Ikaw ay may hindi wastong Geolocation setup. Ang feature na ito ay malaking tulong at kung wala nito hindi mo makikita ang tumpak na at kumpletong impormasyon ng lokasyon para sa iyong mga bisita. Narito kung paano mo agad masisimulan ang paggamit nito:",
+ "HowToInstallApacheModule": "Paano ko ii-install ang GeoIP module para sa Apache?",
+ "HowToInstallNginxModule": "Paano ko ii-install ang GeoIP module para sa Nginx?",
+ "HttpServerModule": "HTTP Module Server",
+ "InvalidGeoIPUpdatePeriod": "Di-wastong panahon para sa GeoIP update: %1$s. Ang wastong value ay %2$s.",
+ "ISPDatabase": "ISP Database",
+ "LocationDatabase": "Lokasyon ng database",
+ "LocationDatabaseHint": "Ang database ng lokasyon ay alinman sa isang bansa rehiyon o database ng lungsod.",
+ "UnsupportedArchiveType": "Nakatagpo ng hindi suportadong klase ng archive %1$s",
+ "UpdaterHasNotBeenRun": "Ang updater ay hindi pa napapatatakbo.",
+ "UpdaterIsNotScheduledToRun": "Ito ay hindi nakaiskedyul na tumakbo sa hinaharap.",
+ "UpdaterScheduledForNextRun": "Ito ay naka-iskedyul na tumakbo sa loob ng susunod na cron core: i-archive ang execution ng command.",
+ "UpdaterWasLastRun": "Ang updater ay huling na i-run ng %s.",
+ "UpdaterWillRunNext": "Ito ang susunod na naka-schedule upang tumakbo ng %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/tr.json b/plugins/GeoIp2/lang/tr.json
index f26445b83f..3064c87db1 100644
--- a/plugins/GeoIp2/lang/tr.json
+++ b/plugins/GeoIp2/lang/tr.json
@@ -1,15 +1,57 @@
{
"GeoIp2": {
+ "AssumingNonApache": "apache_get_modules işlevi bulunamadığı için web sunucusunun Apache olmadığı varsayılıyor.",
"CannotFindGeoIPDatabaseInArchive": "%1$s tar arşivi dosyasında geçerli bir DB-IP \/ GeoIP veritabanı bulunamadı!",
+ "CannotFindGeoIPServerVar": "%s değişkeni ayarlanmamış. Sunucunuz doğru yapılandırılmamış olabilir.",
+ "CannotListContent": "%1$s: %2$s içeriği listelenemedi",
+ "CannotSetupGeoIPAutoUpdating": "Coğrafi konum veritabanlarını Matomo dışında bir konumda bulunduruyorsunuz gibi görünüyor (bunu misc alt klasöründe herhangi bir veritabanı bulunmadığı halde coğrafi konum özelliğinin çalışıyor olduğuna bakarak söyleyebiliyoruz). Matomo, misc klasörünün dışında bulunan coğrafi konum veritabanlarını güncelleyemez.",
"CannotUnzipGeoIPFile": "%1$s içindeki GeoIP arşivi dosyası ayıklanamadı: %2$s",
+ "DownloadingDb": "İndiriliyor %s",
+ "DownloadNewDatabasesEvery": "Veritabanı güncelleme sıklığı",
+ "FatalErrorDuringDownload": "Coğrafi konum veritabanı indirilirken dosya ya da Matomo ile ilgili bir sorun çıktı. İnternet bağlantınız sağlıklı çalışmıyor olabilir. El ile indirip kurmayı deneyin.",
+ "FoundApacheModules": "Matomo şu Apache modüllerini buldu.",
+ "GeoIPImplHasAccessTo": "GeoIP uygulaması şu türdeki veritabanlarına erişebilir",
+ "GeoIPDatabases": "GeoIP Veritabanları",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Not: IP adresini anonim kılmanın bu hizmet sağlayıcı tarafından bildirilen konumlar üzerinde bir etkisi yoktur. IP adresini anonim kılmadan önce bu durumun uymak zorunda olduğunuz kişisel veri güvenliği yasalarına aykırı olmadığından emin olun.",
+ "GeoIPLocationProviderNotRecommended": "Coğrafi konum bulma çalışıyor ancak önerilen hizmet sağlayıcılardan birini kullanmıyorsunuz.",
+ "GeoIPNoDatabaseFound": "Bu GeoIP uygulaması herhangi bir veritabanı bulamadı.",
+ "GeoIPNoServerVars": "Matomo herhangi bir GeoIP %s değişkeni bulamadı.",
+ "GeoIPServerVarsFound": "Matomo şu GeoIP %s değişkenlerini algılar",
+ "GeoIPUpdaterInstructions": "Aşağıya veritabanlarınızın indirme bağlantılarını yazın. %3$sDB-IP%4$s ya da %1$sMaxMind%2$s veritabanlarını satın aldıysanız bu bağlantıları DB-IP ya da MaxMind hesabınızın altında bulabilirsiniz. Erişim sorunu yaşıyorsanız coğrafi konum veritabanı hizmeti sağlayıcınız ile görüşün.",
+ "GeoIPUpdaterIntro": "Matomo şu anda şu coğrafi konum veritabanlarının güncellemelerini alıyor",
+ "GeoIPVariablesConfigurationHere": "Kullanılan sunucu değişkenleri %1$sburadan%2$s yapılandırılabilir.",
+ "GeoLiteCityLink": "DB-IP City Lite veritabanını kullanıyorsanız şu bağlantıyı kullanın: %1$s%2$s%3$s",
+ "HowToSetupGeoIP": "DB-IP ile doğru konum bulma ayarları nasıl yapılır?",
+ "HowToSetupGeoIP_Step1": "%3$sDB-IP%4$s üzerinden DB-IP City Lite veritabanını %1$sİndirin%2$s.",
+ "HowToSetupGeoIP_Step2": "Bu dosyayı ayıklayın ve çıkanları Matomo %2$smisc%3$s klasörü %1$s içine kopyalayıp adını %4$s olarak değiştirin (bunu FTP ya da SSH ile yapabilirsiniz).",
+ "HowToSetupGeoIP_Step3": "Bu sayfayı yeniden yükleyin. Şimdi %1$sDB-IP \/ GeoIP (PHP)%2$s hizmet sağlayıcısı %3$skurulacak%4$s. Onu seçin.",
+ "HowToSetupGeoIP_Step4": "İşlem tamam! Matomo için DB-IP uygulamasını ayarladınız. Böylece ziyaretçilerinizin geldiği ülkeleri büyük doğrulukla belirlerken bunun yanında bölge ve il bilgilerini de görebileceksiniz.",
+ "HowToSetupGeoIPIntro": "Coğrafi konum bulma ayarlarınızın doğruluğu yeterli değil gibi görünüyor. Bu özellik oldukça kullanışlıdır ve düzgün çalışmadığında ziyaretçileriniz hakkında tam ve doğru konum bilgisi alamazsınız. Hızlıca kullanmaya başlamak için gerekli bilgileri şurada bulabilirsiniz:",
+ "HowToInstallApacheModule": "Apache için GeoIP modülü nasıl kurulur?",
+ "HowToInstallNginxModule": "Nginx için GeoIP modülü nasıl kurulur?",
+ "HttpServerModule": "HTTP Sunucu Modülü",
+ "InvalidGeoIPUpdatePeriod": "GeoIP güncelleme sıklığı geçersiz: %1$s. Geçerli değerler şunlardır: %2$s.",
+ "IPurchasedGeoIPDBs": "Daha doğru %3$sDB-IP%4$s ya da %1$sMaxMind%2$s veritabanları satın aldım ve otomatik güncellemeleri kurmak istiyorum.",
+ "ISPDatabase": "ISP Veritabanı",
+ "IWantToDownloadFreeGeoIP": "Ücretsiz DB-IP veritabanını indirmek istiyorum...",
"PluginDescription": "DB-IP \/ GeoIP2 konum hizmeti sağlayıcılarını sunar.",
+ "LocationDatabase": "Konum Veritabanı",
+ "LocationDatabaseHint": "Bir ülke, bölge ya da il konumları veritabanı.",
"LocationProviderDesc_Php": "Bu konum hizmeti sağlayıcı en basit kurulanıdır ve sunucu yapılandırmasına gerek duymaz (paylaşılan barındırma hizmetleri için idealdir). DB-IP ya da GeoIP 2 veritabanını ve MaxMind PHP API uygulamasını kullanarak ziyaretçilerinizin konumunu doğru olarak belirler.",
"LocationProviderDesc_Php_WithExtension": "Bu konum hizmeti sağlayıcısı %1$smaxminddb%2$s eklentisi kurularak hızlandırılmıştır.",
"LocationProviderDesc_ServerModule": "Bu konum hizmeti sağlayıcısı HTTP sunucunuz üzerine kurulmuş GeoIP 2 modülünü kullanır. Bu hizmet sağlayıcı hızlı ve doğrudur ancak %1$syalnız normal web tarayıcı izlemesi ile kullanılabilir%2$s.",
"LocationProviderDesc_ServerModule2": "Günlük dosyalarını içe aktarmak ya da IP adresinin ayarlanmasını gerektiren başka bir işlem yapmak zorundaysanız, %3$sPHP GeoIp 2 uygulamasını%4$s kullanarak %1$smaxminddb eklentisini%2$s kurun.",
- "ServerBasedVariablesConfiguration": "GeoIP 2 sunucu modülleri tarafından kullanılan sunucu değişkeni yapılandırması",
- "GeoIPVariablesConfigurationHere": "Kullanılan sunucu değişkenleri %1$sburadan%2$s yapılandırılabilir.",
+ "NotManagingGeoIPDBs": "Matomo şu anda herhangi bir DB-IP ya da Maxmind veritabanını yönetmiyor.",
+ "UnsupportedArchiveType": "Desteklenmeyen %1$s arşiv türü bulundu.",
+ "UpdaterHasNotBeenRun": "Güncelleyici henüz hiç çalışmamış.",
+ "UpdaterIsNotScheduledToRun": "Gelecekte çalışmak üzere ayarlanmamış.",
+ "UpdaterScheduledForNextRun": "core:archive komutunun yürütüleceği zamanlanmış görevin bir sonraki çalışmasında güncellenecek.",
+ "UpdaterWasLastRun": "Güncelleyici en son %s zamanında çalışmış.",
+ "UpdaterWillRunNext": "Zamanlanmış görev %s zamanında çalışacak.",
"ShowCustomServerVariablesConfig": "GeoIP 2 sunucu modülünü (Nginx, Apache...) kullanacağım ve sunucu ayarlarını yapılandırmak istiyorum",
- "ServerVariableFor": "%s için sunucu değişkeni"
+ "ServerBasedVariablesConfiguration": "GeoIP 2 sunucu modülleri tarafından kullanılan sunucu değişkeni yapılandırması",
+ "ServerVariableFor": "%s için sunucu değişkeni",
+ "SetupAutomaticUpdatesOfGeoIP": "Otomatik coğrafi konum veritabanı güncellemesini kurun",
+ "ThisUrlIsNotAValidGeoIPDB": "İndirilen dosya geçerli bir coğrafi konum veritabanı değil. Lütfen adresi yeniden denetleyin ya da dosyayı el ile indirin."
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/uk.json b/plugins/GeoIp2/lang/uk.json
new file mode 100644
index 0000000000..81cd0351b9
--- /dev/null
+++ b/plugins/GeoIp2/lang/uk.json
@@ -0,0 +1,30 @@
+{
+ "GeoIp2": {
+ "AssumingNonApache": "Не вдається знайти apache_get_modules функцію, мабуть цей веб-сервер це не на Apache.",
+ "CannotFindGeoIPServerVar": "Змінна %s не встановлена. Ваш сервер не може бути налаштований правильно.",
+ "CannotListContent": "Не вдалося перерахувати вміст %1$s: %2$s",
+ "DownloadingDb": "Завантаження %s",
+ "DownloadNewDatabasesEvery": "Оновлювати базу раз в",
+ "FoundApacheModules": "Matomo знайшов наступні модулі Apache",
+ "GeoIPImplHasAccessTo": "Цей варіант реалізації GeoIP має доступ до таких баз даних",
+ "GeoIPDatabases": "Бази даних GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Підказка: анонімізація IP не впливає на ефект на отримання локації користувачів таким способом. Перед тим, як використовувати його з анонімізацією IP, переконайтеся, що це не суперечить законодавству вашої країни.",
+ "GeoIPLocationProviderNotRecommended": "Геолокація працює, але ви не використовуєте один з рекомендованих провайдерів.",
+ "GeoIPNoServerVars": "Matomo не може знайти GeoIP %s змінні.",
+ "GeoIPServerVarsFound": "Matomo знайшов наступні змінні GeoIP: %s",
+ "HowToSetupGeoIPIntro": "Здається, що у вас не налаштоване визначено локації відвідувачів з допомогою GeoIP. Це корисна \"штука\" - без неї ви не зможете досить точно визначати місцезнаходження відвідувачів. І ось як ви можете швидко налаштувати все:",
+ "HowToInstallApacheModule": "Як встановити GeoIP модуль для Apache?",
+ "HowToInstallNginxModule": "Як встановити GeoIP модуль для Nginx?",
+ "HttpServerModule": "HTTP Серверний модуль",
+ "InvalidGeoIPUpdatePeriod": "Невірний період для GeoIP оновлення: %1$s. Допустимі значення: %2$s.",
+ "ISPDatabase": "База провайдерів",
+ "LocationDatabase": "Розташування бази даних",
+ "LocationDatabaseHint": "Розташування бази даних країни, регіону або міста.",
+ "UnsupportedArchiveType": "Зустрівся непідтримуваний тип архіву %1$s.",
+ "UpdaterHasNotBeenRun": "Оновлення ніколи не проводилися.",
+ "UpdaterIsNotScheduledToRun": "Це не заплановано до запуску в майбутньому.",
+ "UpdaterScheduledForNextRun": "Це запланований запуск команди core:archive при наступному виконанні cron-завдання.",
+ "UpdaterWasLastRun": "Оновлення останнього запуску в %s.",
+ "UpdaterWillRunNext": "Заплановано наступний запуск на %s."
+ }
+} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/vi.json b/plugins/GeoIp2/lang/vi.json
index 7369bdcc77..3e1eb5958e 100644
--- a/plugins/GeoIp2/lang/vi.json
+++ b/plugins/GeoIp2/lang/vi.json
@@ -1,5 +1,27 @@
{
"GeoIp2": {
- "CannotUnzipGeoIPFile": "Không thể giải nén tệp GeoIP trong %1$s: %2$s"
+ "AssumingNonApache": "Không thể tìm thấy hàm apache_get_modules, giả sử không có máy chủ web Apache.",
+ "CannotFindGeoIPServerVar": "Biến %s không được thiết lập. Máy chủ của bạn có thể không được cấu hình đúng.",
+ "CannotListContent": "Không thể liệt kê nội dung cho %1$s: %2$s",
+ "CannotUnzipGeoIPFile": "Không thể giải nén tệp GeoIP trong %1$s: %2$s",
+ "DownloadingDb": "Đang tải xuống %s",
+ "DownloadNewDatabasesEvery": "Cập nhật tất cả các cơ sở dữ liệu",
+ "FoundApacheModules": "Matomo tìm thấy các mô-đun Apache sau",
+ "GeoIPImplHasAccessTo": "GeoIP thực thi này có quyền truy cập vào các kiểu cơ sở dữ liệu sau",
+ "GeoIPDatabases": "Cơ sở dữ liệu GeoIP",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "Lưu ý: IP anonymization không ảnh hưởng đến các vị trí được báo cáo bởi nhà cung cấp này. Trước khi sử dụng nó với IP anonymization, đảm bảo điều này không vi phạm bất kỳ luật riêng tư nào bạn có thể bị phạt.",
+ "GeoIPNoServerVars": "Matomo không thể tìm thấy bất kỳ biến %s Geoip nào.",
+ "GeoIPServerVarsFound": "Matomo phát hiện các biến %s Geoip sau đây",
+ "HowToSetupGeoIPIntro": "Bạn không hiển thị để có cài đặt định vị chính xác. Đây là một tính năng hữu ích và không có nó, bạn sẽ không nhìn thấy thông tin vị trí chính xác và đầy đủ cho khách truy cập. Đây là cách bạn có thể nhanh chóng bắt đầu sử dụng nó:",
+ "HowToInstallApacheModule": "Làm thế nào để cài đặt các module Geoip cho Apache?",
+ "HowToInstallNginxModule": "Làm thế nào để cài đặt module GeoIP cho Nginx?",
+ "HttpServerModule": "Module máy chủ HTTP",
+ "InvalidGeoIPUpdatePeriod": "Thời gian cho GeoIP cập nhật không hợp lệ: %1$s. Giá trị hợp lệ là %2$s.",
+ "ISPDatabase": "Cơ sở dữ liệu ISP",
+ "LocationDatabase": "Cơ sở dữ liệu vị trí",
+ "LocationDatabaseHint": "Một cơ sở dữ liệu vị trí là một quốc gia, khu vực hoặc cơ sở dữ liệu thành phố.",
+ "UnsupportedArchiveType": "Bắt gặp kiêu lưu trữ %1$s không được hỗ trợ",
+ "UpdaterHasNotBeenRun": "Các cập nhật chưa bao giờ được chạy.",
+ "UpdaterWasLastRun": "Các cập nhật chạy sau cùng trên %s."
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/zh-cn.json b/plugins/GeoIp2/lang/zh-cn.json
index 429d04c6a4..ef93509b02 100644
--- a/plugins/GeoIp2/lang/zh-cn.json
+++ b/plugins/GeoIp2/lang/zh-cn.json
@@ -1,12 +1,57 @@
{
"GeoIp2": {
+ "AssumingNonApache": "没有找到apache_get_modules函数,可能没有apache网络服务器。",
+ "CannotFindGeoIPDatabaseInArchive": "在tar归档文件%1$s中找不到有效的DBIP\/GeoIP数据库!",
+ "CannotFindGeoIPServerVar": "变量 %s 没有设置,您的服务器配置不正确。",
+ "CannotListContent": "无法列出 %1$s: %2$s 的内容",
+ "CannotSetupGeoIPAutoUpdating": "似乎您正在将地理位置数据库存储在Matomo之外(可以知道,因为misc子目录中没有数据库,但是您的GeoIP可以正常工作)。 如果您的地理位置数据库位于misc目录之外,则Matomo无法自动更新它们。",
"CannotUnzipGeoIPFile": "无法在%1$s中解压缩GeoIP 文件:%2$s",
+ "DownloadingDb": "下载%s",
+ "DownloadNewDatabasesEvery": "更新数据每",
+ "FatalErrorDuringDownload": "下载此文件时发生致命错误。 您下载的地理位置数据库或Matomo的互联网连接可能存在问题。 尝试手动下载并安装。",
+ "FoundApacheModules": "Matomo找到了如下Apache模块",
+ "GeoIPImplHasAccessTo": "这个 GeoIP 方案可以读取以下类型的数据库",
+ "GeoIPDatabases": "GeoIP 数据库",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "提示:IP 屏蔽对这个服务商的报表无效。在使用它和 IP 屏蔽前,请确认这不违反您当地的隐私保护法规。",
+ "GeoIPLocationProviderNotRecommended": "地理位置的工作,但你不使用推荐的供应商之一。",
+ "GeoIPNoDatabaseFound": "此GeoIP实现无法找到任何数据库。",
+ "GeoIPNoServerVars": "Matomo 没有找到 GeoIP %s 变量。",
+ "GeoIPServerVarsFound": "Matomo 检测到以下 GeoIP %s 变量",
+ "GeoIPUpdaterInstructions": "在下面输入数据库的下载链接。 如果您是从%3$s dbip %4$s或%1$s MaxMind %2$s购买数据库的,则可以在dbip或MaxMind帐户中找到这些链接。 如果您在访问地理数据库时遇到问题,请与您联系。",
+ "GeoIPUpdaterIntro": "Matomo当前正在管理以下数据库的更新",
+ "GeoIPVariablesConfigurationHere": "您可以在此处%2$s配置使用的服务器变量%1$s。",
+ "GeoLiteCityLink": "如果您使用的是dbip city lite数据库,请使用以下链接:%1$s%2$s%3$s",
+ "HowToSetupGeoIP": "如何使用dbip设置准确的地理位置",
+ "HowToSetupGeoIP_Step1": "%1$s从%3$s dbip %4$s下载%2$s DBIP City Lite数据库。",
+ "HowToSetupGeoIP_Step2": "解压缩此文件并将结果%1$s复制到%2$s misc %3$sMatomo子目录中,并将其重命名为%4$s(您可以通过FTP或SSH进行此操作)。",
+ "HowToSetupGeoIP_Step3": "重新加载此屏幕。 现在将为%1$s DBIP \/ GeoIP(PHP)%2$s提供程序提供%3$s已安装%4$s。选择它。",
+ "HowToSetupGeoIP_Step4": "大功告成! 您只需将Matomo设置为使用DBIP,这意味着您将能够查看访客的地区和城市以及非常准确的国家\/地区信息。",
+ "HowToSetupGeoIPIntro": "您的地理位置设置不正确,这个功能很有用,否则您无法查看访客的精确和完整的位置信息。如何快速开始使用:",
+ "HowToInstallApacheModule": "我如何在Apache中安装GoeIP模块?",
+ "HowToInstallNginxModule": "我如何在Nginx下安装GeoIP模块?",
+ "HttpServerModule": "HTTP 服务器模块",
+ "InvalidGeoIPUpdatePeriod": "GeoIP 更新时间段不正确: %1$s. 正确的值为 %2$s。",
+ "IPurchasedGeoIPDBs": "我从%3$s dbip %4$s或%1$s MaxMind %2$s购买了更准确的数据库,并希望设置自动更新。",
+ "ISPDatabase": "ISP 数据库",
+ "IWantToDownloadFreeGeoIP": "我想下载免费的DBIP数据库...",
+ "PluginDescription": "提供DBIP \/ GeoIP2位置提供程序。",
+ "LocationDatabase": "位置信息数据库",
+ "LocationDatabaseHint": "地理位置数据库可以是国家、地区或者城市数据库。",
+ "LocationProviderDesc_Php": "此位置提供程序是最简单的安装,因为它不需要服务器配置(共享主机的理想选择!)。 它使用DBIP或GeoIP 2数据库以及MaxMind的PHP API来准确确定访问者的位置。",
"LocationProviderDesc_Php_WithExtension": "安装的%1$sMaxMindDB%2$s扩展加快了此位置提供程序的速度。",
"LocationProviderDesc_ServerModule": "该位置提供者使用HTTP服务器中已安装的GeoIP 2模块。 此提供程序快速准确,但是%1$s只能与正常的浏览器跟踪一起使用。%2$s",
"LocationProviderDesc_ServerModule2": "如果您必须导入日志文件或执行其他需要设置IP地址的操作,请使用%3$sPHP GeoIP 2实现%4$s并安装%1$smaxminddb extension%2$s。",
- "ServerBasedVariablesConfiguration": "配置GeoIP 2服务器模块使用的服务器变量",
- "GeoIPVariablesConfigurationHere": "您可以在此处%2$s配置使用的服务器变量%1$s。",
+ "NotManagingGeoIPDBs": "Matomo当前不管理任何DBIP或MaxMind数据库。",
+ "UnsupportedArchiveType": "不支持的归档类型 %1$s。",
+ "UpdaterHasNotBeenRun": "更新程序从未运行。",
+ "UpdaterIsNotScheduledToRun": "它不计划在将来运行。",
+ "UpdaterScheduledForNextRun": "计划在未来的cron core运行:归档命令执行。",
+ "UpdaterWasLastRun": "更新程序最后运行时间 %s。",
+ "UpdaterWillRunNext": "这是下一个计划在 %s 运行。",
"ShowCustomServerVariablesConfig": "我使用Geoip2服务器模块(Nginx,Apache ...),并希望配置服务器变量",
- "ServerVariableFor": "服务器变量为%s"
+ "ServerBasedVariablesConfiguration": "配置GeoIP 2服务器模块使用的服务器变量",
+ "ServerVariableFor": "服务器变量为%s",
+ "SetupAutomaticUpdatesOfGeoIP": "设置地理位置数据库的自动更新",
+ "ThisUrlIsNotAValidGeoIPDB": "下载的文件不是有效的地理位置数据库。 请重新检查URL或手动下载文件。"
}
} \ No newline at end of file
diff --git a/plugins/GeoIp2/lang/zh-tw.json b/plugins/GeoIp2/lang/zh-tw.json
index 95726494cf..4441d3fe73 100644
--- a/plugins/GeoIp2/lang/zh-tw.json
+++ b/plugins/GeoIp2/lang/zh-tw.json
@@ -1,11 +1,38 @@
{
"GeoIp2": {
+ "AssumingNonApache": "找不到 apache_get_modules 功能,推測是非 Apache 伺服器。",
+ "CannotFindGeoIPServerVar": "變數 %s 未設定。你的伺服器可能沒有正確的變更設定。",
+ "CannotListContent": "無法列出 %1$s 的內容列表:%2$s",
"CannotUnzipGeoIPFile": "無法解壓縮 %1$s 中的 GeoIP 檔案:%2$s",
+ "DownloadingDb": "正在下載 %s",
+ "DownloadNewDatabasesEvery": "更新資料庫每隔一",
+ "FoundApacheModules": "Matomo 找到下列 Apache 模組",
+ "GeoIPImplHasAccessTo": "這個 GeoIP 執行時會存取以下類型的資料庫",
+ "GeoIPDatabases": "GeoIP 資料庫",
+ "GeoIPLocationProviderDesc_ServerBasedAnonWarn": "注意:IP 匿名化在此供應商所提供的位置中沒有任何效果。在 IP 匿名化開啟時,請先確定這並不違反法律政策。",
+ "GeoIPLocationProviderNotRecommended": "地理位置已執行,但你不是使用推薦的供應商。",
+ "GeoIPNoDatabaseFound": "這個 GeoIP 執行時無法找到任何資料庫。",
+ "GeoIPNoServerVars": "Matomo 找不到任何 GeoIP 的 %s 變數。",
+ "GeoIPServerVarsFound": "Matomo 偵測到下列 GeoIP 的 %s 變數",
+ "GeoIPVariablesConfigurationHere": "你可以在%1$s這裡%2$s設置已使用的伺服器變數。",
+ "HowToSetupGeoIPIntro": "看起來你沒有設定準確的地理位置。這是個實用的功能,沒有它你將無法看到準確且完整的訪客資訊。這裡是幾個你可以快速開始使用的方法:",
+ "HowToInstallApacheModule": "我該如何在 Apache 上安裝 GeoIP 模組?",
+ "HowToInstallNginxModule": "我該如何在 Nginx 上安裝 GeoIP 模組?",
+ "HttpServerModule": "HTTP 伺服器模組",
+ "InvalidGeoIPUpdatePeriod": "無效的 GeoIP 更新期間:%1$s。有效值為 %2$s。",
+ "ISPDatabase": "網路服務供應商(ISP)資料庫",
+ "LocationDatabase": "地理位置資料庫",
+ "LocationDatabaseHint": "地理位置資料庫可能是國家、地區或城市資料庫。",
"LocationProviderDesc_Php_WithExtension": "這個地理位置供應商已透過安裝的 %1$smaxminddb%2$s 擴充功能加速。",
"LocationProviderDesc_ServerModule": "這個地理位置供應商使用安裝在你 HTTP 伺服器上的 GeoIP 2 模組。這個供應商快又精準,但是%1$s只適用於一般瀏覽器上的追蹤%2$s。",
"LocationProviderDesc_ServerModule2": "如果你需要匯入紀錄檔或是其他需要設定 IP 位址的事情,使用 %3$sPHP GeoIP 2 implementation%4$s 並安裝 %1$smaxminddb 擴充功能%2$s。",
+ "UnsupportedArchiveType": "遇到不支援的壓縮檔類型 %1$s。",
+ "UpdaterHasNotBeenRun": "還沒有自動更新過。",
+ "UpdaterIsNotScheduledToRun": "未來沒有排程執行。",
+ "UpdaterScheduledForNextRun": "已排程在下次 core:archive 指令執行時執行。",
+ "UpdaterWasLastRun": "上次自動更新執行於 %s。",
+ "UpdaterWillRunNext": "下次自動更新將於 %s 執行。",
"ServerBasedVariablesConfiguration": "GeoIP 2 伺服器模組所使用的伺服器變數設定檔",
- "GeoIPVariablesConfigurationHere": "你可以在%1$s這裡%2$s設置已使用的伺服器變數。",
"ServerVariableFor": "%s 的伺服器變數"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/templates/_updaterManage.twig b/plugins/GeoIp2/templates/_updaterManage.twig
index e624a97d9a..f110de26da 100644
--- a/plugins/UserCountry/templates/_updaterManage.twig
+++ b/plugins/GeoIp2/templates/_updaterManage.twig
@@ -1,53 +1,44 @@
<div ng-show="locationUpdater.geoipDatabaseInstalled" id="geoipdb-update-info">
<p>
- {{ 'UserCountry_GeoIPUpdaterInstructions'|translate('<a href="http://www.maxmind.com/?rId=piwik">','</a>','<a rel="noreferrer noopener" href="https://db-ip.com/?refid=mtm">','</a>')|raw }}
+ {{ 'GeoIp2_GeoIPUpdaterInstructions'|translate('<a href="http://www.maxmind.com/?rId=piwik">','</a>','<a rel="noreferrer noopener" href="https://db-ip.com/?refid=mtm">','</a>')|raw }}
<br/><br/>
- {% if dbipLiteUrl|default is not empty %}{{ 'UserCountry_GeoLiteCityLink'|translate('<a rel="noreferrer noopener" href="'~dbipLiteUrl|e('html_attr')~'">',dbipLiteUrl|e('html'),'</a>')|raw }}{% endif %}
+ {% if dbipLiteUrl|default is not empty %}{{ 'GeoIp2_GeoLiteCityLink'|translate('<a rel="noreferrer noopener" href="'~dbipLiteUrl|e('html_attr')~'">',dbipLiteUrl|e('html'),'</a>')|raw }}{% endif %}
<span ng-show="locationUpdater.geoipDatabaseInstalled">
- <br/><br/>{{ 'UserCountry_GeoIPUpdaterIntro'|translate }}:
+ <br/><br/>{{ 'GeoIp2_GeoIPUpdaterIntro'|translate }}:
</span>
</p>
<div piwik-field uicontrol="text" name="geoip-location-db"
ng-model="locationUpdater.locationDbUrl"
- introduction="{{ 'UserCountry_LocationDatabase'|translate|e('html_attr') }}"
+ introduction="{{ 'GeoIp2_LocationDatabase'|translate|e('html_attr') }}"
data-title="{{ 'Actions_ColumnDownloadURL'|translate|e('html_attr') }}"
value="{{ geoIPLocUrl }}"
- inline-help="{{ 'UserCountry_LocationDatabaseHint'|translate|e('html_attr') }}">
+ inline-help="{{ 'GeoIp2_LocationDatabaseHint'|translate|e('html_attr') }}">
</div>
<div piwik-field uicontrol="text" name="geoip-isp-db"
ng-model="locationUpdater.ispDbUrl"
- introduction="{{ 'UserCountry_ISPDatabase'|translate|e('html_attr') }}"
+ introduction="{{ 'GeoIp2_ISPDatabase'|translate|e('html_attr') }}"
data-title="{{ 'Actions_ColumnDownloadURL'|translate|e('html_attr') }}"
value="{{ geoIPIspUrl }}">
</div>
- {% if geoIPOrgUrl is defined %}
- <div piwik-field uicontrol="text" name="geoip-org-db"
- ng-model="locationUpdater.orgDbUrl"
- introduction="{{ 'UserCountry_OrgDatabase'|translate|e('html_attr') }}"
- data-title="{{ 'Actions_ColumnDownloadURL'|translate|e('html_attr') }}"
- value="{{ geoIPOrgUrl }}">
- </div>
- {% endif %}
-
<div id="locationProviderUpdatePeriodInlineHelp" class="inline-help-node">
{% if lastTimeUpdaterRun is defined and lastTimeUpdaterRun is not empty %}
- {{ 'UserCountry_UpdaterWasLastRun'|translate(lastTimeUpdaterRun)|raw }}
+ {{ 'GeoIp2_UpdaterWasLastRun'|translate(lastTimeUpdaterRun)|raw }}
{% else %}
- {{ 'UserCountry_UpdaterHasNotBeenRun'|translate }}
+ {{ 'GeoIp2_UpdaterHasNotBeenRun'|translate }}
{% endif %}
<br/><br/>
<div id="geoip-updater-next-run-time">
- {% include "@UserCountry/_updaterNextRunTime.twig" %}
+ {% include "@GeoIp2/_updaterNextRunTime.twig" %}
</div>
</div>
<div piwik-field uicontrol="radio" name="geoip-update-period"
ng-model="locationUpdater.updatePeriod"
- introduction="{{ 'UserCountry_DownloadNewDatabasesEvery'|translate|e('html_attr') }}"
+ introduction="{{ 'GeoIp2_DownloadNewDatabasesEvery'|translate|e('html_attr') }}"
value="{{ geoIPUpdatePeriod }}"
options="{{ updatePeriodOptions|json_encode }}"
inline-help="#locationProviderUpdatePeriodInlineHelp">
diff --git a/plugins/GeoIp2/templates/_updaterNextRunTime.twig b/plugins/GeoIp2/templates/_updaterNextRunTime.twig
new file mode 100644
index 0000000000..ab5b273be6
--- /dev/null
+++ b/plugins/GeoIp2/templates/_updaterNextRunTime.twig
@@ -0,0 +1,9 @@
+{% if nextRunTime|default is not empty %}
+ {% if date(nextRunTime.getTimestamp()) <= date() %}
+ {{ 'GeoIp2_UpdaterScheduledForNextRun'|translate }}
+ {% else %}
+ {{ 'GeoIp2_UpdaterWillRunNext'|translate('<strong>' ~ nextRunTime.toString() ~ '</strong>')|raw }}
+ {% endif %}
+{% else %}
+ {{ 'GeoIp2_UpdaterIsNotScheduledToRun'|translate }}
+{% endif %} \ No newline at end of file
diff --git a/plugins/GeoIp2/templates/configuration.twig b/plugins/GeoIp2/templates/configuration.twig
new file mode 100644
index 0000000000..729e0f112d
--- /dev/null
+++ b/plugins/GeoIp2/templates/configuration.twig
@@ -0,0 +1,48 @@
+<div piwik-content-block
+ content-title="{% if not geoIPDatabasesInstalled %}{{ 'GeoIp2_GeoIPDatabases'|translate|e('html_attr') }}{% else %}{{ 'GeoIp2_SetupAutomaticUpdatesOfGeoIP'|translate|e('html_attr') }}{% endif %}"
+ id="geoip-db-mangement">
+
+ <div piwik-geoip2-updater
+ geoip-database-installed="{% if geoIPDatabasesInstalled %}1{% else %}0{% endif %}">
+
+ {% if showGeoIPUpdateSection %}
+ {% if not geoIPDatabasesInstalled %}
+ <div ng-show="!locationUpdater.geoipDatabaseInstalled">
+ <div ng-show="locationUpdater.showPiwikNotManagingInfo">
+ <h3>{{ 'GeoIp2_NotManagingGeoIPDBs'|translate|e('html_attr') }}</h3>
+ <div id="manage-geoip-dbs">
+ <div class="row" id="geoipdb-screen1">
+ <div class="geoipdb-column-1 col s6">
+ <p>{{ 'GeoIp2_IWantToDownloadFreeGeoIP'|translate|raw }}</p>
+ </div>
+ <div class="geoipdb-column-2 col s6">
+ <p>{{ 'GeoIp2_IPurchasedGeoIPDBs'|translate('<a rel="noreferrer noopener" href="http://www.maxmind.com/en/geolocation_landing?rId=piwik">','</a>','<a rel="noreferrer noopener" href="https://db-ip.com/db/?refid=mtm">','</a>')|raw }}</p>
+ </div>
+ <div class="geoipdb-column-1 col s6">
+ <input type="button" class="btn"
+ ng-click="locationUpdater.startDownloadFreeGeoIp()"
+ value="{{ 'General_GetStarted'|translate }}..."/>
+ </div>
+ <div class="geoipdb-column-2 col s6">
+ <input type="button" class="btn"
+ ng-click="locationUpdater.startAutomaticUpdateGeoIp()"
+ value="{{ 'General_GetStarted'|translate }}..." id="start-automatic-update-geoip"/>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div id="geoipdb-screen2-download" ng-show="locationUpdater.showFreeDownload">
+ <div piwik-progressbar
+ label="{{ ('GeoIp2_DownloadingDb'|translate('<a href="'~dbipLiteUrl~'">'~dbipLiteFilename~'</a>') ~ '...')|json_encode }}"
+ progress="locationUpdater.progressFreeDownload">
+ </div>
+ </div>
+ </div>
+ {% endif %}
+
+ {% include "@GeoIp2/_updaterManage.twig" %}
+ {% else %}
+ <p class="form-description">{{ 'GeoIp2_CannotSetupGeoIPAutoUpdating'|translate }}</p>
+ {% endif %}
+ </div>
+</div> \ No newline at end of file
diff --git a/plugins/GeoIp2/templates/setupguide.twig b/plugins/GeoIp2/templates/setupguide.twig
new file mode 100644
index 0000000000..737ec17fb1
--- /dev/null
+++ b/plugins/GeoIp2/templates/setupguide.twig
@@ -0,0 +1,9 @@
+<h3 style="margin-top:0;">{{ 'GeoIp2_HowToSetupGeoIP'|translate }}</h3>
+<p>{{ 'GeoIp2_HowToSetupGeoIPIntro'|translate }}</p>
+<ul style="list-style:disc !important;margin-left:2em;">
+ <li style="list-style-type: disc !important;">{{ 'GeoIp2_HowToSetupGeoIP_Step1'|translate('<a rel="noreferrer noopener" href="'~dbipLiteUrl~'">','</a>','<a rel="noreferrer noopener" target="_blank" href="http://db-ip.com/?refid=mtm">','</a>')|raw }}</li>
+ <li style="list-style-type: disc !important;">{{ 'GeoIp2_HowToSetupGeoIP_Step2'|translate("'"~dbipLiteFilename~"'",'<strong>','</strong>','<strong>'~dbipLiteDesiredFilename~'</strong>')|raw }}</li>
+ <li style="list-style-type: disc !important;">{{ 'GeoIp2_HowToSetupGeoIP_Step3'|translate('<strong>','</strong>','<span style="color:green"><strong>','</strong></span>')|raw }}</li>
+ <li style="list-style-type: disc !important;">{{ 'GeoIp2_HowToSetupGeoIP_Step4'|translate }}</li>
+</ul>
+<p>&nbsp;</p> \ No newline at end of file
diff --git a/plugins/GeoIp2/tests/Integration/LocationProviderTest.php b/plugins/GeoIp2/tests/Integration/LocationProviderTest.php
index b1231f1a57..86d9ae5529 100644
--- a/plugins/GeoIp2/tests/Integration/LocationProviderTest.php
+++ b/plugins/GeoIp2/tests/Integration/LocationProviderTest.php
@@ -13,7 +13,7 @@ use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
/**
* @group GeoIp2
*/
-class LocationProviderTest extends \PHPUnit_Framework_TestCase
+class LocationProviderTest extends \PHPUnit\Framework\TestCase
{
public function testGeoIP2City()
{
diff --git a/plugins/GeoIp2/tests/Integration/UpdateTest.php b/plugins/GeoIp2/tests/Integration/UpdateTest.php
index cec89a5526..b92740bd2b 100644
--- a/plugins/GeoIp2/tests/Integration/UpdateTest.php
+++ b/plugins/GeoIp2/tests/Integration/UpdateTest.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\GeoIp2\tests\Integration;
/**
* @group GeoIp2
*/
-class UpdateTest extends \PHPUnit_Framework_TestCase
+class UpdateTest extends \PHPUnit\Framework\TestCase
{
public function testEnsureFileForUpdateIsPresent()
{
diff --git a/plugins/GeoIp2/tests/System/ConvertRegionCodesToIsoTest.php b/plugins/GeoIp2/tests/System/ConvertRegionCodesToIsoTest.php
index 06b0cc1d2f..09f207b4fd 100644
--- a/plugins/GeoIp2/tests/System/ConvertRegionCodesToIsoTest.php
+++ b/plugins/GeoIp2/tests/System/ConvertRegionCodesToIsoTest.php
@@ -14,7 +14,6 @@ use Piwik\Plugins\UserCountry\LocationProvider;
use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Tester\CommandTester;
@@ -31,7 +30,7 @@ class ConvertRegionCodesToIsoTest extends IntegrationTestCase
protected static $idSite;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -82,7 +81,7 @@ class ConvertRegionCodesToIsoTest extends IntegrationTestCase
Fixture::checkResponse($t->doTrackPageView('It\'s pitch black...'));
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
Option::delete(ConvertRegionCodesToIso::OPTION_NAME);
@@ -116,7 +115,7 @@ class ConvertRegionCodesToIsoTest extends IntegrationTestCase
$result = $this->executeCommand();
- $this->assertContains('All region codes converted', $result);
+ self::assertStringContainsString('All region codes converted', $result);
$queryParams = array(
'idSite' => self::$idSite,
@@ -126,7 +125,7 @@ class ConvertRegionCodesToIsoTest extends IntegrationTestCase
);
// we need to manually reload the translations since they get reset for some reason in IntegrationTestCase::tearDown();
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$this->assertApiResponseEqualsExpected("UserCountry.getRegion", $queryParams);
$this->assertApiResponseEqualsExpected("UserCountry.getCountry", $queryParams);
diff --git a/plugins/GeoIp2/tests/Unit/GeoIp2Test.php b/plugins/GeoIp2/tests/Unit/GeoIp2Test.php
new file mode 100644
index 0000000000..d40a3d1e95
--- /dev/null
+++ b/plugins/GeoIp2/tests/Unit/GeoIp2Test.php
@@ -0,0 +1,135 @@
+<?php
+/**
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Plugins\UserCountry\tests\Unit;
+
+use Piwik\Container\StaticContainer;
+use Piwik\Plugins\GeoIp2\GeoIP2AutoUpdater;
+use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
+use Piwik\Plugins\UserCountry\LocationProvider;
+use Exception;
+
+class GeoIp2Test extends \PHPUnit\Framework\TestCase
+{
+ /**
+ * Test that redundant checks work.
+ *
+ * @group Plugins
+ */
+ public function testGeoIpUpdaterRedundantChecks()
+ {
+ LocationProvider::$providers = null;
+
+ // create empty ISP file
+ $this->createEmptyISPFile();
+
+ // run redundant checks
+ $updater = new Piwik_GeoIp2_GeoIP2AutoUpdater_publictest();
+ $updater->performRedundantDbChecks();
+
+ // check that files are renamed correctly
+ $this->checkBrokenGeoIPState();
+
+ // create empty file again & run checks again
+ $this->createEmptyISPFile();
+ $updater->performRedundantDbChecks();
+
+ // check that w/ broken files already there, redundant checks still work correctly
+ $this->checkBrokenGeoIPState();
+ }
+
+ /**
+ * @group Plugins
+ *
+ * @dataProvider getInvalidGeoIpUrlsToTest
+ */
+ public function testGeoIpDownloadInvalidUrl($url)
+ {
+ // unset translations, otherwise Exception message will be translated
+ StaticContainer::get('Piwik\Translation\Translator')->reset();
+
+ $updater = new Piwik_GeoIp2_GeoIP2AutoUpdater_publictest();
+ try {
+ $updater->downloadFile('loc', $url);
+ $this->fail("Downloading invalid url succeeded!");
+ } catch (Exception $ex) {
+ $this->assertEquals("GeoIp2_UnsupportedArchiveType", $ex->getMessage());
+ }
+ }
+
+ public function getInvalidGeoIpUrlsToTest()
+ {
+ return array(array("http://localhost/tests/resources/geoip.tar"),
+ array("http://localhost/tests/resources/geoip.tar.bz2"),
+ array("http://localhost/tests/resources/geoip.dat"));
+ }
+
+ protected $backUpNames;
+
+ public function setUp(): void
+ {
+ $this->backUpNames = GeoIp2::$dbNames;
+
+ GeoIp2::$dbNames = [
+ 'loc' => ['DBIP-City.mmdb'],
+ 'isp' => ['DBIP-ISP.mmdb']
+ ];
+ }
+
+ public function tearDown(): void
+ {
+ GeoIp2::$dbNames = $this->backUpNames;
+
+ $geoIpDirPath = PIWIK_INCLUDE_PATH . '/tests/lib/geoip-files';
+ $filesToRemove = array('DBIP-ISP.mmdb.broken', 'DBIP-ISP.mmdb');
+
+ foreach ($filesToRemove as $name) {
+ $path = $geoIpDirPath . '/' . $name;
+ if (file_exists($path)) {
+ @unlink($path);
+ }
+ }
+ }
+
+ private function createEmptyISPFile()
+ {
+ $geoIpDir = PIWIK_INCLUDE_PATH . '/tests/lib/geoip-files';
+
+ $fd = fopen($geoIpDir . '/DBIP-ISP.mmdb', 'w');
+ fclose($fd);
+ }
+
+ private function checkBrokenGeoIPState()
+ {
+ $geoIpDir = PIWIK_INCLUDE_PATH . '/tests/lib/geoip-files';
+
+ $this->assertFalse(file_exists($geoIpDir . '/DBIP-City.mmdb.broken'));
+
+ $this->assertFalse(file_exists($geoIpDir . '/DBIP-ISP.mmdb'));
+ $this->assertTrue(file_exists($geoIpDir . '/DBIP-ISP.mmdb.broken'));
+ }
+}
+
+class Piwik_GeoIp2_GeoIP2AutoUpdater_publictest extends GeoIP2AutoUpdater
+{
+ public function __construct()
+ {
+ // empty
+ }
+
+ // during tests do not call the Log::error or they will be displayed in the output
+ public function performRedundantDbChecks($logErrors = false)
+ {
+ parent::performRedundantDbChecks($logErrors);
+ }
+
+ public function downloadFile($type, $url)
+ {
+ parent::downloadFile($type, $url);
+ }
+}
diff --git a/plugins/Goals/Goals.php b/plugins/Goals/Goals.php
index dca07c6de6..e4e21f9390 100644
--- a/plugins/Goals/Goals.php
+++ b/plugins/Goals/Goals.php
@@ -280,7 +280,7 @@ class Goals extends \Piwik\Plugin
$reports = new ReportsProvider();
foreach ($reports->getAllReports() as $report) {
- if ($report->hasGoalMetrics()) {
+ if ($report->hasGoalMetrics() && $report->isEnabled()) {
$reportsWithGoals[] = array(
'category' => $report->getCategoryId(),
'name' => $report->getName(),
diff --git a/plugins/Goals/lang/zh-cn.json b/plugins/Goals/lang/zh-cn.json
index 51708f4e83..aa4634b88c 100644
--- a/plugins/Goals/lang/zh-cn.json
+++ b/plugins/Goals/lang/zh-cn.json
@@ -64,6 +64,9 @@
"GoalIsTriggeredWhen": "转化触发条件",
"GoalName": "转化规则名称",
"Goals": "转化与收益分析",
+ "NGoals": "%s目标",
+ "NRevenue": "%s收入",
+ "NItems": "%s项目",
"ManageGoals": "管理目标",
"GoalsOverview": "目标概览",
"GoalsOverviewDocumentation": "这是目标转化概览。图形首先显示所有转化总和。%s 在图形下面可以看到每个目标的转化报表,点击波迷你图可放大。",
@@ -89,20 +92,35 @@
"PluginDescription": "创建转化与收益分析,可让您查看到关于您目标转化率、目标转化收益的报告,您可根据时间、访客特征、关键词等对信息进行更加细致的研判。",
"ProductCategory": "产品类别",
"ProductName": "产品名称",
+ "ProductNames": "产品名称",
+ "ProductPrice": "产品价格",
+ "ProductQuantity": "产品数量",
"Products": "产品",
"ProductSKU": "产品 SKU",
+ "ProductSKUs": "产品SKU",
"ReturningVisitorsConversionRateIs": "老访客转化率为 %s",
"SingleGoalOverviewDocumentation": "这是单个目标转化的概览。%s 点击图形下的迷你图可放大。",
"ThereIsNoGoalToManage": "%s 没有设定目标",
"UpdateGoal": "更新目标",
"URL": "网址",
"ViewAndEditGoals": "查看并编辑目标",
+ "GoalsBy": "目标数%s",
+ "GoalsAdjective": "目标%s",
"VisitPageTitle": "访问一个特定的页面标题",
"VisitsUntilConv": "访问转化",
"VisitUrl": "访问特定网址(页面或页面组)",
+ "VisitDurationMatchAttr": "停留一定时间",
+ "VisitDuration": "访问持续时间为",
"WhenVisitors": "当访客",
"WhereThe": "设置",
"WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "您需要在受访页面或您需要定以触发条件的位置调用名为'trackGoal'的JavaScript函数(%1$s了解更多%2$s)",
- "YouCanEnableEcommerceReports": "您可以为网站开启%1$s在%2$s页面。"
+ "YouCanEnableEcommerceReports": "您可以为网站开启%1$s在%2$s页面。",
+ "UseEventValueAsRevenue": "使用事件值(如果存在)作为目标转化收入。",
+ "GoalRevenue": "目标收益",
+ "EventValueAsRevenueHelp": "如果您匹配的事件具有收入,并且将该收入作为事件值进行跟踪,则可以启用此选项以将事件值记录为目标转化的收入。 如果您的目标收入不会因每次转化而变化,则可以忽略此选项,而只需在上面设置默认收入即可。",
+ "EventValueAsRevenueHelp2": "注意:如果同时定义了默认目标收入和事件值,则将使用事件值。 如果启用此选项,并且请求中未发送任何事件值,则将使用默认收入(如果已定义)。",
+ "AtLeastMinutes": "至少%1$s分钟。 使用小数来匹配秒,例如,使用%2$s来匹配30秒。",
+ "TimeInMinutes": "时间(分钟)",
+ "ClickToViewThisGoal": "单击以查看此目标。"
}
} \ No newline at end of file
diff --git a/plugins/Goals/tests/Integration/APITest.php b/plugins/Goals/tests/Integration/APITest.php
index 0d4be1c65c..f0e2ff6d79 100644
--- a/plugins/Goals/tests/Integration/APITest.php
+++ b/plugins/Goals/tests/Integration/APITest.php
@@ -29,14 +29,11 @@ class APITest extends IntegrationTestCase
private $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->api = API::getInstance();
- Fixture::createAccessInstance();
- Piwik::setUserHasSuperUserAccess();
-
Fixture::createWebsite('2014-01-01 00:00:00');
Fixture::createWebsite('2014-01-01 00:00:00');
}
@@ -103,39 +100,35 @@ class APITest extends IntegrationTestCase
$this->assertGoal($idGoal, 'MyName', '', 'title', 'rere(.*)', 'regex', 1, 50, 1);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ValidatorErrorXNotWhitelisted
- */
public function test_addGoal_shouldThrowException_IfPatternTypeIsInvalid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorXNotWhitelisted');
+
$this->api->addGoal($this->idSite, 'MyName', 'external_website', 'www.test.de', 'invalid');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ValidatorErrorNoValidRegex
- */
public function test_addGoal_shouldThrowException_IfPatternRegexIsInvalid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorNoValidRegex');
+
$this->api->addGoal($this->idSite, 'MyName', 'url', '/(%$f', 'regex');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Goals_ExceptionInvalidMatchingString
- */
public function test_addGoal_shouldThrowException_IfPatternTypeIsExactAndMatchAttributeNotEvent()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Goals_ExceptionInvalidMatchingString');
+
$this->api->addGoal($this->idSite, 'MyName', 'url', 'www.test.de', 'exact');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Goals_ExceptionInvalidMatchingString
- */
public function test_addGoal_shouldThrowException_IfPatternTypeIsExactAndMatchAttributeNotEvent2()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Goals_ExceptionInvalidMatchingString');
+
$this->api->addGoal($this->idSite, 'MyName', 'external_website', 'www.test.de', 'exact');
}
@@ -148,34 +141,31 @@ class APITest extends IntegrationTestCase
$this->assertSame('3', (string)$idGoal);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasWriteAccess Fake exception
- */
public function test_addGoal_shouldThrowException_IfNotEnoughPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasWriteAccess Fake exception');
+
$this->setNonAdminUser();
$this->createAnyGoal();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasWriteAccess Fake exception
- */
public function test_updateGoal_shouldThrowException_IfNotEnoughPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasWriteAccess Fake exception');
+
$idGoal = $this->createAnyGoal();
$this->assertSame(1, $idGoal); // make sure goal is created and does not already fail here
$this->setNonAdminUser();
$this->api->updateGoal($this->idSite, $idGoal, 'MyName', 'url', 'www.test.de', 'exact');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Goals_ExceptionInvalidMatchingString
- */
public function test_updateGoal_shouldThrowException_IfPatternTypeIsExactAndMatchAttributeNotEvent()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Goals_ExceptionInvalidMatchingString');
+
$idGoal = $this->createAnyGoal();
$this->api->updateGoal($this->idSite, $idGoal, 'MyName', 'url', 'www.test.de', 'exact');
}
@@ -239,12 +229,11 @@ class APITest extends IntegrationTestCase
$this->assertHasNoGoals();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasViewAccess Fake exception
- */
public function test_getGoal_shouldThrowException_IfNotEnoughPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('heckUserHasViewAccess Fake exception');
+
$idGoal = $this->createAnyGoal();
$this->assertSame(1, $idGoal);
$this->setNonAdminUser();
diff --git a/plugins/Goals/tests/Unit/AppendNameToColumnNamesTest.php b/plugins/Goals/tests/Unit/AppendNameToColumnNamesTest.php
index 59d500d208..71bc3ef571 100644
--- a/plugins/Goals/tests/Unit/AppendNameToColumnNamesTest.php
+++ b/plugins/Goals/tests/Unit/AppendNameToColumnNamesTest.php
@@ -17,7 +17,7 @@ use Piwik\DataTable\Row;
* @group Filter
* @group Goals
*/
-class AppendNameToColumnNamesTest extends \PHPUnit_Framework_TestCase
+class AppendNameToColumnNamesTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'Piwik\Plugins\Goals\DataTable\Filter\AppendNameToColumnNames';
@@ -26,7 +26,7 @@ class AppendNameToColumnNamesTest extends \PHPUnit_Framework_TestCase
*/
private $table;
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable\Simple();
$this->addRow(array('nb_visits' => 1, 'nb_conversions' => 5, 'revenue' => 10, 'conversion_rate' => 20));
diff --git a/plugins/ImageGraph/API.php b/plugins/ImageGraph/API.php
index e0e064a591..1fa00cca13 100644
--- a/plugins/ImageGraph/API.php
+++ b/plugins/ImageGraph/API.php
@@ -12,12 +12,12 @@ use Exception;
use Piwik\API\Request;
use Piwik\Archive\DataTableFactory;
use Piwik\Common;
+use Piwik\Container\StaticContainer;
use Piwik\DataTable\Map;
use Piwik\Filesystem;
use Piwik\Period;
use Piwik\Piwik;
use Piwik\SettingsServer;
-use Piwik\Translate;
/**
* The ImageGraph.get API call lets you generate beautiful static PNG Graphs for any existing Matomo report.
@@ -139,7 +139,7 @@ class API extends \Piwik\Plugin\API
$useUnicodeFont = array(
'am', 'ar', 'el', 'fa', 'fi', 'he', 'ja', 'ka', 'ko', 'te', 'th', 'zh-cn', 'zh-tw',
);
- $languageLoaded = Translate::getLanguageLoaded();
+ $languageLoaded = StaticContainer::get('Piwik\Translation\Translator')->getCurrentLanguage();
$font = self::getFontPath(self::DEFAULT_FONT);
if (in_array($languageLoaded, $useUnicodeFont)) {
$unicodeFontPath = self::getFontPath(self::UNICODE_FONT);
diff --git a/plugins/ImageGraph/ImageGraph.php b/plugins/ImageGraph/ImageGraph.php
index 6706691b3e..9cc273906d 100644
--- a/plugins/ImageGraph/ImageGraph.php
+++ b/plugins/ImageGraph/ImageGraph.php
@@ -32,7 +32,7 @@ class ImageGraph extends \Piwik\Plugin
);
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
@@ -56,7 +56,7 @@ class ImageGraph extends \Piwik\Plugin
$idSite = $info['idSite'];
// If only one website is selected, we add the Graph URL
- if (empty($idSite)) {
+ if (empty($idSite) || !is_numeric($idSite)) {
return;
}
diff --git a/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_evolution_graph.png b/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_evolution_graph.png
index 06a932c25d..5285b1b859 100644
--- a/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_evolution_graph.png
+++ b/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_evolution_graph.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9dd4e5b92ce48f84582397b5e43580e3842fbb18a9ca54c937832da5537d8db0
-size 12994
+oid sha256:0023cc766b5e37e8d85964e741ec1ef8ad9663fb013166b83133dead55fb6b57
+size 12553
diff --git a/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_pie.png b/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_pie.png
index bc50ac435d..e9636c98cb 100644
--- a/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_pie.png
+++ b/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_pie.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:717277c7dee415984440cec35f6bf64f3da49804886f95a519b8764255acc543
-size 20777
+oid sha256:8fade832ecbd4d79d335a65848509bb741b2633c9ebbe3dfb1e6f9d60e173ebc
+size 20797
diff --git a/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_vertical_bar.png b/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_vertical_bar.png
index 8c293cddc5..45fb160421 100644
--- a/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_vertical_bar.png
+++ b/plugins/ImageGraph/tests/UI/expected-screenshots/ImageGraph_vertical_bar.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:828768d7912355d51a2de0edda6c7efae49fcd1a106fb03ef5f59e1b8d37032b
-size 7607
+oid sha256:5d9c60f3eb349389ed44ed876203c87f1ac04b986aeb8b186af6b814b3fd67ab
+size 7625
diff --git a/plugins/Insights/Insights.php b/plugins/Insights/Insights.php
index 041ddee030..d928a90793 100644
--- a/plugins/Insights/Insights.php
+++ b/plugins/Insights/Insights.php
@@ -13,7 +13,7 @@ namespace Piwik\Plugins\Insights;
class Insights extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/Insights/lang/zh-cn.json b/plugins/Insights/lang/zh-cn.json
index f19a0a9248..6f1314e8d2 100644
--- a/plugins/Insights/lang/zh-cn.json
+++ b/plugins/Insights/lang/zh-cn.json
@@ -1,17 +1,35 @@
{
"Insights": {
+ "PluginDescription": "提供有关您流量的见解。 洞察可作为仪表板小部件以及报告中的新图标提供",
+ "ControlComparedToDescription": "与增长相比",
+ "ControlFilterByDescription": "全部显示,仅移动者,仅新的或仅消失的",
+ "DatePeriodCombinationNotSupported": "无法针对此日期和期间组合生成见解。",
"DayComparedToPreviousDay": "前一天",
"DayComparedToPreviousWeek": "上一周的同一天",
"DayComparedToPreviousYear": "上一年的同一天",
"Filter": "条件",
+ "FilterIncreaserAndDecreaser": "增减器",
"FilterOnlyDecreaser": "仅限减少的",
"FilterOnlyDisappeared": "仅限消失的",
"FilterOnlyIncreaser": "仅限增加的",
"FilterOnlyMovers": "仅限移动的",
"FilterOnlyNew": "仅限新的",
+ "IgnoredChanges": "影响少于%s次访问的更改被忽略。",
"MonthComparedToPreviousMonth": "上月",
"MonthComparedToPreviousYear": "上一年的同月",
+ "MoversAndShakersWidgetTitle": "有影响力的人",
+ "NoResultMatchesCriteria": "没有符合条件的行",
+ "OverviewWidgetTitle": "见解概述",
+ "TitleConsideredInsightsChanges": "行增加或减少了至少%1$s次访问(共%3$s次访问中的%2$s%%)。",
+ "TitleConsideredInsightsGrowth": "与%2$s相比,以下各行的增长至少为%1$s%%。",
+ "TitleConsideredMoversAndShakersChanges": "仅当动量增长超过%1$s%%次访问或收缩少于%2$s%%次访问时才考虑移动,仅当新动量增长超过%3$s%%次访问(%4$s)时才考虑新条目,而当收缩率少于%5$s%%次访问时则视为行消失(%6$s)。",
+ "TitleConsideredMoversAndShakersGrowth": "%1$s从%2$s更改为,而%4$s变为%3$s。基于此,预计每行%5$s%%都会发生变化。",
+ "TitleRowChangeDetails": "“%1$s”从%2$s(%3$s)变为%4$s(%5$s)%6$s。",
+ "TitleRowDisappearedDetails": "“ %1$s”减少了%2$s,而在%3$s中则从%4$s减少了。",
+ "TitleRowMoverAndShaker": "该行的影响大于平均水平。",
+ "TitleRowNewDetails": "“ %1$s”增加了%2$s,与之前的%3$s相比是新的。",
"WeekComparedToPreviousWeek": "上一周",
+ "WidgetCategory": "见解",
"YearComparedToPreviousYear": "上一年"
}
} \ No newline at end of file
diff --git a/plugins/Insights/tests/Fixtures/SomeVisitsDifferentPathsOnTwoDays.php b/plugins/Insights/tests/Fixtures/SomeVisitsDifferentPathsOnTwoDays.php
index b6d98eff4b..28c26c0bd2 100644
--- a/plugins/Insights/tests/Fixtures/SomeVisitsDifferentPathsOnTwoDays.php
+++ b/plugins/Insights/tests/Fixtures/SomeVisitsDifferentPathsOnTwoDays.php
@@ -21,13 +21,13 @@ class SomeVisitsDifferentPathsOnTwoDays extends Fixture
public $date1 = '2010-12-14';
public $date2 = '2010-12-13';
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/Insights/tests/Integration/ApiTest.php b/plugins/Insights/tests/Integration/ApiTest.php
index fc53973da5..31f3ddba73 100644
--- a/plugins/Insights/tests/Integration/ApiTest.php
+++ b/plugins/Insights/tests/Integration/ApiTest.php
@@ -11,11 +11,10 @@ namespace Piwik\Plugins\Insights\tests\Integration;
use Piwik\API\Request as ApiRequest;
use Piwik\Cache as PiwikCache;
use Piwik\DataTable;
-use Piwik\DataTable\Row;
use Piwik\Plugins\Insights\API;
use Piwik\Plugins\Insights\tests\Fixtures\SomeVisitsDifferentPathsOnTwoDays;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
-use Piwik\Translate;
/**
* @group Insights
@@ -36,21 +35,21 @@ class ApiTest extends SystemTestCase
private $api;
private $idSite;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
PiwikCache::flushAll();
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$this->api = API::getInstance();
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
- Translate::reset();
+ Fixture::resetTranslations();
}
/**
@@ -89,7 +88,7 @@ class ApiTest extends SystemTestCase
'evolutionDifference' => -9
);
- $this->assertInternalType('array', $metadata['report']);
+ self::assertIsArray($metadata['report']);
$this->assertEquals('Actions', $metadata['report']['module']);
$this->assertEquals('getPageUrls', $metadata['report']['action']);
unset($metadata['report']);
@@ -246,7 +245,7 @@ class ApiTest extends SystemTestCase
$this->assertTrue($this->api->canGenerateInsights('2012-12-12', 'month'));
$this->assertFalse($this->api->canGenerateInsights('last10', 'day'));
- $this->assertFalse($this->api->canGenerateInsights('2012-11-11,2012-12-12', 'range'));
+ $this->assertTrue($this->api->canGenerateInsights('2012-11-11,2012-12-12', 'range'));
}
private function requestInsights($requestParams)
diff --git a/plugins/Insights/tests/Integration/ModelTest.php b/plugins/Insights/tests/Integration/ModelTest.php
index 7c3edbaf15..9cde8a09cc 100644
--- a/plugins/Insights/tests/Integration/ModelTest.php
+++ b/plugins/Insights/tests/Integration/ModelTest.php
@@ -18,7 +18,6 @@ use Piwik\Tests\Framework\TestCase\SystemTestCase;
* @group Insights
* @group ModelTest
* @group Plugins
- * @group Plugins
*/
class ModelTest extends SystemTestCase
{
@@ -32,7 +31,7 @@ class ModelTest extends SystemTestCase
*/
private $model;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -101,7 +100,7 @@ class ModelTest extends SystemTestCase
$total = $this->model->getMetricTotalValue($table, 'nb_visits');
$this->assertEquals(17, $total);
- $this->assertInternalType('integer', $total);
+ self::assertIsInt($total);
}
public function test_getMetricTotalValue_shouldReturnZeroIfMetricHasNoTotal()
@@ -114,20 +113,11 @@ class ModelTest extends SystemTestCase
$this->assertEquals(0, $total);
}
- /**
- * @expectedException \Exception
- */
public function test_getLastDate_shouldThrowExceptionIfNotPossibleToGetLastDate()
{
- $this->model->getLastDate('last10', 'day', 1);
- }
+ $this->expectException(\Exception::class);
- /**
- * @expectedException \Exception
- */
- public function test_getLastDate_shouldThrowExceptionInCaseOfRangePeriod()
- {
- $this->model->getLastDate('2012-11-11,2012-12-12', 'range', 1);
+ $this->model->getLastDate('last10', 'day', 1);
}
public function test_getTotalValue_shouldCalculateTotals()
diff --git a/plugins/Insights/tests/UI/expected-screenshots/Insights_initial.png b/plugins/Insights/tests/UI/expected-screenshots/Insights_initial.png
index f606a7445c..fcf030bcab 100644
--- a/plugins/Insights/tests/UI/expected-screenshots/Insights_initial.png
+++ b/plugins/Insights/tests/UI/expected-screenshots/Insights_initial.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5eee4cb55e45acf62fcd4757528a20007976c7c97b0f3e802ba43e9330d547c0
-size 152441
+oid sha256:95657e61878f49b7ab11eefc62e740403b55d0ed3694823008b1a11a7c286e58
+size 152139
diff --git a/plugins/Insights/tests/Unit/BaseUnitTest.php b/plugins/Insights/tests/Unit/BaseUnitTest.php
index 80793224f4..d50cb0dc61 100644
--- a/plugins/Insights/tests/Unit/BaseUnitTest.php
+++ b/plugins/Insights/tests/Unit/BaseUnitTest.php
@@ -19,7 +19,7 @@ use Piwik\DataTable\Row;
* @group Unit
* @group Core
*/
-abstract class BaseUnitTest extends \PHPUnit_Framework_TestCase
+abstract class BaseUnitTest extends \PHPUnit\Framework\TestCase
{
/**
* @var DataTable
diff --git a/plugins/Insights/tests/Unit/FilterExcludeLowValueTest.php b/plugins/Insights/tests/Unit/FilterExcludeLowValueTest.php
index 7e9fba07c3..c63dac03b4 100644
--- a/plugins/Insights/tests/Unit/FilterExcludeLowValueTest.php
+++ b/plugins/Insights/tests/Unit/FilterExcludeLowValueTest.php
@@ -20,7 +20,7 @@ use Piwik\Plugins\Insights\DataTable\Filter\ExcludeLowValue;
*/
class FilterExcludeLowValueTest extends BaseUnitTest
{
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
$this->table->addRowsFromArray(array(
diff --git a/plugins/Insights/tests/Unit/FilterInsightTest.php b/plugins/Insights/tests/Unit/FilterInsightTest.php
index bf98eab975..be5acb7324 100644
--- a/plugins/Insights/tests/Unit/FilterInsightTest.php
+++ b/plugins/Insights/tests/Unit/FilterInsightTest.php
@@ -30,7 +30,7 @@ class FilterInsightTest extends BaseUnitTest
*/
private $pastTable;
- public function setUp()
+ public function setUp(): void
{
$this->currentTable = new DataTable();
$this->currentTable->addRowsFromArray(array(
diff --git a/plugins/Insights/tests/Unit/FilterLimitTest.php b/plugins/Insights/tests/Unit/FilterLimitTest.php
index 0eec585b68..184b95467a 100644
--- a/plugins/Insights/tests/Unit/FilterLimitTest.php
+++ b/plugins/Insights/tests/Unit/FilterLimitTest.php
@@ -20,7 +20,7 @@ use Piwik\Plugins\Insights\DataTable\Filter\Limit;
*/
class FilterLimitTest extends BaseUnitTest
{
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
$this->table->addRowsFromArray(array(
diff --git a/plugins/Insights/tests/Unit/FilterMinGrowthTest.php b/plugins/Insights/tests/Unit/FilterMinGrowthTest.php
index 76434ade21..d8740e4203 100644
--- a/plugins/Insights/tests/Unit/FilterMinGrowthTest.php
+++ b/plugins/Insights/tests/Unit/FilterMinGrowthTest.php
@@ -21,7 +21,7 @@ use Piwik\Plugins\Insights\DataTable\Filter\MinGrowth;
class FilterMinGrowthTest extends BaseUnitTest
{
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
$this->table->addRowsFromArray(array(
diff --git a/plugins/Insights/tests/Unit/FilterOrderByTest.php b/plugins/Insights/tests/Unit/FilterOrderByTest.php
index f3aa74f7bf..d18387eb4c 100644
--- a/plugins/Insights/tests/Unit/FilterOrderByTest.php
+++ b/plugins/Insights/tests/Unit/FilterOrderByTest.php
@@ -21,7 +21,7 @@ use Piwik\Tests\Framework\TestCase\SystemTestCase;
*/
class FilterOrderByTest extends BaseUnitTest
{
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
}
@@ -44,11 +44,7 @@ class FilterOrderByTest extends BaseUnitTest
$this->applyOrderByFilter();
- if (SystemTestCase::isPhp7orLater()) {
- $this->assertOrder(array('pos1', 'pos3', 'pos5', 'pos4', 'pos2', 'pos6', 'neg3', 'neg2', 'neg1', 'neg5', 'neg4'));
- } else {
- $this->assertOrder(array('pos1', 'pos5', 'pos3', 'pos4', 'pos2', 'pos6', 'neg3', 'neg2', 'neg1', 'neg5', 'neg4'));
- }
+ $this->assertOrder(array('pos1', 'pos3', 'pos5', 'pos4', 'pos2', 'pos6', 'neg3', 'neg2', 'neg1', 'neg5', 'neg4'));
}
public function testOrderByShouldSortDependingOnNbVisitsIfColumnsHaveSameValue()
diff --git a/plugins/Insights/tests/Unit/InsightReportTest.php b/plugins/Insights/tests/Unit/InsightReportTest.php
index 88f1ea8719..98b54a100a 100644
--- a/plugins/Insights/tests/Unit/InsightReportTest.php
+++ b/plugins/Insights/tests/Unit/InsightReportTest.php
@@ -19,7 +19,7 @@ use Piwik\Plugins\Insights\Visualizations\Insight;
* @group Unit
* @group Core
*/
-class InsightReportTest extends \PHPUnit_Framework_TestCase
+class InsightReportTest extends \PHPUnit\Framework\TestCase
{
/**
* @var InsightReport
@@ -55,7 +55,7 @@ class InsightReportTest extends \PHPUnit_Framework_TestCase
*/
// TODO use data providers
- public function setUp()
+ public function setUp(): void
{
$this->currentTable = new DataTable();
$this->currentTable->addRowsFromArray(array(
@@ -110,12 +110,11 @@ class InsightReportTest extends \PHPUnit_Framework_TestCase
);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Unsupported orderBy
- */
public function test_generateInsight_Order_ShouldThrowException_IfInvalid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Unsupported orderBy');
+
$this->generateInsight(2, 2, 2, 17, -17, 'InvalidOrDeRbY');
}
@@ -270,7 +269,7 @@ class InsightReportTest extends \PHPUnit_Framework_TestCase
'minDisappearedPercent' => 8,
);
- $this->assertInternalType('array', $metadata['report']);
+ self::assertIsArray($metadata['report']);
$this->assertEquals('TestReport', $metadata['report']['name']);
unset($metadata['report']);
unset($metadata['totals']);
diff --git a/plugins/Installation/Controller.php b/plugins/Installation/Controller.php
index 0392f96b5e..27ba28e91a 100644
--- a/plugins/Installation/Controller.php
+++ b/plugins/Installation/Controller.php
@@ -619,7 +619,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
private function checkPiwikIsNotInstalled($possibleErrorMessage = null)
{
- if (!SettingsPiwik::isPiwikInstalled()) {
+ if (!SettingsPiwik::isMatomoInstalled()) {
return;
}
diff --git a/plugins/Installation/Installation.php b/plugins/Installation/Installation.php
index 5bd24575a4..5f9ab44505 100644
--- a/plugins/Installation/Installation.php
+++ b/plugins/Installation/Installation.php
@@ -26,7 +26,7 @@ class Installation extends \Piwik\Plugin
protected $installationControllerName = '\\Piwik\\Plugins\\Installation\\Controller';
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
@@ -64,7 +64,7 @@ class Installation extends \Piwik\Plugin
{
$general = Config::getInstance()->General;
- if (!SettingsPiwik::isPiwikInstalled() && !$general['enable_installer']) {
+ if (!SettingsPiwik::isMatomoInstalled() && !$general['enable_installer']) {
throw new NotYetInstalledException('Matomo is not set up yet');
}
diff --git a/plugins/Installation/tests/System/APITest.php b/plugins/Installation/tests/System/APITest.php
index bd5d6e08f0..79e3fee480 100644
--- a/plugins/Installation/tests/System/APITest.php
+++ b/plugins/Installation/tests/System/APITest.php
@@ -25,7 +25,7 @@ class APITest extends SystemTestCase
*/
public static $fixture = null; // initialized below class definition
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
@@ -47,7 +47,7 @@ class APITest extends SystemTestCase
$data = str_replace("\n", "", $response['data']);
$this->assertStringStartsWith('<?xml version="1.0" encoding="utf-8" ?><result> <error message=', $data);
- $this->assertContains('Access denied', $data);
+ self::assertStringContainsString('Access denied', $data);
$this->assertStringEndsWith('</result>', $data);
}
@@ -58,7 +58,7 @@ class APITest extends SystemTestCase
$data = str_replace("\n", "", $response['data']);
$this->assertStringStartsWith('{"result":"error","message":"', $data);
- $this->assertContains('Access denied', $data);
+ self::assertStringContainsString('Access denied', $data);
}
public function test_shouldReturnEmptyResultWhenNotInstalledAndDispatchIsDisabled()
diff --git a/plugins/Installation/tests/UI/expected-screenshots/Installation_system_check.png b/plugins/Installation/tests/UI/expected-screenshots/Installation_system_check.png
index 3899305675..2f878b8817 100644
--- a/plugins/Installation/tests/UI/expected-screenshots/Installation_system_check.png
+++ b/plugins/Installation/tests/UI/expected-screenshots/Installation_system_check.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e3d5d05915187f72882d1fa857451d857e2799a030b23baf466da68052a28d10
-size 189007
+oid sha256:d0b21a3742b3cac4b569ab60cfdd0d52aff04894d3db3c1082803adc76b2cefc
+size 188859
diff --git a/plugins/Intl/Commands/GenerateIntl.php b/plugins/Intl/Commands/GenerateIntl.php
index d7c5133408..eaa4abbc95 100644
--- a/plugins/Intl/Commands/GenerateIntl.php
+++ b/plugins/Intl/Commands/GenerateIntl.php
@@ -16,6 +16,9 @@ use Piwik\Development;
use Piwik\Filesystem;
use Piwik\Http;
use Piwik\Plugin\ConsoleCommand;
+use Piwik\Plugins\LanguagesManager\TranslationWriter\Filter\EncodedEntities;
+use Piwik\Plugins\LanguagesManager\TranslationWriter\Filter\UnnecassaryWhitespaces;
+use Piwik\Plugins\LanguagesManager\TranslationWriter\Writer;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
@@ -132,7 +135,11 @@ class GenerateIntl extends ConsoleCommand
ksort($translations['Intl']);
- file_put_contents(sprintf($writePath, $langCode), json_encode($translations, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
+ $translationWriter = new Writer($langCode, 'Intl');
+ $translationWriter->setTranslations($translations);
+ $translationWriter->addFilter(new UnnecassaryWhitespaces());
+ $translationWriter->addFilter(new EncodedEntities());
+ $translationWriter->save();
}
}
diff --git a/plugins/Intl/Intl.php b/plugins/Intl/Intl.php
index 8f44e8d06a..5d14304b5f 100644
--- a/plugins/Intl/Intl.php
+++ b/plugins/Intl/Intl.php
@@ -10,7 +10,7 @@ namespace Piwik\Plugins\Intl;
class Intl extends \Piwik\Plugin
{
- public function getListHooksRegistered()
+ public function registerEvents()
{
return [
'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
diff --git a/plugins/Intl/lang/am.json b/plugins/Intl/lang/am.json
index 73e785ccb4..052e819622 100644
--- a/plugins/Intl/lang/am.json
+++ b/plugins/Intl/lang/am.json
@@ -48,7 +48,7 @@
"Country_CA": "ካናዳ",
"Country_CC": "ኮኮስ(ኬሊንግ) ደሴቶች",
"Country_CD": "ኮንጎ-ኪንሻሳ",
- "Country_CF": "የመካከለኛው አፍሪካ ሪፐብሊክ",
+ "Country_CF": "ማዕከላዊ አፍሪካ ሪፑብሊክ",
"Country_CG": "ኮንጎ ብራዛቪል",
"Country_CH": "ስዊዘርላንድ",
"Country_CI": "ኮት ዲቯር",
@@ -151,7 +151,7 @@
"Country_MF": "ሴንት ማርቲን",
"Country_MG": "ማዳጋስካር",
"Country_MH": "ማርሻል አይላንድ",
- "Country_MK": "መቄዶንያ",
+ "Country_MK": "ሰሜን መቄዶንያ",
"Country_ML": "ማሊ",
"Country_MM": "ማይናማር(በርማ)",
"Country_MN": "ሞንጎሊያ",
@@ -1039,6 +1039,7 @@
"Timezone_Asia_Omsk": "ኦምስክ",
"Timezone_Asia_Oral": "ኦራል",
"Timezone_Asia_Pontianak": "ፖንቲአናክ",
+ "Timezone_Asia_Qostanay": "ኮስታናይ",
"Timezone_Asia_Qyzylorda": "ኩይዚሎርዳ",
"Timezone_Asia_Rangoon": "ያንጎን",
"Timezone_Asia_Saigon": "ሆ ቺ ሚንህ ከተማ",
diff --git a/plugins/Intl/lang/ar.json b/plugins/Intl/lang/ar.json
index 0a6988cd86..9fda49b5a1 100644
--- a/plugins/Intl/lang/ar.json
+++ b/plugins/Intl/lang/ar.json
@@ -39,7 +39,7 @@
"Country_BO": "بوليفيا",
"Country_BQ": "هولندا الكاريبية",
"Country_BR": "البرازيل",
- "Country_BS": "البهاما",
+ "Country_BS": "جزر البهاما",
"Country_BT": "بوتان",
"Country_BV": "جزيرة بوفيه",
"Country_BW": "بوتسوانا",
@@ -151,11 +151,11 @@
"Country_MF": "سان مارتن",
"Country_MG": "مدغشقر",
"Country_MH": "جزر مارشال",
- "Country_MK": "مقدونيا",
+ "Country_MK": "مقدونيا الشمالية",
"Country_ML": "مالي",
"Country_MM": "ميانمار (بورما)",
"Country_MN": "منغوليا",
- "Country_MO": "مكاو الصينية (منطقة إدارية خاصة)",
+ "Country_MO": "منطقة ماكاو الإدارية الخاصة",
"Country_MP": "جزر ماريانا الشمالية",
"Country_MQ": "جزر المارتينيك",
"Country_MR": "موريتانيا",
@@ -220,7 +220,7 @@
"Country_SV": "السلفادور",
"Country_SX": "سانت مارتن",
"Country_SY": "سوريا",
- "Country_SZ": "سوازيلاند",
+ "Country_SZ": "إسواتيني",
"Country_TC": "جزر توركس وكايكوس",
"Country_TD": "تشاد",
"Country_TF": "الأقاليم الجنوبية الفرنسية",
@@ -304,7 +304,7 @@
"CurrencySymbol_EUR": "€",
"CurrencySymbol_FJD": "FJD",
"CurrencySymbol_FKP": "FKP",
- "CurrencySymbol_GBP": "£",
+ "CurrencySymbol_GBP": "UK£",
"CurrencySymbol_GEL": "GEL",
"CurrencySymbol_GHS": "GHS",
"CurrencySymbol_GIP": "GIP",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "أومسك",
"Timezone_Asia_Oral": "أورال",
"Timezone_Asia_Pontianak": "بونتيانك",
+ "Timezone_Asia_Qostanay": "قوستاناي",
"Timezone_Asia_Qyzylorda": "كيزيلوردا",
"Timezone_Asia_Rangoon": "رانغون",
"Timezone_Asia_Saigon": "مدينة هو تشي منة",
diff --git a/plugins/Intl/lang/be.json b/plugins/Intl/lang/be.json
index f520046c39..a148ec99ab 100644
--- a/plugins/Intl/lang/be.json
+++ b/plugins/Intl/lang/be.json
@@ -97,7 +97,7 @@
"Country_GP": "Гвадэлупа",
"Country_GQ": "Экватарыяльная Гвінея",
"Country_GR": "Грэцыя",
- "Country_GS": "Паўднёвая Джорджыя і Паўднёвыя Сандвічавы астравы",
+ "Country_GS": "Паўднёвая Георгія і Паўднёвыя Сандвічавы астравы",
"Country_GT": "Гватэмала",
"Country_GU": "Гуам",
"Country_GW": "Гвінея-Бісау",
@@ -151,7 +151,7 @@
"Country_MF": "Сен-Мартэн",
"Country_MG": "Мадагаскар",
"Country_MH": "Маршалавы астравы",
- "Country_MK": "Македонія",
+ "Country_MK": "Паўночная Македонія",
"Country_ML": "Малі",
"Country_MM": "М’янма (Бірма)",
"Country_MN": "Манголія",
@@ -220,7 +220,7 @@
"Country_SV": "Сальвадор",
"Country_SX": "Сінт-Мартэн",
"Country_SY": "Сірыя",
- "Country_SZ": "Свазіленд",
+ "Country_SZ": "Эсватыні",
"Country_TC": "Астравы Цёркс і Кайкас",
"Country_TD": "Чад",
"Country_TF": "Французскія паўднёвыя тэрыторыі",
@@ -240,7 +240,7 @@
"Country_UA": "Украіна",
"Country_UG": "Уганда",
"Country_UM": "Малыя Аддаленыя астравы ЗША",
- "Country_US": "Злучаныя Штаты Амерыкі",
+ "Country_US": "Злучаныя Штаты",
"Country_UY": "Уругвай",
"Country_UZ": "Узбекістан",
"Country_VA": "Ватыкан",
@@ -413,7 +413,7 @@
"CurrencySymbol_YER": "YER",
"CurrencySymbol_ZAR": "ZAR",
"CurrencySymbol_ZMW": "ZMW",
- "Currency_AED": "Дырхем ААЭ",
+ "Currency_AED": "Дырхам ААЭ",
"Currency_AFN": "Афганскі афгані",
"Currency_ALL": "Албанскі лек",
"Currency_AMD": "Армянскі драм",
@@ -424,7 +424,7 @@
"Currency_AWG": "Арубанскі фларын",
"Currency_AZN": "Азербайджанскі манат",
"Currency_BAM": "Канверсоўная марка Босніі і Герцагавіны",
- "Currency_BBD": "Барбадоскі долар",
+ "Currency_BBD": "Барбадаскі долар",
"Currency_BDT": "Бангладэшская така",
"Currency_BGN": "Балгарскі леў",
"Currency_BHD": "Бахрэйнскі дынар",
@@ -477,20 +477,20 @@
"Currency_ILS": "Новы ізраільскі шэкель",
"Currency_INR": "Індыйская рупія",
"Currency_IQD": "Іракскі дынар",
- "Currency_IRR": "Іранскі рыал",
+ "Currency_IRR": "Іранскі рыял",
"Currency_ISK": "Ісландская крона",
"Currency_JMD": "Ямайскі долар",
"Currency_JOD": "Іарданскі дынар",
"Currency_JPY": "Японская іена",
"Currency_KES": "Кенійскі шылінг",
"Currency_KGS": "Кіргізскі сом",
- "Currency_KHR": "Камбаджыйскі рыэль",
+ "Currency_KHR": "Камбаджыйскі рыель",
"Currency_KMF": "Каморскі франк",
"Currency_KPW": "Паўночнакарэйская вона",
"Currency_KRW": "Паўднёвакарэйская вона",
"Currency_KWD": "Кувейцкі дынар",
"Currency_KYD": "Долар Кайманавых астравоў",
- "Currency_KZT": "Казахстанскі тэнгэ",
+ "Currency_KZT": "Казахстанскі тэнге",
"Currency_LAK": "Лаоскі кіп",
"Currency_LBP": "Ліванскі фунт",
"Currency_LKR": "Шры-ланкійская рупія",
@@ -504,7 +504,7 @@
"Currency_MMK": "М’янманскі к’ят",
"Currency_MNT": "Мангольскі тугрык",
"Currency_MOP": "Патака Макаа",
- "Currency_MRU": "Маўрытанская ўгія",
+ "Currency_MRU": "Маўрытанская угія",
"Currency_MUR": "Маўрыкійская рупія",
"Currency_MVR": "Мальдыўская руфія",
"Currency_MWK": "Малавійская квача",
@@ -512,20 +512,20 @@
"Currency_MYR": "Малайзійскі рынгіт",
"Currency_MZN": "Мазамбікскі метыкал",
"Currency_NAD": "Намібійскі долар",
- "Currency_NGN": "Нігерыйская найра",
+ "Currency_NGN": "Нігерыйская наіра",
"Currency_NIO": "Нікарагуанская кордаба",
"Currency_NOK": "Нарвежская крона",
"Currency_NPR": "Непальская рупія",
"Currency_NZD": "Новазеландскі долар",
- "Currency_OMR": "Аманскі рыал",
+ "Currency_OMR": "Аманскі рыял",
"Currency_PAB": "Панамскае бальбоа",
"Currency_PEN": "Перуанскі соль",
- "Currency_PGK": "Кіна",
+ "Currency_PGK": "Кіна Папуа-Новай Гвінеі",
"Currency_PHP": "Філіпінскае песа",
"Currency_PKR": "Пакістанская рупія",
"Currency_PLN": "Польскі злоты",
"Currency_PYG": "Парагвайскі гуарані",
- "Currency_QAR": "Катарскі рыал",
+ "Currency_QAR": "Катарскі рыял",
"Currency_RON": "Румынскі лей",
"Currency_RSD": "Сербскі дынар",
"Currency_RUB": "Расійскі рубель",
@@ -536,8 +536,8 @@
"Currency_SDG": "Суданскі фунт",
"Currency_SEK": "Шведская крона",
"Currency_SGD": "Сінгапурскі долар",
- "Currency_SHP": "Фунт Святой Алены",
- "Currency_SLL": "Леонэ",
+ "Currency_SHP": "Фунт в-ва Святой Алены",
+ "Currency_SLL": "Сьера-леонскі леонэ",
"Currency_SOS": "Самалійскі шылінг",
"Currency_SRD": "Сурынамскі долар",
"Currency_SSP": "Паўднёвасуданскі фунт",
@@ -560,14 +560,14 @@
"Currency_UZS": "Узбекскі сум",
"Currency_VEF": "Венесуальскі балівар (2008–2018)",
"Currency_VND": "В’етнамскі донг",
- "Currency_VUV": "Вату",
+ "Currency_VUV": "Вануацкі вату",
"Currency_WST": "Самаанская тала",
"Currency_XAF": "Цэнтральнаафрыканскі франк КФА",
"Currency_XCD": "Усходнекарыбскі долар",
"Currency_XOF": "Заходнеафрыканскі франк КФА",
"Currency_XPF": "Французскі ціхаакіянскі франк",
"Currency_YER": "Еменскі рыал",
- "Currency_ZAR": "Паўднёваафрыканскі ранд",
+ "Currency_ZAR": "Паўднёваафрыканскі рэнд",
"Currency_ZMW": "Замбійская квача",
"Day_Long_1": "панядзелак",
"Day_Long_2": "аўторак",
@@ -886,7 +886,7 @@
"Time_AM": "AM",
"Time_PM": "PM",
"Timezone_Africa_Asmera": "Асмара",
- "Timezone_Africa_Ceuta": "Сеўта",
+ "Timezone_Africa_Ceuta": "Сеута",
"Timezone_Africa_Kinshasa": "Кіншаса",
"Timezone_Africa_Lubumbashi": "Лубумбашы",
"Timezone_America_Adak": "Адак",
@@ -955,7 +955,7 @@
"Timezone_America_Merida": "Мерыда",
"Timezone_America_Metlakatla": "Метлакатла",
"Timezone_America_MexicoCity": "Мехіка",
- "Timezone_America_Moncton": "Манктан",
+ "Timezone_America_Moncton": "Монктан",
"Timezone_America_Monterrey": "Мантэрэй",
"Timezone_America_NewYork": "Нью-Ёрк",
"Timezone_America_Nipigon": "Ніпіган",
@@ -965,10 +965,10 @@
"Timezone_America_NorthDakota_Center": "Сентэр, Паўночная Дакота",
"Timezone_America_NorthDakota_NewSalem": "Нью-Сейлем, Паўночная Дакота",
"Timezone_America_Ojinaga": "Ахінага",
- "Timezone_America_Pangnirtung": "Пангніртунг",
+ "Timezone_America_Pangnirtung": "Пангніртанг",
"Timezone_America_Phoenix": "Фінікс",
"Timezone_America_PortoVelho": "Порту-Велью",
- "Timezone_America_PuntaArenas": "Пунта Арэнас",
+ "Timezone_America_PuntaArenas": "Пунта-Арэнас",
"Timezone_America_RainyRiver": "Рэйні-Рывер",
"Timezone_America_RankinInlet": "Ранкін-Інлет",
"Timezone_America_Recife": "Рэсіфі",
@@ -979,11 +979,11 @@
"Timezone_America_Santarem": "Сантарэн",
"Timezone_America_Santiago": "Сант’яга",
"Timezone_America_SaoPaulo": "Сан-Паўлу",
- "Timezone_America_Scoresbysund": "Ітакортаарміут",
+ "Timezone_America_Scoresbysund": "Ітакартаарміт",
"Timezone_America_Sitka": "Сітка",
"Timezone_America_StJohns": "Сент-Джонс",
"Timezone_America_SwiftCurrent": "Свіфт-Керэнт",
- "Timezone_America_Thule": "Каанаак",
+ "Timezone_America_Thule": "Туле",
"Timezone_America_ThunderBay": "Тандэр-Бэй",
"Timezone_America_Tijuana": "Тыхуана",
"Timezone_America_Toronto": "Таронта",
@@ -991,7 +991,7 @@
"Timezone_America_Whitehorse": "Уайтхорс",
"Timezone_America_Winnipeg": "Вініпег",
"Timezone_America_Yakutat": "Якутат",
- "Timezone_America_Yellowknife": "Йелаўнайф",
+ "Timezone_America_Yellowknife": "Елаўнайф",
"Timezone_Antarctica_Casey": "Кэйсі",
"Timezone_Antarctica_Davis": "Дэйвіс",
"Timezone_Antarctica_DumontDUrville": "Дзюмон-Дзюрвіль",
@@ -1033,7 +1033,8 @@
"Timezone_Asia_Omsk": "Омск",
"Timezone_Asia_Oral": "Уральск",
"Timezone_Asia_Pontianak": "Пантыянак",
- "Timezone_Asia_Qyzylorda": "Кзыларда",
+ "Timezone_Asia_Qostanay": "Кустанай",
+ "Timezone_Asia_Qyzylorda": "Кзыл-Арда",
"Timezone_Asia_Rangoon": "Рангун",
"Timezone_Asia_Saigon": "Хашымін",
"Timezone_Asia_Sakhalin": "Сахалін",
@@ -1044,7 +1045,7 @@
"Timezone_Asia_Tomsk": "Томск",
"Timezone_Asia_Ulaanbaatar": "Улан-Батар",
"Timezone_Asia_Urumqi": "Урумчы",
- "Timezone_Asia_Ust-Nera": "Вусць-Нера",
+ "Timezone_Asia_Ust-Nera": "Усць-Нера",
"Timezone_Asia_Vladivostok": "Уладзівасток",
"Timezone_Asia_Yakutsk": "Якуцк",
"Timezone_Asia_Yekaterinburg": "Екацярынбург",
@@ -1083,7 +1084,7 @@
"Timezone_Pacific_Auckland": "Окленд",
"Timezone_Pacific_Bougainville": "Бугенвіль",
"Timezone_Pacific_Chatham": "Чатэм",
- "Timezone_Pacific_Easter": "Пасхі востраў",
+ "Timezone_Pacific_Easter": "Вялікадня востраў",
"Timezone_Pacific_Enderbury": "Эндэрберы",
"Timezone_Pacific_Galapagos": "Галапагас",
"Timezone_Pacific_Gambier": "Астравы Гамб’е",
@@ -1095,11 +1096,11 @@
"Timezone_Pacific_Majuro": "Маджура",
"Timezone_Pacific_Marquesas": "Маркізскія астравы",
"Timezone_Pacific_Midway": "Мідуэй",
- "Timezone_Pacific_Ponape": "Понпеі",
+ "Timezone_Pacific_Ponape": "Панпеі",
"Timezone_Pacific_PortMoresby": "Порт-Морсбі",
"Timezone_Pacific_Tahiti": "Таіці",
"Timezone_Pacific_Tarawa": "Тарава",
- "Timezone_Pacific_Truk": "Чуук",
+ "Timezone_Pacific_Truk": "Трук",
"Timezone_Pacific_Wake": "Уэйк",
"Today": "Сёння",
"Year_Short": "г.",
diff --git a/plugins/Intl/lang/bg.json b/plugins/Intl/lang/bg.json
index b7e9253cdd..6c83d7b24a 100644
--- a/plugins/Intl/lang/bg.json
+++ b/plugins/Intl/lang/bg.json
@@ -151,7 +151,7 @@
"Country_MF": "Сен Мартен",
"Country_MG": "Мадагаскар",
"Country_MH": "Маршалови острови",
- "Country_MK": "Македония",
+ "Country_MK": "Северна Македония",
"Country_ML": "Мали",
"Country_MM": "Мианмар (Бирма)",
"Country_MN": "Монголия",
@@ -220,7 +220,7 @@
"Country_SV": "Салвадор",
"Country_SX": "Синт Мартен",
"Country_SY": "Сирия",
- "Country_SZ": "Свазиленд",
+ "Country_SZ": "Есватини",
"Country_TC": "Острови Търкс и Кайкос",
"Country_TD": "Чад",
"Country_TF": "Френски южни територии",
@@ -530,7 +530,7 @@
"Currency_RSD": "Сръбски динар",
"Currency_RUB": "Руска рубла",
"Currency_RWF": "Руандски франк",
- "Currency_SAR": "Саудитскоарабски риал",
+ "Currency_SAR": "Саудитски риал",
"Currency_SBD": "Долар на Соломоновите острови",
"Currency_SCR": "Сейшелска рупия",
"Currency_SDG": "Суданска лира",
@@ -565,7 +565,7 @@
"Currency_XAF": "Централноафрикански франк",
"Currency_XCD": "Източнокарибски долар",
"Currency_XOF": "Западноафрикански франк",
- "Currency_XPF": "Френскополинезийски франк",
+ "Currency_XPF": "CFP франк",
"Currency_YER": "Йеменски риал",
"Currency_ZAR": "Южноафрикански ранд",
"Currency_ZMW": "Замбийска куача",
@@ -617,8 +617,8 @@
"Format_Date_Day_Month": "E, d.MM",
"Format_Date_Long": "EEEE, d MMMM y 'г'.",
"Format_Date_Short": "d.MM.y 'г'.",
- "Format_Hour_12": "h 'ч'. a",
- "Format_Hour_24": "H 'ч'.",
+ "Format_Hour_12": "h a",
+ "Format_Hour_24": "H",
"Format_Interval_Long_D": "d – d MMMM y 'г'.",
"Format_Interval_Long_M": "d MMMM – d MMMM y 'г'.",
"Format_Interval_Long_Y": "d MMMM y 'г'. – d MMMM y 'г'.",
@@ -628,8 +628,8 @@
"Format_Month_Long": "MMMM y 'г'.",
"Format_Month_Short": "MM.y 'г'.",
"Format_Time": "{time}",
- "Format_Time_12": "h:mm:ss 'ч'. a",
- "Format_Time_24": "H:mm:ss 'ч'.",
+ "Format_Time_12": "h:mm:ss a",
+ "Format_Time_24": "H:mm:ss",
"Format_Year": "y 'г'.",
"Hours": "часове",
"Language_aa": "Афарски",
@@ -681,7 +681,7 @@
"Language_fr": "Френски",
"Language_fy": "Западнофризийски",
"Language_ga": "Ирландски",
- "Language_gd": "Шотландски галски",
+ "Language_gd": "Шотландски келтски",
"Language_gl": "Галисийски",
"Language_gn": "Гуарани",
"Language_gu": "Гуджарати",
@@ -699,7 +699,7 @@
"Language_id": "Индонезийски",
"Language_ie": "Оксидентал",
"Language_ig": "Игбо",
- "Language_ii": "Съчуански и",
+ "Language_ii": "Съчуански йи",
"Language_ik": "Инупиак",
"Language_io": "Идо",
"Language_is": "Исландски",
@@ -756,7 +756,7 @@
"Language_oj": "Оджибва",
"Language_om": "Оромо",
"Language_or": "Ория",
- "Language_os": "Осетски",
+ "Language_os": "Осетински",
"Language_pa": "Пенджабски",
"Language_pi": "Пали",
"Language_pl": "Полски",
@@ -782,7 +782,7 @@
"Language_sq": "Албански",
"Language_sr": "Сръбски",
"Language_ss": "Свати",
- "Language_st": "Сесото",
+ "Language_st": "Сото",
"Language_su": "Сундански",
"Language_sv": "Шведски",
"Language_sw": "Суахили",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Омск",
"Timezone_Asia_Oral": "Арал",
"Timezone_Asia_Pontianak": "Понтианак",
+ "Timezone_Asia_Qostanay": "Костанай",
"Timezone_Asia_Qyzylorda": "Къзълорда",
"Timezone_Asia_Rangoon": "Рангун",
"Timezone_Asia_Saigon": "Хошимин",
diff --git a/plugins/Intl/lang/bn.json b/plugins/Intl/lang/bn.json
index 7764cc1f93..8ca95bc077 100644
--- a/plugins/Intl/lang/bn.json
+++ b/plugins/Intl/lang/bn.json
@@ -151,7 +151,7 @@
"Country_MF": "সেন্ট মার্টিন",
"Country_MG": "মাদাগাস্কার",
"Country_MH": "মার্শাল দ্বীপপুঞ্জ",
- "Country_MK": "ম্যাসাডোনিয়া",
+ "Country_MK": "উত্তর ম্যাসেডোনিয়া",
"Country_ML": "মালি",
"Country_MM": "মায়ানমার (বার্মা)",
"Country_MN": "মঙ্গোলিয়া",
@@ -220,7 +220,7 @@
"Country_SV": "এল সালভেদর",
"Country_SX": "সিন্ট মার্টেন",
"Country_SY": "সিরিয়া",
- "Country_SZ": "সোয়াজিল্যান্ড",
+ "Country_SZ": "ইসওয়াতিনি",
"Country_TC": "তুর্কস ও কাইকোস দ্বীপপুঞ্জ",
"Country_TD": "চাদ",
"Country_TF": "ফরাসী দক্ষিণাঞ্চল",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "ওম্স্ক",
"Timezone_Asia_Oral": "ওরাল",
"Timezone_Asia_Pontianak": "পন্টিয়ান্যাক",
+ "Timezone_Asia_Qostanay": "কোস্টানয়",
"Timezone_Asia_Qyzylorda": "কিজিলর্ডা",
"Timezone_Asia_Rangoon": "রেঙ্গুন",
"Timezone_Asia_Saigon": "হো চি মিন শহর",
diff --git a/plugins/Intl/lang/bs.json b/plugins/Intl/lang/bs.json
index 923f50633e..53e710e67d 100644
--- a/plugins/Intl/lang/bs.json
+++ b/plugins/Intl/lang/bs.json
@@ -84,7 +84,7 @@
"Country_FO": "Farska ostrva",
"Country_FR": "Francuska",
"Country_GA": "Gabon",
- "Country_GB": "Velika Britanija",
+ "Country_GB": "Ujedinjeno Kraljevstvo",
"Country_GD": "Grenada",
"Country_GE": "Gruzija",
"Country_GF": "Francuska Gvajana",
@@ -151,7 +151,7 @@
"Country_MF": "Sveti Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Maršalova ostrva",
- "Country_MK": "Makedonija",
+ "Country_MK": "Sjeverna Makedonija",
"Country_ML": "Mali",
"Country_MM": "Mjanmar",
"Country_MN": "Mongolija",
@@ -220,7 +220,7 @@
"Country_SV": "Salvador",
"Country_SX": "Sint Marten",
"Country_SY": "Sirija",
- "Country_SZ": "Svazilend",
+ "Country_SZ": "Esvatini",
"Country_TC": "Ostrva Turks i Kaikos",
"Country_TD": "Čad",
"Country_TF": "Francuske Južne Teritorije",
@@ -240,7 +240,7 @@
"Country_UA": "Ukrajina",
"Country_UG": "Uganda",
"Country_UM": "Američka Vanjska Ostrva",
- "Country_US": "Sjedinjene Američke Države",
+ "Country_US": "Sjedinjene Države",
"Country_UY": "Urugvaj",
"Country_UZ": "Uzbekistan",
"Country_VA": "Vatikan",
@@ -755,7 +755,7 @@
"Language_oc": "Oksitanski",
"Language_oj": "Ojibva",
"Language_om": "Oromo",
- "Language_or": "Orijski",
+ "Language_or": "Odija",
"Language_os": "Osetski",
"Language_pa": "Pandžapski",
"Language_pi": "Pali",
@@ -1016,7 +1016,7 @@
"Timezone_Asia_Anadyr": "Anadir",
"Timezone_Asia_Aqtau": "Aktau",
"Timezone_Asia_Aqtobe": "Akutobe",
- "Timezone_Asia_Atyrau": "Atyrau",
+ "Timezone_Asia_Atyrau": "Atiraj",
"Timezone_Asia_Barnaul": "Barnaul",
"Timezone_Asia_Calcutta": "Kolkata",
"Timezone_Asia_Chita": "Chita",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanaj",
"Timezone_Asia_Qyzylorda": "Kizilorda",
"Timezone_Asia_Rangoon": "Rangun",
"Timezone_Asia_Saigon": "Ho Ši Min",
diff --git a/plugins/Intl/lang/ca.json b/plugins/Intl/lang/ca.json
index 2b18f9158a..3ae1a25f07 100644
--- a/plugins/Intl/lang/ca.json
+++ b/plugins/Intl/lang/ca.json
@@ -26,7 +26,7 @@
"Country_AZ": "Azerbaidjan",
"Country_BA": "Bòsnia i Hercegovina",
"Country_BB": "Barbados",
- "Country_BD": "Bangla Desh",
+ "Country_BD": "Bangladesh",
"Country_BE": "Bèlgica",
"Country_BF": "Burkina Faso",
"Country_BG": "Bulgària",
@@ -51,7 +51,7 @@
"Country_CF": "República Centreafricana",
"Country_CG": "Congo - Brazzaville",
"Country_CH": "Suïssa",
- "Country_CI": "Costa d’Ivori",
+ "Country_CI": "Côte d’Ivoire",
"Country_CK": "Illes Cook",
"Country_CL": "Xile",
"Country_CM": "Camerun",
@@ -91,7 +91,7 @@
"Country_GG": "Guernsey",
"Country_GH": "Ghana",
"Country_GI": "Gibraltar",
- "Country_GL": "Grenlàndia",
+ "Country_GL": "Groenlàndia",
"Country_GM": "Gàmbia",
"Country_GN": "Guinea",
"Country_GP": "Guadeloupe",
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagascar",
"Country_MH": "Illes Marshall",
- "Country_MK": "Macedònia",
+ "Country_MK": "Macedònia del Nord",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Birmània)",
"Country_MN": "Mongòlia",
@@ -220,7 +220,7 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Síria",
- "Country_SZ": "Swazilàndia",
+ "Country_SZ": "ESwatini",
"Country_TC": "Illes Turks i Caicos",
"Country_TD": "Txad",
"Country_TF": "Territoris Australs Francesos",
@@ -325,7 +325,7 @@
"CurrencySymbol_ISK": "ISK",
"CurrencySymbol_JMD": "JMD",
"CurrencySymbol_JOD": "JOD",
- "CurrencySymbol_JPY": "JP¥",
+ "CurrencySymbol_JPY": "¥",
"CurrencySymbol_KES": "KES",
"CurrencySymbol_KGS": "KGS",
"CurrencySymbol_KHR": "KHR",
@@ -542,7 +542,7 @@
"Currency_SRD": "Dòlar de Surinam",
"Currency_SSP": "Lliura del Sudan del Sud",
"Currency_STN": "Dobra de São Tomé i Príncipe",
- "Currency_SYP": "Lliura síria",
+ "Currency_SYP": "Lliura siriana",
"Currency_SZL": "Lilangeni swazi",
"Currency_THB": "Baht tailandès",
"Currency_TJS": "Somoni tadjik",
@@ -892,8 +892,8 @@
"PeriodYear": "any",
"PeriodYears": "anys",
"Seconds": "segons",
- "Time_AM": "a. m.",
- "Time_PM": "p. m.",
+ "Time_AM": "a. m.",
+ "Time_PM": "p. m.",
"Timezone_Africa_Asmera": "Asmara",
"Timezone_Africa_Ceuta": "Ceuta",
"Timezone_Africa_Kinshasa": "Kinshasa",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanai",
"Timezone_Asia_Qyzylorda": "Kizil-Orda",
"Timezone_Asia_Rangoon": "Yangôn",
"Timezone_Asia_Saigon": "Ho Chi Minh",
@@ -1056,7 +1057,7 @@
"Timezone_Asia_Ust-Nera": "Ust’-Nera",
"Timezone_Asia_Vladivostok": "Vladivostok",
"Timezone_Asia_Yakutsk": "Jakutsk",
- "Timezone_Asia_Yekaterinburg": "Jekaterinburg",
+ "Timezone_Asia_Yekaterinburg": "Iekaterinburg",
"Timezone_Atlantic_Azores": "Açores",
"Timezone_Atlantic_Canary": "Illes Canàries",
"Timezone_Atlantic_Faeroe": "Illes Fèroe",
diff --git a/plugins/Intl/lang/cs.json b/plugins/Intl/lang/cs.json
index 51c819d93f..af966481d1 100644
--- a/plugins/Intl/lang/cs.json
+++ b/plugins/Intl/lang/cs.json
@@ -151,7 +151,7 @@
"Country_MF": "Svatý Martin (Francie)",
"Country_MG": "Madagaskar",
"Country_MH": "Marshallovy ostrovy",
- "Country_MK": "Makedonie",
+ "Country_MK": "Severní Makedonie",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Barma)",
"Country_MN": "Mongolsko",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Uralsk",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanaj",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Rangún",
"Timezone_Asia_Saigon": "Ho Či Minovo město",
diff --git a/plugins/Intl/lang/cy.json b/plugins/Intl/lang/cy.json
index 92b0fdd398..13882783fc 100644
--- a/plugins/Intl/lang/cy.json
+++ b/plugins/Intl/lang/cy.json
@@ -24,7 +24,7 @@
"Country_AW": "Aruba",
"Country_AX": "Ynysoedd Åland",
"Country_AZ": "Azerbaijan",
- "Country_BA": "Bosnia & Herzegovina",
+ "Country_BA": "Bosnia a Herzegovina",
"Country_BB": "Barbados",
"Country_BD": "Bangladesh",
"Country_BE": "Gwlad Belg",
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagascar",
"Country_MH": "Ynysoedd Marshall",
- "Country_MK": "Macedonia",
+ "Country_MK": "Gogledd Macedonia",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Mongolia",
@@ -220,7 +220,7 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Syria",
- "Country_SZ": "Gwlad Swazi",
+ "Country_SZ": "Eswatini",
"Country_TC": "Ynysoedd Turks a Caicos",
"Country_TD": "Tchad",
"Country_TF": "Tiroedd Deheuol ac Antarctig Ffrainc",
@@ -521,7 +521,7 @@
"Currency_PAB": "Balboa Panama",
"Currency_PEN": "Sol Periw",
"Currency_PGK": "Kina Papua Guinea Newydd",
- "Currency_PHP": "Peso’r Philipinau",
+ "Currency_PHP": "Peso Philipinas",
"Currency_PKR": "Rwpî Pacistan",
"Currency_PLN": "Zloty Gwlad Pwyl",
"Currency_PYG": "Guarani Paraguay",
@@ -790,7 +790,7 @@
"Language_tg": "Tajiceg",
"Language_th": "Thai",
"Language_ti": "Tigrinya",
- "Language_tk": "Twrcmeneg",
+ "Language_tk": "Tyrcmeneg",
"Language_tl": "Tagalog",
"Language_tn": "Tswana",
"Language_to": "Tongeg",
@@ -811,7 +811,7 @@
"Language_xh": "Xhosa",
"Language_yi": "Iddew-Almaeneg",
"Language_yo": "Iorwba",
- "Language_zh": "Tsieineeg",
+ "Language_zh": "Tsieinëeg",
"Language_zu": "Swlw",
"LayoutDirection": "ltr",
"Minutes": "munudau",
@@ -845,7 +845,7 @@
"Month_Short_12": "Rhag",
"Month_Short_2": "Chwef",
"Month_Short_3": "Maw",
- "Month_Short_4": "Ebrill",
+ "Month_Short_4": "Ebr",
"Month_Short_5": "Mai",
"Month_Short_6": "Meh",
"Month_Short_7": "Gorff",
@@ -892,7 +892,7 @@
"Seconds": "eiliadau",
"Time_AM": "yb",
"Time_PM": "yh",
- "Timezone_Africa_Asmera": "Asmera",
+ "Timezone_Africa_Asmera": "Asmara",
"Timezone_Africa_Ceuta": "Ceuta",
"Timezone_Africa_Kinshasa": "Kinshasa",
"Timezone_Africa_Lubumbashi": "Lubumbashi",
@@ -1040,6 +1040,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Dinas Hô Chi Minh",
@@ -1086,7 +1087,7 @@
"Timezone_Europe_Ulyanovsk": "Ulyanovsk",
"Timezone_Europe_Uzhgorod": "Uzhhorod",
"Timezone_Europe_Volgograd": "Volgograd",
- "Timezone_Europe_Zaporozhye": "Zaporizhzhya",
+ "Timezone_Europe_Zaporozhye": "Zaporozhye",
"Timezone_Pacific_Auckland": "Auckland",
"Timezone_Pacific_Bougainville": "Bougainville",
"Timezone_Pacific_Chatham": "Chatham",
diff --git a/plugins/Intl/lang/da.json b/plugins/Intl/lang/da.json
index c97fdb6a7a..c9d3b6c459 100644
--- a/plugins/Intl/lang/da.json
+++ b/plugins/Intl/lang/da.json
@@ -113,7 +113,7 @@
"Country_IL": "Israel",
"Country_IM": "Isle of Man",
"Country_IN": "Indien",
- "Country_IO": "Det britiske territorium i Det Indiske Ocean",
+ "Country_IO": "Det Britiske Territorium i Det Indiske Ocean",
"Country_IQ": "Irak",
"Country_IR": "Iran",
"Country_IS": "Island",
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshalløerne",
- "Country_MK": "Makedonien",
+ "Country_MK": "Nordmakedonien",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Mongoliet",
@@ -220,10 +220,10 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Syrien",
- "Country_SZ": "Swaziland",
+ "Country_SZ": "Eswatini",
"Country_TC": "Turks- og Caicosøerne",
"Country_TD": "Tchad",
- "Country_TF": "De Franske Besiddelser i Det Sydlige Indiske Ocean",
+ "Country_TF": "De Franske Besiddelser i Det Sydlige Indiske Ocean og Antarktis",
"Country_TG": "Togo",
"Country_TH": "Thailand",
"Country_TJ": "Tadsjikistan",
@@ -399,7 +399,7 @@
"CurrencySymbol_TZS": "TZS",
"CurrencySymbol_UAH": "UAH",
"CurrencySymbol_UGX": "UGX",
- "CurrencySymbol_USD": "$",
+ "CurrencySymbol_USD": "US$",
"CurrencySymbol_UYU": "UYU",
"CurrencySymbol_UZS": "UZS",
"CurrencySymbol_VEF": "VEF",
@@ -468,7 +468,7 @@
"Currency_GNF": "Guineansk franc",
"Currency_GTQ": "Guatemalansk quetzal",
"Currency_GYD": "Guyansk dollar",
- "Currency_HKD": "Hongkong dollar",
+ "Currency_HKD": "Hongkongsk dollar",
"Currency_HNL": "Honduransk lempira",
"Currency_HRK": "Kroatisk kuna",
"Currency_HTG": "Haitisk gourde",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Rangoon",
"Timezone_Asia_Saigon": "Ho Chi Minh City",
diff --git a/plugins/Intl/lang/de.json b/plugins/Intl/lang/de.json
index 0387093b47..30a4e0697c 100644
--- a/plugins/Intl/lang/de.json
+++ b/plugins/Intl/lang/de.json
@@ -151,7 +151,7 @@
"Country_MF": "St. Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshallinseln",
- "Country_MK": "Mazedonien",
+ "Country_MK": "Nordmazedonien",
"Country_ML": "Mali",
"Country_MM": "Myanmar",
"Country_MN": "Mongolei",
@@ -220,7 +220,7 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Syrien",
- "Country_SZ": "Swasiland",
+ "Country_SZ": "Eswatini",
"Country_TC": "Turks- und Caicosinseln",
"Country_TD": "Tschad",
"Country_TF": "Französische Süd- und Antarktisgebiete",
@@ -870,7 +870,7 @@
"NMinutes": "%s Minuten",
"NMinutesShort": "%s Min.",
"NSeconds": "%s Sekunden",
- "NSecondsShort": "%s s",
+ "NSecondsShort": "%s Sek.",
"NumberFormatCurrency": "#,##0.00 ¤",
"NumberFormatNumber": "#,##0.###",
"NumberFormatPercent": "#,##0 %",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Qostanai",
"Timezone_Asia_Qyzylorda": "Qysylorda",
"Timezone_Asia_Rangoon": "Rangun",
"Timezone_Asia_Saigon": "Ho-Chi-Minh-Stadt",
diff --git a/plugins/Intl/lang/el.json b/plugins/Intl/lang/el.json
index fe7f6eaa68..057974331a 100644
--- a/plugins/Intl/lang/el.json
+++ b/plugins/Intl/lang/el.json
@@ -151,7 +151,7 @@
"Country_MF": "Άγιος Μαρτίνος (Γαλλικό τμήμα)",
"Country_MG": "Μαδαγασκάρη",
"Country_MH": "Νήσοι Μάρσαλ",
- "Country_MK": "Πρώην Γιουγκοσλαβική Δημοκρατία της Μακεδονίας",
+ "Country_MK": "Βόρεια Μακεδονία",
"Country_ML": "Μάλι",
"Country_MM": "Μιανμάρ (Βιρμανία)",
"Country_MN": "Μογγολία",
@@ -734,7 +734,7 @@
"Language_mg": "Μαλγασικά",
"Language_mh": "Μαρσαλέζικα",
"Language_mi": "Μαορί",
- "Language_mk": "Σλαβομακεδονικά",
+ "Language_mk": "Μακεδονικά",
"Language_ml": "Μαλαγιαλαμικά",
"Language_mn": "Μογγολικά",
"Language_mr": "Μαραθικά",
@@ -981,7 +981,7 @@
"Timezone_America_RainyRiver": "Ρέινι Ρίβερ",
"Timezone_America_RankinInlet": "Ράνκιν Ίνλετ",
"Timezone_America_Recife": "Ρεσίφε",
- "Timezone_America_Regina": "Ρετζίνα",
+ "Timezone_America_Regina": "Ρετζάινα",
"Timezone_America_Resolute": "Ρέζολουτ",
"Timezone_America_RioBranco": "Ρίο Μπράνκο",
"Timezone_America_SantaIsabel": "Σάντα Ιζαμπέλ",
@@ -999,7 +999,7 @@
"Timezone_America_Vancouver": "Βανκούβερ",
"Timezone_America_Whitehorse": "Γουάιτχορς",
"Timezone_America_Winnipeg": "Γουίνιπεγκ",
- "Timezone_America_Yakutat": "Γιακούτατ",
+ "Timezone_America_Yakutat": "Γιάκουτατ",
"Timezone_America_Yellowknife": "Γέλοουναϊφ",
"Timezone_Antarctica_Casey": "Κάσεϊ",
"Timezone_Antarctica_Davis": "Ντέιβις",
@@ -1016,7 +1016,7 @@
"Timezone_Asia_Anadyr": "Αναντίρ",
"Timezone_Asia_Aqtau": "Ακτάου",
"Timezone_Asia_Aqtobe": "Ακτόμπε",
- "Timezone_Asia_Atyrau": "Aτιράου",
+ "Timezone_Asia_Atyrau": "Ατιράου",
"Timezone_Asia_Barnaul": "Μπαρναούλ",
"Timezone_Asia_Calcutta": "Καλκούτα",
"Timezone_Asia_Chita": "Τσιτά",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Ομσκ",
"Timezone_Asia_Oral": "Οράλ",
"Timezone_Asia_Pontianak": "Πόντιανακ",
+ "Timezone_Asia_Qostanay": "Κοστανάι",
"Timezone_Asia_Qyzylorda": "Κιζιλορντά",
"Timezone_Asia_Rangoon": "Ρανγκούν",
"Timezone_Asia_Saigon": "Πόλη Χο Τσι Μινχ",
diff --git a/plugins/Intl/lang/en.json b/plugins/Intl/lang/en.json
index 38a05bfea1..502781f177 100644
--- a/plugins/Intl/lang/en.json
+++ b/plugins/Intl/lang/en.json
@@ -151,11 +151,11 @@
"Country_MF": "St. Martin",
"Country_MG": "Madagascar",
"Country_MH": "Marshall Islands",
- "Country_MK": "Macedonia",
+ "Country_MK": "North Macedonia",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Mongolia",
- "Country_MO": "Macau SAR China",
+ "Country_MO": "Macao SAR China",
"Country_MP": "Northern Mariana Islands",
"Country_MQ": "Martinique",
"Country_MR": "Mauritania",
@@ -220,7 +220,7 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Syria",
- "Country_SZ": "Swaziland",
+ "Country_SZ": "Eswatini",
"Country_TC": "Turks & Caicos Islands",
"Country_TD": "Chad",
"Country_TF": "French Southern Territories",
@@ -1041,6 +1041,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Ho Chi Minh City",
diff --git a/plugins/Intl/lang/eo.json b/plugins/Intl/lang/eo.json
index 26e5788038..4890f32a57 100644
--- a/plugins/Intl/lang/eo.json
+++ b/plugins/Intl/lang/eo.json
@@ -128,7 +128,6 @@
"Country_MD": "Moldavujo",
"Country_MG": "Madagaskaro",
"Country_MH": "Marŝaloj",
- "Country_MK": "Makedonujo",
"Country_ML": "Malio",
"Country_MM": "Mjanmao",
"Country_MN": "Mongolujo",
@@ -966,6 +965,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Qostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Ho Chi Minh",
diff --git a/plugins/Intl/lang/es-ar.json b/plugins/Intl/lang/es-ar.json
index e6b88a6df7..001ad519e3 100644
--- a/plugins/Intl/lang/es-ar.json
+++ b/plugins/Intl/lang/es-ar.json
@@ -151,7 +151,7 @@
"Country_MF": "San Martín",
"Country_MG": "Madagascar",
"Country_MH": "Islas Marshall",
- "Country_MK": "Macedonia",
+ "Country_MK": "Macedonia del Norte",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Birmania)",
"Country_MN": "Mongolia",
@@ -220,7 +220,7 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Siria",
- "Country_SZ": "Suazilandia",
+ "Country_SZ": "Esuatini",
"Country_TC": "Islas Turcas y Caicos",
"Country_TD": "Chad",
"Country_TF": "Territorios Australes Franceses",
@@ -416,7 +416,7 @@
"Currency_AED": "Dírham de los Emiratos Árabes Unidos",
"Currency_AFN": "Afgani",
"Currency_ALL": "Lek",
- "Currency_AMD": "Dram armenio",
+ "Currency_AMD": "Dram",
"Currency_ANG": "Florín de las Antillas Neerlandesas",
"Currency_AOA": "Kuanza",
"Currency_ARS": "Peso argentino",
@@ -455,7 +455,7 @@
"Currency_DOP": "Peso dominicano",
"Currency_DZD": "Dinar argelino",
"Currency_EGP": "Libra egipcia",
- "Currency_ERN": "Nafka",
+ "Currency_ERN": "Nakfa",
"Currency_ETB": "Bir",
"Currency_EUR": "Euro",
"Currency_FJD": "Dólar fiyiano",
@@ -509,7 +509,7 @@
"Currency_MVR": "Rufiya",
"Currency_MWK": "Kwacha malauí",
"Currency_MXN": "Peso mexicano",
- "Currency_MYR": "Ringgit malayo",
+ "Currency_MYR": "Ringit",
"Currency_MZN": "Metical",
"Currency_NAD": "Dólar namibio",
"Currency_NGN": "Naira",
@@ -558,13 +558,13 @@
"Currency_USD": "Dólar estadounidense",
"Currency_UYU": "Peso uruguayo",
"Currency_UZS": "Som uzbeko",
- "Currency_VEF": "Bolívar venezolano",
+ "Currency_VEF": "Bolívar venezolano (2008–2018)",
"Currency_VND": "Dong",
"Currency_VUV": "Vatu",
"Currency_WST": "Tala",
- "Currency_XAF": "Franco CFA BEAC",
+ "Currency_XAF": "Franco CFA de África Central",
"Currency_XCD": "Dólar del Caribe Oriental",
- "Currency_XOF": "Franco CFA BCEAO",
+ "Currency_XOF": "Franco CFA de África Occidental",
"Currency_XPF": "Franco CFP",
"Currency_YER": "Rial yemení",
"Currency_ZAR": "Rand",
@@ -892,8 +892,8 @@
"PeriodYear": "año",
"PeriodYears": "años",
"Seconds": "segundos",
- "Time_AM": "a. m.",
- "Time_PM": "p. m.",
+ "Time_AM": "a. m.",
+ "Time_PM": "p. m.",
"Timezone_Africa_Asmera": "Asmara",
"Timezone_Africa_Ceuta": "Ceuta",
"Timezone_Africa_Kinshasa": "Kinshasa",
@@ -986,8 +986,8 @@
"Timezone_America_RioBranco": "Río Branco",
"Timezone_America_SantaIsabel": "Santa Isabel",
"Timezone_America_Santarem": "Santarém",
- "Timezone_America_Santiago": "Santiago de Chile",
- "Timezone_America_SaoPaulo": "San Pablo",
+ "Timezone_America_Santiago": "Santiago",
+ "Timezone_America_SaoPaulo": "São Paulo",
"Timezone_America_Scoresbysund": "Ittoqqortoormiit",
"Timezone_America_Sitka": "Sitka",
"Timezone_America_StJohns": "San Juan de Terranova",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanái",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Yangón (Rangún)",
"Timezone_Asia_Saigon": "Ciudad Ho Chi Minh",
diff --git a/plugins/Intl/lang/es.json b/plugins/Intl/lang/es.json
index ceec9afb2c..f0f61b8bdc 100644
--- a/plugins/Intl/lang/es.json
+++ b/plugins/Intl/lang/es.json
@@ -151,7 +151,7 @@
"Country_MF": "San Martín",
"Country_MG": "Madagascar",
"Country_MH": "Islas Marshall",
- "Country_MK": "Macedonia",
+ "Country_MK": "Macedonia del Norte",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Birmania)",
"Country_MN": "Mongolia",
@@ -220,7 +220,7 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Siria",
- "Country_SZ": "Suazilandia",
+ "Country_SZ": "Esuatini",
"Country_TC": "Islas Turcas y Caicos",
"Country_TD": "Chad",
"Country_TF": "Territorios Australes Franceses",
@@ -507,7 +507,7 @@
"Currency_MRU": "Uguiya",
"Currency_MUR": "Rupia mauriciana",
"Currency_MVR": "Rufiya",
- "Currency_MWK": "Kwacha malauí",
+ "Currency_MWK": "Kuacha malauí",
"Currency_MXN": "Peso mexicano",
"Currency_MYR": "Ringit",
"Currency_MZN": "Metical",
@@ -568,7 +568,7 @@
"Currency_XPF": "Franco CFP",
"Currency_YER": "Rial yemení",
"Currency_ZAR": "Rand",
- "Currency_ZMW": "Kwacha zambiano",
+ "Currency_ZMW": "Kuacha zambiano",
"Day_Long_1": "lunes",
"Day_Long_2": "martes",
"Day_Long_3": "miércoles",
@@ -757,7 +757,7 @@
"Language_om": "Oromo",
"Language_or": "Oriya",
"Language_os": "Osético",
- "Language_pa": "Panyabí",
+ "Language_pa": "Punyabí",
"Language_pi": "Pali",
"Language_pl": "Polaco",
"Language_ps": "Pastún",
@@ -866,11 +866,11 @@
"Month_Short_StandAlone_8": "ago.",
"Month_Short_StandAlone_9": "sept.",
"NDays": "%s días",
- "NHoursShort": "%sh",
+ "NHoursShort": "%s h",
"NMinutes": "%s minutos",
"NMinutesShort": "%s min",
"NSeconds": "%s segundos",
- "NSecondsShort": "%ss",
+ "NSecondsShort": "%s s",
"NumberFormatCurrency": "#,##0.00 ¤",
"NumberFormatNumber": "#,##0.###",
"NumberFormatPercent": "#,##0 %",
@@ -892,8 +892,8 @@
"PeriodYear": "año",
"PeriodYears": "años",
"Seconds": "segundos",
- "Time_AM": "a. m.",
- "Time_PM": "p. m.",
+ "Time_AM": "a. m.",
+ "Time_PM": "p. m.",
"Timezone_Africa_Asmera": "Asmara",
"Timezone_Africa_Ceuta": "Ceuta",
"Timezone_Africa_Kinshasa": "Kinshasa",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanái",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Yangón (Rangún)",
"Timezone_Asia_Saigon": "Ciudad Ho Chi Minh",
@@ -1058,7 +1059,7 @@
"Timezone_Asia_Yakutsk": "Yakutsk",
"Timezone_Asia_Yekaterinburg": "Ekaterimburgo",
"Timezone_Atlantic_Azores": "Azores",
- "Timezone_Atlantic_Canary": "Islas Canarias",
+ "Timezone_Atlantic_Canary": "Canarias",
"Timezone_Atlantic_Faeroe": "Islas Feroe",
"Timezone_Atlantic_Madeira": "Madeira",
"Timezone_Australia_Adelaide": "Adelaida",
diff --git a/plugins/Intl/lang/et.json b/plugins/Intl/lang/et.json
index a9c7de17ea..00847570ad 100644
--- a/plugins/Intl/lang/et.json
+++ b/plugins/Intl/lang/et.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint-Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshalli Saared",
- "Country_MK": "Makedoonia",
+ "Country_MK": "Põhja-Makedoonia",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Birma)",
"Country_MN": "Mongoolia",
@@ -699,7 +699,7 @@
"Language_id": "Indoneesia",
"Language_ie": "Interlingue",
"Language_ig": "Ibo",
- "Language_ii": "Sichuani jii",
+ "Language_ii": "Nuosu",
"Language_ik": "Injupiaki",
"Language_io": "Ido",
"Language_is": "Islandi",
@@ -729,7 +729,7 @@
"Language_ln": "Lingala",
"Language_lo": "Lao",
"Language_lt": "Leedu",
- "Language_lu": "Luba",
+ "Language_lu": "Katanga luba",
"Language_lv": "Läti",
"Language_mg": "Malagassi",
"Language_mh": "Maršalli",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanaj",
"Timezone_Asia_Qyzylorda": "Kõzõlorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Ho Chi Minh",
diff --git a/plugins/Intl/lang/eu.json b/plugins/Intl/lang/eu.json
index cb0a6c025f..50d6b3a718 100644
--- a/plugins/Intl/lang/eu.json
+++ b/plugins/Intl/lang/eu.json
@@ -151,7 +151,7 @@
"Country_MF": "San Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshall Uharteak",
- "Country_MK": "Mazedonia",
+ "Country_MK": "Ipar Mazedonia",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Birmania)",
"Country_MN": "Mongolia",
@@ -414,161 +414,161 @@
"CurrencySymbol_ZAR": "ZAR",
"CurrencySymbol_ZMW": "ZMW",
"Currency_AED": "Arabiar Emirerri Batuetako dirhama",
- "Currency_AFN": "Afganistango afghania",
- "Currency_ALL": "Albaniako leka",
- "Currency_AMD": "Armeniako drama",
- "Currency_ANG": "Holandarren Antilletako guilderra",
- "Currency_AOA": "Angolako kwanza",
- "Currency_ARS": "Argentinako pesoa",
- "Currency_AUD": "Australiako dolarra",
- "Currency_AWG": "Arubako florina",
- "Currency_AZN": "Azerbaijango manata",
- "Currency_BAM": "Bosnia-Herzegovinako marko trukakorra",
- "Currency_BBD": "Barbadosetako dolarra",
- "Currency_BDT": "Bangladesheko taka",
- "Currency_BGN": "Bulgariako leva",
- "Currency_BHD": "Bahraingo dinarra",
- "Currency_BIF": "Burundiko frankoa",
- "Currency_BMD": "Bermudetako dolarra",
- "Currency_BND": "Bruneiko dolarra",
- "Currency_BOB": "Boliviako bolivianoa",
- "Currency_BRL": "Brasilgo erreala",
- "Currency_BSD": "Bahametako dolarra",
+ "Currency_AFN": "Afgani afganiarra",
+ "Currency_ALL": "Lek albaniarra",
+ "Currency_AMD": "Dram armeniarra",
+ "Currency_ANG": "Holandarren Antilletako florina",
+ "Currency_AOA": "Kwanza angolarra",
+ "Currency_ARS": "Peso argentinarra",
+ "Currency_AUD": "Dolar australiarra",
+ "Currency_AWG": "Florin arubarra",
+ "Currency_AZN": "Manat azerbaijandarra",
+ "Currency_BAM": "Marko bihurgarri bosniarra",
+ "Currency_BBD": "Dolar barbadostarra",
+ "Currency_BDT": "Taka bangladeshtarra",
+ "Currency_BGN": "Lev bulgariarra",
+ "Currency_BHD": "Dinar bahraindarra",
+ "Currency_BIF": "Franko burundiarra",
+ "Currency_BMD": "Dolar bermudarra",
+ "Currency_BND": "Dolar bruneitarra",
+ "Currency_BOB": "Boliviano boliviarra",
+ "Currency_BRL": "Erreal brasildarra",
+ "Currency_BSD": "Dolar bahamarra",
"Currency_BTC": "Bitcoin",
- "Currency_BTN": "Bhutango ngultruma",
- "Currency_BWP": "Bosniako pula",
- "Currency_BYN": "Bielorrusiako errubloa",
- "Currency_BZD": "Belizeko dolarra",
- "Currency_CAD": "Kanadako dolarra",
- "Currency_CDF": "Kongoko frankoa",
- "Currency_CHF": "Suitzako frankoa",
- "Currency_CLP": "Txileko pesoa",
- "Currency_CNY": "Txinako yuana",
- "Currency_COP": "Kolonbiako pesoa",
+ "Currency_BTN": "Ngultrum bhutandarra",
+ "Currency_BWP": "Pula botswanarra",
+ "Currency_BYN": "Errublo bielorrusiarra",
+ "Currency_BZD": "Dolar belizetarra",
+ "Currency_CAD": "Dolar kanadarra",
+ "Currency_CDF": "Franko kongoarra",
+ "Currency_CHF": "Franko suitzarra",
+ "Currency_CLP": "Peso txiletarra",
+ "Currency_CNY": "Yuan txinatarra",
+ "Currency_COP": "Peso kolonbiarra",
"Currency_CRC": "Costa Ricako colona",
- "Currency_CUC": "Kubako peso trukakorra",
- "Currency_CUP": "Kubako pesoa",
- "Currency_CVE": "Cabo Verdeko ezkutua",
- "Currency_CZK": "Txekiar Errepublikako koroa",
- "Currency_DJF": "Djibutiko frankoa",
- "Currency_DKK": "Danimarkako koroa",
- "Currency_DOP": "Dominikar Errepublikako pesoa",
- "Currency_DZD": "Aljeriako dinarra",
- "Currency_EGP": "Egiptoko libera",
- "Currency_ERN": "Eritreako nakfa",
- "Currency_ETB": "Etiopiako birra",
+ "Currency_CUC": "Peso bihurgarri kubatarra",
+ "Currency_CUP": "Peso kubatarra",
+ "Currency_CVE": "Ezkutu caboverdetarra",
+ "Currency_CZK": "Koroa txekiarra",
+ "Currency_DJF": "Franko djibutiarra",
+ "Currency_DKK": "Koroa danimarkarra",
+ "Currency_DOP": "Peso dominikarra",
+ "Currency_DZD": "Dinar aljeriarra",
+ "Currency_EGP": "Libera egiptoarra",
+ "Currency_ERN": "Nakfa eritrearra",
+ "Currency_ETB": "Birr etiopiarra",
"Currency_EUR": "Euroa",
- "Currency_FJD": "Fijiko dolarra",
- "Currency_FKP": "Falkland uharteetako libera",
+ "Currency_FJD": "Dolar fijiarra",
+ "Currency_FKP": "Libera falklandarra",
"Currency_GBP": "Libera esterlina",
- "Currency_GEL": "Georgiako laria",
- "Currency_GHS": "Ghanako cedia",
- "Currency_GIP": "Gibraltarreko libera",
- "Currency_GMD": "Ganbiako dalasia",
- "Currency_GNF": "Gineako frankoa",
- "Currency_GTQ": "Guatemalako quetzala",
- "Currency_GYD": "Guyanako dolarra",
- "Currency_HKD": "Hong Kongeko dolarra",
- "Currency_HNL": "Hondurasko lempira",
- "Currency_HRK": "Kroaziako kuna",
- "Currency_HTG": "Haitiko gourdea",
- "Currency_HUF": "Hungariako florina",
- "Currency_IDR": "Indonesiako errupia",
- "Currency_ILS": "Israelgo shekel berria",
- "Currency_INR": "Indiako errupia",
- "Currency_IQD": "Irakeko dinarra",
- "Currency_IRR": "Irango riala",
- "Currency_ISK": "Islandiako koroa",
+ "Currency_GEL": "Lari georgiarra",
+ "Currency_GHS": "Cedi ghanatarra",
+ "Currency_GIP": "Libera gibraltartarra",
+ "Currency_GMD": "Dalasi ganbiarra",
+ "Currency_GNF": "Franko ginearra",
+ "Currency_GTQ": "Ketzal guatemalarra",
+ "Currency_GYD": "Dolar guyanarra",
+ "Currency_HKD": "Dolar hongkongtarra",
+ "Currency_HNL": "Lempira hodurastarra",
+ "Currency_HRK": "Kuna kroaziarra",
+ "Currency_HTG": "Gourde haitiarra",
+ "Currency_HUF": "Florin hungariarra",
+ "Currency_IDR": "Errupia indonesiarra",
+ "Currency_ILS": "Shekel israeldar berria",
+ "Currency_INR": "Errupia indiarra",
+ "Currency_IQD": "Dinar irakiarra",
+ "Currency_IRR": "Rial irandarra",
+ "Currency_ISK": "Koroa islandiarra",
"Currency_JMD": "Jamaikako dolarra",
- "Currency_JOD": "Jordaniako dinarra",
- "Currency_JPY": "Japoniako yena",
- "Currency_KES": "Kenyako txelina",
- "Currency_KGS": "Kirgizistango soma",
- "Currency_KHR": "Kanbodiako riela",
- "Currency_KMF": "Komoreetako frankoa",
- "Currency_KPW": "Ipar Koreako wona",
- "Currency_KRW": "Hego Koreako wona",
- "Currency_KWD": "Kuwaiteko dinarra",
- "Currency_KYD": "Kaiman uharteetako dolarra",
- "Currency_KZT": "Kazakhstango tengea",
- "Currency_LAK": "Laoseko kipa",
- "Currency_LBP": "Libanoko libera",
- "Currency_LKR": "Sri Lankako errupia",
- "Currency_LRD": "Liberiako dolarra",
+ "Currency_JOD": "Dinar jordaniarra",
+ "Currency_JPY": "Yen japoniarra",
+ "Currency_KES": "Txelin kenyarra",
+ "Currency_KGS": "Som kirgizistandarra",
+ "Currency_KHR": "Riel kanbodiarra",
+ "Currency_KMF": "Franko komoretarra",
+ "Currency_KPW": "Won iparkorearra",
+ "Currency_KRW": "Won hegokorearra",
+ "Currency_KWD": "Dinar kuwaitarra",
+ "Currency_KYD": "Dolar kaimandarra",
+ "Currency_KZT": "Tenge kazakhstandarra",
+ "Currency_LAK": "Kip laostarra",
+ "Currency_LBP": "Libera libanoarra",
+ "Currency_LKR": "Errupia srilankarra",
+ "Currency_LRD": "Dolar liberiarra",
"Currency_LSL": "Lesothoko lotia",
- "Currency_LYD": "Libiako dinarra",
- "Currency_MAD": "Marokoko dirhama",
- "Currency_MDL": "Moldaviako leua",
- "Currency_MGA": "Madagaskarreko ariarya",
- "Currency_MKD": "Mazedoniako dinarra",
- "Currency_MMK": "Myanmarreko kyata",
- "Currency_MNT": "Mongoliako tugrika",
- "Currency_MOP": "Macanako pataca",
- "Currency_MRU": "Mauritaniako ouguiya",
- "Currency_MUR": "Maurizio uharteetako errupia",
- "Currency_MVR": "Maldivetako rufiyaa",
- "Currency_MWK": "Malawiko kwacha",
- "Currency_MXN": "Mexikoko pesoa",
- "Currency_MYR": "Malaysiako ringgita",
- "Currency_MZN": "Mozambikeko metikala",
- "Currency_NAD": "Namibiako dolarra",
- "Currency_NGN": "Nigeriako naira",
- "Currency_NIO": "Nikaraguako cordoba",
- "Currency_NOK": "Norvegiako koroa",
- "Currency_NPR": "Nepalgo errupia",
- "Currency_NZD": "Zeelanda Berriko dolarra",
- "Currency_OMR": "Omango riala",
- "Currency_PAB": "Panamako balboa",
- "Currency_PEN": "Peruko sol",
- "Currency_PGK": "Papua Ginea Berriko kina",
- "Currency_PHP": "Filipinetako pesoa",
- "Currency_PKR": "Pakistango errupia",
- "Currency_PLN": "Poloniako zlotya",
- "Currency_PYG": "Paraguaiko guarania",
- "Currency_QAR": "Qatarreko riala",
- "Currency_RON": "Errumaniako leua",
- "Currency_RSD": "Serbiako dinarra",
- "Currency_RUB": "Errusiako errubloa",
- "Currency_RWF": "Ruandako frankoa",
- "Currency_SAR": "Arabia Saudiko riala",
- "Currency_SBD": "Salomon uharteetako dolarra",
- "Currency_SCR": "Seychelleetako errupia",
- "Currency_SDG": "Sudango libera",
- "Currency_SEK": "Suediako koroa",
- "Currency_SGD": "Singapurreko dolarra",
+ "Currency_LYD": "Dinar libiarra",
+ "Currency_MAD": "Dirham marokoarra",
+ "Currency_MDL": "Leu moldaviarra",
+ "Currency_MGA": "Ariary madagaskartarra",
+ "Currency_MKD": "Dinar mazedoniarra",
+ "Currency_MMK": "Kyat myanmartarra",
+ "Currency_MNT": "Tugrik mongoliarra",
+ "Currency_MOP": "Pataca macauarra",
+ "Currency_MRU": "Uguiya mauritaniarra",
+ "Currency_MUR": "Errupia mauriziarra",
+ "Currency_MVR": "Errupia maldivarra",
+ "Currency_MWK": "Kwacha malawiarra",
+ "Currency_MXN": "Peso mexikarra",
+ "Currency_MYR": "Ringgit malaysiarra",
+ "Currency_MZN": "Metical mozambiketarra",
+ "Currency_NAD": "Dolar namibiarra",
+ "Currency_NGN": "Naira nigeriarra",
+ "Currency_NIO": "Córdoba nikaraguarra",
+ "Currency_NOK": "Koroa norvegiarra",
+ "Currency_NPR": "Errupia nepaldarra",
+ "Currency_NZD": "Dolar zeelandaberritarra",
+ "Currency_OMR": "Rial omandarra",
+ "Currency_PAB": "Balboa panamarra",
+ "Currency_PEN": "Sol perutarra",
+ "Currency_PGK": "Kina gineaberriarra",
+ "Currency_PHP": "Peso filipinarra",
+ "Currency_PKR": "Errupia pakistandarra",
+ "Currency_PLN": "Zloty poloniarra",
+ "Currency_PYG": "Guarani paraguaitarra",
+ "Currency_QAR": "Riyal qatartarra",
+ "Currency_RON": "Leu errumaniarra",
+ "Currency_RSD": "Dinar serbiarra",
+ "Currency_RUB": "Errublo errusiarra",
+ "Currency_RWF": "Franko ruandarra",
+ "Currency_SAR": "Riyal saudiarabiarra",
+ "Currency_SBD": "Dolar salomondarra",
+ "Currency_SCR": "Errupia seychelletarra",
+ "Currency_SDG": "Libera sudandarra",
+ "Currency_SEK": "Koroa suediarra",
+ "Currency_SGD": "Dolar singapurtarra",
"Currency_SHP": "Santa Helenako libera",
- "Currency_SLL": "Sierra Leonako leona",
- "Currency_SOS": "Somaliako txelina",
- "Currency_SRD": "Surinameko dolarra",
- "Currency_SSP": "Hego Sudango libera",
- "Currency_STN": "Sao Tome eta Principeko dobra",
- "Currency_SYP": "Siriako libera",
- "Currency_SZL": "Swazilandiako lilangenia",
- "Currency_THB": "Thailandiako bahta",
- "Currency_TJS": "Tajikistango somonia",
- "Currency_TMT": "Turkmenistango manata",
- "Currency_TND": "Tunisiako dinarra",
+ "Currency_SLL": "Leone sierraleonarra",
+ "Currency_SOS": "Txelin somaliarra",
+ "Currency_SRD": "Dolar surinamdarra",
+ "Currency_SSP": "Libera hegosudandarra",
+ "Currency_STN": "Dobra saotometarra",
+ "Currency_SYP": "Libera siriarra",
+ "Currency_SZL": "Lilangeni swazilandiarra",
+ "Currency_THB": "Baht thailandiarra",
+ "Currency_TJS": "Somoni tajikistandarra",
+ "Currency_TMT": "Manat turkmenistandarra",
+ "Currency_TND": "Dinar tunisiarra",
"Currency_TOP": "Tongako Paʻanga",
- "Currency_TRY": "Turkiako lira",
+ "Currency_TRY": "Lira turkiarra",
"Currency_TTD": "Trinidad eta Tobagoko dolarra",
- "Currency_TWD": "Taiwango dolar berria",
- "Currency_TZS": "Tanzaniako txelina",
+ "Currency_TWD": "Dolar taiwandar berria",
+ "Currency_TZS": "Txelin tanzaniarra",
"Currency_UAH": "Ukrainako hryvnia",
- "Currency_UGX": "Ugandako txelina",
- "Currency_USD": "AEBko dolarra",
- "Currency_UYU": "Uruguaiko pesoa",
- "Currency_UZS": "Uzbekistango soma",
+ "Currency_UGX": "Txelin ugandarra",
+ "Currency_USD": "Dolar estatubatuarra",
+ "Currency_UYU": "Peso uruguaitarra",
+ "Currency_UZS": "Sum uzbekistandarra",
"Currency_VEF": "Venezuelako bolivarra (2008–2018)",
- "Currency_VND": "Vietnameko donga",
- "Currency_VUV": "Vanuatuko vatua",
- "Currency_WST": "Samoko tala",
+ "Currency_VND": "Dong vietnamdarra",
+ "Currency_VUV": "Vatu vanuatuarra",
+ "Currency_WST": "Tala samoarra",
"Currency_XAF": "Afrika erdialdeko CFA frankoa",
"Currency_XCD": "Karibe ekialdeko dolarra",
"Currency_XOF": "Afrika mendebaldeko CFA frankoa",
"Currency_XPF": "CFP frankoa",
- "Currency_YER": "Yemengo riala",
- "Currency_ZAR": "Hegoafrikako randa",
- "Currency_ZMW": "Zambiako kwacha",
+ "Currency_YER": "Rial yemendarra",
+ "Currency_ZAR": "Rand hegoafrikarra",
+ "Currency_ZMW": "Kwacha zambiarra",
"Day_Long_1": "astelehena",
"Day_Long_2": "asteartea",
"Day_Long_3": "asteazkena",
@@ -631,7 +631,7 @@
"Format_Time_12": "h:mm:ss a",
"Format_Time_24": "HH:mm:ss",
"Format_Year": "y",
- "Hours": "ordu",
+ "Hours": "orduak",
"Language_aa": "Afarera",
"Language_ab": "Abkhaziera",
"Language_af": "Afrikaans",
@@ -678,7 +678,7 @@
"Language_fo": "Faroera",
"Language_fr": "Frantses",
"Language_fy": "Frisiera",
- "Language_ga": "Gaeliko",
+ "Language_ga": "Irlandera",
"Language_gd": "Eskoziako gaeliko",
"Language_gl": "Galiziera",
"Language_gn": "Guaraniera",
@@ -725,7 +725,7 @@
"Language_ln": "Lingala",
"Language_lo": "Laosera",
"Language_lt": "Lituaniera",
- "Language_lu": "Luba-katangera",
+ "Language_lu": "Katangako lubera",
"Language_lv": "Letoniera",
"Language_mg": "Malgaxe",
"Language_mh": "Marshallera",
@@ -809,7 +809,7 @@
"Language_zh": "Txinera",
"Language_zu": "Zuluera",
"LayoutDirection": "ltr",
- "Minutes": "minutu",
+ "Minutes": "minutuak",
"Month_Long_1": "urtarrila",
"Month_Long_10": "urria",
"Month_Long_11": "azaroa",
@@ -877,14 +877,14 @@
"OneMinuteShort": "1 min",
"OriginalLanguageName": "Euskara",
"PeriodDay": "eguna",
- "PeriodDays": "egun",
+ "PeriodDays": "egunak",
"PeriodMonth": "hilabetea",
- "PeriodMonths": "hilabete",
+ "PeriodMonths": "hilabeteak",
"PeriodWeek": "astea",
- "PeriodWeeks": "aste",
+ "PeriodWeeks": "asteak",
"PeriodYear": "urtea",
- "PeriodYears": "urte",
- "Seconds": "segundo",
+ "PeriodYears": "urteak",
+ "Seconds": "segundoak",
"Time_AM": "AM",
"Time_PM": "PM",
"Timezone_Africa_Asmera": "Asmara",
@@ -1035,6 +1035,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Qostanay",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Ho Chi Minh",
diff --git a/plugins/Intl/lang/fa.json b/plugins/Intl/lang/fa.json
index cbacdb2593..c7cd737819 100644
--- a/plugins/Intl/lang/fa.json
+++ b/plugins/Intl/lang/fa.json
@@ -63,7 +63,7 @@
"Country_CW": "کوراسائو",
"Country_CX": "جزیرهٔ کریسمس",
"Country_CY": "قبرس",
- "Country_CZ": "جمهوری چک",
+ "Country_CZ": "چک",
"Country_DE": "آلمان",
"Country_DJ": "جیبوتی",
"Country_DK": "دانمارک",
@@ -97,13 +97,13 @@
"Country_GP": "گوادلوپ",
"Country_GQ": "گینهٔ استوایی",
"Country_GR": "یونان",
- "Country_GS": "جزایر جورجیای جنوبی و ساندویچ جنوبی",
+ "Country_GS": "جورجیای جنوبی و جزایر ساندویچ جنوبی",
"Country_GT": "گواتمالا",
"Country_GU": "گوام",
"Country_GW": "گینهٔ بیسائو",
"Country_GY": "گویان",
- "Country_HK": "هنگ‌کنگ، منطقۀ ویژۀ اداری چین",
- "Country_HM": "جزیرهٔ هرد و جزایر مک‌دونالد",
+ "Country_HK": "هنگ‌کنگ، منطقهٔ ویژهٔ اداری چین",
+ "Country_HM": "هرد و جزایر مک‌دونالد",
"Country_HN": "هندوراس",
"Country_HR": "کرواسی",
"Country_HT": "هائیتی",
@@ -151,11 +151,11 @@
"Country_MF": "سنت مارتین",
"Country_MG": "ماداگاسکار",
"Country_MH": "جزایر مارشال",
- "Country_MK": "مقدونیه",
+ "Country_MK": "مقدونیهٔ شمالی",
"Country_ML": "مالی",
"Country_MM": "میانمار (برمه)",
"Country_MN": "مغولستان",
- "Country_MO": "ماکائو، منطقۀ ویژۀ اداری چین",
+ "Country_MO": "ماکائو، منطقهٔ ویژهٔ اداری چین",
"Country_MP": "جزایر ماریانای شمالی",
"Country_MQ": "مارتینیک",
"Country_MR": "موریتانی",
@@ -208,7 +208,7 @@
"Country_SG": "سنگاپور",
"Country_SH": "سنت هلن",
"Country_SI": "اسلوونی",
- "Country_SJ": "اسوالبارد و جان‌ماین",
+ "Country_SJ": "سوالبارد و یان ماین",
"Country_SK": "اسلواکی",
"Country_SL": "سیرالئون",
"Country_SM": "سان‌مارینو",
@@ -220,7 +220,7 @@
"Country_SV": "السالوادور",
"Country_SX": "سنت مارتن",
"Country_SY": "سوریه",
- "Country_SZ": "سوازیلند",
+ "Country_SZ": "اسواتینی",
"Country_TC": "جزایر تورکس و کایکوس",
"Country_TD": "چاد",
"Country_TF": "سرزمین‌های جنوب فرانسه",
@@ -519,7 +519,7 @@
"Currency_NZD": "دلار زلاند نو",
"Currency_OMR": "ریال عمان",
"Currency_PAB": "بالبوای پاناما",
- "Currency_PEN": "نوئووسول پرو",
+ "Currency_PEN": "سول پرو",
"Currency_PGK": "کینای پاپوا گینهٔ نو",
"Currency_PHP": "پزوی فیلیپین",
"Currency_PKR": "روپیهٔ پاکستان",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "اومسک",
"Timezone_Asia_Oral": "اورال",
"Timezone_Asia_Pontianak": "پونتیاناک",
+ "Timezone_Asia_Qostanay": "قوستانای",
"Timezone_Asia_Qyzylorda": "قیزیل‌اوردا",
"Timezone_Asia_Rangoon": "یانگون",
"Timezone_Asia_Saigon": "هوشی‌مین‌سیتی",
diff --git a/plugins/Intl/lang/fi.json b/plugins/Intl/lang/fi.json
index 8e164c9436..18f842ce5f 100644
--- a/plugins/Intl/lang/fi.json
+++ b/plugins/Intl/lang/fi.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint-Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshallinsaaret",
- "Country_MK": "Makedonia",
+ "Country_MK": "Pohjois-Makedonia",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Mongolia",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Uralsk",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Qostanay",
"Timezone_Asia_Qyzylorda": "Qızılorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Hồ Chí Minhin kaupunki",
diff --git a/plugins/Intl/lang/fr.json b/plugins/Intl/lang/fr.json
index 6651bd7b6c..e50a009241 100644
--- a/plugins/Intl/lang/fr.json
+++ b/plugins/Intl/lang/fr.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint-Martin",
"Country_MG": "Madagascar",
"Country_MH": "Îles Marshall",
- "Country_MK": "Macédoine",
+ "Country_MK": "Macédoine du Nord",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Birmanie)",
"Country_MN": "Mongolie",
@@ -220,7 +220,7 @@
"Country_SV": "Salvador",
"Country_SX": "Saint-Martin (partie néerlandaise)",
"Country_SY": "Syrie",
- "Country_SZ": "Swaziland",
+ "Country_SZ": "Eswatini",
"Country_TC": "Îles Turques-et-Caïques",
"Country_TD": "Tchad",
"Country_TF": "Terres australes françaises",
@@ -405,7 +405,7 @@
"CurrencySymbol_VEF": "VEF",
"CurrencySymbol_VND": "₫",
"CurrencySymbol_VUV": "VUV",
- "CurrencySymbol_WST": "WS$",
+ "CurrencySymbol_WST": "$WS",
"CurrencySymbol_XAF": "FCFA",
"CurrencySymbol_XCD": "XCD",
"CurrencySymbol_XOF": "CFA",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Ouralsk",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanaï",
"Timezone_Asia_Qyzylorda": "Kzyl Orda",
"Timezone_Asia_Rangoon": "Rangoun",
"Timezone_Asia_Saigon": "Hô-Chi-Minh-Ville",
diff --git a/plugins/Intl/lang/gl.json b/plugins/Intl/lang/gl.json
index 809d84b9b4..2ad1327d9c 100644
--- a/plugins/Intl/lang/gl.json
+++ b/plugins/Intl/lang/gl.json
@@ -2,8 +2,8 @@
"Intl": {
"Continent_afr": "África",
"Continent_amc": "América Central",
- "Continent_amn": "Norteamérica",
- "Continent_ams": "Suramérica",
+ "Continent_amn": "América do Norte",
+ "Continent_ams": "América do Sur",
"Continent_ant": "A Antártida",
"Continent_asi": "Asia",
"Continent_eur": "Europa",
@@ -51,7 +51,7 @@
"Country_CF": "República Centroafricana",
"Country_CG": "República do Congo",
"Country_CH": "Suíza",
- "Country_CI": "Costa do Marfil",
+ "Country_CI": "Côte d’Ivoire",
"Country_CK": "Illas Cook",
"Country_CL": "Chile",
"Country_CM": "Camerún",
@@ -132,7 +132,7 @@
"Country_KR": "Corea do Sur",
"Country_KW": "Kuwait",
"Country_KY": "Illas Caimán",
- "Country_KZ": "Casaquistán",
+ "Country_KZ": "Kazakistán",
"Country_LA": "Laos",
"Country_LB": "O Líbano",
"Country_LC": "Santa Lucía",
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagascar",
"Country_MH": "Illas Marshall",
- "Country_MK": "Macedonia",
+ "Country_MK": "Macedonia do Norte",
"Country_ML": "Malí",
"Country_MM": "Myanmar (Birmania)",
"Country_MN": "Mongolia",
@@ -220,7 +220,7 @@
"Country_SV": "O Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Siria",
- "Country_SZ": "Suazilandia",
+ "Country_SZ": "Eswatini",
"Country_TC": "Illas Turks e Caicos",
"Country_TD": "Chad",
"Country_TF": "Territorios Austrais Franceses",
@@ -242,7 +242,7 @@
"Country_UM": "Illas Menores Distantes dos Estados Unidos",
"Country_US": "Os Estados Unidos",
"Country_UY": "O Uruguai",
- "Country_UZ": "Uzbequistán",
+ "Country_UZ": "Uzbekistán",
"Country_VA": "Cidade do Vaticano",
"Country_VC": "San Vicente e As Granadinas",
"Country_VE": "Venezuela",
@@ -407,14 +407,14 @@
"CurrencySymbol_VUV": "VUV",
"CurrencySymbol_WST": "WST",
"CurrencySymbol_XAF": "FCFA",
- "CurrencySymbol_XCD": "EC$",
+ "CurrencySymbol_XCD": "XCD",
"CurrencySymbol_XOF": "CFA",
"CurrencySymbol_XPF": "CFPF",
"CurrencySymbol_YER": "YER",
"CurrencySymbol_ZAR": "ZAR",
"CurrencySymbol_ZMW": "ZMW",
"Currency_AED": "Dirham dos Emiratos Árabes Unidos",
- "Currency_AFN": "Afgani afgano",
+ "Currency_AFN": "Afgani afgán",
"Currency_ALL": "Lek albanés",
"Currency_AMD": "Dram armenio",
"Currency_ANG": "Florín das Antillas Neerlandesas",
@@ -425,19 +425,19 @@
"Currency_AZN": "Manat acerbaixano",
"Currency_BAM": "Marco convertible de Bosnia e Hercegovina",
"Currency_BBD": "Dólar de Barbados",
- "Currency_BDT": "Taka de Bangladés",
+ "Currency_BDT": "Taka de Bangladesh",
"Currency_BGN": "Lev búlgaro",
"Currency_BHD": "Dinar de Bahrain",
"Currency_BIF": "Franco burundiano",
- "Currency_BMD": "Dólar das Bemudas",
+ "Currency_BMD": "Dólar bermudano",
"Currency_BND": "Dólar de Brunei",
"Currency_BOB": "Boliviano",
"Currency_BRL": "Real brasileiro",
- "Currency_BSD": "Dólar das Bahamas",
+ "Currency_BSD": "Dólar bahamés",
"Currency_BTC": "Bitcoin",
"Currency_BTN": "Ngultrum butanés",
- "Currency_BWP": "Pula botsuaniano",
- "Currency_BYN": "Rublo bielorruso",
+ "Currency_BWP": "Pula botswaniano",
+ "Currency_BYN": "Rublo belaruso",
"Currency_BZD": "Dólar belizense",
"Currency_CAD": "Dólar canadense",
"Currency_CDF": "Franco congolés",
@@ -450,7 +450,7 @@
"Currency_CUP": "Peso cubano",
"Currency_CVE": "Escudo caboverdiano",
"Currency_CZK": "Coroa checa",
- "Currency_DJF": "Franco xibutiano",
+ "Currency_DJF": "Franco djibutiano",
"Currency_DKK": "Coroa dinamarquesa",
"Currency_DOP": "Peso dominicano",
"Currency_DZD": "Dinar alxeriano",
@@ -458,11 +458,11 @@
"Currency_ERN": "Nakfa eritreo",
"Currency_ETB": "Birr etíope",
"Currency_EUR": "Euro",
- "Currency_FJD": "Dólar fidxiano",
- "Currency_FKP": "Libra das Malvinas",
+ "Currency_FJD": "Dólar fixiano",
+ "Currency_FKP": "Libra das Illas Malvinas",
"Currency_GBP": "Libra esterlina",
"Currency_GEL": "Lari xeorxiano",
- "Currency_GHS": "Cedi de Ghana",
+ "Currency_GHS": "Cedi ghanés",
"Currency_GIP": "Libra xibraltareña",
"Currency_GMD": "Dalasi gambiano",
"Currency_GNF": "Franco guineano",
@@ -471,7 +471,7 @@
"Currency_HKD": "Dólar de Hong Kong",
"Currency_HNL": "Lempira hondureño",
"Currency_HRK": "Kuna croata",
- "Currency_HTG": "Gourde haitiano",
+ "Currency_HTG": "Gourde haitiana",
"Currency_HUF": "Florín húngaro",
"Currency_IDR": "Rupia indonesia",
"Currency_ILS": "Novo shequel israelí",
@@ -483,17 +483,17 @@
"Currency_JOD": "Dinar xordano",
"Currency_JPY": "Ien xaponés",
"Currency_KES": "Xilin kenyano",
- "Currency_KGS": "Som quirguicistano",
+ "Currency_KGS": "Som kirguiz",
"Currency_KHR": "Riel camboxano",
"Currency_KMF": "Franco comoriano",
"Currency_KPW": "Won norcoreano",
"Currency_KRW": "Won surcoreano",
"Currency_KWD": "Dinar kuwaití",
"Currency_KYD": "Dólar das Illas Caimán",
- "Currency_KZT": "Tenge casaco",
+ "Currency_KZT": "Tenge kazako",
"Currency_LAK": "Kip laosiano",
"Currency_LBP": "Libra libanesa",
- "Currency_LKR": "Rupia de Sri Lanka",
+ "Currency_LKR": "Rupia srilankesa",
"Currency_LRD": "Dólar liberiano",
"Currency_LSL": "Loti de Lesoto",
"Currency_LYD": "Dinar libio",
@@ -503,17 +503,17 @@
"Currency_MKD": "Dinar macedonio",
"Currency_MMK": "Kyat birmano",
"Currency_MNT": "Tugrik mongol",
- "Currency_MOP": "Pataca de Macau",
+ "Currency_MOP": "Pataca macaense",
"Currency_MRU": "Ouguiya mauritano",
"Currency_MUR": "Rupia mauriciana",
"Currency_MVR": "Rupia maldivana",
- "Currency_MWK": "Kwacha de Malaui",
+ "Currency_MWK": "Kwacha de Malawi",
"Currency_MXN": "Peso mexicano",
"Currency_MYR": "Ringgit malaio",
- "Currency_MZN": "Metical de Mozambique",
+ "Currency_MZN": "Metical mozambicano",
"Currency_NAD": "Dólar namibio",
"Currency_NGN": "Naira nixeriano",
- "Currency_NIO": "Córdoba de ouro nicaraguano",
+ "Currency_NIO": "Córdoba nicaraguano",
"Currency_NOK": "Coroa norueguesa",
"Currency_NPR": "Rupia nepalesa",
"Currency_NZD": "Dólar neozelandés",
@@ -532,7 +532,7 @@
"Currency_RWF": "Franco ruandés",
"Currency_SAR": "Rial saudita",
"Currency_SBD": "Dólar das Illas Salomón",
- "Currency_SCR": "Rupia de Seixeles",
+ "Currency_SCR": "Rupia de Seychelles",
"Currency_SDG": "Libra sudanesa",
"Currency_SEK": "Coroa sueca",
"Currency_SGD": "Dólar de Singapur",
@@ -541,23 +541,23 @@
"Currency_SOS": "Xilin somalí",
"Currency_SRD": "Dólar surinamés",
"Currency_SSP": "Libra sursudanesa",
- "Currency_STN": "Dobra de São Tomé e Príncipe",
+ "Currency_STN": "Dobra de San Tomé e Príncipe",
"Currency_SYP": "Libra siria",
- "Currency_SZL": "Lilangeni de Suacilandia",
+ "Currency_SZL": "Lilangeni de Eswatini",
"Currency_THB": "Baht tailandés",
"Currency_TJS": "Somoni taxiquistano",
- "Currency_TMT": "Manat turcomán",
+ "Currency_TMT": "Manat turkmeno",
"Currency_TND": "Dinar tunisiano",
- "Currency_TOP": "Paʻanga de Tonga",
+ "Currency_TOP": "Paʻanga tongano",
"Currency_TRY": "Lira turca",
- "Currency_TTD": "Dólar de Trinidad e Tobago",
+ "Currency_TTD": "Dólar trinitense",
"Currency_TWD": "Novo dólar taiwanés",
"Currency_TZS": "Xilin tanzano",
"Currency_UAH": "Hrivna ucraína",
"Currency_UGX": "Xilin ugandés",
"Currency_USD": "Dólar estadounidense",
"Currency_UYU": "Peso uruguaio",
- "Currency_UZS": "Som usbeco",
+ "Currency_UZS": "Som uzbeko",
"Currency_VEF": "Bolívar venezolano (2008–2018)",
"Currency_VND": "Dong vietnamita",
"Currency_VUV": "Vatu vanuatiano",
@@ -620,11 +620,11 @@
"Format_Hour_12": "h a",
"Format_Hour_24": "HH",
"Format_Interval_Long_D": "d–d 'de' MMMM 'de' y",
- "Format_Interval_Long_M": "d MMMM – d MMMM 'de' y",
- "Format_Interval_Long_Y": "d MMMM y – d MMMM y",
+ "Format_Interval_Long_M": "d 'de' MMMM – d 'de' MMMM 'de' y",
+ "Format_Interval_Long_Y": "d 'de' MMMM 'de' y – d 'de' MMMM 'de' y",
"Format_Interval_Short_D": "d–d 'de' MMMM 'de' y",
- "Format_Interval_Short_M": "d MMM – d MMM 'de' y",
- "Format_Interval_Short_Y": "d MMM y – d MMM y",
+ "Format_Interval_Short_M": "d 'de' MMM – d 'de' MMM 'de' y",
+ "Format_Interval_Short_Y": "d 'de' MMM 'de' y – d 'de' MMM 'de' y",
"Format_Month_Long": "MMMM 'de' y",
"Format_Month_Short": "MMM 'de' y",
"Format_Time": "{time}",
@@ -644,7 +644,7 @@
"Language_ay": "Aimará",
"Language_az": "Acerbaixano",
"Language_ba": "Baxkir",
- "Language_be": "Bielorruso",
+ "Language_be": "Belaruso",
"Language_bg": "Búlgaro",
"Language_bi": "Bislama",
"Language_bm": "Bambara",
@@ -706,7 +706,7 @@
"Language_kg": "Kongo",
"Language_ki": "Kikuyu",
"Language_kj": "Kuanyama",
- "Language_kk": "Casaco",
+ "Language_kk": "Kazako",
"Language_kl": "Groenlandés",
"Language_km": "Khmer",
"Language_kn": "Kannará",
@@ -746,7 +746,7 @@
"Language_no": "Noruegués",
"Language_nr": "Ndebele meridional",
"Language_nv": "Navajo",
- "Language_ny": "Nyanja",
+ "Language_ny": "Chewa",
"Language_oc": "Occitano",
"Language_om": "Oromo",
"Language_or": "Odiá",
@@ -784,7 +784,7 @@
"Language_tg": "Taxico",
"Language_th": "Tailandés",
"Language_ti": "Tigriña",
- "Language_tk": "Turcomán",
+ "Language_tk": "Turkmeno",
"Language_tl": "Tagalo",
"Language_tn": "Tswana",
"Language_to": "Tongano",
@@ -796,7 +796,7 @@
"Language_ug": "Uigur",
"Language_uk": "Ucraíno",
"Language_ur": "Urdú",
- "Language_uz": "Uzbeco",
+ "Language_uz": "Uzbeko",
"Language_ve": "Venda",
"Language_vi": "Vietnamita",
"Language_vo": "Volapuk",
@@ -1001,7 +1001,7 @@
"Timezone_Antarctica_McMurdo": "McMurdo",
"Timezone_Antarctica_Palmer": "Palmer",
"Timezone_Antarctica_Rothera": "Rothera",
- "Timezone_Antarctica_Syowa": "Syowa",
+ "Timezone_Antarctica_Syowa": "Showa",
"Timezone_Antarctica_Troll": "Troll",
"Timezone_Antarctica_Vostok": "Vostok",
"Timezone_Asia_Almaty": "Almati",
@@ -1034,17 +1034,18 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Qostanai",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Ho Chi Minh",
- "Timezone_Asia_Sakhalin": "Sakhalin",
+ "Timezone_Asia_Sakhalin": "Sakhalín",
"Timezone_Asia_Samarkand": "Samarcanda",
"Timezone_Asia_Shanghai": "Shanghai",
"Timezone_Asia_Srednekolymsk": "Srednekolimsk",
"Timezone_Asia_Tashkent": "Tashkent",
"Timezone_Asia_Tomsk": "Tomsk",
"Timezone_Asia_Ulaanbaatar": "Ulaanbaatar",
- "Timezone_Asia_Urumqi": "Urumqi",
+ "Timezone_Asia_Urumqi": "Ürümqi",
"Timezone_Asia_Ust-Nera": "Ust-Nera",
"Timezone_Asia_Vladivostok": "Vladivostok",
"Timezone_Asia_Yakutsk": "Iakutsk",
@@ -1078,7 +1079,7 @@
"Timezone_Europe_Saratov": "Saratov",
"Timezone_Europe_Simferopol": "Simferópol",
"Timezone_Europe_Ulyanovsk": "Ulianovsk",
- "Timezone_Europe_Uzhgorod": "Úzhgorod",
+ "Timezone_Europe_Uzhgorod": "Uzghorod",
"Timezone_Europe_Volgograd": "Volgogrado",
"Timezone_Europe_Zaporozhye": "Zaporizhia",
"Timezone_Pacific_Auckland": "Auckland",
diff --git a/plugins/Intl/lang/he.json b/plugins/Intl/lang/he.json
index e31833231d..c8122e3264 100644
--- a/plugins/Intl/lang/he.json
+++ b/plugins/Intl/lang/he.json
@@ -151,7 +151,7 @@
"Country_MF": "סן מרטן",
"Country_MG": "מדגסקר",
"Country_MH": "איי מרשל",
- "Country_MK": "מקדוניה",
+ "Country_MK": "מקדוניה הצפונית",
"Country_ML": "מאלי",
"Country_MM": "מיאנמר (בורמה)",
"Country_MN": "מונגוליה",
@@ -220,7 +220,7 @@
"Country_SV": "אל סלבדור",
"Country_SX": "סנט מארטן",
"Country_SY": "סוריה",
- "Country_SZ": "סווזילנד",
+ "Country_SZ": "אסוואטיני",
"Country_TC": "איי טרקס וקייקוס",
"Country_TD": "צ׳אד",
"Country_TF": "הטריטוריות הדרומיות של צרפת",
@@ -541,7 +541,7 @@
"Currency_SOS": "שילינג סומלי",
"Currency_SRD": "דולר סורינאמי",
"Currency_SSP": "לירה דרום-סודנית",
- "Currency_STN": "דוברה של סן טומה ופרינסיפה",
+ "Currency_STN": "דוברה של סאו טומה ופרינסיפה",
"Currency_SYP": "לירה סורית",
"Currency_SZL": "לילנגני סווזילנדי",
"Currency_THB": "בהט תאילנדי",
@@ -805,7 +805,7 @@
"Language_ur": "אורדו",
"Language_uz": "אוזבקית",
"Language_ve": "וונדה",
- "Language_vi": "ויאטנמית",
+ "Language_vi": "וייטנאמית",
"Language_vo": "‏וולאפיק",
"Language_wa": "ולונית",
"Language_wo": "וולוף",
@@ -1009,7 +1009,7 @@
"Timezone_Antarctica_McMurdo": "מק-מרדו",
"Timezone_Antarctica_Palmer": "פאלמר",
"Timezone_Antarctica_Rothera": "רות׳רה",
- "Timezone_Antarctica_Syowa": "סיוואה",
+ "Timezone_Antarctica_Syowa": "סייווה",
"Timezone_Antarctica_Troll": "טרול",
"Timezone_Antarctica_Vostok": "ווסטוק",
"Timezone_Asia_Almaty": "אלמאטי",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "אומסק",
"Timezone_Asia_Oral": "אורל",
"Timezone_Asia_Pontianak": "פונטיאנק",
+ "Timezone_Asia_Qostanay": "קוסטנאי",
"Timezone_Asia_Qyzylorda": "קיזילורדה",
"Timezone_Asia_Rangoon": "רנגון",
"Timezone_Asia_Saigon": "הו צ׳י מין סיטי",
@@ -1051,7 +1052,7 @@
"Timezone_Asia_Srednekolymsk": "סרדנייקולימסק",
"Timezone_Asia_Tashkent": "טשקנט",
"Timezone_Asia_Tomsk": "טומסק",
- "Timezone_Asia_Ulaanbaatar": "אולאאנבטאר",
+ "Timezone_Asia_Ulaanbaatar": "אולאן באטור",
"Timezone_Asia_Urumqi": "אורומקי",
"Timezone_Asia_Ust-Nera": "אוסט-נרה",
"Timezone_Asia_Vladivostok": "ולדיווסטוק",
diff --git a/plugins/Intl/lang/hi.json b/plugins/Intl/lang/hi.json
index 933c83cb42..dfabea54b9 100644
--- a/plugins/Intl/lang/hi.json
+++ b/plugins/Intl/lang/hi.json
@@ -151,7 +151,7 @@
"Country_MF": "सेंट मार्टिन",
"Country_MG": "मेडागास्कर",
"Country_MH": "मार्शल द्वीपसमूह",
- "Country_MK": "मकदूनिया",
+ "Country_MK": "उत्तरी मकदूनिया",
"Country_ML": "माली",
"Country_MM": "म्यांमार (बर्मा)",
"Country_MN": "मंगोलिया",
@@ -557,7 +557,7 @@
"Currency_UGX": "युगांडाई शिलिंग",
"Currency_USD": "यूएस डॉलर",
"Currency_UYU": "उरुग्वियन पेसो",
- "Currency_UZS": "उज़्बेकिस्तान सोम",
+ "Currency_UZS": "उज़्बेकिस्तानी सोम",
"Currency_VEF": "वेनेज़ुएला बोलिवर (2008–2018)",
"Currency_VND": "वियतनामी डोंग",
"Currency_VUV": "वनुआतू वातू",
@@ -892,8 +892,8 @@
"PeriodYear": "वर्ष",
"PeriodYears": "वर्ष",
"Seconds": "सेकंड",
- "Time_AM": "पूर्वाह्न",
- "Time_PM": "अपराह्न",
+ "Time_AM": "am",
+ "Time_PM": "pm",
"Timezone_Africa_Asmera": "अस्मारा",
"Timezone_Africa_Ceuta": "सेउटा",
"Timezone_Africa_Kinshasa": "किंशासा",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "ओम्स्क",
"Timezone_Asia_Oral": "ओरल",
"Timezone_Asia_Pontianak": "पोंटीयांक",
+ "Timezone_Asia_Qostanay": "कोस्टाने",
"Timezone_Asia_Qyzylorda": "केज़ेलोर्डा",
"Timezone_Asia_Rangoon": "रंगून",
"Timezone_Asia_Saigon": "हो ची मिन्ह सिटी",
diff --git a/plugins/Intl/lang/hr.json b/plugins/Intl/lang/hr.json
index 4a194db135..b4e343e64e 100644
--- a/plugins/Intl/lang/hr.json
+++ b/plugins/Intl/lang/hr.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Maršalovi Otoci",
- "Country_MK": "Makedonija",
+ "Country_MK": "Sjeverna Makedonija",
"Country_ML": "Mali",
"Country_MM": "Mjanmar (Burma)",
"Country_MN": "Mongolija",
@@ -187,7 +187,7 @@
"Country_PH": "Filipini",
"Country_PK": "Pakistan",
"Country_PL": "Poljska",
- "Country_PM": "Sveti Petar i Mikelon",
+ "Country_PM": "Saint-Pierre-et-Miquelon",
"Country_PN": "Otoci Pitcairn",
"Country_PR": "Portoriko",
"Country_PS": "Palestinsko područje",
@@ -220,7 +220,7 @@
"Country_SV": "Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Sirija",
- "Country_SZ": "Svazi",
+ "Country_SZ": "Esvatini",
"Country_TC": "Otoci Turks i Caicos",
"Country_TD": "Čad",
"Country_TF": "Francuski južni i antarktički teritoriji",
@@ -437,7 +437,7 @@
"Currency_BTC": "Bitcoin",
"Currency_BTN": "Butanski ngultrum",
"Currency_BWP": "Bocvanska pula",
- "Currency_BYN": "Bjeloruska rublja",
+ "Currency_BYN": "Bjeloruski rubalj",
"Currency_BZD": "Belizeanski dolar",
"Currency_CAD": "Kanadski dolar",
"Currency_CDF": "Kongoanski franak",
@@ -484,7 +484,7 @@
"Currency_JPY": "Japanski jen",
"Currency_KES": "Kenijski šiling",
"Currency_KGS": "Kirgiski som",
- "Currency_KHR": "Kambođanski rijal",
+ "Currency_KHR": "Kambodžanski rijal",
"Currency_KMF": "Komorski franak",
"Currency_KPW": "Sjevernokorejski won",
"Currency_KRW": "Južnokorejski won",
@@ -499,7 +499,7 @@
"Currency_LYD": "Libijski dinar",
"Currency_MAD": "Marokanski dirham",
"Currency_MDL": "Moldavski lej",
- "Currency_MGA": "Madagaskarski ariary",
+ "Currency_MGA": "Malgaški arijari",
"Currency_MKD": "Makedonski denar",
"Currency_MMK": "Mjanmarski kjat",
"Currency_MNT": "Mongolski tugrik",
@@ -528,9 +528,9 @@
"Currency_QAR": "Katarski rial",
"Currency_RON": "Rumunjski lej",
"Currency_RSD": "Srpski dinar",
- "Currency_RUB": "Ruska rublja",
+ "Currency_RUB": "Ruski rubalj",
"Currency_RWF": "Ruandski franak",
- "Currency_SAR": "Saudijski rial",
+ "Currency_SAR": "Saudijski rijal",
"Currency_SBD": "Solmonskootočni dolar",
"Currency_SCR": "Sejšelska rupija",
"Currency_SDG": "Sudanska funta",
@@ -566,7 +566,7 @@
"Currency_XCD": "Istočnokaripski dolar",
"Currency_XOF": "CFA franak BCEAO",
"Currency_XPF": "CFP franak",
- "Currency_YER": "Jemenski rial",
+ "Currency_YER": "Jemenski rijal",
"Currency_ZAR": "Južnoafrički rand",
"Currency_ZMW": "Zambijska kvača",
"Day_Long_1": "ponedjeljak",
@@ -1019,7 +1019,7 @@
"Timezone_Asia_Atyrau": "Atyrau",
"Timezone_Asia_Barnaul": "Barnaul",
"Timezone_Asia_Calcutta": "Kolkata",
- "Timezone_Asia_Chita": "Chita",
+ "Timezone_Asia_Chita": "Čita",
"Timezone_Asia_Choibalsan": "Choibalsan",
"Timezone_Asia_Famagusta": "Famagusta",
"Timezone_Asia_Gaza": "Gaza",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Kizilorda",
"Timezone_Asia_Rangoon": "Rangoon",
"Timezone_Asia_Saigon": "Ho Ši Min",
@@ -1056,7 +1057,7 @@
"Timezone_Asia_Ust-Nera": "Ust-Nera",
"Timezone_Asia_Vladivostok": "Vladivostok",
"Timezone_Asia_Yakutsk": "Jakutsk",
- "Timezone_Asia_Yekaterinburg": "Ekaterinburg",
+ "Timezone_Asia_Yekaterinburg": "Jekaterinburg",
"Timezone_Atlantic_Azores": "Azorski otoci",
"Timezone_Atlantic_Canary": "Kanari",
"Timezone_Atlantic_Faeroe": "Ferojski otoci",
@@ -1073,7 +1074,7 @@
"Timezone_Australia_Melbourne": "Melbourne",
"Timezone_Australia_Perth": "Perth",
"Timezone_Australia_Sydney": "Sydney",
- "Timezone_Europe_Astrakhan": "Astrakhan",
+ "Timezone_Europe_Astrakhan": "Astrahan",
"Timezone_Europe_Berlin": "Berlin",
"Timezone_Europe_Busingen": "Busingen",
"Timezone_Europe_Kaliningrad": "Kalinjingrad",
@@ -1084,7 +1085,7 @@
"Timezone_Europe_Moscow": "Moskva",
"Timezone_Europe_Samara": "Samara",
"Timezone_Europe_Saratov": "Saratov",
- "Timezone_Europe_Simferopol": "Simferopol",
+ "Timezone_Europe_Simferopol": "Simferopolj",
"Timezone_Europe_Ulyanovsk": "Uljanovsk",
"Timezone_Europe_Uzhgorod": "Užgorod",
"Timezone_Europe_Volgograd": "Volgograd",
diff --git a/plugins/Intl/lang/hu.json b/plugins/Intl/lang/hu.json
index 2667fcecb9..f71fbba34c 100644
--- a/plugins/Intl/lang/hu.json
+++ b/plugins/Intl/lang/hu.json
@@ -151,9 +151,9 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagaszkár",
"Country_MH": "Marshall-szigetek",
- "Country_MK": "Macedónia",
+ "Country_MK": "Észak-Macedónia",
"Country_ML": "Mali",
- "Country_MM": "Mianmar (Burma)",
+ "Country_MM": "Mianmar",
"Country_MN": "Mongólia",
"Country_MO": "Makaó KKT",
"Country_MP": "Északi Mariana-szigetek",
@@ -437,7 +437,7 @@
"Currency_BTC": "Bitcoin",
"Currency_BTN": "Bhutáni ngultrum",
"Currency_BWP": "Botswanai pula",
- "Currency_BYN": "Fehérorosz rubel",
+ "Currency_BYN": "Belarusz rubel",
"Currency_BZD": "Belize-i dollár",
"Currency_CAD": "Kanadai dollár",
"Currency_CDF": "Kongói frank",
@@ -543,7 +543,7 @@
"Currency_SSP": "Dél-szudáni font",
"Currency_STN": "São Tomé és Príncipe-i dobra",
"Currency_SYP": "Szíriai font",
- "Currency_SZL": "Szváziföldi lilangeni",
+ "Currency_SZL": "Szvázi lilangeni",
"Currency_THB": "Thai baht",
"Currency_TJS": "Tádzsikisztáni somoni",
"Currency_TMT": "Türkmenisztáni manat",
@@ -559,7 +559,7 @@
"Currency_UYU": "Uruguay-i peso",
"Currency_UZS": "Üzbegisztáni szum",
"Currency_VEF": "Venezuelai bolivar (2008–2018)",
- "Currency_VND": "Vietnami dong",
+ "Currency_VND": "Vietnámi dong",
"Currency_VUV": "Vanuatui vatu",
"Currency_WST": "Nyugat-szamoai tala",
"Currency_XAF": "CFA frank BEAC",
@@ -805,7 +805,7 @@
"Language_ur": "Urdu",
"Language_uz": "Üzbég",
"Language_ve": "Venda",
- "Language_vi": "Vietnami",
+ "Language_vi": "Vietnámi",
"Language_vo": "Volapük",
"Language_wa": "Vallon",
"Language_wo": "Volof",
@@ -1016,7 +1016,7 @@
"Timezone_Asia_Anadyr": "Anadir",
"Timezone_Asia_Aqtau": "Aktau",
"Timezone_Asia_Aqtobe": "Aktöbe",
- "Timezone_Asia_Atyrau": "Atyrau",
+ "Timezone_Asia_Atyrau": "Atirau",
"Timezone_Asia_Barnaul": "Barnaul",
"Timezone_Asia_Calcutta": "Kalkutta",
"Timezone_Asia_Chita": "Csita",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omszk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kosztanaj",
"Timezone_Asia_Qyzylorda": "Kizilorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Ho Si Minh-város",
diff --git a/plugins/Intl/lang/id.json b/plugins/Intl/lang/id.json
index 0241f9cc3a..ab744c57af 100644
--- a/plugins/Intl/lang/id.json
+++ b/plugins/Intl/lang/id.json
@@ -4,7 +4,7 @@
"Continent_amc": "Amerika Tengah",
"Continent_amn": "Amerika Utara",
"Continent_ams": "Amerika Selatan",
- "Continent_ant": "Antartika",
+ "Continent_ant": "Antarktika",
"Continent_asi": "Asia",
"Continent_eur": "Eropa",
"Continent_oce": "Oseania",
@@ -16,7 +16,7 @@
"Country_AL": "Albania",
"Country_AM": "Armenia",
"Country_AO": "Angola",
- "Country_AQ": "Antartika",
+ "Country_AQ": "Antarktika",
"Country_AR": "Argentina",
"Country_AS": "Samoa Amerika",
"Country_AT": "Austria",
@@ -51,7 +51,7 @@
"Country_CF": "Republik Afrika Tengah",
"Country_CG": "Kongo - Brazzaville",
"Country_CH": "Swiss",
- "Country_CI": "Pantai Gading",
+ "Country_CI": "Côte d’Ivoire",
"Country_CK": "Kepulauan Cook",
"Country_CL": "Cile",
"Country_CM": "Kamerun",
@@ -61,7 +61,7 @@
"Country_CU": "Kuba",
"Country_CV": "Tanjung Verde",
"Country_CW": "Curaçao",
- "Country_CX": "Pulau Christmas",
+ "Country_CX": "Pulau Natal",
"Country_CY": "Siprus",
"Country_CZ": "Ceko",
"Country_DE": "Jerman",
@@ -79,7 +79,7 @@
"Country_ET": "Etiopia",
"Country_FI": "Finlandia",
"Country_FJ": "Fiji",
- "Country_FK": "Kepulauan Malvinas",
+ "Country_FK": "Kepulauan Falkland",
"Country_FM": "Mikronesia",
"Country_FO": "Kepulauan Faroe",
"Country_FR": "Prancis",
@@ -102,7 +102,7 @@
"Country_GU": "Guam",
"Country_GW": "Guinea-Bissau",
"Country_GY": "Guyana",
- "Country_HK": "Hong Kong SAR Tiongkok",
+ "Country_HK": "Hong Kong DAK Tiongkok",
"Country_HM": "Pulau Heard dan Kepulauan McDonald",
"Country_HN": "Honduras",
"Country_HR": "Kroasia",
@@ -151,11 +151,11 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Kepulauan Marshall",
- "Country_MK": "Makedonia",
+ "Country_MK": "Makedonia Utara",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Mongolia",
- "Country_MO": "Makau SAR Tiongkok",
+ "Country_MO": "Makau DAK Tiongkok",
"Country_MP": "Kepulauan Mariana Utara",
"Country_MQ": "Martinik",
"Country_MR": "Mauritania",
@@ -220,10 +220,10 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Suriah",
- "Country_SZ": "Swaziland",
+ "Country_SZ": "ESwatini",
"Country_TC": "Kepulauan Turks dan Caicos",
"Country_TD": "Cad",
- "Country_TF": "Wilayah Kutub Selatan Prancis",
+ "Country_TF": "Wilayah Selatan Perancis",
"Country_TG": "Togo",
"Country_TH": "Thailand",
"Country_TJ": "Tajikistan",
@@ -244,10 +244,10 @@
"Country_UY": "Uruguay",
"Country_UZ": "Uzbekistan",
"Country_VA": "Vatikan",
- "Country_VC": "Saint Vincent dan Grenadines",
+ "Country_VC": "Saint Vincent dan Grenadine",
"Country_VE": "Venezuela",
- "Country_VG": "Kepulauan Virgin Inggris",
- "Country_VI": "Kepulauan Virgin A.S.",
+ "Country_VG": "Kepulauan Virgin Britania Raya",
+ "Country_VI": "Kepulauan Virgin Amerika Serikat",
"Country_VN": "Vietnam",
"Country_VU": "Vanuatu",
"Country_WF": "Kepulauan Wallis dan Futuna",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Rangoon",
"Timezone_Asia_Saigon": "Ho Chi Minh",
diff --git a/plugins/Intl/lang/is.json b/plugins/Intl/lang/is.json
index 0bfec7adb7..17eb2b999f 100644
--- a/plugins/Intl/lang/is.json
+++ b/plugins/Intl/lang/is.json
@@ -148,10 +148,10 @@
"Country_MC": "Mónakó",
"Country_MD": "Moldóva",
"Country_ME": "Svartfjallaland",
- "Country_MF": "St. Martin",
+ "Country_MF": "Saint-Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshalleyjar",
- "Country_MK": "Makedónía",
+ "Country_MK": "Norður-Makedónía",
"Country_ML": "Malí",
"Country_MM": "Mjanmar (Búrma)",
"Country_MN": "Mongólía",
@@ -751,7 +751,7 @@
"Language_no": "Norska",
"Language_nr": "Suðurndebele",
"Language_nv": "Navahó",
- "Language_ny": "Njanja; sísjeva; sjeva",
+ "Language_ny": "Nýanja",
"Language_oc": "Oksítaníska",
"Language_oj": "Ojibva",
"Language_om": "Oromo",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Rangún",
"Timezone_Asia_Saigon": "Ho Chi Minh-borg",
diff --git a/plugins/Intl/lang/it.json b/plugins/Intl/lang/it.json
index 3392674a0f..0bf074d000 100644
--- a/plugins/Intl/lang/it.json
+++ b/plugins/Intl/lang/it.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagascar",
"Country_MH": "Isole Marshall",
- "Country_MK": "Repubblica di Macedonia",
+ "Country_MK": "Macedonia del Nord",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Birmania)",
"Country_MN": "Mongolia",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Qostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Rangoon",
"Timezone_Asia_Saigon": "Ho Chi Minh",
diff --git a/plugins/Intl/lang/ja.json b/plugins/Intl/lang/ja.json
index 66bf87ddf9..dd8d06fff4 100644
--- a/plugins/Intl/lang/ja.json
+++ b/plugins/Intl/lang/ja.json
@@ -151,7 +151,7 @@
"Country_MF": "サン・マルタン",
"Country_MG": "マダガスカル",
"Country_MH": "マーシャル諸島",
- "Country_MK": "マケドニア",
+ "Country_MK": "北マケドニア",
"Country_ML": "マリ",
"Country_MM": "ミャンマー (ビルマ)",
"Country_MN": "モンゴル",
@@ -220,7 +220,7 @@
"Country_SV": "エルサルバドル",
"Country_SX": "シント・マールテン",
"Country_SY": "シリア",
- "Country_SZ": "スワジランド",
+ "Country_SZ": "エスワティニ",
"Country_TC": "タークス・カイコス諸島",
"Country_TD": "チャド",
"Country_TF": "仏領極南諸島",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "オムスク",
"Timezone_Asia_Oral": "オラル",
"Timezone_Asia_Pontianak": "ポンティアナック",
+ "Timezone_Asia_Qostanay": "コスタナイ",
"Timezone_Asia_Qyzylorda": "クズロルダ",
"Timezone_Asia_Rangoon": "ヤンゴン",
"Timezone_Asia_Saigon": "ホーチミン",
diff --git a/plugins/Intl/lang/ka.json b/plugins/Intl/lang/ka.json
index 9376457690..0e87886120 100644
--- a/plugins/Intl/lang/ka.json
+++ b/plugins/Intl/lang/ka.json
@@ -151,7 +151,7 @@
"Country_MF": "სენ-მარტენი",
"Country_MG": "მადაგასკარი",
"Country_MH": "მარშალის კუნძულები",
- "Country_MK": "მაკედონია",
+ "Country_MK": "ჩრდილოეთ მაკედონია",
"Country_ML": "მალი",
"Country_MM": "მიანმარი (ბირმა)",
"Country_MN": "მონღოლეთი",
@@ -1038,6 +1038,7 @@
"Timezone_Asia_Omsk": "ომსკი",
"Timezone_Asia_Oral": "ორალი",
"Timezone_Asia_Pontianak": "პონტიანაკი",
+ "Timezone_Asia_Qostanay": "კოსტანაი",
"Timezone_Asia_Qyzylorda": "ყიზილორდა",
"Timezone_Asia_Rangoon": "რანგუნი",
"Timezone_Asia_Saigon": "ჰოჩიმინი",
diff --git a/plugins/Intl/lang/ko.json b/plugins/Intl/lang/ko.json
index 4627388cda..b428f2b3ce 100644
--- a/plugins/Intl/lang/ko.json
+++ b/plugins/Intl/lang/ko.json
@@ -151,7 +151,7 @@
"Country_MF": "생마르탱",
"Country_MG": "마다가스카르",
"Country_MH": "마셜 제도",
- "Country_MK": "마케도니아",
+ "Country_MK": "북마케도니아",
"Country_ML": "말리",
"Country_MM": "미얀마",
"Country_MN": "몽골",
@@ -220,7 +220,7 @@
"Country_SV": "엘살바도르",
"Country_SX": "신트마르턴",
"Country_SY": "시리아",
- "Country_SZ": "스와질란드",
+ "Country_SZ": "에스와티니",
"Country_TC": "터크스 케이커스 제도",
"Country_TD": "차드",
"Country_TF": "프랑스 남부 지방",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "옴스크",
"Timezone_Asia_Oral": "오랄",
"Timezone_Asia_Pontianak": "폰티아나크",
+ "Timezone_Asia_Qostanay": "코스타나이",
"Timezone_Asia_Qyzylorda": "키질로르다",
"Timezone_Asia_Rangoon": "랑군",
"Timezone_Asia_Saigon": "사이공",
diff --git a/plugins/Intl/lang/lt.json b/plugins/Intl/lang/lt.json
index c91ee539eb..ce64f3a831 100644
--- a/plugins/Intl/lang/lt.json
+++ b/plugins/Intl/lang/lt.json
@@ -151,7 +151,7 @@
"Country_MF": "Sen Martenas",
"Country_MG": "Madagaskaras",
"Country_MH": "Maršalo Salos",
- "Country_MK": "Makedonija",
+ "Country_MK": "Šiaurės Makedonija",
"Country_ML": "Malis",
"Country_MM": "Mianmaras (Birma)",
"Country_MN": "Mongolija",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omskas",
"Timezone_Asia_Oral": "Uralskas",
"Timezone_Asia_Pontianak": "Pontianakas",
+ "Timezone_Asia_Qostanay": "Kostanajus",
"Timezone_Asia_Qyzylorda": "Kzyl-Orda",
"Timezone_Asia_Rangoon": "Rangūnas",
"Timezone_Asia_Saigon": "Hošiminas",
diff --git a/plugins/Intl/lang/lv.json b/plugins/Intl/lang/lv.json
index a4b7889b1c..1431091d9f 100644
--- a/plugins/Intl/lang/lv.json
+++ b/plugins/Intl/lang/lv.json
@@ -151,11 +151,11 @@
"Country_MF": "Senmartēna",
"Country_MG": "Madagaskara",
"Country_MH": "Māršala salas",
- "Country_MK": "Maķedonija",
+ "Country_MK": "Ziemeļmaķedonija",
"Country_ML": "Mali",
"Country_MM": "Mjanma (Birma)",
"Country_MN": "Mongolija",
- "Country_MO": "Ķīnas īpašās pārvaldes apgabals Makao",
+ "Country_MO": "ĶTR īpašais administratīvais reģions Makao",
"Country_MP": "Ziemeļu Marianas salas",
"Country_MQ": "Martinika",
"Country_MR": "Mauritānija",
@@ -220,7 +220,7 @@
"Country_SV": "Salvadora",
"Country_SX": "Sintmārtena",
"Country_SY": "Sīrija",
- "Country_SZ": "Svazilenda",
+ "Country_SZ": "Svatini",
"Country_TC": "Tērksas un Kaikosas salas",
"Country_TD": "Čada",
"Country_TF": "Francijas Dienvidjūru teritorija",
@@ -866,11 +866,11 @@
"Month_Short_StandAlone_8": "aug.",
"Month_Short_StandAlone_9": "sept.",
"NDays": "%s dienas",
- "NHoursShort": "%sh",
+ "NHoursShort": "%s h",
"NMinutes": "%s minūtes",
- "NMinutesShort": "%s min.",
+ "NMinutesShort": "%s min",
"NSeconds": "%s sekundes",
- "NSecondsShort": "%ss",
+ "NSecondsShort": "%s s",
"NumberFormatCurrency": "#,##0.00 ¤",
"NumberFormatNumber": "#,##0.###",
"NumberFormatPercent": "#,##0%",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omska",
"Timezone_Asia_Oral": "Orala",
"Timezone_Asia_Pontianak": "Pontianaka",
+ "Timezone_Asia_Qostanay": "Kostanaja",
"Timezone_Asia_Qyzylorda": "Kizilorda",
"Timezone_Asia_Rangoon": "Ranguna",
"Timezone_Asia_Saigon": "Hošimina",
diff --git a/plugins/Intl/lang/nb.json b/plugins/Intl/lang/nb.json
index eb7a5d5d22..355d83dfd7 100644
--- a/plugins/Intl/lang/nb.json
+++ b/plugins/Intl/lang/nb.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint-Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshalløyene",
- "Country_MK": "Makedonia",
+ "Country_MK": "Nord-Makedonia",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Mongolia",
@@ -220,7 +220,7 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Syria",
- "Country_SZ": "Swaziland",
+ "Country_SZ": "Eswatini",
"Country_TC": "Turks- og Caicosøyene",
"Country_TD": "Tsjad",
"Country_TF": "De franske sørterritorier",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanaj",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Ho Chi Minh-byen",
diff --git a/plugins/Intl/lang/nl.json b/plugins/Intl/lang/nl.json
index 18f49d67c0..be2cedba0f 100644
--- a/plugins/Intl/lang/nl.json
+++ b/plugins/Intl/lang/nl.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint-Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshalleilanden",
- "Country_MK": "Macedonië",
+ "Country_MK": "Noord-Macedonië",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Birma)",
"Country_MN": "Mongolië",
@@ -220,7 +220,7 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint-Maarten",
"Country_SY": "Syrië",
- "Country_SZ": "Swaziland",
+ "Country_SZ": "ESwatini",
"Country_TC": "Turks- en Caicoseilanden",
"Country_TD": "Tsjaad",
"Country_TF": "Franse Gebieden in de zuidelijke Indische Oceaan",
@@ -990,7 +990,7 @@
"Timezone_America_SaoPaulo": "São Paulo",
"Timezone_America_Scoresbysund": "Ittoqqortoormiit",
"Timezone_America_Sitka": "Sitka",
- "Timezone_America_StJohns": "St. John’s",
+ "Timezone_America_StJohns": "Saint John’s",
"Timezone_America_SwiftCurrent": "Swift Current",
"Timezone_America_Thule": "Thule",
"Timezone_America_ThunderBay": "Thunder Bay",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Qostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Rangoon",
"Timezone_Asia_Saigon": "Ho Chi Minhstad",
diff --git a/plugins/Intl/lang/nn.json b/plugins/Intl/lang/nn.json
index 273da2ddc5..e6f113acd9 100644
--- a/plugins/Intl/lang/nn.json
+++ b/plugins/Intl/lang/nn.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshalløyane",
- "Country_MK": "Makedonia",
+ "Country_MK": "Nord-Makedonia",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Mongolia",
@@ -1041,6 +1041,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Qostanay",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Yangôn",
"Timezone_Asia_Saigon": "Ho Chi Minh-byen",
diff --git a/plugins/Intl/lang/pl.json b/plugins/Intl/lang/pl.json
index 68b6b92c87..87d14c9a26 100644
--- a/plugins/Intl/lang/pl.json
+++ b/plugins/Intl/lang/pl.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint-Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Wyspy Marshalla",
- "Country_MK": "Macedonia",
+ "Country_MK": "Macedonia Północna",
"Country_ML": "Mali",
"Country_MM": "Mjanma (Birma)",
"Country_MN": "Mongolia",
@@ -220,7 +220,7 @@
"Country_SV": "Salwador",
"Country_SX": "Sint Maarten",
"Country_SY": "Syria",
- "Country_SZ": "Suazi",
+ "Country_SZ": "Eswatini",
"Country_TC": "Turks i Caicos",
"Country_TD": "Czad",
"Country_TF": "Francuskie Terytoria Południowe i Antarktyczne",
@@ -413,12 +413,12 @@
"CurrencySymbol_YER": "YER",
"CurrencySymbol_ZAR": "ZAR",
"CurrencySymbol_ZMW": "ZMW",
- "Currency_AED": "Dirham arabski",
- "Currency_AFN": "Afgani",
+ "Currency_AED": "Dirham ZEA",
+ "Currency_AFN": "Afgani afgańskie",
"Currency_ALL": "Lek albański",
"Currency_AMD": "Dram armeński",
"Currency_ANG": "Gulden antylski",
- "Currency_AOA": "Kwanza angolańska",
+ "Currency_AOA": "Kwanza angolska",
"Currency_ARS": "Peso argentyńskie",
"Currency_AUD": "Dolar australijski",
"Currency_AWG": "Florin arubański",
@@ -431,7 +431,7 @@
"Currency_BIF": "Frank burundyjski",
"Currency_BMD": "Dolar bermudzki",
"Currency_BND": "Dolar brunejski",
- "Currency_BOB": "Boliviano",
+ "Currency_BOB": "Boliviano boliwijskie",
"Currency_BRL": "Real brazylijski",
"Currency_BSD": "Dolar bahamski",
"Currency_BTC": "Bitcoin",
@@ -462,7 +462,7 @@
"Currency_FKP": "Funt falklandzki",
"Currency_GBP": "Funt szterling",
"Currency_GEL": "Lari gruzińskie",
- "Currency_GHS": "Cedi ghański",
+ "Currency_GHS": "Cedi ghańskie",
"Currency_GIP": "Funt gibraltarski",
"Currency_GMD": "Dalasi gambijskie",
"Currency_GNF": "Frank gwinejski",
@@ -471,7 +471,7 @@
"Currency_HKD": "Dolar hongkoński",
"Currency_HNL": "Lempira honduraska",
"Currency_HRK": "Kuna chorwacka",
- "Currency_HTG": "Gourde haitańskie",
+ "Currency_HTG": "Gourde haitański",
"Currency_HUF": "Forint węgierski",
"Currency_IDR": "Rupia indonezyjska",
"Currency_ILS": "Nowy szekel izraelski",
@@ -504,7 +504,7 @@
"Currency_MMK": "Kiat birmański",
"Currency_MNT": "Tugrik mongolski",
"Currency_MOP": "Pataca Makau",
- "Currency_MRU": "Ouguiya mauretańska",
+ "Currency_MRU": "Ugija mauretańska",
"Currency_MUR": "Rupia maurytyjska",
"Currency_MVR": "Rupia malediwska",
"Currency_MWK": "Kwacha malawijska",
@@ -520,7 +520,7 @@
"Currency_OMR": "Rial omański",
"Currency_PAB": "Balboa panamski",
"Currency_PEN": "Sol peruwiański",
- "Currency_PGK": "Kina Papua Nowa Gwinea",
+ "Currency_PGK": "Kina papuańska",
"Currency_PHP": "Peso filipińskie",
"Currency_PKR": "Rupia pakistańska",
"Currency_PLN": "Złoty polski",
@@ -536,7 +536,7 @@
"Currency_SDG": "Funt sudański",
"Currency_SEK": "Korona szwedzka",
"Currency_SGD": "Dolar singapurski",
- "Currency_SHP": "Funt Wyspy Świętej Heleny",
+ "Currency_SHP": "Funt Świętej Heleny",
"Currency_SLL": "Leone sierraleoński",
"Currency_SOS": "Szyling somalijski",
"Currency_SRD": "Dolar surinamski",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Uralsk",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kustanaj",
"Timezone_Asia_Qyzylorda": "Kyzyłorda",
"Timezone_Asia_Rangoon": "Rangun",
"Timezone_Asia_Saigon": "Ho Chi Minh",
diff --git a/plugins/Intl/lang/pt-br.json b/plugins/Intl/lang/pt-br.json
index bb83ab29ed..b18e45f6f9 100644
--- a/plugins/Intl/lang/pt-br.json
+++ b/plugins/Intl/lang/pt-br.json
@@ -151,11 +151,11 @@
"Country_MF": "São Martinho",
"Country_MG": "Madagascar",
"Country_MH": "Ilhas Marshall",
- "Country_MK": "Macedônia",
+ "Country_MK": "Macedônia do Norte",
"Country_ML": "Mali",
"Country_MM": "Mianmar (Birmânia)",
"Country_MN": "Mongólia",
- "Country_MO": "RAE de Macau (China)",
+ "Country_MO": "Macau, RAE da China",
"Country_MP": "Ilhas Marianas do Norte",
"Country_MQ": "Martinica",
"Country_MR": "Mauritânia",
@@ -220,7 +220,7 @@
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Síria",
- "Country_SZ": "Suazilândia",
+ "Country_SZ": "Essuatíni",
"Country_TC": "Ilhas Turcas e Caicos",
"Country_TD": "Chade",
"Country_TF": "Territórios Franceses do Sul",
@@ -443,7 +443,7 @@
"Currency_CDF": "Franco congolês",
"Currency_CHF": "Franco suíço",
"Currency_CLP": "Peso chileno",
- "Currency_CNY": "Renminbi chinês",
+ "Currency_CNY": "Yuan chinês",
"Currency_COP": "Peso colombiano",
"Currency_CRC": "Colón costarriquenho",
"Currency_CUC": "Peso cubano conversível",
@@ -583,34 +583,34 @@
"Day_Long_StandAlone_5": "sexta-feira",
"Day_Long_StandAlone_6": "sábado",
"Day_Long_StandAlone_7": "domingo",
- "Day_Min_1": "seg",
- "Day_Min_2": "ter",
- "Day_Min_3": "qua",
- "Day_Min_4": "qui",
- "Day_Min_5": "sex",
- "Day_Min_6": "sáb",
- "Day_Min_7": "dom",
- "Day_Min_StandAlone_1": "seg",
- "Day_Min_StandAlone_2": "ter",
- "Day_Min_StandAlone_3": "qua",
- "Day_Min_StandAlone_4": "qui",
- "Day_Min_StandAlone_5": "sex",
- "Day_Min_StandAlone_6": "sáb",
- "Day_Min_StandAlone_7": "dom",
- "Day_Short_1": "seg",
- "Day_Short_2": "ter",
- "Day_Short_3": "qua",
- "Day_Short_4": "qui",
- "Day_Short_5": "sex",
- "Day_Short_6": "sáb",
- "Day_Short_7": "dom",
- "Day_Short_StandAlone_1": "seg",
- "Day_Short_StandAlone_2": "ter",
- "Day_Short_StandAlone_3": "qua",
- "Day_Short_StandAlone_4": "qui",
- "Day_Short_StandAlone_5": "sex",
- "Day_Short_StandAlone_6": "sáb",
- "Day_Short_StandAlone_7": "dom",
+ "Day_Min_1": "seg.",
+ "Day_Min_2": "ter.",
+ "Day_Min_3": "qua.",
+ "Day_Min_4": "qui.",
+ "Day_Min_5": "sex.",
+ "Day_Min_6": "sáb.",
+ "Day_Min_7": "dom.",
+ "Day_Min_StandAlone_1": "seg.",
+ "Day_Min_StandAlone_2": "ter.",
+ "Day_Min_StandAlone_3": "qua.",
+ "Day_Min_StandAlone_4": "qui.",
+ "Day_Min_StandAlone_5": "sex.",
+ "Day_Min_StandAlone_6": "sáb.",
+ "Day_Min_StandAlone_7": "dom.",
+ "Day_Short_1": "seg.",
+ "Day_Short_2": "ter.",
+ "Day_Short_3": "qua.",
+ "Day_Short_4": "qui.",
+ "Day_Short_5": "sex.",
+ "Day_Short_6": "sáb.",
+ "Day_Short_7": "dom.",
+ "Day_Short_StandAlone_1": "seg.",
+ "Day_Short_StandAlone_2": "ter.",
+ "Day_Short_StandAlone_3": "qua.",
+ "Day_Short_StandAlone_4": "qui.",
+ "Day_Short_StandAlone_5": "sex.",
+ "Day_Short_StandAlone_6": "sáb.",
+ "Day_Short_StandAlone_7": "dom.",
"EnglishLanguageName": "Brazilian Portuguese",
"Format_DateTime_Long": "EEEE, d 'de' MMMM 'de' y {time}",
"Format_DateTime_Short": "d 'de' MMM 'de' y {time}",
@@ -841,30 +841,30 @@
"Month_Long_StandAlone_7": "julho",
"Month_Long_StandAlone_8": "agosto",
"Month_Long_StandAlone_9": "setembro",
- "Month_Short_1": "jan",
- "Month_Short_10": "out",
- "Month_Short_11": "nov",
- "Month_Short_12": "dez",
- "Month_Short_2": "fev",
- "Month_Short_3": "mar",
- "Month_Short_4": "abr",
- "Month_Short_5": "mai",
- "Month_Short_6": "jun",
- "Month_Short_7": "jul",
- "Month_Short_8": "ago",
- "Month_Short_9": "set",
- "Month_Short_StandAlone_1": "jan",
- "Month_Short_StandAlone_10": "out",
- "Month_Short_StandAlone_11": "nov",
- "Month_Short_StandAlone_12": "dez",
- "Month_Short_StandAlone_2": "fev",
- "Month_Short_StandAlone_3": "mar",
- "Month_Short_StandAlone_4": "abr",
- "Month_Short_StandAlone_5": "mai",
- "Month_Short_StandAlone_6": "jun",
- "Month_Short_StandAlone_7": "jul",
- "Month_Short_StandAlone_8": "ago",
- "Month_Short_StandAlone_9": "set",
+ "Month_Short_1": "jan.",
+ "Month_Short_10": "out.",
+ "Month_Short_11": "nov.",
+ "Month_Short_12": "dez.",
+ "Month_Short_2": "fev.",
+ "Month_Short_3": "mar.",
+ "Month_Short_4": "abr.",
+ "Month_Short_5": "mai.",
+ "Month_Short_6": "jun.",
+ "Month_Short_7": "jul.",
+ "Month_Short_8": "ago.",
+ "Month_Short_9": "set.",
+ "Month_Short_StandAlone_1": "jan.",
+ "Month_Short_StandAlone_10": "out.",
+ "Month_Short_StandAlone_11": "nov.",
+ "Month_Short_StandAlone_12": "dez.",
+ "Month_Short_StandAlone_2": "fev.",
+ "Month_Short_StandAlone_3": "mar.",
+ "Month_Short_StandAlone_4": "abr.",
+ "Month_Short_StandAlone_5": "mai.",
+ "Month_Short_StandAlone_6": "jun.",
+ "Month_Short_StandAlone_7": "jul.",
+ "Month_Short_StandAlone_8": "ago.",
+ "Month_Short_StandAlone_9": "set.",
"NDays": "%s dias",
"NHoursShort": "%s h",
"NMinutes": "%s minutos",
@@ -1009,41 +1009,42 @@
"Timezone_Antarctica_McMurdo": "McMurdo",
"Timezone_Antarctica_Palmer": "Palmer",
"Timezone_Antarctica_Rothera": "Rothera",
- "Timezone_Antarctica_Syowa": "Showa",
+ "Timezone_Antarctica_Syowa": "Syowa",
"Timezone_Antarctica_Troll": "Troll",
"Timezone_Antarctica_Vostok": "Vostok",
"Timezone_Asia_Almaty": "Almaty",
"Timezone_Asia_Anadyr": "Anadyr",
- "Timezone_Asia_Aqtau": "Aqtau",
- "Timezone_Asia_Aqtobe": "Aqtöbe",
+ "Timezone_Asia_Aqtau": "Aktau",
+ "Timezone_Asia_Aqtobe": "Aktobe",
"Timezone_Asia_Atyrau": "Atyrau",
"Timezone_Asia_Barnaul": "Barnaul",
- "Timezone_Asia_Calcutta": "Kolkata",
+ "Timezone_Asia_Calcutta": "Calcutá",
"Timezone_Asia_Chita": "Chita",
"Timezone_Asia_Choibalsan": "Choibalsan",
"Timezone_Asia_Famagusta": "Famagusta",
"Timezone_Asia_Gaza": "Gaza",
- "Timezone_Asia_Hebron": "Hebrom",
+ "Timezone_Asia_Hebron": "Hebron",
"Timezone_Asia_Hovd": "Hovd",
"Timezone_Asia_Irkutsk": "Irkutsk",
"Timezone_Asia_Jakarta": "Jacarta",
"Timezone_Asia_Jayapura": "Jayapura",
"Timezone_Asia_Kamchatka": "Kamchatka",
- "Timezone_Asia_Katmandu": "Catmandu",
+ "Timezone_Asia_Katmandu": "Katmandu",
"Timezone_Asia_Khandyga": "Khandyga",
"Timezone_Asia_Krasnoyarsk": "Krasnoyarsk",
- "Timezone_Asia_KualaLumpur": "Kuala Lampur",
+ "Timezone_Asia_KualaLumpur": "Kuala Lumpur",
"Timezone_Asia_Kuching": "Kuching",
"Timezone_Asia_Magadan": "Magadan",
- "Timezone_Asia_Makassar": "Macáçar",
+ "Timezone_Asia_Makassar": "Makassar",
"Timezone_Asia_Nicosia": "Nicósia",
"Timezone_Asia_Novokuznetsk": "Novokuznetsk",
"Timezone_Asia_Novosibirsk": "Novosibirsk",
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Qostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
- "Timezone_Asia_Rangoon": "Yangon",
+ "Timezone_Asia_Rangoon": "Rangum",
"Timezone_Asia_Saigon": "Ho Chi Minh",
"Timezone_Asia_Sakhalin": "Sacalina",
"Timezone_Asia_Samarkand": "Samarcanda",
@@ -1091,7 +1092,7 @@
"Timezone_Europe_Zaporozhye": "Zaporizhia",
"Timezone_Pacific_Auckland": "Auckland",
"Timezone_Pacific_Bougainville": "Bougainville",
- "Timezone_Pacific_Chatham": "Chatham",
+ "Timezone_Pacific_Chatham": "Chatnam",
"Timezone_Pacific_Easter": "Ilha de Páscoa",
"Timezone_Pacific_Enderbury": "Enderbury",
"Timezone_Pacific_Galapagos": "Galápagos",
diff --git a/plugins/Intl/lang/pt.json b/plugins/Intl/lang/pt.json
index ba3bdd3098..5aa9ae13c7 100644
--- a/plugins/Intl/lang/pt.json
+++ b/plugins/Intl/lang/pt.json
@@ -151,7 +151,7 @@
"Country_MF": "São Martinho",
"Country_MG": "Madagáscar",
"Country_MH": "Ilhas Marshall",
- "Country_MK": "Macedónia",
+ "Country_MK": "Macedónia do Norte",
"Country_ML": "Mali",
"Country_MM": "Mianmar (Birmânia)",
"Country_MN": "Mongólia",
@@ -220,10 +220,10 @@
"Country_SV": "Salvador",
"Country_SX": "São Martinho (Sint Maarten)",
"Country_SY": "Síria",
- "Country_SZ": "Suazilândia",
+ "Country_SZ": "Essuatíni",
"Country_TC": "Ilhas Turcas e Caicos",
"Country_TD": "Chade",
- "Country_TF": "Territórios Franceses do Sul",
+ "Country_TF": "Territórios Austrais Franceses",
"Country_TG": "Togo",
"Country_TH": "Tailândia",
"Country_TJ": "Tajiquistão",
@@ -414,7 +414,7 @@
"CurrencySymbol_ZAR": "ZAR",
"CurrencySymbol_ZMW": "ZMW",
"Currency_AED": "Dirham dos Emirados Árabes Unidos",
- "Currency_AFN": "Afegani do Afeganistão",
+ "Currency_AFN": "Afegâni afegão",
"Currency_ALL": "Lek albanês",
"Currency_AMD": "Dram arménio",
"Currency_ANG": "Florim das Antilhas Holandesas",
@@ -422,20 +422,20 @@
"Currency_ARS": "Peso argentino",
"Currency_AUD": "Dólar australiano",
"Currency_AWG": "Florim de Aruba",
- "Currency_AZN": "Manat do Azerbaijão",
+ "Currency_AZN": "Manat azeri",
"Currency_BAM": "Marco bósnio-herzegóvino conversível",
"Currency_BBD": "Dólar barbadense",
- "Currency_BDT": "Taka de Bangladesh",
+ "Currency_BDT": "Taka bengali",
"Currency_BGN": "Lev búlgaro",
"Currency_BHD": "Dinar baremita",
"Currency_BIF": "Franco burundiano",
"Currency_BMD": "Dólar bermudense",
- "Currency_BND": "Dólar bruneíno",
+ "Currency_BND": "Dólar bruneano",
"Currency_BOB": "Boliviano",
"Currency_BRL": "Real brasileiro",
"Currency_BSD": "Dólar das Bahamas",
"Currency_BTC": "Bitcoin",
- "Currency_BTN": "Ngultrum do Butão",
+ "Currency_BTN": "Ngultrum butanês",
"Currency_BWP": "Pula de Botswana",
"Currency_BYN": "Rublo bielorrusso",
"Currency_BZD": "Dólar belizense",
@@ -458,7 +458,7 @@
"Currency_ERN": "Nakfa eritreia",
"Currency_ETB": "Birr etíope",
"Currency_EUR": "Euro",
- "Currency_FJD": "Dólar de Fiji",
+ "Currency_FJD": "Dólar fijiano",
"Currency_FKP": "Libra das Ilhas Falkland",
"Currency_GBP": "Libra esterlina britânica",
"Currency_GEL": "Lari georgiano",
@@ -483,15 +483,15 @@
"Currency_JOD": "Dinar jordaniano",
"Currency_JPY": "Iene japonês",
"Currency_KES": "Xelim queniano",
- "Currency_KGS": "Som do Quirguistão",
+ "Currency_KGS": "Som quirguiz",
"Currency_KHR": "Riel cambojano",
"Currency_KMF": "Franco comoriano",
"Currency_KPW": "Won norte-coreano",
"Currency_KRW": "Won sul-coreano",
"Currency_KWD": "Dinar kuwaitiano",
"Currency_KYD": "Dólar das Ilhas Caimão",
- "Currency_KZT": "Tenge do Cazaquistão",
- "Currency_LAK": "Kip de Laos",
+ "Currency_KZT": "Tenge cazaque",
+ "Currency_LAK": "Kip laosiano",
"Currency_LBP": "Libra libanesa",
"Currency_LKR": "Rupia do Sri Lanka",
"Currency_LRD": "Dólar liberiano",
@@ -502,30 +502,30 @@
"Currency_MGA": "Ariari malgaxe",
"Currency_MKD": "Dinar macedónio",
"Currency_MMK": "Kyat de Mianmar",
- "Currency_MNT": "Tugrik da Mongólia",
- "Currency_MOP": "Pataca de Macau",
+ "Currency_MNT": "Tugrik mongol",
+ "Currency_MOP": "Pataca macaense",
"Currency_MRU": "Ouguiya mauritana",
"Currency_MUR": "Rupia mauriciana",
- "Currency_MVR": "Rupia das Ilhas Maldivas",
+ "Currency_MVR": "Rupia maldivana",
"Currency_MWK": "Kwacha malauiano",
"Currency_MXN": "Peso mexicano",
"Currency_MYR": "Ringgit malaio",
"Currency_MZN": "Metical moçambicano",
- "Currency_NAD": "Dólar da Namíbia",
+ "Currency_NAD": "Dólar namibiano",
"Currency_NGN": "Naira nigeriana",
"Currency_NIO": "Córdoba nicaraguano",
"Currency_NOK": "Coroa norueguesa",
"Currency_NPR": "Rupia nepalesa",
"Currency_NZD": "Dólar neozelandês",
- "Currency_OMR": "Rial de Omã",
+ "Currency_OMR": "Rial omanense",
"Currency_PAB": "Balboa do Panamá",
"Currency_PEN": "Sol peruano",
- "Currency_PGK": "Kina da Papua-Nova Guiné",
+ "Currency_PGK": "Kina papuásia",
"Currency_PHP": "Peso filipino",
"Currency_PKR": "Rupia paquistanesa",
"Currency_PLN": "Zloti polaco",
"Currency_PYG": "Guarani paraguaio",
- "Currency_QAR": "Rial do Catar",
+ "Currency_QAR": "Rial catarense",
"Currency_RON": "Leu romeno",
"Currency_RSD": "Dinar sérvio",
"Currency_RUB": "Rublo russo",
@@ -535,7 +535,7 @@
"Currency_SCR": "Rupia seichelense",
"Currency_SDG": "Libra sudanesa",
"Currency_SEK": "Coroa sueca",
- "Currency_SGD": "Dólar de Singapura",
+ "Currency_SGD": "Dólar singapuriano",
"Currency_SHP": "Libra santa-helenense",
"Currency_SLL": "Leone de Serra Leoa",
"Currency_SOS": "Xelim somali",
@@ -543,12 +543,12 @@
"Currency_SSP": "Libra sul-sudanesa",
"Currency_STN": "Dobra de São Tomé e Príncipe",
"Currency_SYP": "Libra síria",
- "Currency_SZL": "Lilangeni da Suazilândia",
- "Currency_THB": "Baht da Tailândia",
- "Currency_TJS": "Somoni do Tajaquistão",
- "Currency_TMT": "Manat do Turquemenistão",
+ "Currency_SZL": "Lilangeni suázi",
+ "Currency_THB": "Baht tailandês",
+ "Currency_TJS": "Somoni tajique",
+ "Currency_TMT": "Manat turcomeno",
"Currency_TND": "Dinar tunisino",
- "Currency_TOP": "Paʻanga de Tonga",
+ "Currency_TOP": "Paʻanga tonganesa",
"Currency_TRY": "Lira turca",
"Currency_TTD": "Dólar de Trindade e Tobago",
"Currency_TWD": "Novo dólar taiwanês",
@@ -557,7 +557,7 @@
"Currency_UGX": "Xelim ugandense",
"Currency_USD": "Dólar dos Estados Unidos",
"Currency_UYU": "Peso uruguaio",
- "Currency_UZS": "Som do Uzbequistão",
+ "Currency_UZS": "Som uzbeque",
"Currency_VEF": "Bolívar (2008–2018)",
"Currency_VND": "Dong vietnamita",
"Currency_VUV": "Vatu de Vanuatu",
@@ -583,20 +583,20 @@
"Day_Long_StandAlone_5": "sexta-feira",
"Day_Long_StandAlone_6": "sábado",
"Day_Long_StandAlone_7": "domingo",
- "Day_Min_1": "seg",
- "Day_Min_2": "ter",
- "Day_Min_3": "qua",
- "Day_Min_4": "qui",
- "Day_Min_5": "sex",
- "Day_Min_6": "sáb",
- "Day_Min_7": "dom",
- "Day_Min_StandAlone_1": "seg",
- "Day_Min_StandAlone_2": "ter",
- "Day_Min_StandAlone_3": "qua",
- "Day_Min_StandAlone_4": "qui",
- "Day_Min_StandAlone_5": "sex",
- "Day_Min_StandAlone_6": "sáb",
- "Day_Min_StandAlone_7": "dom",
+ "Day_Min_1": "segunda",
+ "Day_Min_2": "terça",
+ "Day_Min_3": "quarta",
+ "Day_Min_4": "quinta",
+ "Day_Min_5": "sexta",
+ "Day_Min_6": "sábado",
+ "Day_Min_7": "domingo",
+ "Day_Min_StandAlone_1": "segunda",
+ "Day_Min_StandAlone_2": "terça",
+ "Day_Min_StandAlone_3": "quarta",
+ "Day_Min_StandAlone_4": "quinta",
+ "Day_Min_StandAlone_5": "sexta",
+ "Day_Min_StandAlone_6": "sábado",
+ "Day_Min_StandAlone_7": "domingo",
"Day_Short_1": "segunda",
"Day_Short_2": "terça",
"Day_Short_3": "quarta",
@@ -841,30 +841,30 @@
"Month_Long_StandAlone_7": "julho",
"Month_Long_StandAlone_8": "agosto",
"Month_Long_StandAlone_9": "setembro",
- "Month_Short_1": "jan",
- "Month_Short_10": "out",
- "Month_Short_11": "nov",
- "Month_Short_12": "dez",
- "Month_Short_2": "fev",
- "Month_Short_3": "mar",
- "Month_Short_4": "abr",
- "Month_Short_5": "mai",
- "Month_Short_6": "jun",
- "Month_Short_7": "jul",
- "Month_Short_8": "ago",
- "Month_Short_9": "set",
- "Month_Short_StandAlone_1": "jan",
- "Month_Short_StandAlone_10": "out",
- "Month_Short_StandAlone_11": "nov",
- "Month_Short_StandAlone_12": "dez",
- "Month_Short_StandAlone_2": "fev",
- "Month_Short_StandAlone_3": "mar",
- "Month_Short_StandAlone_4": "abr",
- "Month_Short_StandAlone_5": "mai",
- "Month_Short_StandAlone_6": "jun",
- "Month_Short_StandAlone_7": "jul",
- "Month_Short_StandAlone_8": "ago",
- "Month_Short_StandAlone_9": "set",
+ "Month_Short_1": "jan.",
+ "Month_Short_10": "out.",
+ "Month_Short_11": "nov.",
+ "Month_Short_12": "dez.",
+ "Month_Short_2": "fev.",
+ "Month_Short_3": "mar.",
+ "Month_Short_4": "abr.",
+ "Month_Short_5": "mai.",
+ "Month_Short_6": "jun.",
+ "Month_Short_7": "jul.",
+ "Month_Short_8": "ago.",
+ "Month_Short_9": "set.",
+ "Month_Short_StandAlone_1": "jan.",
+ "Month_Short_StandAlone_10": "out.",
+ "Month_Short_StandAlone_11": "nov.",
+ "Month_Short_StandAlone_12": "dez.",
+ "Month_Short_StandAlone_2": "fev.",
+ "Month_Short_StandAlone_3": "mar.",
+ "Month_Short_StandAlone_4": "abr.",
+ "Month_Short_StandAlone_5": "mai.",
+ "Month_Short_StandAlone_6": "jun.",
+ "Month_Short_StandAlone_7": "jul.",
+ "Month_Short_StandAlone_8": "ago.",
+ "Month_Short_StandAlone_9": "set.",
"NDays": "%s dias",
"NHoursShort": "%s h",
"NMinutes": "%s minutos",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Cidade de Ho Chi Minh",
diff --git a/plugins/Intl/lang/ro.json b/plugins/Intl/lang/ro.json
index 658aa73f0f..239d9fdab7 100644
--- a/plugins/Intl/lang/ro.json
+++ b/plugins/Intl/lang/ro.json
@@ -151,11 +151,11 @@
"Country_MF": "Sfântul Martin",
"Country_MG": "Madagascar",
"Country_MH": "Insulele Marshall",
- "Country_MK": "Republica Macedonia",
+ "Country_MK": "Macedonia de Nord",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Birmania)",
"Country_MN": "Mongolia",
- "Country_MO": "R.A.S. Macao a Chinei",
+ "Country_MO": "R.A.S. Macao, China",
"Country_MP": "Insulele Mariane de Nord",
"Country_MQ": "Martinica",
"Country_MR": "Mauritania",
@@ -216,11 +216,11 @@
"Country_SO": "Somalia",
"Country_SR": "Suriname",
"Country_SS": "Sudanul de Sud",
- "Country_ST": "Sao Tome și Principe",
+ "Country_ST": "São Tomé și Príncipe",
"Country_SV": "El Salvador",
"Country_SX": "Sint-Maarten",
"Country_SY": "Siria",
- "Country_SZ": "Swaziland",
+ "Country_SZ": "ESwatini",
"Country_TC": "Insulele Turks și Caicos",
"Country_TD": "Ciad",
"Country_TF": "Teritoriile Australe și Antarctice Franceze",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Uralsk",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Ho Și Min",
diff --git a/plugins/Intl/lang/ru.json b/plugins/Intl/lang/ru.json
index 4eef9c9299..81044e6b6e 100644
--- a/plugins/Intl/lang/ru.json
+++ b/plugins/Intl/lang/ru.json
@@ -151,7 +151,7 @@
"Country_MF": "Сен-Мартен",
"Country_MG": "Мадагаскар",
"Country_MH": "Маршалловы Острова",
- "Country_MK": "Македония",
+ "Country_MK": "Северная Македония",
"Country_ML": "Мали",
"Country_MM": "Мьянма (Бирма)",
"Country_MN": "Монголия",
@@ -220,7 +220,7 @@
"Country_SV": "Сальвадор",
"Country_SX": "Синт-Мартен",
"Country_SY": "Сирия",
- "Country_SZ": "Свазиленд",
+ "Country_SZ": "Эсватини",
"Country_TC": "О-ва Тёркс и Кайкос",
"Country_TD": "Чад",
"Country_TF": "Французские Южные территории",
@@ -974,7 +974,7 @@
"Timezone_America_NorthDakota_Center": "Центр, Северная Дакота",
"Timezone_America_NorthDakota_NewSalem": "Нью-Сейлем, Северная Дакота",
"Timezone_America_Ojinaga": "Охинага",
- "Timezone_America_Pangnirtung": "Пангниртунг",
+ "Timezone_America_Pangnirtung": "Пангниртанг",
"Timezone_America_Phoenix": "Финикс",
"Timezone_America_PortoVelho": "Порту-Велью",
"Timezone_America_PuntaArenas": "Пунта-Аренас",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Омск",
"Timezone_Asia_Oral": "Уральск",
"Timezone_Asia_Pontianak": "Понтианак",
+ "Timezone_Asia_Qostanay": "Костанай",
"Timezone_Asia_Qyzylorda": "Кызылорда",
"Timezone_Asia_Rangoon": "Янгон",
"Timezone_Asia_Saigon": "Хошимин",
diff --git a/plugins/Intl/lang/sk.json b/plugins/Intl/lang/sk.json
index 9d85dfd780..46a811609d 100644
--- a/plugins/Intl/lang/sk.json
+++ b/plugins/Intl/lang/sk.json
@@ -151,7 +151,7 @@
"Country_MF": "Svätý Martin (fr.)",
"Country_MG": "Madagaskar",
"Country_MH": "Marshallove ostrovy",
- "Country_MK": "Macedónsko",
+ "Country_MK": "Severné Macedónsko",
"Country_ML": "Mali",
"Country_MM": "Mjanmarsko",
"Country_MN": "Mongolsko",
@@ -220,7 +220,7 @@
"Country_SV": "Salvádor",
"Country_SX": "Svätý Martin (hol.)",
"Country_SY": "Sýria",
- "Country_SZ": "Svazijsko",
+ "Country_SZ": "Eswatini",
"Country_TC": "Turks a Caicos",
"Country_TD": "Čad",
"Country_TF": "Francúzske južné a antarktické územia",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Uraľsk",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanaj",
"Timezone_Asia_Qyzylorda": "Kyzylorda",
"Timezone_Asia_Rangoon": "Rangún",
"Timezone_Asia_Saigon": "Hočiminovo Mesto",
diff --git a/plugins/Intl/lang/sl.json b/plugins/Intl/lang/sl.json
index 363dff2789..2a18150cdf 100644
--- a/plugins/Intl/lang/sl.json
+++ b/plugins/Intl/lang/sl.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshallovi otoki",
- "Country_MK": "Makedonija",
+ "Country_MK": "Severna Makedonija",
"Country_ML": "Mali",
"Country_MM": "Mjanmar (Burma)",
"Country_MN": "Mongolija",
@@ -220,7 +220,7 @@
"Country_SV": "Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Sirija",
- "Country_SZ": "Svazi",
+ "Country_SZ": "Esvatini",
"Country_TC": "Otoki Turks in Caicos",
"Country_TD": "Čad",
"Country_TF": "Francosko južno ozemlje",
@@ -1017,7 +1017,7 @@
"Timezone_Asia_Aqtobe": "Aktobe",
"Timezone_Asia_Atyrau": "Atyrau",
"Timezone_Asia_Barnaul": "Barnaul",
- "Timezone_Asia_Calcutta": "Kolkata",
+ "Timezone_Asia_Calcutta": "Kalkuta",
"Timezone_Asia_Chita": "Čita",
"Timezone_Asia_Choibalsan": "Čojbalsan",
"Timezone_Asia_Famagusta": "Famagusta",
@@ -1041,6 +1041,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Uralsk",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanaj",
"Timezone_Asia_Qyzylorda": "Kizlorda",
"Timezone_Asia_Rangoon": "Rangun",
"Timezone_Asia_Saigon": "Hošiminh",
diff --git a/plugins/Intl/lang/sq.json b/plugins/Intl/lang/sq.json
index de4ffc7d47..1d2f8ee6f0 100644
--- a/plugins/Intl/lang/sq.json
+++ b/plugins/Intl/lang/sq.json
@@ -151,7 +151,7 @@
"Country_MF": "Sen-Marten",
"Country_MG": "Madagaskar",
"Country_MH": "Ishujt Marshall",
- "Country_MK": "Maqedoni",
+ "Country_MK": "Maqedonia e Veriut",
"Country_ML": "Mali",
"Country_MM": "Mianmar (Burmë)",
"Country_MN": "Mongoli",
@@ -220,7 +220,7 @@
"Country_SV": "Salvador",
"Country_SX": "Sint-Marten",
"Country_SY": "Siri",
- "Country_SZ": "Suazilend",
+ "Country_SZ": "Esvatini",
"Country_TC": "Ishujt Turks dhe Kaikos",
"Country_TD": "Çad",
"Country_TF": "Territoret Jugore Franceze",
@@ -276,7 +276,7 @@
"CurrencySymbol_BMD": "BMD",
"CurrencySymbol_BND": "BND",
"CurrencySymbol_BOB": "BOB",
- "CurrencySymbol_BRL": "R$",
+ "CurrencySymbol_BRL": "BRL",
"CurrencySymbol_BSD": "BSD",
"CurrencySymbol_BTC": "BTC",
"CurrencySymbol_BTN": "BTN",
@@ -1033,6 +1033,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanaj",
"Timezone_Asia_Qyzylorda": "Kizilorda",
"Timezone_Asia_Rangoon": "Rangun",
"Timezone_Asia_Saigon": "Ho-Çi-Min",
diff --git a/plugins/Intl/lang/sr.json b/plugins/Intl/lang/sr.json
index 3e3fca8a6a..8e86a5f800 100644
--- a/plugins/Intl/lang/sr.json
+++ b/plugins/Intl/lang/sr.json
@@ -151,7 +151,7 @@
"Country_MF": "Свети Мартин (Француска)",
"Country_MG": "Мадагаскар",
"Country_MH": "Маршалска Острва",
- "Country_MK": "Македонија",
+ "Country_MK": "Северна Македонија",
"Country_ML": "Мали",
"Country_MM": "Мијанмар (Бурма)",
"Country_MN": "Монголија",
@@ -450,7 +450,7 @@
"Currency_CUP": "Кубански пезос",
"Currency_CVE": "Зеленортски ескудо",
"Currency_CZK": "Чешка круна",
- "Currency_DJF": "Џибутански франак",
+ "Currency_DJF": "Џибутски франак",
"Currency_DKK": "Данска круна",
"Currency_DOP": "Доминикански пезос",
"Currency_DZD": "Алжирски динар",
@@ -504,7 +504,7 @@
"Currency_MMK": "Мјанмарски кјат",
"Currency_MNT": "Монголски тугрик",
"Currency_MOP": "Макаоска патака",
- "Currency_MRU": "Мауританијска oгија",
+ "Currency_MRU": "Мауританска огија",
"Currency_MUR": "Маурицијска рупија",
"Currency_MVR": "Малдивска руфија",
"Currency_MWK": "Малавијска квача",
@@ -536,7 +536,7 @@
"Currency_SDG": "Суданска фунта",
"Currency_SEK": "Шведска круна",
"Currency_SGD": "Сингапурски долар",
- "Currency_SHP": "Св. јеленска фунта",
+ "Currency_SHP": "Свете Јелене фунта",
"Currency_SLL": "Сијералеонски леоне",
"Currency_SOS": "Сомалијски шилинг",
"Currency_SRD": "Суринамски долар",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Омск",
"Timezone_Asia_Oral": "Орал",
"Timezone_Asia_Pontianak": "Понтијанак",
+ "Timezone_Asia_Qostanay": "Костанај",
"Timezone_Asia_Qyzylorda": "Кизилорда",
"Timezone_Asia_Rangoon": "Рангун",
"Timezone_Asia_Saigon": "Хо Ши Мин",
diff --git a/plugins/Intl/lang/sv.json b/plugins/Intl/lang/sv.json
index 1ef11e5827..8306b85c41 100644
--- a/plugins/Intl/lang/sv.json
+++ b/plugins/Intl/lang/sv.json
@@ -51,7 +51,7 @@
"Country_CF": "Centralafrikanska republiken",
"Country_CG": "Kongo-Brazzaville",
"Country_CH": "Schweiz",
- "Country_CI": "Elfenbenskusten",
+ "Country_CI": "Côte d’Ivoire",
"Country_CK": "Cooköarna",
"Country_CL": "Chile",
"Country_CM": "Kamerun",
@@ -151,7 +151,7 @@
"Country_MF": "Saint-Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshallöarna",
- "Country_MK": "Makedonien",
+ "Country_MK": "Nordmakedonien",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Mongoliet",
@@ -721,7 +721,7 @@
"Language_ku": "Kurdiska",
"Language_kv": "Kome",
"Language_kw": "Korniska",
- "Language_ky": "Kirgisiska",
+ "Language_ky": "Kirgiziska",
"Language_la": "Latin",
"Language_lb": "Luxemburgiska",
"Language_lg": "Luganda",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanaj",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Rangoon",
"Timezone_Asia_Saigon": "Ho Chi Minh-staden",
diff --git a/plugins/Intl/lang/ta.json b/plugins/Intl/lang/ta.json
index 1ab2b40753..79640f8669 100644
--- a/plugins/Intl/lang/ta.json
+++ b/plugins/Intl/lang/ta.json
@@ -25,7 +25,7 @@
"Country_AX": "ஆலந்து தீவுகள்",
"Country_AZ": "அசர்பைஜான்",
"Country_BA": "போஸ்னியா & ஹெர்ஸகோவினா",
- "Country_BB": "பார்படோஸ்",
+ "Country_BB": "பார்படாஸ்",
"Country_BD": "பங்களாதேஷ்",
"Country_BE": "பெல்ஜியம்",
"Country_BF": "புர்கினா ஃபாஸோ",
@@ -41,7 +41,7 @@
"Country_BR": "பிரேசில்",
"Country_BS": "பஹாமாஸ்",
"Country_BT": "பூடான்",
- "Country_BV": "பொவேட் தீவுகள்",
+ "Country_BV": "பொவேட் தீவு",
"Country_BW": "போட்ஸ்வானா",
"Country_BY": "பெலாரஸ்",
"Country_BZ": "பெலிஸ்",
@@ -105,7 +105,7 @@
"Country_HK": "ஹாங்காங் எஸ்ஏஆர் சீனா",
"Country_HM": "ஹேர்ட் மற்றும் மெக்டொனால்டு தீவுகள்",
"Country_HN": "ஹோண்டூராஸ்",
- "Country_HR": "குரேஷியா",
+ "Country_HR": "குரோஷியா",
"Country_HT": "ஹைட்டி",
"Country_HU": "ஹங்கேரி",
"Country_ID": "இந்தோனேசியா",
@@ -151,7 +151,7 @@
"Country_MF": "செயின்ட் மார்ட்டீன்",
"Country_MG": "மடகாஸ்கர்",
"Country_MH": "மார்ஷல் தீவுகள்",
- "Country_MK": "மாசிடோனியா",
+ "Country_MK": "வடக்கு மாசிடோனியா",
"Country_ML": "மாலி",
"Country_MM": "மியான்மார் (பர்மா)",
"Country_MN": "மங்கோலியா",
@@ -220,7 +220,7 @@
"Country_SV": "எல் சால்வடார்",
"Country_SX": "சின்ட் மார்டென்",
"Country_SY": "சிரியா",
- "Country_SZ": "ஸ்வாஸிலாந்து",
+ "Country_SZ": "எஸ்வாட்டீனி",
"Country_TC": "டர்க்ஸ் & கைகோஸ் தீவுகள்",
"Country_TD": "சாட்",
"Country_TF": "பிரெஞ்சு தெற்கு பிரதேசங்கள்",
@@ -228,7 +228,7 @@
"Country_TH": "தாய்லாந்து",
"Country_TJ": "தஜிகிஸ்தான்",
"Country_TK": "டோகேலோ",
- "Country_TL": "தைமூர்-லெஸ்தே",
+ "Country_TL": "திமோர்-லெஸ்தே",
"Country_TM": "துர்க்மெனிஸ்தான்",
"Country_TN": "டுனிசியா",
"Country_TO": "டோங்கா",
@@ -643,7 +643,7 @@
"Language_as": "அஸ்ஸாமீஸ்",
"Language_av": "அவேரிக்",
"Language_ay": "அய்மரா",
- "Language_az": "அஸர்பைஜானி",
+ "Language_az": "அசர்பைஜானி",
"Language_ba": "பஷ்கிர்",
"Language_be": "பெலாருஷியன்",
"Language_bg": "பல்கேரியன்",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "ஓம்ஸ்க்",
"Timezone_Asia_Oral": "ஓரல்",
"Timezone_Asia_Pontianak": "போன்டியானாக்",
+ "Timezone_Asia_Qostanay": "கோஸ்டானே",
"Timezone_Asia_Qyzylorda": "கிஸிலோர்டா",
"Timezone_Asia_Rangoon": "ரங்கூன்",
"Timezone_Asia_Saigon": "ஹோ சி மின் சிட்டி",
diff --git a/plugins/Intl/lang/te.json b/plugins/Intl/lang/te.json
index 1d912e04f1..211432b2f5 100644
--- a/plugins/Intl/lang/te.json
+++ b/plugins/Intl/lang/te.json
@@ -102,7 +102,7 @@
"Country_GU": "గ్వామ్",
"Country_GW": "గినియా-బిస్సావ్",
"Country_GY": "గయానా",
- "Country_HK": "హాంకాంగ్ ఎస్ఏఆర్",
+ "Country_HK": "హాంకాంగ్ ఎస్ఏఆర్ చైనా",
"Country_HM": "హెర్డ్ దీవి మరియు మెక్‌డొనాల్డ్ దీవులు",
"Country_HN": "హోండురాస్",
"Country_HR": "క్రొయేషియా",
@@ -113,7 +113,7 @@
"Country_IL": "ఇజ్రాయెల్",
"Country_IM": "ఐల్ ఆఫ్ మాన్",
"Country_IN": "భారతదేశం",
- "Country_IO": "బ్రిటీష్ హిందూ మహాసముద్ర ప్రాంతం",
+ "Country_IO": "బ్రిటిష్ హిందూ మహాసముద్ర ప్రాంతం",
"Country_IQ": "ఇరాక్",
"Country_IR": "ఇరాన్",
"Country_IS": "ఐస్లాండ్",
@@ -151,7 +151,7 @@
"Country_MF": "సెయింట్ మార్టిన్",
"Country_MG": "మడగాస్కర్",
"Country_MH": "మార్షల్ దీవులు",
- "Country_MK": "మేసిడోనియా",
+ "Country_MK": "ఉత్తర మాసిడోనియా",
"Country_ML": "మాలి",
"Country_MM": "మయన్మార్",
"Country_MN": "మంగోలియా",
@@ -220,7 +220,7 @@
"Country_SV": "ఎల్ సాల్వడోర్",
"Country_SX": "సింట్ మార్టెన్",
"Country_SY": "సిరియా",
- "Country_SZ": "స్వాజిల్యాండ్",
+ "Country_SZ": "ఈస్వాటిని",
"Country_TC": "టర్క్స్ మరియు కైకోస్ దీవులు",
"Country_TD": "చాద్",
"Country_TF": "ఫ్రెంచ్ దక్షిణ ప్రాంతాలు",
@@ -474,7 +474,7 @@
"Currency_HTG": "హైటియన్ గ్వోర్డే",
"Currency_HUF": "హంగేరియన్ ఫోరింట్",
"Currency_IDR": "ఇండోనేషియా రూపాయి",
- "Currency_ILS": "ఐరాయిలి న్యూ షెక్యెల్",
+ "Currency_ILS": "ఇజ్రాయేలీ న్యూ షెకెల్",
"Currency_INR": "రూపాయి",
"Currency_IQD": "ఇరాకీ దీనార్",
"Currency_IRR": "ఇరానియన్ రీయల్",
@@ -549,7 +549,7 @@
"Currency_TMT": "తుర్క్‌మెనిస్థాని మనాట్",
"Currency_TND": "తునీషియన్ దీనార్",
"Currency_TOP": "టోంగాన్ పాంʻగా",
- "Currency_TRY": "తుర్కిష్ లిరా",
+ "Currency_TRY": "టర్కిస్ లీరా",
"Currency_TTD": "ట్రినిడాడ్ మరియు టొబాగో డాలర్",
"Currency_TWD": "క్రొత్త తైవాన్ డాలర్",
"Currency_TZS": "టాంజానియన్ షిల్లింగ్",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "ఓమ్స్క్",
"Timezone_Asia_Oral": "ఓరల్",
"Timezone_Asia_Pontianak": "పొన్టియనాక్",
+ "Timezone_Asia_Qostanay": "కోస్తానే",
"Timezone_Asia_Qyzylorda": "క్విజిలోర్డా",
"Timezone_Asia_Rangoon": "యాంగన్",
"Timezone_Asia_Saigon": "హో చి మిన్హ్ నగరం",
diff --git a/plugins/Intl/lang/th.json b/plugins/Intl/lang/th.json
index f749980864..b2985461f4 100644
--- a/plugins/Intl/lang/th.json
+++ b/plugins/Intl/lang/th.json
@@ -41,7 +41,7 @@
"Country_BR": "บราซิล",
"Country_BS": "บาฮามาส",
"Country_BT": "ภูฏาน",
- "Country_BV": "เกาะบูเวต",
+ "Country_BV": "เกาะบูเว",
"Country_BW": "บอตสวานา",
"Country_BY": "เบลารุส",
"Country_BZ": "เบลีซ",
@@ -151,7 +151,7 @@
"Country_MF": "เซนต์มาร์ติน",
"Country_MG": "มาดากัสการ์",
"Country_MH": "หมู่เกาะมาร์แชลล์",
- "Country_MK": "มาซิโดเนีย",
+ "Country_MK": "มาซิโดเนียเหนือ",
"Country_ML": "มาลี",
"Country_MM": "เมียนมาร์ (พม่า)",
"Country_MN": "มองโกเลีย",
@@ -220,7 +220,7 @@
"Country_SV": "เอลซัลวาดอร์",
"Country_SX": "ซินต์มาร์เทน",
"Country_SY": "ซีเรีย",
- "Country_SZ": "สวาซิแลนด์",
+ "Country_SZ": "เอสวาตีนี",
"Country_TC": "หมู่เกาะเติกส์และหมู่เกาะเคคอส",
"Country_TD": "ชาด",
"Country_TF": "เฟรนช์เซาเทิร์นเทร์ริทอรีส์",
@@ -699,7 +699,7 @@
"Language_id": "อินโดนีเซีย",
"Language_ie": "อินเตอร์ลิงกิว",
"Language_ig": "อิกโบ",
- "Language_ii": "เสฉวนยิ",
+ "Language_ii": "เสฉวนยี่",
"Language_ik": "อีนูเปียก",
"Language_io": "อีโด",
"Language_is": "ไอซ์แลนด์",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "โอมสก์",
"Timezone_Asia_Oral": "ออรัล",
"Timezone_Asia_Pontianak": "พอนเทียนัก",
+ "Timezone_Asia_Qostanay": "คอสตาเนย์",
"Timezone_Asia_Qyzylorda": "ไคซีลอร์ดา",
"Timezone_Asia_Rangoon": "ย่างกุ้ง",
"Timezone_Asia_Saigon": "นครโฮจิมินห์",
diff --git a/plugins/Intl/lang/tl.json b/plugins/Intl/lang/tl.json
index f7d9bf5f61..b6a73f3ddb 100644
--- a/plugins/Intl/lang/tl.json
+++ b/plugins/Intl/lang/tl.json
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagascar",
"Country_MH": "Marshall Islands",
- "Country_MK": "Macedonia",
+ "Country_MK": "North Macedonia",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Mongolia",
@@ -1035,6 +1035,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Rangoon",
"Timezone_Asia_Saigon": "Lungsod ng Ho Chi Minh",
diff --git a/plugins/Intl/lang/tr.json b/plugins/Intl/lang/tr.json
index 4a0f5f8eb8..545b8a275b 100644
--- a/plugins/Intl/lang/tr.json
+++ b/plugins/Intl/lang/tr.json
@@ -51,7 +51,7 @@
"Country_CF": "Orta Afrika Cumhuriyeti",
"Country_CG": "Kongo - Brazavil",
"Country_CH": "İsviçre",
- "Country_CI": "Fildişi Sahili",
+ "Country_CI": "Côte d’Ivoire",
"Country_CK": "Cook Adaları",
"Country_CL": "Şili",
"Country_CM": "Kamerun",
@@ -151,7 +151,7 @@
"Country_MF": "Saint Martin",
"Country_MG": "Madagaskar",
"Country_MH": "Marshall Adaları",
- "Country_MK": "Makedonya",
+ "Country_MK": "Kuzey Makedonya",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Burma)",
"Country_MN": "Moğolistan",
@@ -195,7 +195,7 @@
"Country_PW": "Palau",
"Country_PY": "Paraguay",
"Country_QA": "Katar",
- "Country_RE": "Réunion",
+ "Country_RE": "Reunion",
"Country_RO": "Romanya",
"Country_RS": "Sırbistan",
"Country_RU": "Rusya",
@@ -216,11 +216,11 @@
"Country_SO": "Somali",
"Country_SR": "Surinam",
"Country_SS": "Güney Sudan",
- "Country_ST": "São Tomé ve Príncipe",
+ "Country_ST": "Sao Tome ve Principe",
"Country_SV": "El Salvador",
"Country_SX": "Sint Maarten",
"Country_SY": "Suriye",
- "Country_SZ": "Svaziland",
+ "Country_SZ": "Esvatini",
"Country_TC": "Turks ve Caicos Adaları",
"Country_TD": "Çad",
"Country_TF": "Fransız Güney Toprakları",
@@ -435,7 +435,7 @@
"Currency_BRL": "Brezilya Reali",
"Currency_BSD": "Bahama Doları",
"Currency_BTC": "Bitcoin",
- "Currency_BTN": "Bhutan Ngultrumu",
+ "Currency_BTN": "Butan Ngultrumu",
"Currency_BWP": "Botsvana Pulası",
"Currency_BYN": "Belarus Rublesi",
"Currency_BZD": "Belize Doları",
@@ -449,7 +449,7 @@
"Currency_CUC": "Konvertibl Küba Pesosu",
"Currency_CUP": "Küba Pesosu",
"Currency_CVE": "Cape Verde Esküdosu",
- "Currency_CZK": "Çek Cumhuriyeti Korunası",
+ "Currency_CZK": "Çek Korunası",
"Currency_DJF": "Cibuti Frangı",
"Currency_DKK": "Danimarka Kronu",
"Currency_DOP": "Dominik Pesosu",
@@ -473,7 +473,7 @@
"Currency_HRK": "Hırvatistan Kunası",
"Currency_HTG": "Haiti Gurdu",
"Currency_HUF": "Macar Forinti",
- "Currency_IDR": "Endonezya Rupiahı",
+ "Currency_IDR": "Endonezya Rupisi",
"Currency_ILS": "Yeni İsrail Şekeli",
"Currency_INR": "Hindistan Rupisi",
"Currency_IQD": "Irak Dinarı",
@@ -541,7 +541,7 @@
"Currency_SOS": "Somali Şilini",
"Currency_SRD": "Surinam Doları",
"Currency_SSP": "Güney Sudan Lirası",
- "Currency_STN": "São Tomé ve Príncipe Dobrası",
+ "Currency_STN": "Sao Tome ve Principe Dobrası",
"Currency_SYP": "Suriye Lirası",
"Currency_SZL": "Svaziland Lilangenisi",
"Currency_THB": "Tayland Bahtı",
@@ -562,9 +562,9 @@
"Currency_VND": "Vietnam Dongu",
"Currency_VUV": "Vanuatu Vatusu",
"Currency_WST": "Samoa Talası",
- "Currency_XAF": "CFA Frangı BEAC",
+ "Currency_XAF": "Orta Afrika CFA Frangı",
"Currency_XCD": "Doğu Karayip Doları",
- "Currency_XOF": "CFA Frangı BCEAO",
+ "Currency_XOF": "Batı Afrika CFA Frangı",
"Currency_XPF": "CFP Frangı",
"Currency_YER": "Yemen Riyali",
"Currency_ZAR": "Güney Afrika Randı",
@@ -643,7 +643,7 @@
"Language_as": "Assamca",
"Language_av": "Avar Dili",
"Language_ay": "Aymara",
- "Language_az": "Azerice",
+ "Language_az": "Azerbaycan dili",
"Language_ba": "Başkırtça",
"Language_be": "Belarusça",
"Language_bg": "Bulgarca",
@@ -695,7 +695,7 @@
"Language_hu": "Macarca",
"Language_hy": "Ermenice",
"Language_hz": "Herero dili",
- "Language_ia": "Interlingua",
+ "Language_ia": "İnterlingua",
"Language_id": "Endonezce",
"Language_ie": "Interlingue",
"Language_ig": "İbo dili",
@@ -706,7 +706,7 @@
"Language_it": "İtalyanca",
"Language_iu": "İnuktitut dili",
"Language_ja": "Japonca",
- "Language_jv": "Cava Dili",
+ "Language_jv": "Cava dili",
"Language_ka": "Gürcüce",
"Language_kg": "Kongo dili",
"Language_ki": "Kikuyu",
@@ -777,13 +777,13 @@
"Language_sk": "Slovakça",
"Language_sl": "Slovence",
"Language_sm": "Samoa dili",
- "Language_sn": "Shona",
+ "Language_sn": "Şona dili",
"Language_so": "Somalice",
"Language_sq": "Arnavutça",
"Language_sr": "Sırpça",
"Language_ss": "Sisvati",
"Language_st": "Güney Sotho dili",
- "Language_su": "Sunda Dili",
+ "Language_su": "Sunda dili",
"Language_sv": "İsveççe",
"Language_sw": "Svahili dili",
"Language_ta": "Tamilce",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Kızılorda",
"Timezone_Asia_Rangoon": "Yangon",
"Timezone_Asia_Saigon": "Ho Chi Minh Kenti",
diff --git a/plugins/Intl/lang/uk.json b/plugins/Intl/lang/uk.json
index 411e718f8d..17307c8e85 100644
--- a/plugins/Intl/lang/uk.json
+++ b/plugins/Intl/lang/uk.json
@@ -151,7 +151,7 @@
"Country_MF": "Сен-Мартен",
"Country_MG": "Мадагаскар",
"Country_MH": "Маршаллові Острови",
- "Country_MK": "Македонія",
+ "Country_MK": "Північна Македонія",
"Country_ML": "Малі",
"Country_MM": "Мʼянма (Бірма)",
"Country_MN": "Монголія",
@@ -220,7 +220,7 @@
"Country_SV": "Сальвадор",
"Country_SX": "Сінт-Мартен",
"Country_SY": "Сирія",
- "Country_SZ": "Свазіленд",
+ "Country_SZ": "Есватіні",
"Country_TC": "Острови Теркс і Кайкос",
"Country_TD": "Чад",
"Country_TF": "Французькі Південні Території",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Омськ",
"Timezone_Asia_Oral": "Орал",
"Timezone_Asia_Pontianak": "Понтіанак",
+ "Timezone_Asia_Qostanay": "Костанай",
"Timezone_Asia_Qyzylorda": "Кизилорда",
"Timezone_Asia_Rangoon": "Янґон",
"Timezone_Asia_Saigon": "Хошимін",
diff --git a/plugins/Intl/lang/vi.json b/plugins/Intl/lang/vi.json
index 5d3639d05d..c9aa294bd1 100644
--- a/plugins/Intl/lang/vi.json
+++ b/plugins/Intl/lang/vi.json
@@ -86,7 +86,7 @@
"Country_GA": "Gabon",
"Country_GB": "Vương quốc Anh",
"Country_GD": "Grenada",
- "Country_GE": "Gruzia",
+ "Country_GE": "Georgia",
"Country_GF": "Guiana thuộc Pháp",
"Country_GG": "Guernsey",
"Country_GH": "Ghana",
@@ -151,7 +151,7 @@
"Country_MF": "St. Martin",
"Country_MG": "Madagascar",
"Country_MH": "Quần đảo Marshall",
- "Country_MK": "Macedonia",
+ "Country_MK": "Bắc Macedonia",
"Country_ML": "Mali",
"Country_MM": "Myanmar (Miến Điện)",
"Country_MN": "Mông Cổ",
@@ -461,7 +461,7 @@
"Currency_FJD": "Đô la Fiji",
"Currency_FKP": "Bảng Quần đảo Falkland",
"Currency_GBP": "Bảng Anh",
- "Currency_GEL": "Lari Gruzia",
+ "Currency_GEL": "Lari Georgia",
"Currency_GHS": "Cedi Ghana",
"Currency_GIP": "Bảng Gibraltar",
"Currency_GMD": "Dalasi Gambia",
@@ -476,7 +476,7 @@
"Currency_IDR": "Rupiah Indonesia",
"Currency_ILS": "Sheqel Israel mới",
"Currency_INR": "Rupee Ấn Độ",
- "Currency_IQD": "Dinar I-rắc",
+ "Currency_IQD": "Dinar Iraq",
"Currency_IRR": "Rial Iran",
"Currency_ISK": "Króna Iceland",
"Currency_JMD": "Đô la Jamaica",
@@ -520,7 +520,7 @@
"Currency_OMR": "Rial Oman",
"Currency_PAB": "Balboa Panama",
"Currency_PEN": "Sol Peru",
- "Currency_PGK": "Kina Papua New Guinean",
+ "Currency_PGK": "Kina Papua New Guinea",
"Currency_PHP": "Peso Philipin",
"Currency_PKR": "Rupee Pakistan",
"Currency_PLN": "Zloty Ba Lan",
@@ -553,7 +553,7 @@
"Currency_TTD": "Đô la Trinidad và Tobago",
"Currency_TWD": "Đô la Đài Loan mới",
"Currency_TZS": "Shilling Tanzania",
- "Currency_UAH": "Hryvnia Ucraina",
+ "Currency_UAH": "Hryvnia Ukraina",
"Currency_UGX": "Shilling Uganda",
"Currency_USD": "Đô la Mỹ",
"Currency_UYU": "Peso Uruguay",
@@ -801,7 +801,7 @@
"Language_tw": "Tiếng Twi",
"Language_ty": "Tiếng Tahiti",
"Language_ug": "Tiếng Uyghur",
- "Language_uk": "Tiếng Ucraina",
+ "Language_uk": "Tiếng Ukraina",
"Language_ur": "Tiếng Urdu",
"Language_uz": "Tiếng Uzbek",
"Language_ve": "Tiếng Venda",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "Omsk",
"Timezone_Asia_Oral": "Oral",
"Timezone_Asia_Pontianak": "Pontianak",
+ "Timezone_Asia_Qostanay": "Kostanay",
"Timezone_Asia_Qyzylorda": "Qyzylorda",
"Timezone_Asia_Rangoon": "Rangoon",
"Timezone_Asia_Saigon": "TP Hồ Chí Minh",
diff --git a/plugins/Intl/lang/zh-cn.json b/plugins/Intl/lang/zh-cn.json
index 208c0337fa..9af591066c 100644
--- a/plugins/Intl/lang/zh-cn.json
+++ b/plugins/Intl/lang/zh-cn.json
@@ -151,7 +151,7 @@
"Country_MF": "法属圣马丁",
"Country_MG": "马达加斯加",
"Country_MH": "马绍尔群岛",
- "Country_MK": "马其顿",
+ "Country_MK": "北马其顿",
"Country_ML": "马里",
"Country_MM": "缅甸",
"Country_MN": "蒙古",
@@ -287,7 +287,7 @@
"CurrencySymbol_CDF": "CDF",
"CurrencySymbol_CHF": "CHF",
"CurrencySymbol_CLP": "CLP",
- "CurrencySymbol_CNY": "¥",
+ "CurrencySymbol_CNY": "¥",
"CurrencySymbol_COP": "COP",
"CurrencySymbol_CRC": "CRC",
"CurrencySymbol_CUC": "CUC",
@@ -1038,10 +1038,11 @@
"Timezone_Asia_Makassar": "望加锡",
"Timezone_Asia_Nicosia": "尼科西亚",
"Timezone_Asia_Novokuznetsk": "新库兹涅茨克",
- "Timezone_Asia_Novosibirsk": "诺沃西比尔斯克",
+ "Timezone_Asia_Novosibirsk": "新西伯利亚",
"Timezone_Asia_Omsk": "鄂木斯克",
"Timezone_Asia_Oral": "乌拉尔",
"Timezone_Asia_Pontianak": "坤甸",
+ "Timezone_Asia_Qostanay": "库斯塔奈",
"Timezone_Asia_Qyzylorda": "克孜洛尔达",
"Timezone_Asia_Rangoon": "仰光",
"Timezone_Asia_Saigon": "胡志明市",
@@ -1075,7 +1076,7 @@
"Timezone_Australia_Sydney": "悉尼",
"Timezone_Europe_Astrakhan": "阿斯特拉罕",
"Timezone_Europe_Berlin": "柏林",
- "Timezone_Europe_Busingen": "布辛根",
+ "Timezone_Europe_Busingen": "比辛根",
"Timezone_Europe_Kaliningrad": "加里宁格勒",
"Timezone_Europe_Kiev": "基辅",
"Timezone_Europe_Kirov": "基洛夫",
diff --git a/plugins/Intl/lang/zh-tw.json b/plugins/Intl/lang/zh-tw.json
index 65272d6e50..656e477a9f 100644
--- a/plugins/Intl/lang/zh-tw.json
+++ b/plugins/Intl/lang/zh-tw.json
@@ -151,7 +151,7 @@
"Country_MF": "法屬聖馬丁",
"Country_MG": "馬達加斯加",
"Country_MH": "馬紹爾群島",
- "Country_MK": "馬其頓",
+ "Country_MK": "北馬其頓",
"Country_ML": "馬利",
"Country_MM": "緬甸",
"Country_MN": "蒙古",
@@ -220,7 +220,7 @@
"Country_SV": "薩爾瓦多",
"Country_SX": "荷屬聖馬丁",
"Country_SY": "敘利亞",
- "Country_SZ": "史瓦濟蘭",
+ "Country_SZ": "史瓦帝尼",
"Country_TC": "土克斯及開科斯群島",
"Country_TD": "查德",
"Country_TF": "法屬南部屬地",
@@ -1042,6 +1042,7 @@
"Timezone_Asia_Omsk": "鄂木斯克",
"Timezone_Asia_Oral": "烏拉爾",
"Timezone_Asia_Pontianak": "坤甸",
+ "Timezone_Asia_Qostanay": "庫斯塔奈",
"Timezone_Asia_Qyzylorda": "克孜勒奧爾達",
"Timezone_Asia_Rangoon": "仰光",
"Timezone_Asia_Saigon": "胡志明市",
diff --git a/plugins/IntranetMeasurable/tests/Fixtures/IntranetSitesWithVisits.php b/plugins/IntranetMeasurable/tests/Fixtures/IntranetSitesWithVisits.php
index 25fac65727..57c09f2f92 100644
--- a/plugins/IntranetMeasurable/tests/Fixtures/IntranetSitesWithVisits.php
+++ b/plugins/IntranetMeasurable/tests/Fixtures/IntranetSitesWithVisits.php
@@ -22,14 +22,14 @@ class IntranetSitesWithVisits extends Fixture
public $idSite = 1;
public $idSiteNotIntranet = 2;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsites();
$this->trackVisits($this->idSite);
$this->trackVisits($this->idSiteNotIntranet);
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
@@ -49,7 +49,7 @@ class IntranetSitesWithVisits extends Fixture
}
}
- private function configureSameDevice(\PiwikTracker $t)
+ private function configureSameDevice(\MatomoTracker $t)
{
// to make purpose of test more clear we configure the device partially...
$t->setIp('56.11.55.70');
diff --git a/plugins/LanguagesManager/Commands/CreatePull.php b/plugins/LanguagesManager/Commands/CreatePull.php
index b5e908d4df..03159542ce 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 = '3.x-dev';
+ const GIT_BASE_BRANCH = '4.x-dev';
protected function configure()
{
diff --git a/plugins/LanguagesManager/Commands/FetchTranslations.php b/plugins/LanguagesManager/Commands/FetchTranslations.php
index 1e69f7cef4..ee08046042 100644
--- a/plugins/LanguagesManager/Commands/FetchTranslations.php
+++ b/plugins/LanguagesManager/Commands/FetchTranslations.php
@@ -62,17 +62,6 @@ class FetchTranslations extends TranslationBase
$output->writeln("Fetching translations from Transifex for resource $resource");
- $availableLanguages = LanguagesManagerApi::getInstance()->getAvailableLanguageNames();
-
- $languageCodes = array();
- foreach ($availableLanguages as $languageInfo) {
- $languageCodes[] = $languageInfo['code'];
- }
-
- $languageCodes = array_filter($languageCodes, function($code) {
- return !in_array($code, array('en', 'dev'));
- });
-
try {
$languages = $transifexApi->getAvailableLanguageCodes();
@@ -82,6 +71,23 @@ class FetchTranslations extends TranslationBase
});
}
} catch (AuthenticationFailedException $e) {
+ $availableLanguages = LanguagesManagerApi::getInstance()->getAvailableLanguageNames();
+
+ $languageCodes = array();
+ foreach ($availableLanguages as $languageInfo) {
+ $codeParts = explode('-', $languageInfo['code']);
+
+ if (!empty($codeParts[1])) {
+ $codeParts[1] = strtoupper($codeParts[1]);
+ }
+
+ $languageCodes[] = implode('_', $codeParts);
+ }
+
+ $languageCodes = array_filter($languageCodes, function($code) {
+ return !in_array($code, array('en', 'dev'));
+ });
+
$languages = $languageCodes;
}
diff --git a/plugins/LanguagesManager/Commands/LanguageInfo.php b/plugins/LanguagesManager/Commands/LanguageInfo.php
new file mode 100644
index 0000000000..5571db8cc3
--- /dev/null
+++ b/plugins/LanguagesManager/Commands/LanguageInfo.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Matomo - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Plugins\LanguagesManager\Commands;
+
+use Piwik\Plugins\LanguagesManager\API;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ */
+class LanguageInfo extends TranslationBase
+{
+ protected function configure()
+ {
+ $this->setName('translations:languageinfo')
+ ->setDescription('Shows available languages info');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $languages = API::getInstance()->getAvailableLanguagesInfo();
+
+ foreach ($languages as $languageInfo) {
+ $output->writeln($languageInfo['code'].'|' . $languageInfo['english_name'] . '|' . $languageInfo['percentage_complete']);
+ }
+ }
+}
diff --git a/plugins/LanguagesManager/LanguagesManager.php b/plugins/LanguagesManager/LanguagesManager.php
index e24651d4b7..79a90b139c 100644
--- a/plugins/LanguagesManager/LanguagesManager.php
+++ b/plugins/LanguagesManager/LanguagesManager.php
@@ -15,11 +15,9 @@ use Piwik\Common;
use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Cookie;
-use Piwik\Db;
use Piwik\Intl\Locale;
use Piwik\Piwik;
use Piwik\ProxyHttp;
-use Piwik\Translate;
use Piwik\Translation\Translator;
use Piwik\View;
@@ -29,7 +27,7 @@ use Piwik\View;
class LanguagesManager extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
@@ -156,7 +154,7 @@ class LanguagesManager extends \Piwik\Plugin
$languageCode = Common::extractLanguageCodeFromBrowserLanguage(Common::getBrowserLanguage(), API::getInstance()->getAvailableLanguages());
}
if (!API::getInstance()->isLanguageAvailable($languageCode)) {
- $languageCode = Translate::getLanguageDefault();
+ $languageCode = StaticContainer::get('Piwik\Translation\Translator')->getDefaultLanguage();
}
return $languageCode;
}
diff --git a/plugins/LanguagesManager/Menu.php b/plugins/LanguagesManager/Menu.php
index a5707b0a08..f3a2e8449a 100644
--- a/plugins/LanguagesManager/Menu.php
+++ b/plugins/LanguagesManager/Menu.php
@@ -18,7 +18,7 @@ class Menu extends \Piwik\Plugin\Menu
{
public function configureTopMenu(MenuTop $menu)
{
- if (Piwik::isUserIsAnonymous() || !SettingsPiwik::isPiwikInstalled()) {
+ if (Piwik::isUserIsAnonymous() || !SettingsPiwik::isMatomoInstalled()) {
$langManager = new LanguagesManager();
$menu->addHtml('LanguageSelector', $langManager->getLanguagesSelector(), true, $order = 30, false);
}
diff --git a/plugins/LanguagesManager/TranslationWriter/Filter/EncodedEntities.php b/plugins/LanguagesManager/TranslationWriter/Filter/EncodedEntities.php
index dd1146f581..3e2c9dbb5b 100644
--- a/plugins/LanguagesManager/TranslationWriter/Filter/EncodedEntities.php
+++ b/plugins/LanguagesManager/TranslationWriter/Filter/EncodedEntities.php
@@ -9,7 +9,7 @@
namespace Piwik\Plugins\LanguagesManager\TranslationWriter\Filter;
-use Piwik\Translate;
+use Piwik\Container\StaticContainer;
class EncodedEntities extends FilterAbstract
{
@@ -38,12 +38,12 @@ class EncodedEntities extends FilterAbstract
foreach ($pluginTranslations as $key => $translation) {
if (isset($this->baseTranslations[$pluginName][$key]) &&
- $this->baseTranslations[$pluginName][$key] != Translate::clean($this->baseTranslations[$pluginName][$key])) {
+ $this->baseTranslations[$pluginName][$key] != StaticContainer::get('Piwik\Translation\Translator')->clean($this->baseTranslations[$pluginName][$key])) {
continue; // skip if base translation already contains encoded entities
}
// remove encoded entities
- $decoded = Translate::clean($translation);
+ $decoded = StaticContainer::get('Piwik\Translation\Translator')->clean($translation);
if ($translation != $decoded) {
$this->filteredData[$pluginName][$key] = $translation;
$translations[$pluginName][$key] = $decoded;
diff --git a/plugins/LanguagesManager/tests/Integration/LanguagesManagerTest.php b/plugins/LanguagesManager/tests/Integration/LanguagesManagerTest.php
index ce92f9e191..4a58eb9a67 100644
--- a/plugins/LanguagesManager/tests/Integration/LanguagesManagerTest.php
+++ b/plugins/LanguagesManager/tests/Integration/LanguagesManagerTest.php
@@ -20,12 +20,12 @@ use Piwik\Plugins\LanguagesManager\TranslationWriter\Filter\UnnecassaryWhitespac
use Piwik\Plugins\LanguagesManager\TranslationWriter\Validate\CoreTranslations;
use Piwik\Plugins\LanguagesManager\TranslationWriter\Validate\NoScripts;
use Piwik\Plugins\LanguagesManager\TranslationWriter\Writer;
-use Piwik\Translate;
+use Piwik\Tests\Framework\Fixture;
/**
* @group LanguagesManager
*/
-class LanguagesManagerTest extends \PHPUnit_Framework_TestCase
+class LanguagesManagerTest extends \PHPUnit\Framework\TestCase
{
function getTestDataForLanguageFiles()
{
@@ -38,7 +38,7 @@ class LanguagesManagerTest extends \PHPUnit_Framework_TestCase
foreach ($plugins as $plugin) {
- if (API::getInstance()->getPluginTranslationsForLanguage($plugin, 'en')) {
+ if ('Intl' !== $plugin && API::getInstance()->getPluginTranslationsForLanguage($plugin, 'en')) {
$pluginsWithTranslation[] = $plugin;
}
@@ -87,12 +87,13 @@ class LanguagesManagerTest extends \PHPUnit_Framework_TestCase
$translations = $translationWriter->getTranslations($language);
if (empty($translations)) {
+ self::assertTrue(true);
return; // skip language / plugin combinations that aren't present
}
$translationWriter->setTranslations($translations);
- $this->assertTrue($translationWriter->isValid(), $translationWriter->getValidationMessage());
+ $this->assertTrue($translationWriter->isValid(), $translationWriter->getValidationMessage() ?: '');
if ($translationWriter->wasFiltered()) {
@@ -116,11 +117,11 @@ class LanguagesManagerTest extends \PHPUnit_Framework_TestCase
* test language when it's not defined
*
* @group Plugins
- *
- * @expectedException Exception
*/
function testWriterInvalidPlugin()
{
+ $this->expectException(\Exception::class);
+
new Writer('de', 'iNvaLiDPluGin'); // invalid plugin throws exception
}
@@ -145,7 +146,7 @@ class LanguagesManagerTest extends \PHPUnit_Framework_TestCase
Cache::flushAll();
$translator = StaticContainer::get('Piwik\Translation\Translator');
$translator->reset();
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$translations = $translator->getAllTranslations();
foreach ($translations AS $plugin => $pluginTranslations) {
foreach ($pluginTranslations as $key => $pluginTranslation) {
@@ -166,7 +167,7 @@ class LanguagesManagerTest extends \PHPUnit_Framework_TestCase
Cache::flushAll();
$translator = StaticContainer::get('Piwik\Translation\Translator');
$translator->reset();
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$translations = $translator->getAllTranslations();
foreach ($translations AS $plugin => $pluginTranslations) {
if ($plugin == 'Intl') {
diff --git a/plugins/LanguagesManager/tests/Integration/ModelTest.php b/plugins/LanguagesManager/tests/Integration/ModelTest.php
index fb0cc94456..975e92021e 100644
--- a/plugins/LanguagesManager/tests/Integration/ModelTest.php
+++ b/plugins/LanguagesManager/tests/Integration/ModelTest.php
@@ -26,7 +26,7 @@ class ModelTest extends IntegrationTestCase
*/
protected $model;
- public function setUp()
+ public function setUp(): void
{
$this->model = new Model();
parent::setUp();
@@ -109,7 +109,7 @@ class ModelTest extends IntegrationTestCase
$tableNames = $this->getCurrentAvailableTableNames();
foreach ($expectedTables as $expectedTable) {
- $this->assertContains(Common::prefixTable($expectedTable), $tableNames);
+ self::assertTrue(in_array(Common::prefixTable($expectedTable), $tableNames));
}
}
@@ -118,7 +118,7 @@ class ModelTest extends IntegrationTestCase
$tableNames = $this->getCurrentAvailableTableNames();
foreach ($expectedTables as $expectedTable) {
- $this->assertNotContains(Common::prefixTable($expectedTable), $tableNames);
+ self::assertTrue(!in_array(Common::prefixTable($expectedTable), $tableNames));
}
}
diff --git a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByBaseTranslationsTest.php b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByBaseTranslationsTest.php
index a4a6f804a5..d32af6ae48 100644
--- a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByBaseTranslationsTest.php
+++ b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByBaseTranslationsTest.php
@@ -13,7 +13,7 @@ use Piwik\Plugins\LanguagesManager\TranslationWriter\Filter\ByBaseTranslations;
/**
* @group LanguagesManager
*/
-class ByBaseTranslationsTest extends \PHPUnit_Framework_TestCase
+class ByBaseTranslationsTest extends \PHPUnit\Framework\TestCase
{
public function getFilterTestData()
{
diff --git a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByParameterCountTest.php b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByParameterCountTest.php
index ae85217637..259fb4fe3f 100644
--- a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByParameterCountTest.php
+++ b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/ByParameterCountTest.php
@@ -13,7 +13,7 @@ use Piwik\Plugins\LanguagesManager\TranslationWriter\Filter\ByParameterCount;
/**
* @group LanguagesManager
*/
-class ByParameterCountTest extends \PHPUnit_Framework_TestCase
+class ByParameterCountTest extends \PHPUnit\Framework\TestCase
{
public function getFilterTestData()
{
diff --git a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EmptyTranslationsTest.php b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EmptyTranslationsTest.php
index 061dbd4094..3960e9fe7b 100644
--- a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EmptyTranslationsTest.php
+++ b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EmptyTranslationsTest.php
@@ -13,7 +13,7 @@ use Piwik\Plugins\LanguagesManager\TranslationWriter\Filter\EmptyTranslations;
/**
* @group LanguagesManager
*/
-class EmptyTranslationsTest extends \PHPUnit_Framework_TestCase
+class EmptyTranslationsTest extends \PHPUnit\Framework\TestCase
{
public function getFilterTestData()
{
diff --git a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EncodedEntitiesTest.php b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EncodedEntitiesTest.php
index 3fa14b4e40..7dc7104c58 100644
--- a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EncodedEntitiesTest.php
+++ b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/EncodedEntitiesTest.php
@@ -13,7 +13,7 @@ use Piwik\Plugins\LanguagesManager\TranslationWriter\Filter\EncodedEntities;
/**
* @group LanguagesManager
*/
-class EncodedEntitiesTest extends \PHPUnit_Framework_TestCase
+class EncodedEntitiesTest extends \PHPUnit\Framework\TestCase
{
public function getFilterTestData()
{
diff --git a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/UnnecassaryWhitespacesTest.php b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/UnnecassaryWhitespacesTest.php
index c5a066fec7..5cac4bbb26 100644
--- a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/UnnecassaryWhitespacesTest.php
+++ b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Filter/UnnecassaryWhitespacesTest.php
@@ -13,7 +13,7 @@ use Piwik\Plugins\LanguagesManager\TranslationWriter\Filter\UnnecassaryWhitespac
/**
* @group LanguagesManager
*/
-class UnnecassaryWhitepsacesTest extends \PHPUnit_Framework_TestCase
+class UnnecassaryWhitepsacesTest extends \PHPUnit\Framework\TestCase
{
public function getFilterTestData()
{
diff --git a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/CoreTranslationsTest.php b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/CoreTranslationsTest.php
index 059ff299fd..8eecdee957 100644
--- a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/CoreTranslationsTest.php
+++ b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/CoreTranslationsTest.php
@@ -13,7 +13,7 @@ use Piwik\Plugins\LanguagesManager\TranslationWriter\Validate\CoreTranslations;
/**
* @group LanguagesManager
*/
-class CoreTranslationsTest extends \PHPUnit_Framework_TestCase
+class CoreTranslationsTest extends \PHPUnit\Framework\TestCase
{
public function getFilterTestDataValid()
{
diff --git a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/NoScriptsTest.php b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/NoScriptsTest.php
index 36bb439b96..eed906bbc6 100644
--- a/plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/NoScriptsTest.php
+++ b/plugins/LanguagesManager/tests/Unit/TranslationWriter/Validate/NoScriptsTest.php
@@ -13,7 +13,7 @@ use Piwik\Plugins\LanguagesManager\TranslationWriter\Validate\NoScripts;
/**
* @group LanguagesManager
*/
-class NoScriptsTest extends \PHPUnit_Framework_TestCase
+class NoScriptsTest extends \PHPUnit\Framework\TestCase
{
public function getFilterTestDataValid()
{
diff --git a/plugins/LanguagesManager/tests/Unit/TranslationWriter/WriterTest.php b/plugins/LanguagesManager/tests/Unit/TranslationWriter/WriterTest.php
index 331a783052..dc2189a426 100644
--- a/plugins/LanguagesManager/tests/Unit/TranslationWriter/WriterTest.php
+++ b/plugins/LanguagesManager/tests/Unit/TranslationWriter/WriterTest.php
@@ -19,7 +19,7 @@ use Piwik\Plugins\LanguagesManager\TranslationWriter\Writer;
/**
* @group LanguagesManager
*/
-class WriterTest extends \PHPUnit_Framework_TestCase
+class WriterTest extends \PHPUnit\Framework\TestCase
{
/**
* @group Core
@@ -44,11 +44,11 @@ class WriterTest extends \PHPUnit_Framework_TestCase
/**
* @group Core
- *
- * @expectedException \Exception
*/
public function testConstructorInvalid()
{
+ $this->expectException(\Exception::class);
+
new Writer('en', 'InValIdPlUGin');
}
@@ -115,22 +115,22 @@ class WriterTest extends \PHPUnit_Framework_TestCase
/**
* @group Core
- *
- * @expectedException \Exception
*/
public function testSaveException()
{
+ $this->expectException(\Exception::class);
+
$writer = new Writer('it');
$writer->save();
}
/**
* @group Core
- *
- * @expectedException \Exception
*/
public function testSaveTemporaryException()
{
+ $this->expectException(\Exception::class);
+
$writer = new Writer('it');
$writer->saveTemporary();
}
@@ -241,11 +241,12 @@ class WriterTest extends \PHPUnit_Framework_TestCase
/**
* @group Core
*
- * @expectedException \Exception
* @dataProvider getInvalidLanguages
*/
public function testSetLanguageInvalid($language)
{
+ $this->expectException(\Exception::class);
+
$writer = new Writer('en', null);
$writer->setLanguage($language);
}
diff --git a/plugins/Live/Visitor.php b/plugins/Live/Visitor.php
index 99ff282848..fc2d29b3b0 100644
--- a/plugins/Live/Visitor.php
+++ b/plugins/Live/Visitor.php
@@ -16,6 +16,7 @@ use Piwik\Date;
use Piwik\Metrics\Formatter;
use Piwik\Plugin;
use Piwik\Piwik;
+use Piwik\Plugins\Live\Visualizations\VisitorLog;
use Piwik\Tracker\GoalManager;
class Visitor implements VisitorInterface
@@ -291,7 +292,7 @@ class Visitor implements VisitorInterface
$instance->filterActions($actionDetails, $visitorDetailsArray);
}
- usort($actionDetails, array('static', 'sortByServerTime'));
+ $actionDetails = self::sortActionDetails($actionDetails);
$actionDetails = array_values($actionDetails);
@@ -315,27 +316,21 @@ class Visitor implements VisitorInterface
return $visitorDetailsArray;
}
- private static function sortByServerTime($a, $b)
+ private static function sortActionDetails($actions)
{
- $ta = strtotime($a['serverTimePretty']);
- $tb = strtotime($b['serverTimePretty']);
-
- if ($ta < $tb) {
- return -1;
- }
-
- if ($ta == $tb) {
- if ($a['idlink_va'] == $b['idlink_va']) {
- return strcmp($a['type'], $b['type']);
- }
-
- if ($a['idlink_va'] > $b['idlink_va']) {
- return 1;
+ usort($actions, function ($a, $b) {
+ $fields = array('serverTimePretty', 'idlink_va', 'type', 'title', 'url', 'pageIdAction', 'goalId');
+ foreach ($fields as $field) {
+ $sort = VisitorLog::sortByActionsOnPageColumn($a, $b, $field);
+ if ($sort !== 0) {
+ return $sort;
+ }
}
- return -1;
- }
+ return 0;
+ });
- return 1;
+ return $actions;
}
+
}
diff --git a/plugins/Live/VisitorDetails.php b/plugins/Live/VisitorDetails.php
index 98c0c52c9d..b6d51c0be7 100644
--- a/plugins/Live/VisitorDetails.php
+++ b/plugins/Live/VisitorDetails.php
@@ -14,7 +14,7 @@ use Piwik\Config;
use Piwik\Date;
use Piwik\DataTable;
use Piwik\Metrics\Formatter;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Piwik;
use Piwik\Site;
use Piwik\Plugins\SitesManager\API as APISitesManager;
@@ -96,6 +96,7 @@ class VisitorDetails extends VisitorDetailsAbstract
$sitesModel = new \Piwik\Plugins\SitesManager\Model();
$view = new View($template);
+ $view->sendHeadersWhenRendering = false;
$view->mainUrl = trim(Site::getMainUrlFor($this->getIdSite()));
$view->additionalUrls = $sitesModel->getAliasSiteUrlsFromId($this->getIdSite());
$view->action = $action;
@@ -107,6 +108,7 @@ class VisitorDetails extends VisitorDetailsAbstract
public function renderActionTooltip($action, $visitInfo)
{
$view = new View('@Live/_actionTooltip');
+ $view->sendHeadersWhenRendering = false;
$view->action = $action;
$view->visitInfo = $visitInfo;
return [[ 0, $view->render() ]];
@@ -115,6 +117,7 @@ class VisitorDetails extends VisitorDetailsAbstract
public function renderVisitorDetails($visitorDetails)
{
$view = new View('@Live/_visitorDetails.twig');
+ $view->sendHeadersWhenRendering = false;
$view->visitInfo = $visitorDetails;
return [[ 0, $view->render() ]];
}
@@ -122,6 +125,7 @@ class VisitorDetails extends VisitorDetailsAbstract
public function renderIcons($visitorDetails)
{
$view = new View('@Live/_visitorLogIcons.twig');
+ $view->sendHeadersWhenRendering = false;
$view->visitor = $visitorDetails;
return $view->render();
}
diff --git a/plugins/Live/VisitorFactory.php b/plugins/Live/VisitorFactory.php
index a500013a63..2ebada941a 100644
--- a/plugins/Live/VisitorFactory.php
+++ b/plugins/Live/VisitorFactory.php
@@ -29,7 +29,7 @@ class VisitorFactory
/**
* Triggered while visit is filtering in live plugin. Subscribers to this
* event can force the use of a custom visitor object that extends from
- * {@link Piwik\Plugins\Live\VisitorInterface}.
+ * {@link \Piwik\Plugins\Live\VisitorInterface}.
*
* @param \Piwik\Plugins\Live\VisitorInterface &$visitor Initialized to null, but can be set to
* a new visitor object. If it isn't modified
diff --git a/plugins/Live/Visualizations/VisitorLog.php b/plugins/Live/Visualizations/VisitorLog.php
index ed06d4df80..937bfec893 100644
--- a/plugins/Live/Visualizations/VisitorLog.php
+++ b/plugins/Live/Visualizations/VisitorLog.php
@@ -202,6 +202,23 @@ class VisitorLog extends Visualization
}
}
+ foreach ($actionGroups as $idPageView => $actionGroup) {
+ if (!empty($actionGroup['actionsOnPage'])) {
+ usort($actionGroup['actionsOnPage'], function ($a, $b) {
+ $fields = array('timestamp', 'title', 'url', 'type', 'pageIdAction', 'goalId', 'timeSpent');
+ foreach ($fields as $field) {
+ $sort = self::sortByActionsOnPageColumn($a, $b, $field);
+ if ($sort !== 0) {
+ return $sort;
+ }
+ }
+
+ return 0;
+ });
+ $actionGroups[$idPageView]['actionsOnPage'] = $actionGroup['actionsOnPage'];
+ }
+ }
+
// merge action groups that have the same page url/action and no pageviewactions
$actionGroups = self::mergeRefreshes($actionGroups);
@@ -209,6 +226,30 @@ class VisitorLog extends Visualization
}
}
+ public static function sortByActionsOnPageColumn($a, $b, $field)
+ {
+ if (!isset($a[$field]) && !isset($b[$field])) {
+ return 0;
+ }
+ if (!isset($a[$field])) {
+ return -1;
+ }
+ if (!isset($b[$field])) {
+ return 1;
+ }
+ if ($field === 'serverTimePretty') {
+ $a[$field] = strtotime($a[$field]);
+ $b[$field] = strtotime($b[$field]);
+ }
+ if ($a[$field] === $b[$field]) {
+ return 0;
+ }
+ if ($a[$field] < $b[$field]) {
+ return -1;
+ }
+ return 1;
+ }
+
private static function mergeRefreshes(array $actionGroups)
{
$previousId = null;
diff --git a/plugins/Live/lang/zh-cn.json b/plugins/Live/lang/zh-cn.json
index c25feda858..1cb7e68ea1 100644
--- a/plugins/Live/lang/zh-cn.json
+++ b/plugins/Live/lang/zh-cn.json
@@ -3,6 +3,7 @@
"AveragePageGenerationTime": "这个访客的每个页面加载平均花 %1$s。",
"CalculatedOverNPageViews": "采用这个访客最后 %1$s 个访问页面统计。",
"ClickToViewMoreAboutVisit": "点击查看关于这次访问的详细信息。",
+ "ClickToViewAllActions": "单击以查看该组的所有详细操作",
"ConvertedNGoals": "转化了 %s 个目标",
"FirstVisit": "首次访问",
"GoalType": "类型",
@@ -11,28 +12,49 @@
"LastHours": "最后%s小时",
"LastMinutes": "最后%s分钟",
"LastVisit": "最后访问",
+ "LinkVisitorLog": "查看详细的访问日志",
"LoadMoreVisits": "查看更多访问",
+ "LimitedSummary": "此配置文件中的信息总结了最近的%1$s次访问。 该用户总共有更多访问。",
+ "LimitedVisitsShown": "仅显示最后%1$s次访问。 该用户总共有更多访问。",
"MorePagesNotDisplayed": "该访客访问的更多页面没有显示。",
"NbVisitor": "1 个访客",
"NbVisitors": "%s 个访客",
"NextVisitor": "下一个访问者",
"NoMoreVisits": "这个访客没有其它的访问了。",
"PageRefreshed": "这个页面被查看 \/ 刷新的次数。",
+ "PluginDescription": "提供实时访问者日志,并允许您在实时仪表板小部件中实时监视访问者。 该插件还可以让您查看任何给定用户的访客资料。",
"PreviousVisitor": "前个访客",
"RealTimeVisitors": "实时访问",
"RealTimeVisitorCount": "实时访客计数",
"Referrer_URL": "来源网址",
"ShowMap": "显示地图",
+ "ActionsAndDuration": "%2$s中的%1$s个动作",
"SimpleRealTimeWidget_Message": "%1$s 和 %2$s 在最近 %3$s。",
"ViewVisitorProfile": "查看访客资料",
"VisitedPages": "访问的页面",
"RevisitedPages": "被浏览超过一次的页面",
+ "ToggleActions": "切换所有动作的可见性",
+ "TopVisitedPages": "热门访问页面",
+ "VisitsLog": "访问日志",
+ "QueryMaxExecutionTimeExceeded": "该查询花费很长时间才能执行。",
+ "QueryMaxExecutionTimeExceededReasonDateRange": "如果选择的日期范围太大,可能会发生这种情况。 请尝试选择较小的日期范围。",
+ "QueryMaxExecutionTimeExceededReasonSegment": "如果所选的部分与任何访问都不匹配,则可能发生这种情况。 请尝试检查您选择的部分。",
+ "QueryMaxExecutionTimeExceededReasonUnknown": "请再试一遍。 如果重复发生,请与管理员或支持人员联系。",
+ "VisitorLog": "访问日志",
"VisitorLogDocumentation": "本表显示所选时间段内最新的访客资料,鼠标移到日期上可以查看上次访问时间,%1$s 如果时间段包含今天,您可以实时查看访客! %2$s 这里显示的数据总是实时的,无论是否使用定时处理任务。",
+ "VisitorLogNoDataMessagePurged": "由于启用了对旧原始数据的定期删除且此报告的日期已超过%s天,因此可能已清除了数据。 超级用户可以通过转到管理=>隐私来更改此设置。",
"VisitorProfile": "访客资料",
"VisitorsInRealTime": "实时访问",
"VisitorsLastVisit": "此访客上次访问是%s天前。",
"VisitsFrom": "%1$s%2$s 次访问%3$s 来自",
+ "VisitSummary": "在网站%3$s上总共花费%1$s%2$s,在%6$s次访问%7$s查看了%4$s页%5$s。",
+ "VisitSummaryWithActionDetails": "在网站%3$s上总共花费%1$s%2$s,在%7$s次访问中进行了%4$s次操作%5$s(%6$s)%8$s。",
+ "RowActionTooltipDefault": "显示按此行部分的访问日志",
+ "RowActionTooltipWithDimension": "显示按此%s部分的访问日志",
+ "RowActionTooltipTitle": "打开分段访问日志",
+ "SegmentedVisitorLogTitle": "访问记录,显示访问次数为%1$s的“%2$s”",
"OnClickPause": "%s已经开始。点击停止。",
- "OnClickStart": "%s已经停止。点击开始。"
+ "OnClickStart": "%s已经停止。点击开始。",
+ "ClickToSeeAllContents": "单击以查看每个内容的交互\/印象"
}
} \ No newline at end of file
diff --git a/plugins/Live/templates/_actionTooltip.twig b/plugins/Live/templates/_actionTooltip.twig
index b0e885a1ae..5b20add67e 100644
--- a/plugins/Live/templates/_actionTooltip.twig
+++ b/plugins/Live/templates/_actionTooltip.twig
@@ -5,4 +5,10 @@
{{ 'General_ColumnGenerationTime'|translate }}: {{ action.generationTime|raw }}{% endif %}
{%- if action.timeSpentPretty is defined %}
-{{ 'General_TimeOnPage'|translate }}: {{ action.timeSpentPretty|raw }}{% endif -%} \ No newline at end of file
+{{ 'General_TimeOnPage'|translate }}: {{ action.timeSpentPretty|raw }}{% endif %}
+{%- if action.siteSearchCategory|default(false) %}
+
+{{ 'Actions_ColumnSearchCategory'|translate }}: {{ action.siteSearchCategory|rawSafeDecoded }}{% endif %}
+{%- if action.siteSearchCount|default(false) %}
+
+{{ 'Actions_ColumnSearchResultsCount'|translate }}: {{ action.siteSearchCount|rawSafeDecoded }}{% endif %} \ No newline at end of file
diff --git a/plugins/Live/tests/Fixtures/ManyVisitsOfSameVisitor.php b/plugins/Live/tests/Fixtures/ManyVisitsOfSameVisitor.php
index d2bcb9f302..1d1da7a55c 100644
--- a/plugins/Live/tests/Fixtures/ManyVisitsOfSameVisitor.php
+++ b/plugins/Live/tests/Fixtures/ManyVisitsOfSameVisitor.php
@@ -19,7 +19,7 @@ class ManyVisitsOfSameVisitor extends Fixture
public $idSite = 1;
public $idSite2 = 2;
- public function setUp()
+ public function setUp(): void
{
if (!self::siteCreated($this->idSite)) {
self::createWebsite($this->dateTime);
@@ -32,7 +32,7 @@ class ManyVisitsOfSameVisitor extends Fixture
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
@@ -63,6 +63,9 @@ class ManyVisitsOfSameVisitor extends Fixture
if ($numVisits > 0) {
$visitDateTime = Date::factory($this->dateTime)->addDay($numVisits)->getDatetime();
$t->setForceVisitDateTime($visitDateTime);
+ } else {
+ $visitDateTime = Date::factory($this->dateTime)->subHour(-$numVisits/10)->getDatetime();
+ $t->setForceVisitDateTime($visitDateTime);
}
self::assertTrue($t->doTrackPageView('incredible title ' . ($numVisits % 3)));
diff --git a/plugins/Live/tests/Fixtures/VisitsWithAllActionsAndDevices.php b/plugins/Live/tests/Fixtures/VisitsWithAllActionsAndDevices.php
index 987ea6fc51..f61aa3b16f 100644
--- a/plugins/Live/tests/Fixtures/VisitsWithAllActionsAndDevices.php
+++ b/plugins/Live/tests/Fixtures/VisitsWithAllActionsAndDevices.php
@@ -20,7 +20,7 @@ class VisitsWithAllActionsAndDevices extends Fixture
public $dateTime = '2010-02-01 11:22:33';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
if (!self::siteCreated($idSite = 1)) {
self::createWebsite($this->dateTime, 1);
@@ -64,12 +64,12 @@ class VisitsWithAllActionsAndDevices extends Fixture
$this->trackVisitTablet($t, Date::factory($this->dateTime)->addHour(156.9)->getDatetime());
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
- private function trackVisitSmartphone(\PiwikTracker $t, $dateTime)
+ private function trackVisitSmartphone(\MatomoTracker $t, $dateTime)
{
$t->setForceVisitDateTime($dateTime);
$t->setUserAgent('Mozilla/5.0 (Linux; U; Android 4.4.2; fr-fr; HTC One_M8 Build/KOT49H) AppleWebKit/537.16 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.16');
@@ -147,7 +147,7 @@ class VisitsWithAllActionsAndDevices extends Fixture
self::checkResponse($t->doTrackAction('http://vendor.site', 'link'));
}
- private function trackVisitTablet(\PiwikTracker $t, $dateTime)
+ private function trackVisitTablet(\MatomoTracker $t, $dateTime)
{
$t->setForceVisitDateTime($dateTime);
$t->setUserAgent('Mozilla/5.0 (Linux; U; en-us; KFAPWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.8 Safari/535.19 Silk-Accelerated=true');
@@ -187,7 +187,7 @@ class VisitsWithAllActionsAndDevices extends Fixture
$t->doTrackContentImpression('product slider', 'product_16.jpg', 'http://example.org/product16');
}
- private function trackVisitMediaPlayer(\PiwikTracker $t, $dateTime)
+ private function trackVisitMediaPlayer(\MatomoTracker $t, $dateTime)
{
$t->setForceVisitDateTime($dateTime);
$t->setUserAgent('Mozilla/5.0 (iPod; U; CPU iPhone OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8C148');
@@ -213,7 +213,7 @@ class VisitsWithAllActionsAndDevices extends Fixture
self::checkResponse($t->doTrackPageView('Action without url'));
}
- private function trackDeviceVisit(\PiwikTracker $t, $dateTime, $useragent)
+ private function trackDeviceVisit(\MatomoTracker $t, $dateTime, $useragent)
{
$t->setForceVisitDateTime($dateTime);
$t->setUserAgent($useragent);
diff --git a/plugins/Live/tests/Integration/ModelTest.php b/plugins/Live/tests/Integration/ModelTest.php
index 19bc97e82b..d66872e44d 100644
--- a/plugins/Live/tests/Integration/ModelTest.php
+++ b/plugins/Live/tests/Integration/ModelTest.php
@@ -27,7 +27,7 @@ use Piwik\Tests\Integration\SegmentTest;
*/
class ModelTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -86,13 +86,12 @@ class ModelTest extends IntegrationTestCase
$this->assertTrue(true);
}
- /**
- * @expectedException \Piwik\Plugins\Live\Exception\MaxExecutionTimeExceededException
- * @expectedExceptionMessage Live_QueryMaxExecutionTimeExceeded Live_QueryMaxExecutionTimeExceededReasonUnknown
- */
public function test_handleMaxExecutionTimeError_whenTimeIsExceeded_noReasonFound()
{
- $db = Db::get();
+ $this->expectException(\Piwik\Plugins\Live\Exception\MaxExecutionTimeExceededException::class);
+ $this->expectExceptionMessage('Live_QueryMaxExecutionTimeExceeded Live_QueryMaxExecutionTimeExceededReasonUnknown');
+
+ $db = Db::get();
$e = new \Exception('[3024] Query execution was interrupted, maximum statement execution time exceeded');
$sql = 'SELECT 1';
$bind = array();
@@ -104,13 +103,12 @@ class ModelTest extends IntegrationTestCase
Model::handleMaxExecutionTimeError($db, $e, $segment, $dateStart, $dateEnd, $minTimestamp, $limit, [$sql, $bind]);
}
- /**
- * @expectedException \Piwik\Plugins\Live\Exception\MaxExecutionTimeExceededException
- * @expectedExceptionMessage Live_QueryMaxExecutionTimeExceeded Live_QueryMaxExecutionTimeExceededReasonDateRange Live_QueryMaxExecutionTimeExceededReasonSegment Live_QueryMaxExecutionTimeExceededLimit
- */
public function test_handleMaxExecutionTimeError_whenTimeIsExceeded_manyReasonsFound()
{
- $db = Db::get();
+ $this->expectException(\Piwik\Plugins\Live\Exception\MaxExecutionTimeExceededException::class);
+ $this->expectExceptionMessage('Live_QueryMaxExecutionTimeExceeded Live_QueryMaxExecutionTimeExceededReasonDateRange Live_QueryMaxExecutionTimeExceededReasonSegment Live_QueryMaxExecutionTimeExceededLimit');
+
+ $db = Db::get();
$e = new \Exception('Query execution was interrupted, maximum statement execution time exceeded');
$segment = 'userId>=1';
$dateStart = Date::now()->subDay(10);
diff --git a/plugins/Live/tests/System/ApiCounterTest.php b/plugins/Live/tests/System/ApiCounterTest.php
index c71a62a850..58cf83fbb1 100644
--- a/plugins/Live/tests/System/ApiCounterTest.php
+++ b/plugins/Live/tests/System/ApiCounterTest.php
@@ -35,14 +35,14 @@ class ApiCounterTest extends SystemTestCase
private $api;
private $idSite = 1;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
self::$testNow = strtotime('2018-02-03 04:45:40');
parent::setUpBeforeClass();
}
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -51,12 +51,11 @@ class ApiCounterTest extends SystemTestCase
$this->createSite();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasViewAccess Fake exception
- */
public function test_GetCounters_ShouldFail_IfUserHasNoPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasViewAccess Fake exception');
+
$this->setAnonymous();
$this->api->getCounters($this->idSite, 5);
}
diff --git a/plugins/Live/tests/System/expected/test_actionSegment__Live.getLastVisitsDetails_day.xml b/plugins/Live/tests/System/expected/test_actionSegment__Live.getLastVisitsDetails_day.xml
index b38e75dc5a..8cfab6ddcf 100644
--- a/plugins/Live/tests/System/expected/test_actionSegment__Live.getLastVisitsDetails_day.xml
+++ b/plugins/Live/tests/System/expected/test_actionSegment__Live.getLastVisitsDetails_day.xml
@@ -2,213 +2,23 @@
<result>
<row>
<idSite>1</idSite>
- <idVisit>2</idVisit>
+ <idVisit>4</idVisit>
<visitIp>156.5.3.2</visitIp>
- <fingerprint>e16cf2bbaeea2c88</fingerprint>
+ <fingerprint>5041e282fc23fef1</fingerprint>
<actionDetails>
<row>
<type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title -2</pageTitle>
- <pageIdAction>4</pageIdAction>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>9</pageIdAction>
- <pageId>2</pageId>
+ <pageId>14</pageId>
<bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
<interactionPosition>1</interactionPosition>
- <title>incredible title -2</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>3</pageId>
- <bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <interactionPosition>2</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>4</pageId>
- <bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <interactionPosition>3</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>5</pageId>
- <bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <interactionPosition>4</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>6</pageId>
- <bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <interactionPosition>5</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>7</pageId>
- <bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <interactionPosition>6</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>8</pageId>
- <bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <interactionPosition>7</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>9</pageId>
- <bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <interactionPosition>8</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>10</pageId>
- <bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <interactionPosition>9</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>11</pageId>
- <bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
- <interactionPosition>10</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-2</url>
- <pageTitle>incredible title 1</pageTitle>
- <pageIdAction>4</pageIdAction>
-
-
- <pageId>12</pageId>
- <bandwidth />
- <interactionPosition>11</interactionPosition>
- <title>incredible title 1</title>
- <subtitle>http://example.org/my/dir/page-2</subtitle>
+ <title>incredible title 0</title>
+ <subtitle>http://example.org/my/dir/page0</subtitle>
<icon />
<iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
@@ -230,8 +40,8 @@
<userId />
- <visitorType>new</visitorType>
- <visitorTypeIcon />
+ <visitorType>returning</visitorType>
+ <visitorTypeIcon>plugins/Live/images/returningVisitor.png</visitorTypeIcon>
<visitConverted>0</visitConverted>
<visitConvertedIcon />
<visitCount>1</visitCount>
@@ -239,11 +49,11 @@
<visitEcommerceStatusIcon />
<daysSinceFirstVisit>0</daysSinceFirstVisit>
<daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
- <visitDuration>1</visitDuration>
- <visitDurationPretty>1s</visitDurationPretty>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
<searches>0</searches>
- <actions>11</actions>
- <interactions>11</interactions>
+ <actions>1</actions>
+ <interactions>1</interactions>
<referrerType>direct</referrerType>
<referrerTypeName>Direct Entry</referrerTypeName>
<referrerName />
@@ -254,24 +64,24 @@
<referrerSearchEngineIcon />
<referrerSocialNetworkUrl />
<referrerSocialNetworkIcon />
- <languageCode>fr</languageCode>
- <language>French</language>
- <deviceType>Desktop</deviceType>
- <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/desktop.png</deviceTypeIcon>
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/unknown.png</deviceTypeIcon>
<deviceBrand>Unknown</deviceBrand>
- <deviceModel>Generic Desktop</deviceModel>
- <operatingSystem>Windows XP</operatingSystem>
- <operatingSystemName>Windows</operatingSystemName>
- <operatingSystemIcon>plugins/Morpheus/icons/dist/os/WIN.png</operatingSystemIcon>
- <operatingSystemCode>WIN</operatingSystemCode>
- <operatingSystemVersion>XP</operatingSystemVersion>
- <browserFamily>Gecko</browserFamily>
- <browserFamilyDescription>Gecko (Firefox)</browserFamilyDescription>
- <browser>Firefox 3.6</browser>
- <browserName>Firefox</browserName>
- <browserIcon>plugins/Morpheus/icons/dist/browsers/FF.png</browserIcon>
- <browserCode>FF</browserCode>
- <browserVersion>3.6</browserVersion>
+ <deviceModel>Unknown</deviceModel>
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/Morpheus/icons/dist/os/UNK.png</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/Morpheus/icons/dist/browsers/UNK.png</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
<totalEcommerceRevenue>0</totalEcommerceRevenue>
<totalEcommerceConversions>0</totalEcommerceConversions>
<totalEcommerceItems>0</totalEcommerceItems>
@@ -279,15 +89,15 @@
<totalAbandonedCarts>0</totalAbandonedCarts>
<totalAbandonedCartsItems>0</totalAbandonedCartsItems>
<events>0</events>
- <continent>Europe</continent>
- <continentCode>eur</continentCode>
- <country>France</country>
- <countryCode>fr</countryCode>
- <countryFlag>plugins/Morpheus/icons/dist/flags/fr.png</countryFlag>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/Morpheus/icons/dist/flags/xx.png</countryFlag>
<region />
<regionCode />
<city />
- <location>France</location>
+ <location>Unknown</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
diff --git a/plugins/Live/tests/System/expected/test_allSites__Live.getLastVisitsDetails_day.xml b/plugins/Live/tests/System/expected/test_allSites__Live.getLastVisitsDetails_day.xml
index a5fc306b26..0d7129ff7a 100644
--- a/plugins/Live/tests/System/expected/test_allSites__Live.getLastVisitsDetails_day.xml
+++ b/plugins/Live/tests/System/expected/test_allSites__Live.getLastVisitsDetails_day.xml
@@ -124,6 +124,250 @@
</row>
<row>
<idSite>1</idSite>
+ <idVisit>4</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <fingerprint>5041e282fc23fef1</fingerprint>
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>9</pageIdAction>
+
+
+ <pageId>14</pageId>
+ <bandwidth />
+ <interactionPosition>1</interactionPosition>
+ <title>incredible title 0</title>
+ <subtitle>http://example.org/my/dir/page0</subtitle>
+ <icon />
+ <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
+
+ <bandwidth_pretty>0 M</bandwidth_pretty>
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <siteName>Piwik test</siteName>
+
+
+
+
+
+
+ <userId />
+ <visitorType>returning</visitorType>
+ <visitorTypeIcon>plugins/Live/images/returningVisitor.png</visitorTypeIcon>
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <interactions>1</interactions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <referrerSocialNetworkUrl />
+ <referrerSocialNetworkIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/unknown.png</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel>Unknown</deviceModel>
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/Morpheus/icons/dist/os/UNK.png</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/Morpheus/icons/dist/browsers/UNK.png</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <totalEcommerceRevenue>0</totalEcommerceRevenue>
+ <totalEcommerceConversions>0</totalEcommerceConversions>
+ <totalEcommerceItems>0</totalEcommerceItems>
+ <totalAbandonedCartsRevenue>0</totalAbandonedCartsRevenue>
+ <totalAbandonedCarts>0</totalAbandonedCarts>
+ <totalAbandonedCartsItems>0</totalAbandonedCartsItems>
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/Morpheus/icons/dist/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>cookie, flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/cookie.png</pluginIcon>
+ <pluginName>cookie</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/flash.png</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/java.png</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>3</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <fingerprint>5041e282fc23fef1</fingerprint>
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page-1</url>
+ <pageTitle>incredible title -1</pageTitle>
+ <pageIdAction>7</pageIdAction>
+
+
+ <pageId>13</pageId>
+ <bandwidth />
+ <interactionPosition>1</interactionPosition>
+ <title>incredible title -1</title>
+ <subtitle>http://example.org/my/dir/page-1</subtitle>
+ <icon />
+ <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
+
+ <bandwidth_pretty>0 M</bandwidth_pretty>
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <siteName>Piwik test</siteName>
+
+
+
+
+
+
+ <userId />
+ <visitorType>returning</visitorType>
+ <visitorTypeIcon>plugins/Live/images/returningVisitor.png</visitorTypeIcon>
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <interactions>1</interactions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <referrerSocialNetworkUrl />
+ <referrerSocialNetworkIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/unknown.png</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel>Unknown</deviceModel>
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/Morpheus/icons/dist/os/UNK.png</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/Morpheus/icons/dist/browsers/UNK.png</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <totalEcommerceRevenue>0</totalEcommerceRevenue>
+ <totalEcommerceConversions>0</totalEcommerceConversions>
+ <totalEcommerceItems>0</totalEcommerceItems>
+ <totalAbandonedCartsRevenue>0</totalAbandonedCartsRevenue>
+ <totalAbandonedCarts>0</totalAbandonedCarts>
+ <totalAbandonedCartsItems>0</totalAbandonedCartsItems>
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/Morpheus/icons/dist/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>cookie, flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/cookie.png</pluginIcon>
+ <pluginName>cookie</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/flash.png</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/java.png</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+ </row>
+ <row>
+ <idSite>1</idSite>
<idVisit>2</idVisit>
<visitIp>156.5.3.2</visitIp>
@@ -434,248 +678,4 @@
</row>
</pluginsIcons>
</row>
- <row>
- <idSite>1</idSite>
- <idVisit>3</idVisit>
- <visitIp>156.5.3.2</visitIp>
-
- <fingerprint>5041e282fc23fef1</fingerprint>
- <actionDetails>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-1</url>
- <pageTitle>incredible title -1</pageTitle>
- <pageIdAction>7</pageIdAction>
-
-
- <pageId>13</pageId>
- <bandwidth />
- <interactionPosition>1</interactionPosition>
- <title>incredible title -1</title>
- <subtitle>http://example.org/my/dir/page-1</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- </actionDetails>
- <goalConversions>0</goalConversions>
- <siteCurrency>USD</siteCurrency>
- <siteCurrencySymbol>$</siteCurrencySymbol>
-
-
-
-
- <siteName>Piwik test</siteName>
-
-
-
-
-
-
- <userId />
- <visitorType>returning</visitorType>
- <visitorTypeIcon>plugins/Live/images/returningVisitor.png</visitorTypeIcon>
- <visitConverted>0</visitConverted>
- <visitConvertedIcon />
- <visitCount>1</visitCount>
- <visitEcommerceStatus>none</visitEcommerceStatus>
- <visitEcommerceStatusIcon />
- <daysSinceFirstVisit>0</daysSinceFirstVisit>
- <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
- <visitDuration>0</visitDuration>
- <visitDurationPretty>0s</visitDurationPretty>
- <searches>0</searches>
- <actions>1</actions>
- <interactions>1</interactions>
- <referrerType>direct</referrerType>
- <referrerTypeName>Direct Entry</referrerTypeName>
- <referrerName />
- <referrerKeyword />
- <referrerKeywordPosition />
- <referrerUrl />
- <referrerSearchEngineUrl />
- <referrerSearchEngineIcon />
- <referrerSocialNetworkUrl />
- <referrerSocialNetworkIcon />
- <languageCode />
- <language>Unknown</language>
- <deviceType>Unknown</deviceType>
- <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/unknown.png</deviceTypeIcon>
- <deviceBrand>Unknown</deviceBrand>
- <deviceModel>Unknown</deviceModel>
- <operatingSystem>Unknown</operatingSystem>
- <operatingSystemName>Unknown</operatingSystemName>
- <operatingSystemIcon>plugins/Morpheus/icons/dist/os/UNK.png</operatingSystemIcon>
- <operatingSystemCode>UNK</operatingSystemCode>
- <operatingSystemVersion>UNK</operatingSystemVersion>
- <browserFamily />
- <browserFamilyDescription>Unknown</browserFamilyDescription>
- <browser>Unknown</browser>
- <browserName>Unknown</browserName>
- <browserIcon>plugins/Morpheus/icons/dist/browsers/UNK.png</browserIcon>
- <browserCode>UNK</browserCode>
- <browserVersion />
- <totalEcommerceRevenue>0</totalEcommerceRevenue>
- <totalEcommerceConversions>0</totalEcommerceConversions>
- <totalEcommerceItems>0</totalEcommerceItems>
- <totalAbandonedCartsRevenue>0</totalAbandonedCartsRevenue>
- <totalAbandonedCarts>0</totalAbandonedCarts>
- <totalAbandonedCartsItems>0</totalAbandonedCartsItems>
- <events>0</events>
- <continent>Unknown</continent>
- <continentCode>unk</continentCode>
- <country>Unknown</country>
- <countryCode>xx</countryCode>
- <countryFlag>plugins/Morpheus/icons/dist/flags/xx.png</countryFlag>
- <region />
- <regionCode />
- <city />
- <location>Unknown</location>
- <latitude />
- <longitude />
- <visitLocalTime>12:34:06</visitLocalTime>
- <visitLocalHour>12</visitLocalHour>
- <daysSinceLastVisit>0</daysSinceLastVisit>
- <customVariables>
- </customVariables>
- <resolution>1024x768</resolution>
- <plugins>cookie, flash, java</plugins>
- <pluginsIcons>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/cookie.png</pluginIcon>
- <pluginName>cookie</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/flash.png</pluginIcon>
- <pluginName>flash</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/java.png</pluginIcon>
- <pluginName>java</pluginName>
- </row>
- </pluginsIcons>
- </row>
- <row>
- <idSite>1</idSite>
- <idVisit>4</idVisit>
- <visitIp>156.5.3.2</visitIp>
-
- <fingerprint>5041e282fc23fef1</fingerprint>
- <actionDetails>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page0</url>
- <pageTitle>incredible title 0</pageTitle>
- <pageIdAction>9</pageIdAction>
-
-
- <pageId>14</pageId>
- <bandwidth />
- <interactionPosition>1</interactionPosition>
- <title>incredible title 0</title>
- <subtitle>http://example.org/my/dir/page0</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- </actionDetails>
- <goalConversions>0</goalConversions>
- <siteCurrency>USD</siteCurrency>
- <siteCurrencySymbol>$</siteCurrencySymbol>
-
-
-
-
- <siteName>Piwik test</siteName>
-
-
-
-
-
-
- <userId />
- <visitorType>returning</visitorType>
- <visitorTypeIcon>plugins/Live/images/returningVisitor.png</visitorTypeIcon>
- <visitConverted>0</visitConverted>
- <visitConvertedIcon />
- <visitCount>1</visitCount>
- <visitEcommerceStatus>none</visitEcommerceStatus>
- <visitEcommerceStatusIcon />
- <daysSinceFirstVisit>0</daysSinceFirstVisit>
- <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
- <visitDuration>0</visitDuration>
- <visitDurationPretty>0s</visitDurationPretty>
- <searches>0</searches>
- <actions>1</actions>
- <interactions>1</interactions>
- <referrerType>direct</referrerType>
- <referrerTypeName>Direct Entry</referrerTypeName>
- <referrerName />
- <referrerKeyword />
- <referrerKeywordPosition />
- <referrerUrl />
- <referrerSearchEngineUrl />
- <referrerSearchEngineIcon />
- <referrerSocialNetworkUrl />
- <referrerSocialNetworkIcon />
- <languageCode />
- <language>Unknown</language>
- <deviceType>Unknown</deviceType>
- <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/unknown.png</deviceTypeIcon>
- <deviceBrand>Unknown</deviceBrand>
- <deviceModel>Unknown</deviceModel>
- <operatingSystem>Unknown</operatingSystem>
- <operatingSystemName>Unknown</operatingSystemName>
- <operatingSystemIcon>plugins/Morpheus/icons/dist/os/UNK.png</operatingSystemIcon>
- <operatingSystemCode>UNK</operatingSystemCode>
- <operatingSystemVersion>UNK</operatingSystemVersion>
- <browserFamily />
- <browserFamilyDescription>Unknown</browserFamilyDescription>
- <browser>Unknown</browser>
- <browserName>Unknown</browserName>
- <browserIcon>plugins/Morpheus/icons/dist/browsers/UNK.png</browserIcon>
- <browserCode>UNK</browserCode>
- <browserVersion />
- <totalEcommerceRevenue>0</totalEcommerceRevenue>
- <totalEcommerceConversions>0</totalEcommerceConversions>
- <totalEcommerceItems>0</totalEcommerceItems>
- <totalAbandonedCartsRevenue>0</totalAbandonedCartsRevenue>
- <totalAbandonedCarts>0</totalAbandonedCarts>
- <totalAbandonedCartsItems>0</totalAbandonedCartsItems>
- <events>0</events>
- <continent>Unknown</continent>
- <continentCode>unk</continentCode>
- <country>Unknown</country>
- <countryCode>xx</countryCode>
- <countryFlag>plugins/Morpheus/icons/dist/flags/xx.png</countryFlag>
- <region />
- <regionCode />
- <city />
- <location>Unknown</location>
- <latitude />
- <longitude />
- <visitLocalTime>12:34:06</visitLocalTime>
- <visitLocalHour>12</visitLocalHour>
- <daysSinceLastVisit>0</daysSinceLastVisit>
- <customVariables>
- </customVariables>
- <resolution>1024x768</resolution>
- <plugins>cookie, flash, java</plugins>
- <pluginsIcons>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/cookie.png</pluginIcon>
- <pluginName>cookie</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/flash.png</pluginIcon>
- <pluginName>flash</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/java.png</pluginIcon>
- <pluginName>java</pluginName>
- </row>
- </pluginsIcons>
- </row>
</result> \ No newline at end of file
diff --git a/plugins/Live/tests/System/expected/test_multiSites__Live.getLastVisitsDetails_day.xml b/plugins/Live/tests/System/expected/test_multiSites__Live.getLastVisitsDetails_day.xml
index a5fc306b26..0d7129ff7a 100644
--- a/plugins/Live/tests/System/expected/test_multiSites__Live.getLastVisitsDetails_day.xml
+++ b/plugins/Live/tests/System/expected/test_multiSites__Live.getLastVisitsDetails_day.xml
@@ -124,6 +124,250 @@
</row>
<row>
<idSite>1</idSite>
+ <idVisit>4</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <fingerprint>5041e282fc23fef1</fingerprint>
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page0</url>
+ <pageTitle>incredible title 0</pageTitle>
+ <pageIdAction>9</pageIdAction>
+
+
+ <pageId>14</pageId>
+ <bandwidth />
+ <interactionPosition>1</interactionPosition>
+ <title>incredible title 0</title>
+ <subtitle>http://example.org/my/dir/page0</subtitle>
+ <icon />
+ <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
+
+ <bandwidth_pretty>0 M</bandwidth_pretty>
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <siteName>Piwik test</siteName>
+
+
+
+
+
+
+ <userId />
+ <visitorType>returning</visitorType>
+ <visitorTypeIcon>plugins/Live/images/returningVisitor.png</visitorTypeIcon>
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <interactions>1</interactions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <referrerSocialNetworkUrl />
+ <referrerSocialNetworkIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/unknown.png</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel>Unknown</deviceModel>
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/Morpheus/icons/dist/os/UNK.png</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/Morpheus/icons/dist/browsers/UNK.png</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <totalEcommerceRevenue>0</totalEcommerceRevenue>
+ <totalEcommerceConversions>0</totalEcommerceConversions>
+ <totalEcommerceItems>0</totalEcommerceItems>
+ <totalAbandonedCartsRevenue>0</totalAbandonedCartsRevenue>
+ <totalAbandonedCarts>0</totalAbandonedCarts>
+ <totalAbandonedCartsItems>0</totalAbandonedCartsItems>
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/Morpheus/icons/dist/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>cookie, flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/cookie.png</pluginIcon>
+ <pluginName>cookie</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/flash.png</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/java.png</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+ </row>
+ <row>
+ <idSite>1</idSite>
+ <idVisit>3</idVisit>
+ <visitIp>156.5.3.2</visitIp>
+
+ <fingerprint>5041e282fc23fef1</fingerprint>
+ <actionDetails>
+ <row>
+ <type>action</type>
+ <url>http://example.org/my/dir/page-1</url>
+ <pageTitle>incredible title -1</pageTitle>
+ <pageIdAction>7</pageIdAction>
+
+
+ <pageId>13</pageId>
+ <bandwidth />
+ <interactionPosition>1</interactionPosition>
+ <title>incredible title -1</title>
+ <subtitle>http://example.org/my/dir/page-1</subtitle>
+ <icon />
+ <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
+
+ <bandwidth_pretty>0 M</bandwidth_pretty>
+ </row>
+ </actionDetails>
+ <goalConversions>0</goalConversions>
+ <siteCurrency>USD</siteCurrency>
+ <siteCurrencySymbol>$</siteCurrencySymbol>
+
+
+
+
+ <siteName>Piwik test</siteName>
+
+
+
+
+
+
+ <userId />
+ <visitorType>returning</visitorType>
+ <visitorTypeIcon>plugins/Live/images/returningVisitor.png</visitorTypeIcon>
+ <visitConverted>0</visitConverted>
+ <visitConvertedIcon />
+ <visitCount>1</visitCount>
+ <visitEcommerceStatus>none</visitEcommerceStatus>
+ <visitEcommerceStatusIcon />
+ <daysSinceFirstVisit>0</daysSinceFirstVisit>
+ <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
+ <visitDuration>0</visitDuration>
+ <visitDurationPretty>0s</visitDurationPretty>
+ <searches>0</searches>
+ <actions>1</actions>
+ <interactions>1</interactions>
+ <referrerType>direct</referrerType>
+ <referrerTypeName>Direct Entry</referrerTypeName>
+ <referrerName />
+ <referrerKeyword />
+ <referrerKeywordPosition />
+ <referrerUrl />
+ <referrerSearchEngineUrl />
+ <referrerSearchEngineIcon />
+ <referrerSocialNetworkUrl />
+ <referrerSocialNetworkIcon />
+ <languageCode />
+ <language>Unknown</language>
+ <deviceType>Unknown</deviceType>
+ <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/unknown.png</deviceTypeIcon>
+ <deviceBrand>Unknown</deviceBrand>
+ <deviceModel>Unknown</deviceModel>
+ <operatingSystem>Unknown</operatingSystem>
+ <operatingSystemName>Unknown</operatingSystemName>
+ <operatingSystemIcon>plugins/Morpheus/icons/dist/os/UNK.png</operatingSystemIcon>
+ <operatingSystemCode>UNK</operatingSystemCode>
+ <operatingSystemVersion>UNK</operatingSystemVersion>
+ <browserFamily />
+ <browserFamilyDescription>Unknown</browserFamilyDescription>
+ <browser>Unknown</browser>
+ <browserName>Unknown</browserName>
+ <browserIcon>plugins/Morpheus/icons/dist/browsers/UNK.png</browserIcon>
+ <browserCode>UNK</browserCode>
+ <browserVersion />
+ <totalEcommerceRevenue>0</totalEcommerceRevenue>
+ <totalEcommerceConversions>0</totalEcommerceConversions>
+ <totalEcommerceItems>0</totalEcommerceItems>
+ <totalAbandonedCartsRevenue>0</totalAbandonedCartsRevenue>
+ <totalAbandonedCarts>0</totalAbandonedCarts>
+ <totalAbandonedCartsItems>0</totalAbandonedCartsItems>
+ <events>0</events>
+ <continent>Unknown</continent>
+ <continentCode>unk</continentCode>
+ <country>Unknown</country>
+ <countryCode>xx</countryCode>
+ <countryFlag>plugins/Morpheus/icons/dist/flags/xx.png</countryFlag>
+ <region />
+ <regionCode />
+ <city />
+ <location>Unknown</location>
+ <latitude />
+ <longitude />
+ <visitLocalTime>12:34:06</visitLocalTime>
+ <visitLocalHour>12</visitLocalHour>
+ <daysSinceLastVisit>0</daysSinceLastVisit>
+ <customVariables>
+ </customVariables>
+ <resolution>1024x768</resolution>
+ <plugins>cookie, flash, java</plugins>
+ <pluginsIcons>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/cookie.png</pluginIcon>
+ <pluginName>cookie</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/flash.png</pluginIcon>
+ <pluginName>flash</pluginName>
+ </row>
+ <row>
+ <pluginIcon>plugins/Morpheus/icons/dist/plugins/java.png</pluginIcon>
+ <pluginName>java</pluginName>
+ </row>
+ </pluginsIcons>
+ </row>
+ <row>
+ <idSite>1</idSite>
<idVisit>2</idVisit>
<visitIp>156.5.3.2</visitIp>
@@ -434,248 +678,4 @@
</row>
</pluginsIcons>
</row>
- <row>
- <idSite>1</idSite>
- <idVisit>3</idVisit>
- <visitIp>156.5.3.2</visitIp>
-
- <fingerprint>5041e282fc23fef1</fingerprint>
- <actionDetails>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page-1</url>
- <pageTitle>incredible title -1</pageTitle>
- <pageIdAction>7</pageIdAction>
-
-
- <pageId>13</pageId>
- <bandwidth />
- <interactionPosition>1</interactionPosition>
- <title>incredible title -1</title>
- <subtitle>http://example.org/my/dir/page-1</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- </actionDetails>
- <goalConversions>0</goalConversions>
- <siteCurrency>USD</siteCurrency>
- <siteCurrencySymbol>$</siteCurrencySymbol>
-
-
-
-
- <siteName>Piwik test</siteName>
-
-
-
-
-
-
- <userId />
- <visitorType>returning</visitorType>
- <visitorTypeIcon>plugins/Live/images/returningVisitor.png</visitorTypeIcon>
- <visitConverted>0</visitConverted>
- <visitConvertedIcon />
- <visitCount>1</visitCount>
- <visitEcommerceStatus>none</visitEcommerceStatus>
- <visitEcommerceStatusIcon />
- <daysSinceFirstVisit>0</daysSinceFirstVisit>
- <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
- <visitDuration>0</visitDuration>
- <visitDurationPretty>0s</visitDurationPretty>
- <searches>0</searches>
- <actions>1</actions>
- <interactions>1</interactions>
- <referrerType>direct</referrerType>
- <referrerTypeName>Direct Entry</referrerTypeName>
- <referrerName />
- <referrerKeyword />
- <referrerKeywordPosition />
- <referrerUrl />
- <referrerSearchEngineUrl />
- <referrerSearchEngineIcon />
- <referrerSocialNetworkUrl />
- <referrerSocialNetworkIcon />
- <languageCode />
- <language>Unknown</language>
- <deviceType>Unknown</deviceType>
- <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/unknown.png</deviceTypeIcon>
- <deviceBrand>Unknown</deviceBrand>
- <deviceModel>Unknown</deviceModel>
- <operatingSystem>Unknown</operatingSystem>
- <operatingSystemName>Unknown</operatingSystemName>
- <operatingSystemIcon>plugins/Morpheus/icons/dist/os/UNK.png</operatingSystemIcon>
- <operatingSystemCode>UNK</operatingSystemCode>
- <operatingSystemVersion>UNK</operatingSystemVersion>
- <browserFamily />
- <browserFamilyDescription>Unknown</browserFamilyDescription>
- <browser>Unknown</browser>
- <browserName>Unknown</browserName>
- <browserIcon>plugins/Morpheus/icons/dist/browsers/UNK.png</browserIcon>
- <browserCode>UNK</browserCode>
- <browserVersion />
- <totalEcommerceRevenue>0</totalEcommerceRevenue>
- <totalEcommerceConversions>0</totalEcommerceConversions>
- <totalEcommerceItems>0</totalEcommerceItems>
- <totalAbandonedCartsRevenue>0</totalAbandonedCartsRevenue>
- <totalAbandonedCarts>0</totalAbandonedCarts>
- <totalAbandonedCartsItems>0</totalAbandonedCartsItems>
- <events>0</events>
- <continent>Unknown</continent>
- <continentCode>unk</continentCode>
- <country>Unknown</country>
- <countryCode>xx</countryCode>
- <countryFlag>plugins/Morpheus/icons/dist/flags/xx.png</countryFlag>
- <region />
- <regionCode />
- <city />
- <location>Unknown</location>
- <latitude />
- <longitude />
- <visitLocalTime>12:34:06</visitLocalTime>
- <visitLocalHour>12</visitLocalHour>
- <daysSinceLastVisit>0</daysSinceLastVisit>
- <customVariables>
- </customVariables>
- <resolution>1024x768</resolution>
- <plugins>cookie, flash, java</plugins>
- <pluginsIcons>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/cookie.png</pluginIcon>
- <pluginName>cookie</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/flash.png</pluginIcon>
- <pluginName>flash</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/java.png</pluginIcon>
- <pluginName>java</pluginName>
- </row>
- </pluginsIcons>
- </row>
- <row>
- <idSite>1</idSite>
- <idVisit>4</idVisit>
- <visitIp>156.5.3.2</visitIp>
-
- <fingerprint>5041e282fc23fef1</fingerprint>
- <actionDetails>
- <row>
- <type>action</type>
- <url>http://example.org/my/dir/page0</url>
- <pageTitle>incredible title 0</pageTitle>
- <pageIdAction>9</pageIdAction>
-
-
- <pageId>14</pageId>
- <bandwidth />
- <interactionPosition>1</interactionPosition>
- <title>incredible title 0</title>
- <subtitle>http://example.org/my/dir/page0</subtitle>
- <icon />
- <iconSVG>plugins/Morpheus/images/action.svg</iconSVG>
-
- <bandwidth_pretty>0 M</bandwidth_pretty>
- </row>
- </actionDetails>
- <goalConversions>0</goalConversions>
- <siteCurrency>USD</siteCurrency>
- <siteCurrencySymbol>$</siteCurrencySymbol>
-
-
-
-
- <siteName>Piwik test</siteName>
-
-
-
-
-
-
- <userId />
- <visitorType>returning</visitorType>
- <visitorTypeIcon>plugins/Live/images/returningVisitor.png</visitorTypeIcon>
- <visitConverted>0</visitConverted>
- <visitConvertedIcon />
- <visitCount>1</visitCount>
- <visitEcommerceStatus>none</visitEcommerceStatus>
- <visitEcommerceStatusIcon />
- <daysSinceFirstVisit>0</daysSinceFirstVisit>
- <daysSinceLastEcommerceOrder>0</daysSinceLastEcommerceOrder>
- <visitDuration>0</visitDuration>
- <visitDurationPretty>0s</visitDurationPretty>
- <searches>0</searches>
- <actions>1</actions>
- <interactions>1</interactions>
- <referrerType>direct</referrerType>
- <referrerTypeName>Direct Entry</referrerTypeName>
- <referrerName />
- <referrerKeyword />
- <referrerKeywordPosition />
- <referrerUrl />
- <referrerSearchEngineUrl />
- <referrerSearchEngineIcon />
- <referrerSocialNetworkUrl />
- <referrerSocialNetworkIcon />
- <languageCode />
- <language>Unknown</language>
- <deviceType>Unknown</deviceType>
- <deviceTypeIcon>plugins/Morpheus/icons/dist/devices/unknown.png</deviceTypeIcon>
- <deviceBrand>Unknown</deviceBrand>
- <deviceModel>Unknown</deviceModel>
- <operatingSystem>Unknown</operatingSystem>
- <operatingSystemName>Unknown</operatingSystemName>
- <operatingSystemIcon>plugins/Morpheus/icons/dist/os/UNK.png</operatingSystemIcon>
- <operatingSystemCode>UNK</operatingSystemCode>
- <operatingSystemVersion>UNK</operatingSystemVersion>
- <browserFamily />
- <browserFamilyDescription>Unknown</browserFamilyDescription>
- <browser>Unknown</browser>
- <browserName>Unknown</browserName>
- <browserIcon>plugins/Morpheus/icons/dist/browsers/UNK.png</browserIcon>
- <browserCode>UNK</browserCode>
- <browserVersion />
- <totalEcommerceRevenue>0</totalEcommerceRevenue>
- <totalEcommerceConversions>0</totalEcommerceConversions>
- <totalEcommerceItems>0</totalEcommerceItems>
- <totalAbandonedCartsRevenue>0</totalAbandonedCartsRevenue>
- <totalAbandonedCarts>0</totalAbandonedCarts>
- <totalAbandonedCartsItems>0</totalAbandonedCartsItems>
- <events>0</events>
- <continent>Unknown</continent>
- <continentCode>unk</continentCode>
- <country>Unknown</country>
- <countryCode>xx</countryCode>
- <countryFlag>plugins/Morpheus/icons/dist/flags/xx.png</countryFlag>
- <region />
- <regionCode />
- <city />
- <location>Unknown</location>
- <latitude />
- <longitude />
- <visitLocalTime>12:34:06</visitLocalTime>
- <visitLocalHour>12</visitLocalHour>
- <daysSinceLastVisit>0</daysSinceLastVisit>
- <customVariables>
- </customVariables>
- <resolution>1024x768</resolution>
- <plugins>cookie, flash, java</plugins>
- <pluginsIcons>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/cookie.png</pluginIcon>
- <pluginName>cookie</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/flash.png</pluginIcon>
- <pluginName>flash</pluginName>
- </row>
- <row>
- <pluginIcon>plugins/Morpheus/icons/dist/plugins/java.png</pluginIcon>
- <pluginName>java</pluginName>
- </row>
- </pluginsIcons>
- </row>
</result> \ No newline at end of file
diff --git a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_log.png b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_log.png
index e556fb1ffd..1128675542 100644
--- a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_log.png
+++ b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_log.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d3dbbfb7280b58c59197ae791c14fa7b4dcf40a4d868bd9ef77614055b05f199
-size 386906
+oid sha256:363ee1f7abca91be5422910989a2328cfc507f217d2eaf1008b8bd7862c49d1a
+size 386911
diff --git a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_log_expand_pageview_actions.png b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_log_expand_pageview_actions.png
index 1b98f667be..bca3118156 100644
--- a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_log_expand_pageview_actions.png
+++ b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_log_expand_pageview_actions.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:952d7e1a73a09d164f7d2b1acf83768b4d42159c46a3d11eb767d7fcd190864f
-size 102198
+oid sha256:c7b27fe264d6b12a0383fe1e788c43d7544dbc7d8cd94752bedc56b081757804
+size 102195
diff --git a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile.png b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile.png
index dadf228e75..3361725e7d 100644
--- a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile.png
+++ b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1e7b93f0d66876577db7fa4a2ec3f4445256207e7064cd41dc6b754400fdd6c2
-size 418491
+oid sha256:9ca0fcc3ee5901df974c348fd7da020df9f4283bfd5768eba89b664717272000
+size 418489
diff --git a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_action_details.png b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_action_details.png
index f4ed9f750e..14c6866db9 100644
--- a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_action_details.png
+++ b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_action_details.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:922ac457ffa3b2a0117b8056e66530e01b5165d38b5b3b386c3d47bfa1ef9b38
-size 286501
+oid sha256:cb87e309174e3932f823cf29ef2f17aa7a843d8b1dc1839369da573c800f0226
+size 286483
diff --git a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_actions_hidden.png b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_actions_hidden.png
index be8d08e5d8..9916a673f4 100644
--- a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_actions_hidden.png
+++ b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_actions_hidden.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:eaeba2afebc1c74fd8d13d74ea8ccfc7f9cb3dd9418d288ac8e4420ed85f47d4
+oid sha256:7469391d27c7b107ba69c5e45ac4544a98839af7088dbb49be0540630408d496
size 253276
diff --git a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_limited.png b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_limited.png
index 8fea3c44f2..d46830adc0 100644
--- a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_limited.png
+++ b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_limited.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:23ab3a8404d0c0fdc67fd30720968a7ba1f062e8b485f737c8894d0bc45b586b
-size 310449
+oid sha256:81d25e5b1ecdd3bd0d094fccab4b387a1e00d147015b5621a68942edc2e65113
+size 310462
diff --git a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_visit_details.png b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_visit_details.png
index 4973b5d61b..02599bb8f0 100644
--- a/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_visit_details.png
+++ b/plugins/Live/tests/UI/expected-screenshots/Live_visitor_profile_visit_details.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2d935ef09c39f74682a18f6cd285b8efddb93777e249876d2ad245e2aff08eab
-size 263232
+oid sha256:69d8ed1bf1f34cd8aa7e06f98d6f8cd4a3a92e27101cb16c7220dfee2b575d75
+size 263202
diff --git a/plugins/LogViewer b/plugins/LogViewer
-Subproject 102cd13d8a848dc6379eabe6e2ecb6d1cbce18b
+Subproject 18367ca3fea1a6837d5a0bc1191ba64141e52be
diff --git a/plugins/Login/Controller.php b/plugins/Login/Controller.php
index b5ce90908e..8704b3c1ac 100644
--- a/plugins/Login/Controller.php
+++ b/plugins/Login/Controller.php
@@ -108,7 +108,6 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
/**
* Default action
*
- * @param none
* @return string
*/
function index()
@@ -472,7 +471,6 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
/**
* Logout current user
*
- * @param none
* @return void
*/
public function logout()
diff --git a/plugins/Login/SystemSettings.php b/plugins/Login/SystemSettings.php
index 360add240c..93c1f799e5 100644
--- a/plugins/Login/SystemSettings.php
+++ b/plugins/Login/SystemSettings.php
@@ -8,7 +8,7 @@
namespace Piwik\Plugins\Login;
-use Piwik\Network\IP;
+use Matomo\Network\IP;
use Piwik\Piwik;
use Piwik\Settings\Setting;
use Piwik\Settings\FieldConfig;
diff --git a/plugins/Login/config/test.php b/plugins/Login/config/test.php
index cf83aaabdb..30717d24d5 100644
--- a/plugins/Login/config/test.php
+++ b/plugins/Login/config/test.php
@@ -6,7 +6,7 @@ return array(
\Piwik\Access::doAsSuperUser(function () use ($settings, $c) {
if ($c->get('test.vars.bruteForceBlockIps')) {
$settings->blacklistedBruteForceIps->setValue(array('10.2.3.4'));
- } elseif (\Piwik\SettingsPiwik::isPiwikInstalled()) {
+ } elseif (\Piwik\SettingsPiwik::isMatomoInstalled()) {
$settings->blacklistedBruteForceIps->setValue(array());
}
});
@@ -26,7 +26,7 @@ return array(
// we block this IP
$detection->addFailedAttempt(\Piwik\IP::getIpFromHeader());
}
- } elseif (\Piwik\SettingsPiwik::isPiwikInstalled()) {
+ } elseif (\Piwik\SettingsPiwik::isMatomoInstalled()) {
// prevent tests from blocking other tests
$detection->deleteAll();
}
diff --git a/plugins/Login/templates/loginLayout.twig b/plugins/Login/templates/loginLayout.twig
index f1132812f5..2306f6bfa7 100644
--- a/plugins/Login/templates/loginLayout.twig
+++ b/plugins/Login/templates/loginLayout.twig
@@ -6,8 +6,6 @@
{% block head %}
{{ parent() }}
-
- <script type="text/javascript" src="libs/bower_components/jquery-placeholder/jquery.placeholder.js"></script>
{% endblock %}
{% set title %}{{ 'Login_LogIn'|translate }}{% endset %}
diff --git a/plugins/Login/tests/Integration/APITest.php b/plugins/Login/tests/Integration/APITest.php
index 9c09ccfa92..c250abfa46 100644
--- a/plugins/Login/tests/Integration/APITest.php
+++ b/plugins/Login/tests/Integration/APITest.php
@@ -24,19 +24,18 @@ class APITest extends IntegrationTestCase
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->api = API::getInstance();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasSuperUserAccess
- */
public function test_unblockBruteForceIPs_requiresSuperUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasSuperUserAccess');
+
FakeAccess::clearAccess(false, array(1,2,3));
$this->api->unblockBruteForceIPs();
}
diff --git a/plugins/Login/tests/Integration/LoginTest.php b/plugins/Login/tests/Integration/LoginTest.php
index ee76537ed3..a0351b5ea1 100644
--- a/plugins/Login/tests/Integration/LoginTest.php
+++ b/plugins/Login/tests/Integration/LoginTest.php
@@ -30,7 +30,7 @@ class LoginTest extends IntegrationTestCase
*/
private $auth;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Login/tests/Integration/PasswordResetterTest.php b/plugins/Login/tests/Integration/PasswordResetterTest.php
index f3603c7aca..89abe3ee8d 100644
--- a/plugins/Login/tests/Integration/PasswordResetterTest.php
+++ b/plugins/Login/tests/Integration/PasswordResetterTest.php
@@ -39,7 +39,7 @@ class PasswordResetterTest extends IntegrationTestCase
*/
private $passwordResetter;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->passwordResetter = new PasswordResetter();
@@ -83,12 +83,11 @@ class PasswordResetterTest extends IntegrationTestCase
$this->assertNotEquals($token, $this->capturedToken);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage You have requested too many password resets recently. A new request can be made in one hour. If you have problems resetting your password, please contact your administrator for help.
- */
public function test_passwordReset_notAllowedMoreThanThreeTimesInAnHour()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('You have requested too many password resets recently. A new request can be made in one hour. If you have problems resetting your password, please contact your administrator for help.');
+
$this->passwordResetter->initiatePasswordResetProcess('superUserLogin', self::NEWPASSWORD);
$this->assertNotEmpty($this->capturedToken);
@@ -124,12 +123,11 @@ class PasswordResetterTest extends IntegrationTestCase
$this->assertEquals(1, $data['requests']);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Token is invalid or has expired
- */
public function test_passwordReset_shouldNotAllowTokenToBeUsedMoreThanOnce()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Token is invalid or has expired');
+
$this->passwordResetter->initiatePasswordResetProcess('superUserLogin', self::NEWPASSWORD);
$this->assertNotEmpty($this->capturedToken);
@@ -157,12 +155,11 @@ class PasswordResetterTest extends IntegrationTestCase
$this->assertNotEquals($oldCapturedToken, $this->capturedToken);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Token is invalid or has expired
- */
public function test_passwordReset_shouldNotAllowOldTokenToBeUsedAfterAnotherResetRequest()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Token is invalid or has expired');
+
$this->passwordResetter->initiatePasswordResetProcess('superUserLogin', self::NEWPASSWORD);
$this->assertNotEmpty($this->capturedToken);
diff --git a/plugins/Login/tests/Integration/PasswordVerifierTest.php b/plugins/Login/tests/Integration/PasswordVerifierTest.php
index a169e5e723..7a84f44e7e 100644
--- a/plugins/Login/tests/Integration/PasswordVerifierTest.php
+++ b/plugins/Login/tests/Integration/PasswordVerifierTest.php
@@ -27,7 +27,7 @@ class PasswordVerifierTest extends IntegrationTestCase
*/
private $verifier;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Login/tests/Integration/Security/BruteForceDetectionTest.php b/plugins/Login/tests/Integration/Security/BruteForceDetectionTest.php
index d258d9d3d4..187a747fd9 100644
--- a/plugins/Login/tests/Integration/Security/BruteForceDetectionTest.php
+++ b/plugins/Login/tests/Integration/Security/BruteForceDetectionTest.php
@@ -50,7 +50,7 @@ class BruteForceDetectionTest extends IntegrationTestCase
*/
private $settings;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Login/tests/Integration/SessionInitializerTest.php b/plugins/Login/tests/Integration/SessionInitializerTest.php
index c10c4d920d..c2215de7a9 100644
--- a/plugins/Login/tests/Integration/SessionInitializerTest.php
+++ b/plugins/Login/tests/Integration/SessionInitializerTest.php
@@ -22,7 +22,7 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class SessionInitializerTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -69,7 +69,7 @@ class SessionInitializerTest extends IntegrationTestCase
private function assertAuthCookieIsCreated(Cookie $cookie)
{
- $this->assertContains('login=czo5OiJ0ZXN0bG9naW4iOw==:token_auth=czozMjoiOWU5MDYxZjk2MDI0YTY3NWFmOGFkNWZmNmNiZGY2ZGMiOw==',
+ self::assertStringContainsString('login=czo5OiJ0ZXN0bG9naW4iOw==:token_auth=czozMjoiOWU5MDYxZjk2MDI0YTY3NWFmOGFkNWZmNmNiZGY2ZGMiOw==',
$cookie->generateContentString());
}
diff --git a/plugins/Login/tests/Integration/SystemSettingsTest.php b/plugins/Login/tests/Integration/SystemSettingsTest.php
index 8bf1a83afe..f1aa859b8c 100644
--- a/plugins/Login/tests/Integration/SystemSettingsTest.php
+++ b/plugins/Login/tests/Integration/SystemSettingsTest.php
@@ -30,7 +30,7 @@ class SystemSettingsTest extends IntegrationTestCase
'2001:0db8:85a3:0000:0000:8a2e:0370:7334'
);
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -63,12 +63,11 @@ class SystemSettingsTest extends IntegrationTestCase
$this->assertSame($this->exampleIps, $this->settings->whitelisteBruteForceIps->getValue());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage SitesManager_ExceptionInvalidIPFormat
- */
public function test_whitelisteBruteForceIps_failsWhenContainsInvalidValue()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('SitesManager_ExceptionInvalidIPFormat');
+
$this->settings->whitelisteBruteForceIps->setValue(array(
'127.0.0.1', 'foobar'
));
@@ -100,12 +99,11 @@ class SystemSettingsTest extends IntegrationTestCase
$this->assertSame($this->exampleIps, $this->settings->blacklistedBruteForceIps->getValue());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage SitesManager_ExceptionInvalidIPFormat
- */
public function test_blacklistedBruteForceIps_failsWhenContainsInvalidValue()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('SitesManager_ExceptionInvalidIPFormat');
+
$this->settings->blacklistedBruteForceIps->setValue(array(
'127.0.0.1', 'foobar'
));
diff --git a/plugins/LoginHttpAuth b/plugins/LoginHttpAuth
deleted file mode 160000
-Subproject a9c6370526845f33637172eb197e3c76bcc082c
diff --git a/plugins/LoginLdap b/plugins/LoginLdap
-Subproject aea78502d4f37ef89676bff8dedf18adafadc94
+Subproject 1e03f257fa601a31182eb38096d25bb105a43ae
diff --git a/plugins/MarketingCampaignsReporting b/plugins/MarketingCampaignsReporting
-Subproject 4175bf630ed4112cb7d79022950318dbe30a24f
+Subproject 44be128d806ed3be02e4ea98868377f9ce9b005
diff --git a/plugins/Marketplace/Api/Client.php b/plugins/Marketplace/Api/Client.php
index 7334d2f629..b1e42b9ee9 100644
--- a/plugins/Marketplace/Api/Client.php
+++ b/plugins/Marketplace/Api/Client.php
@@ -8,7 +8,7 @@
*/
namespace Piwik\Plugins\Marketplace\Api;
-use Piwik\Cache;
+use Matomo\Cache\Lazy;
use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\Filesystem;
@@ -34,7 +34,7 @@ class Client
private $service;
/**
- * @var Cache\Lazy
+ * @var Lazy
*/
private $cache;
@@ -53,7 +53,7 @@ class Client
*/
private $environment;
- public function __construct(Service $service, Cache\Lazy $cache, LoggerInterface $logger, Environment $environment)
+ public function __construct(Service $service, Lazy $cache, LoggerInterface $logger, Environment $environment)
{
$this->service = $service;
$this->cache = $cache;
diff --git a/plugins/Marketplace/Plugins/InvalidLicenses.php b/plugins/Marketplace/Plugins/InvalidLicenses.php
index 2439a06117..faae824031 100644
--- a/plugins/Marketplace/Plugins/InvalidLicenses.php
+++ b/plugins/Marketplace/Plugins/InvalidLicenses.php
@@ -8,7 +8,7 @@
*/
namespace Piwik\Plugins\Marketplace\Plugins;
-use Piwik\Cache;
+use Matomo\Cache\Eager;
use Piwik\Piwik;
use Piwik\Plugin;
use Piwik\Plugins\Marketplace\Api\Client;
@@ -37,7 +37,7 @@ class InvalidLicenses
private $translator;
/**
- * @var Cache\Eager
+ * @var Eager
*/
private $cache;
@@ -50,7 +50,7 @@ class InvalidLicenses
private $cacheKey = 'Marketplace_ExpiredPlugins';
- public function __construct(Client $client, Cache\Eager $cache, Translator $translator, Plugins $plugins)
+ public function __construct(Client $client, Eager $cache, Translator $translator, Plugins $plugins)
{
$this->client = $client;
$this->translator = $translator;
diff --git a/plugins/Marketplace/lang/zh-cn.json b/plugins/Marketplace/lang/zh-cn.json
index 5c2b8937d6..ce80fe6a5b 100644
--- a/plugins/Marketplace/lang/zh-cn.json
+++ b/plugins/Marketplace/lang/zh-cn.json
@@ -7,23 +7,68 @@
"AddToCart": "加入购物车",
"AllowedUploadFormats": "您可以通过该页面上传.zip格式的插件或主题。",
"Authors": "作者",
+ "Browse": "浏览",
+ "LatestMarketplaceUpdates": "最新市场更新",
"BackToMarketplace": "返回商城",
+ "BrowseMarketplace": "浏览市场",
"ByXDevelopers": "开发者: %s",
"CannotInstall": "无法安装",
+ "CannotUpdate": "无法更新",
+ "ClickToCompletePurchase": "点击完成购买。",
+ "CurrentNumPiwikUsers": "您的Matomo当前有%1$s个注册用户。",
+ "ConfirmRemoveLicense": "您确定要删除许可证密钥吗? 您将不再收到任何已购买插件的更新。",
"Developer": "程序员",
"DevelopersLearnHowToDevelopPlugins": "开发者:你可以学习如何扩展和定制 Matomo%1$s开发插件或主题%2$s。",
+ "NoticeRemoveMarketplaceFromReportingMenu": "您可以通过安装%1$s White Label %2$s插件从报告菜单中删除市场。",
"Marketplace": "商城",
+ "PaidPlugins": "高级功能",
"FeaturedPlugin": "特色插件",
+ "InstallingNewPluginViaMarketplaceOrUpload": "您可以从Marketplace自动安装%1$s或%2$s以.zip格式上传%3$s%4$s。",
"InstallingPlugin": "正在安装 %s",
+ "InstallPurchasedPlugins": "安装购买的插件",
"LastCommitTime": "(最后提交 %s)",
"LastUpdated": "最后更新",
"License": "许可证",
+ "LicenseKey": "注册码",
+ "LicenseKeyActivatedSuccess": "许可证密钥已成功激活!",
+ "LicenseKeyDeletedSuccess": "许可证密钥已成功删除。",
+ "Exceeded": "超过",
+ "LicenseMissing": "许可证丢失",
+ "LicenseMissingDeactivatedDescription": "以下插件已被停用,因为您正在使用它们而未获得许可证:%1$s. %2$s要解决此问题,请更新您的许可证密钥,%3$s立即订阅%4$s或停用该插件。",
+ "PluginLicenseMissingDescription": "您无权下载此插件,因为该插件没有许可证。 要解决此问题,请更新您的许可证密钥,获取订阅或卸载插件。",
+ "LicenseExceeded": "超出许可",
+ "LicenseExceededDescription": "由于超过了许可证的授权用户数量,以下插件的许可证不再有效:%1$s. %2$s您将无法下载这些插件的更新。 要解决此问题,请删除一些用户,或者%3$s立即升级订阅%4$s。",
+ "PluginLicenseExceededDescription": "您无权下载此插件。 该插件的许可证不再有效,因为超过了许可证的授权用户数量。 要解决此问题,请删除一些用户或立即升级您的订阅。",
+ "LicenseExpired": "许可证过期",
+ "LicenseExpiredDescription": "以下插件的许可证已过期:%1$s。 %2$s您将不再收到这些插件的任何更新。 要解决此问题,请%3$s立即更新您的订阅%4$s,或者如果不再使用该插件,请停用该插件。",
+ "LicenseRenewsNextPaymentDate": "在下一个付款日期续费",
+ "UpgradeSubscription": "升级订阅",
+ "ViewSubscriptionsSummary": "%1$s查看您的插件订阅。%2$s",
+ "ViewSubscriptions": "查看订阅",
+ "ExceptionLinceseKeyIsExpired": "该许可证密钥已过期。",
+ "ExceptionLinceseKeyIsNotValid": "该许可证密钥无效。",
+ "LicenseKeyIsValidShort": "许可证密钥有效!",
+ "RemoveLicenseKey": "删除许可证密钥",
+ "InstallAllPurchasedPlugins": "一次安装所有购买的插件",
+ "InstallAllPurchasedPluginsAction": "安装并激活%d个购买的插件",
+ "InstallThesePlugins": "这将安装并激活以下插件:",
+ "AllPaidPluginsInstalledAndActivated": "所有付费插件均已成功安装并激活。",
+ "OnlySomePaidPluginsInstalledAndActivated": "某些付费插件未成功安装。",
"NewVersion": "新版本",
"NotAllowedToBrowseMarketplacePlugins": "您可以浏览,可以安装定制或扩展您的Matomo平台插件列表。如果你有需要请联系您的管理员。",
"NotAllowedToBrowseMarketplaceThemes": "就可以浏览可以安装定制Matomo平台的外观的主题列表。如果你有需要请联系您的管理员。",
"NoPluginsFound": "没有插件",
"NoThemesFound": "没有布景",
+ "NoSubscriptionsFound": "找不到订阅",
"NumDownloadsLatestVersion": "最新版本: %s次下载",
+ "OverviewPluginSubscriptions": "插件订阅概述",
+ "OverviewPluginSubscriptionsMissingLicense": "您没有设置许可证密钥。 如果您购买了插件订阅,请转到%1$s Marketplace %2$s并输入许可证密钥。",
+ "OverviewPluginSubscriptionsAllDetails": "要查看所有详细信息或更改订阅,请登录到您的帐户。",
+ "OverviewPluginSubscriptionsMissingInfo": "订阅可能会丢失,例如,如果尚未付款。 在这种情况下,请在几个小时后重试,或与Matomo小组联系。",
+ "NoValidSubscriptionNoUpdates": "订阅过期后,您将不再收到此插件的任何更新。",
+ "PluginSubscriptionsList": "这是与您的许可证密钥关联的订阅列表。",
+ "PaidPluginsNoLicenseKeyIntro": "如果您购买了%1$s个高级付费插件%2$s,请在下面插入收到的许可证密钥。",
+ "PaidPluginsWithLicenseKeyIntro": "已设置有效的许可证密钥。 出于安全原因,我们不在此处显示许可证密钥。 如果您丢失了许可证密钥,请联系Matomo团队。",
"PluginKeywords": "关键词",
"PluginUpdateAvailable": "您正在使用的版本号为 %1$s,现在有最新的版本%2$s。",
"PluginVersionInfo": "%1$s 从 %2$s",
diff --git a/plugins/Marketplace/tests/Fixtures/SimpleFixtureTrackFewVisits.php b/plugins/Marketplace/tests/Fixtures/SimpleFixtureTrackFewVisits.php
index 1da808af4e..dd16938ba9 100644
--- a/plugins/Marketplace/tests/Fixtures/SimpleFixtureTrackFewVisits.php
+++ b/plugins/Marketplace/tests/Fixtures/SimpleFixtureTrackFewVisits.php
@@ -15,13 +15,13 @@ class SimpleFixtureTrackFewVisits extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/Marketplace/tests/Framework/Mock/Client.php b/plugins/Marketplace/tests/Framework/Mock/Client.php
index 1fab955c2d..813ad08934 100644
--- a/plugins/Marketplace/tests/Framework/Mock/Client.php
+++ b/plugins/Marketplace/tests/Framework/Mock/Client.php
@@ -8,8 +8,8 @@
namespace Piwik\Plugins\Marketplace\tests\Framework\Mock;
-use Piwik\Cache\Backend\NullCache;
-use Piwik\Cache\Lazy;
+use Matomo\Cache\Backend\NullCache;
+use Matomo\Cache\Lazy;
use Psr\Log\NullLogger;
class Client {
diff --git a/plugins/Marketplace/tests/Integration/ApiTest.php b/plugins/Marketplace/tests/Integration/ApiTest.php
index 86769daea5..15dc2a28fa 100644
--- a/plugins/Marketplace/tests/Integration/ApiTest.php
+++ b/plugins/Marketplace/tests/Integration/ApiTest.php
@@ -35,7 +35,7 @@ class ApiTest extends IntegrationTestCase
*/
private $service;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -50,22 +50,20 @@ class ApiTest extends IntegrationTestCase
$this->setSuperUser();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasSuperUserAccess
- */
public function test_deleteLicenseKey_requiresSuperUserAccess_IfUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasSuperUserAccess');
+
$this->setUser();
$this->api->deleteLicenseKey();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasSuperUserAccess
- */
public function test_deleteLicenseKey_requiresSuperUserAccess_IfAnonymous()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasSuperUserAccess');
+
$this->setAnonymousUser();
$this->api->deleteLicenseKey();
}
@@ -80,32 +78,29 @@ class ApiTest extends IntegrationTestCase
$this->assertNotHasLicenseKey();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasSuperUserAccess
- */
public function test_saveLicenseKey_requiresSuperUserAccess_IfUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasSuperUserAccess');
+
$this->setUser();
$this->api->saveLicenseKey('key');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasSuperUserAccess
- */
public function test_saveLicenseKey_requiresSuperUserAccess_IfAnonymous()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasSuperUserAccess');
+
$this->setAnonymousUser();
$this->api->saveLicenseKey('key');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Marketplace_ExceptionLinceseKeyIsNotValid
- */
public function test_saveLicenseKey_shouldThrowException_IfTokenIsNotValid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Marketplace_ExceptionLinceseKeyIsNotValid');
+
$this->service->returnFixture('v2.0_consumer_validate-access_token-notexistingtoken.json');
$this->api->saveLicenseKey('key');
}
@@ -137,12 +132,11 @@ class ApiTest extends IntegrationTestCase
$this->assertSame('123licensekey', $this->buildLicenseKey()->get());
}
- /**
- * @expectedExceptionMessage Host not reachable
- * @expectedException \Piwik\Plugins\Marketplace\Api\Service\Exception
- */
public function test_saveLicenseKey_shouldThrowException_IfConnectionToMarketplaceFailed()
{
+ $this->expectException(\Piwik\Plugins\Marketplace\Api\Service\Exception::class);
+ $this->expectExceptionMessage('Host not reachable');
+
$this->service->throwException(new ServiceException('Host not reachable', ServiceException::HTTP_ERROR));
$success = $this->api->saveLicenseKey('123licensekey');
$this->assertTrue($success);
diff --git a/plugins/Marketplace/tests/Integration/ClientTest.php b/plugins/Marketplace/tests/Integration/ClientTest.php
index 96f9cb1779..777ce4393b 100644
--- a/plugins/Marketplace/tests/Integration/ClientTest.php
+++ b/plugins/Marketplace/tests/Integration/ClientTest.php
@@ -32,7 +32,7 @@ class ClientTest extends IntegrationTestCase
*/
private $service;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -54,12 +54,11 @@ class ClientTest extends IntegrationTestCase
$this->assertStringEndsWith('.zip', $file);
}
- /**
- * @expectedException \Piwik\Plugins\Marketplace\Api\Exception
- * @expectedExceptionMessage Requested plugin does not exist.
- */
public function test_getPluginInfo_shouldThrowException_IfNotAllowedToRequestPlugin()
{
+ $this->expectException(\Piwik\Plugins\Marketplace\Api\Exception::class);
+ $this->expectExceptionMessage('Requested plugin does not exist.');
+
$this->service->returnFixture('v2.0_plugins_CustomPlugin1_info-access_token-notexistingtoken.json');
$this->client->getPluginInfo('CustomPlugin1');
}
diff --git a/plugins/Marketplace/tests/Integration/EnvironmentTest.php b/plugins/Marketplace/tests/Integration/EnvironmentTest.php
index 677950fea6..d928f7b44a 100644
--- a/plugins/Marketplace/tests/Integration/EnvironmentTest.php
+++ b/plugins/Marketplace/tests/Integration/EnvironmentTest.php
@@ -28,7 +28,7 @@ class EnvironmentTest extends IntegrationTestCase
*/
private $environment;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Marketplace/tests/Integration/Input/PluginNameTest.php b/plugins/Marketplace/tests/Integration/Input/PluginNameTest.php
index fe0e3a2fbc..24ad6b6c97 100644
--- a/plugins/Marketplace/tests/Integration/Input/PluginNameTest.php
+++ b/plugins/Marketplace/tests/Integration/Input/PluginNameTest.php
@@ -19,7 +19,7 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class PluginNameTest extends IntegrationTestCase
{
- public function tearDown()
+ public function tearDown(): void
{
unset($_GET['pluginName']);
}
@@ -32,12 +32,11 @@ class PluginNameTest extends IntegrationTestCase
$this->assertSame('CoreFooBar', $pluginName->getPluginName());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Invalid plugin name given
- */
public function test_throws_exception_ifInvalidName()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Invalid plugin name given');
+
$this->setPluginName('CoreFooBar-?4');
$pluginName = new PluginName();
diff --git a/plugins/Marketplace/tests/Integration/LicenseKeyTest.php b/plugins/Marketplace/tests/Integration/LicenseKeyTest.php
index ff7918aec5..c1e147165c 100644
--- a/plugins/Marketplace/tests/Integration/LicenseKeyTest.php
+++ b/plugins/Marketplace/tests/Integration/LicenseKeyTest.php
@@ -24,7 +24,7 @@ class LicenseKeyTest extends IntegrationTestCase
*/
private $licenseKey;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Marketplace/tests/Integration/Plugins/InvalidLicensesTest.php b/plugins/Marketplace/tests/Integration/Plugins/InvalidLicensesTest.php
index 132ec6f211..cbb94fd501 100644
--- a/plugins/Marketplace/tests/Integration/Plugins/InvalidLicensesTest.php
+++ b/plugins/Marketplace/tests/Integration/Plugins/InvalidLicensesTest.php
@@ -8,15 +8,15 @@
namespace Piwik\Plugins\Marketplace\tests\Integration\Plugins;
-use Piwik\Cache\Backend\ArrayCache;
-use Piwik\Cache\Eager;
+use Matomo\Cache\Backend\ArrayCache;
+use Matomo\Cache\Eager;
use Piwik\Container\StaticContainer;
use Piwik\Plugins\Marketplace\Consumer;
use Piwik\Plugins\Marketplace\Plugins;
use Piwik\Plugins\Marketplace\Plugins\InvalidLicenses;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Piwik\Plugins\Marketplace\tests\Framework\Mock\Consumer as ConsumerBuilder;
-use Piwik\Translate;
class CustomInvalidLicenses extends InvalidLicenses {
private $isActivated = true;
@@ -47,18 +47,18 @@ class InvalidLicensesTest extends IntegrationTestCase
private $cacheKey = 'Marketplace_ExpiredPlugins';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- Translate::loadEnglishTranslation();
+ Fixture::loadAllTranslations();
$this->cache = new Eager(new ArrayCache(), 'test');
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::unloadEnglishTranslation();
+ Fixture::resetTranslations();
parent::tearDown();
}
diff --git a/plugins/Marketplace/tests/Integration/PluginsTest.php b/plugins/Marketplace/tests/Integration/PluginsTest.php
index 36d035bfba..d3b0a73bb8 100644
--- a/plugins/Marketplace/tests/Integration/PluginsTest.php
+++ b/plugins/Marketplace/tests/Integration/PluginsTest.php
@@ -41,7 +41,7 @@ class PluginsTest extends IntegrationTestCase
*/
private $consumerService;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -87,7 +87,7 @@ class PluginsTest extends IntegrationTestCase
'TreemapVisualization',
);
foreach ($expected as $name) {
- $this->assertContains($name, $pluginNames);
+ self::assertTrue(in_array($name, $pluginNames));
}
}
@@ -371,7 +371,7 @@ class PluginsTest extends IntegrationTestCase
$this->service->returnFixture('v2.0_plugins.json');
$plugins = $this->plugins->searchPlugins($query = '', $sort = Sort::DEFAULT_SORT, $themesOnly = false);
- $this->assertCount(54, $plugins);
+ $this->assertCount(47, $plugins);
$names = array_map(function ($plugin) {
return $plugin['name'];
}, $plugins);
@@ -398,9 +398,9 @@ class PluginsTest extends IntegrationTestCase
}
if ($plugin['owner'] === 'PiwikPRO') {
- $this->assertContains($piwikProCampaign, $plugin['homepage']);
+ self::assertStringContainsString($piwikProCampaign, $plugin['homepage']);
} else {
- $this->assertNotContains($piwikProCampaign, $plugin['homepage']);
+ self::assertStringNotContainsString($piwikProCampaign, $plugin['homepage']);
}
}
}
@@ -485,7 +485,6 @@ class PluginsTest extends IntegrationTestCase
{
return array (
'AdminNotification',
- 'AdvancedCampaignReporting',
'AnonymousPiwikUsageMeasurement',
'ApiGetWithSitesInfo',
'Bandwidth',
@@ -496,14 +495,12 @@ class PluginsTest extends IntegrationTestCase
'CustomAlerts',
'CustomDimensions',
'CustomOptOut',
- 'CustomTrackerJs',
'ExcludeByDDNS',
'FeedAnnotation',
'FlagCounter',
'FreeMobileMessaging',
'GoogleAuthenticator',
'GrabGravatar',
- 'InterSites',
'IntranetGeoIP',
'Ip2Hostname',
'IP2Location',
@@ -519,7 +516,6 @@ class PluginsTest extends IntegrationTestCase
'PaidPlugin1',
'PerformanceInfo',
'PerformanceMonitor',
- 'PlatformsReport',
'QueuedTracking',
'ReferrersManager',
'RerUserDates',
@@ -527,17 +523,14 @@ class PluginsTest extends IntegrationTestCase
'ServerMonitor',
'ShibbolethLogin',
'ShortcodeTracker',
- 'SimplePageBuilder',
'SimpleSysMon',
- 'SiteMigration',
'SnoopyBehavioralScoring',
'TasksTimetable',
'TopPagesByActions',
'TrackingCodeCustomizer',
'TreemapVisualization',
'UptimeRobotMonitor',
- 'VisitorAvatar',
- 'WebsiteGroups'
+ 'VisitorAvatar'
);
}
}
diff --git a/plugins/Marketplace/tests/Integration/ServiceTest.php b/plugins/Marketplace/tests/Integration/ServiceTest.php
index 4852e9ba07..6fea2f109b 100644
--- a/plugins/Marketplace/tests/Integration/ServiceTest.php
+++ b/plugins/Marketplace/tests/Integration/ServiceTest.php
@@ -25,31 +25,29 @@ class ServiceTest extends IntegrationTestCase
*/
private $service;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->service = new TestService();
}
- /**
- * @expectedException \Piwik\Plugins\Marketplace\Api\Service\Exception
- * @expectedExceptionCode 101
- * @expectedExceptionMessage Requested plugin does not exist.
- */
public function test_fetch_throwsApiError_WhenMarketplaceReturnsAnError()
{
+ $this->expectException(\Piwik\Plugins\Marketplace\Api\Service\Exception::class);
+ $this->expectExceptionCode(101);
+ $this->expectExceptionMessage('Requested plugin does not exist.');
+
$this->service->returnFixture('v2.0_plugins_CustomPlugin1_info-access_token-notexistingtoken.json');
$this->service->fetch('plugins/CustomPlugin1/info', array());
}
- /**
- * @expectedException \Piwik\Plugins\Marketplace\Api\Service\Exception
- * @expectedExceptionCode 100
- * @expectedExceptionMessage There was an error reading the response from the Marketplace
- */
public function test_fetch_throwsHttpError_WhenMarketplaceReturnsNoResultWhichMeansHttpError()
{
+ $this->expectException(\Piwik\Plugins\Marketplace\Api\Service\Exception::class);
+ $this->expectExceptionCode(100);
+ $this->expectExceptionMessage('There was an error reading the response from the Marketplace');
+
$this->service->setOnDownloadCallback(function () {
return null;
});
diff --git a/plugins/Marketplace/tests/Integration/UpdateCommunicationTest.php b/plugins/Marketplace/tests/Integration/UpdateCommunicationTest.php
index d862a22cea..16ffe3e530 100644
--- a/plugins/Marketplace/tests/Integration/UpdateCommunicationTest.php
+++ b/plugins/Marketplace/tests/Integration/UpdateCommunicationTest.php
@@ -33,7 +33,7 @@ class UpdateCommunicationTest extends IntegrationTestCase
*/
private $settings;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Marketplace/tests/System/Api/ClientTest.php b/plugins/Marketplace/tests/System/Api/ClientTest.php
index 694be41eb3..6673cef597 100644
--- a/plugins/Marketplace/tests/System/Api/ClientTest.php
+++ b/plugins/Marketplace/tests/System/Api/ClientTest.php
@@ -40,7 +40,7 @@ class ClientTest extends SystemTestCase
*/
private $environment;
- public function setUp()
+ public function setUp(): void
{
$releaseChannels = new Plugin\ReleaseChannels(Plugin\Manager::getInstance());
$this->environment = new Environment($releaseChannels);
@@ -51,6 +51,8 @@ class ClientTest extends SystemTestCase
public function test_getPluginInfo_existingPluginOnTheMarketplace()
{
+ $this->skipTestUntilFirstRelease();
+
$plugin = $this->client->getPluginInfo('SecurityInfo');
$expectedPluginKeys = array(
@@ -106,12 +108,11 @@ class ClientTest extends SystemTestCase
$this->assertNotEmpty($lastVersion['download']);
}
- /**
- * @expectedException \Piwik\Plugins\Marketplace\Api\Exception
- * @expectedExceptionMessage Requested plugin does not exist.
- */
public function test_getPluginInfo_shouldThrowException_IfPluginDoesNotExistOnMarketplace()
{
+ $this->expectException(\Piwik\Plugins\Marketplace\Api\Exception::class);
+ $this->expectExceptionMessage('Requested plugin does not exist.');
+
$this->client->getPluginInfo('NotExistingPlugIn');
}
@@ -127,6 +128,8 @@ class ClientTest extends SystemTestCase
public function test_searchForPlugins_requestAll()
{
+ $this->skipTestUntilFirstRelease();
+
$plugins = $this->client->searchForPlugins($keywords = '', $query = '', $sort = '', $purchaseType = PurchaseType::TYPE_ALL);
$this->assertGreaterThan(15, count($plugins));
@@ -139,6 +142,8 @@ class ClientTest extends SystemTestCase
public function test_searchForPlugins_onlyFree()
{
+ $this->skipTestUntilFirstRelease();
+
$plugins = $this->client->searchForPlugins($keywords = '', $query = '', $sort = '', $purchaseType = PurchaseType::TYPE_FREE);
$this->assertGreaterThan(15, count($plugins));
@@ -170,7 +175,7 @@ class ClientTest extends SystemTestCase
$this->assertLessThan(30, count($plugins));
foreach ($plugins as $plugin) {
- $this->assertContains($keywords, $plugin['keywords']);
+ self::assertStringContainsString($keywords, $plugin['keywords']);
}
}
@@ -189,6 +194,8 @@ class ClientTest extends SystemTestCase
public function test_getDownloadUrl()
{
+ $this->skipTestUntilFirstRelease();
+
$url = $this->client->getDownloadUrl('SecurityInfo');
$start = $this->domain . '/api/2.0/plugins/SecurityInfo/download/';
@@ -228,7 +235,7 @@ class ClientTest extends SystemTestCase
$this->assertTrue($cache->contains($id));
$cachedPlugins = $cache->fetch($id);
- $this->assertInternalType('array', $cachedPlugins);
+ self::assertIsArray($cachedPlugins);
$this->assertNotEmpty($cachedPlugins);
$this->assertGreaterThan(30, $cachedPlugins);
}
@@ -275,7 +282,7 @@ class ClientTest extends SystemTestCase
$this->assertSame(array('plugins', 'release_channel', 'prefer_stable', 'piwik', 'php', 'mysql', 'num_users', 'num_websites'), array_keys($service->params));
$plugins = $service->params['plugins'];
- $this->assertInternalType('string', $plugins);
+ self::assertIsString($plugins);
$this->assertJson($plugins);
$plugins = json_decode($plugins, true);
@@ -304,4 +311,11 @@ class ClientTest extends SystemTestCase
return Cache::getLazyCache();
}
+ public function skipTestUntilFirstRelease()
+ {
+ if (version_compare(Version::VERSION, '4.0.0-rc1', '<')) {
+ $this->markTestSkipped('Skipping tests until we have first release candidate');
+ }
+ }
+
}
diff --git a/plugins/Marketplace/tests/System/Api/ServiceTest.php b/plugins/Marketplace/tests/System/Api/ServiceTest.php
index 262b4e6d7b..7725cacaa4 100644
--- a/plugins/Marketplace/tests/System/Api/ServiceTest.php
+++ b/plugins/Marketplace/tests/System/Api/ServiceTest.php
@@ -85,28 +85,26 @@ class ServiceTest extends SystemTestCase
$this->assertLessThan(20, count($response['plugins']));
foreach ($response['plugins'] as $plugin) {
- $this->assertContains($keyword, $plugin['keywords']);
+ self::assertTrue(in_array($keyword, $plugin['keywords']));
}
}
- /**
- * @expectedException \Piwik\Plugins\Marketplace\Api\Service\Exception
- * @expectedExceptionMessage Not authenticated
- * @expectedExceptionCode 101
- */
public function test_fetch_shouldThrowException_WhenNotBeingAuthenticated()
{
+ $this->expectException(\Piwik\Plugins\Marketplace\Api\Service\Exception::class);
+ $this->expectExceptionCode(101);
+ $this->expectExceptionMessage('Not authenticated');
+
$service = $this->buildService();
$service->fetch('consumer', array());
}
- /**
- * @expectedException \Piwik\Plugins\Marketplace\Api\Service\Exception
- * @expectedExceptionMessage Not authenticated
- * @expectedExceptionCode 101
- */
public function test_fetch_shouldThrowException_WhenBeingAuthenticatedWithInvalidTokens()
{
+ $this->expectException(\Piwik\Plugins\Marketplace\Api\Service\Exception::class);
+ $this->expectExceptionCode(101);
+ $this->expectExceptionMessage('Not authenticated');
+
$service = $this->buildService();
$service->authenticate('1234567890');
$service->fetch('consumer', array());
@@ -117,7 +115,7 @@ class ServiceTest extends SystemTestCase
$service = $this->buildService();
$response = $service->download($this->domain . '/api/2.0/plugins');
- $this->assertInternalType('string', $response);
+ self::assertIsString($response);
$this->assertNotEmpty($response);
$this->assertStringStartsWith('{"plugins"', $response);
}
diff --git a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin.png b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin.png
index cdf9198e9b..41d9d631af 100644
--- a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin.png
+++ b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6b7c8a1eaed0ef1c37e46143cf0248a843f689eadb7d343dab452f0202845c7e
-size 931422
+oid sha256:3000a27ba0656474f91d0469bcc0525972f1076fe6fa6bccd8aae90aa5d29130
+size 825055
diff --git a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin_with_multiserver_enabled.png b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin_with_multiserver_enabled.png
index eee4d55df3..1d114cfcc8 100644
--- a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin_with_multiserver_enabled.png
+++ b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_enable_plugins_admin_with_multiserver_enabled.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8b3cbb8387bee4f2dcccae0816df96f008dffa320c958f975f63ca39764af0e0
-size 961347
+oid sha256:9b80f3e7360c6d56f0b04de3a28cc39dfef57a52c2de05a7050c84d36dc02d03
+size 850800
diff --git a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_invalid_license_key_entered.png b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_invalid_license_key_entered.png
index 66d036abda..9e7dc8d9b8 100644
--- a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_invalid_license_key_entered.png
+++ b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_invalid_license_key_entered.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:995398ff818e2ffd09976a587ea6e6b14d1e0a8bbb8dea474f7773a8b10ad9d4
-size 947600
+oid sha256:f67e86f4d5f0bb39d8d62964ce2b5bc4392b4ea24e6e98166d4aad77a9f587e8
+size 842446
diff --git a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_remove_license_key_confirmed.png b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_remove_license_key_confirmed.png
index 58b09a33da..8918ac3938 100644
--- a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_remove_license_key_confirmed.png
+++ b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_remove_license_key_confirmed.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b54c8f776f2c49a2cac212fde2a18c2e4c2ada824f987fb816d4cebc555b2448
-size 942151
+oid sha256:df8842c7383689b5caa2cd0fc15ebb713e4909db5b1db79ae87f23fd3ae6ee2d
+size 838448
diff --git a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_valid_license_key_entered.png b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_valid_license_key_entered.png
index 439f812769..1b19c83f3c 100644
--- a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_valid_license_key_entered.png
+++ b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_superuser_valid_license_key_entered.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fbe61587a2af134c797c827030649a01235e620c082d0661fc9a475d56ecb9f3
-size 951302
+oid sha256:01ce5959eafb08ff882c4458ec7e4993ef9da53ec9e064920165c8645ba79658
+size 847430
diff --git a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_multiUserEnvironment.png b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_multiUserEnvironment.png
index f801831cc6..59270314fa 100644
--- a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_multiUserEnvironment.png
+++ b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_multiUserEnvironment.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9f7a60c07cde715f1ff8b948ee0d6f090431d6044a287919e70397efcd769bf5
-size 34290
+oid sha256:aedacc8391c6aa9078d0d89dbfa42109383cc282ea43119b41f4ec3ea8bd6339
+size 34391
diff --git a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_superuser.png b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_superuser.png
index f4f1ee5a85..a6eeed7e91 100644
--- a/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_superuser.png
+++ b/plugins/Marketplace/tests/UI/expected-screenshots/Marketplace_updates_superuser.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e8ebdd83529208feda5de3cc45015a790d454e1a8bda6e4bbcbbd0b680b77131
-size 33953
+oid sha256:a46eff4e13c22fdead2aff2276512a44680987ada275fa91d86872a3543a09f7
+size 34004
diff --git a/plugins/Marketplace/tests/Unit/ConsumerTest.php b/plugins/Marketplace/tests/Unit/ConsumerTest.php
index 9ee7d44ebb..3d4a9189f7 100644
--- a/plugins/Marketplace/tests/Unit/ConsumerTest.php
+++ b/plugins/Marketplace/tests/Unit/ConsumerTest.php
@@ -17,14 +17,14 @@ use Piwik\Plugins\Marketplace\tests\Framework\Mock\Consumer as ConsumerBuilder;
* @group Consumer
* @group Plugins
*/
-class ConsumerTest extends \PHPUnit_Framework_TestCase
+class ConsumerTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Service
*/
private $service;
- public function setUp()
+ public function setUp(): void
{
$this->service = new Service();
}
diff --git a/plugins/Marketplace/tests/resources/v2.0_plugins.json b/plugins/Marketplace/tests/resources/v2.0_plugins.json
index 0caa2e0fca..a006274726 100644
--- a/plugins/Marketplace/tests/resources/v2.0_plugins.json
+++ b/plugins/Marketplace/tests/resources/v2.0_plugins.json
@@ -30,88 +30,7 @@
"readmeHtml":{"description":"\n\n<p>Adds the ability for Piwik administrators to include an informative message on all users' dashboards. This may be useful for communicating with users in larger shared environments. In our setup we were tracking 1,900 websites with 250 users. This is a solution we wrote to allow us to easily inform our users of maintainance windows.<\/p>\n\n",
"faq":"",
"documentation":"",
- "changelog":"<p>0.1.2 Tested with Piwik v2.15 and included new registerEvents() hook for compatibility with Piwik 3.0\n0.1.1 Cleanup. Removed plugin template verbiage from code files.\n0.1.0 Initial Release<\/p>"},"download":"\/api\/2.0\/plugins\/AdminNotification\/download\/0.1.2"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/AdminNotification\/changelog"},"consumer":{"license":null}},{"name":"AdvancedCampaignReporting",
- "displayName":"Advanced Campaign Reporting",
- "owner":"PiwikPRO",
- "description":"Track up to five Campaigns parameter (campaign, source, medium, keyword, content). Lets you also segment users by any campaign dimension, and provides",
- "homepage":"http:\/\/piwik.pro",
- "createdDateTime":"2014-10-01 03:22:04",
- "donate":{},"support":[],"isTheme":false,"keywords":[],"basePrice":0,"authors":[],"repositoryUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting",
- "lastUpdated":"2016-03-22 12:36:04",
- "latestVersion":"1.3.1",
- "numDownloads":8360,"screenshots":[],"previews":[],"activity":{"numCommits":"149",
- "numContributors":"9",
- "lastCommitDate":"2016-04-15 22:57:32"},"featured":false,"isFree":true,"isPaid":false,"isCustomPlugin":false,"shop":null,"versions":[{"name":"1.0.3",
- "release":"2014-10-01 03:22:04",
- "requires":{},"numDownloads":496,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.0.3"},{"name":"1.0.4",
- "release":"2014-11-03 15:08:04",
- "requires":{},"numDownloads":213,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.0.4"},{"name":"1.0.5",
- "release":"2014-11-14 11:16:04",
- "requires":{},"numDownloads":109,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.0.5"},{"name":"1.0.6",
- "release":"2014-11-17 04:44:03",
- "requires":{},"numDownloads":1531,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.0.6"},{"name":"1.0.7",
- "release":"2015-03-31 20:50:04",
- "requires":{},"numDownloads":9,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.0.7"},{"name":"1.0.8",
- "release":"2015-03-31 21:20:04",
- "requires":{},"numDownloads":1853,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.0.8"},{"name":"1.1.1",
- "release":"2015-09-03 02:04:03",
- "requires":{"piwik":">=2.14.0"},"numDownloads":954,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.1.1"},{"name":"1.2.0",
- "release":"2015-11-11 13:08:02",
- "requires":{"piwik":">=2.15.0"},"numDownloads":1743,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/2.0.2",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.2.0"},{"name":"1.3.0",
- "release":"2016-03-08 14:02:03",
- "requires":{"piwik":">=2.16.0"},"numDownloads":352,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.3.0"},{"name":"1.3.1",
- "release":"2016-03-22 12:36:04",
- "requires":{"piwik":">=2.16.0"},"numDownloads":1100,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/commits\/v0.1.1",
- "readmeHtml":{"description":"\n\n<p>Track up to five Campaigns parameters (name, source, medium, keyword, content), and access Campaign Analytics reports.<\/p>\n\n<h3>Measuring campaigns<\/h3>\n\n<p>The default Campaign parameters are called: pk_campaign, pk_source, pk_medium, pk_keyword, pk_content and pk_cid.<\/p>\n\n<p>If you already have URLs tagged with Google Analytics parameters these are supported: utm_campaign, utm_source, utm_medium, utm_term, utm_content and utm_id<\/p>\n\n<p>An example landing page URL is:<\/p>\n\n<pre><code>\/offer?pk_campaign=Best-Seller&amp;pk_source=Newsletter_7&amp;pk_medium=email\n<\/code><\/pre>\n\n<h3>Features<\/h3>\n\n<ul><li>Real time Analytics Reports of all your Campaign Marketing<\/li>\n<li>Detects Campaign parameters from the landing page URL, within the query string or in the #hash string<\/li>\n<li>The Referrers&gt;Overview report displays a left column \"Referrers Overview\" with a list of reports that can be loaded on click.\nThis report viewer now also lists the new Campaign reports under \"View Referrers by Campaign\".<\/li>\n<li>The content of Referrers&gt; Campaign will be replaced with the new enhanced Campaigns reports.<\/li>\n<li>The default Referrers Campaign widget and API are working as before.<\/li>\n<li>The campaign reports are available in Piwik Mobile and can be sent as Scheduled reports (by email, as HTML or PDF)<\/li>\n<li>Segment editor: a new \"Campaigns\" category lists the five new segment for each campaign dimension<\/li>\n<li>The new Campaign reports can be added as widgets in your personalized Dashboard<\/li>\n<li>Access the Campaign Report data by the API<\/li>\n<li>Comes with automated tests to ensure the Plugin works as expected<\/li>\n<li>Will track up to 250 characters for each of the five Campaign dimension<\/li>\n<\/ul><h3>Notes<\/h3>\n\n<p>In the Campaign reports by default Piwik will only archive the first 1000 rows. If you track many campaigns you can configure Piwik so it does not truncate your data. To have data truncated after 10,000 rows, edit your <code>config\/config.ini.php<\/code> and add the following:<\/p>\n\n<pre><code>[General]\ndatatable_archiving_maximum_rows_referrers = 10000\ndatatable_archiving_maximum_rows_subtable_referrers = 10000\n<\/code><\/pre>\n\n<h3>Ideas for improvement<\/h3>\n\n<ul><li>To improve data acquisition accuracy, we could extend the piwik.js class to store in first party cookies\nthe five campaign dimensions. This would increase the accuracy of Goal conversions and Ecommerce conversions attributions\nfor these conversions made at least one day after the first visit with a campaign set. <a href=\"https:\/\/github.com\/PiwikPRO\/plugin-AdvancedCampaignReporting\/issues\/10\">#10<\/a><\/li>\n<li>Add friendly Tracking API parameters to collect campaign dimensions.\ncampaignName <code>cn<\/code>, campaignSource <code>cs<\/code>, campaignMedium <code>cm<\/code>, campaignContent <code>cc<\/code>, campaignId <code>ci<\/code>.<\/li>\n<\/ul>",
- "faq":"",
- "documentation":"",
- "changelog":"<ul><li>1.3.1 Better support for campaign parameters behind hash tag (#)<\/li>\n<li>1.3.0 PPCDEV-2609 Compatibility with Piwik 2.16.0<\/li>\n<li>1.2.0 (Nov 10th 2015) - Plugin comaptibility with Piwik 2.15.0<\/li>\n<li>1.1.1 (Sept 3rd 2015) - Campaign reports now display your campaign report data even for campaign data before you activated AdvancedCampaignReporting<\/li>\n<li>1.1.0 (July 28th 2015)<\/li>\n<li>1.0.8 (Apr 1st 2015) - Exclude Google Analytics campaign parameters from the Page URLs<\/li>\n<li>1.0.6 (Nov 17th 2014) - Documentation<\/li>\n<li>1.0.5 (Nov 14th 2014) - Detect new URL parameters: piwik_campaign, pk_cpn and for Keywords: pk_kwd, piwik_keyword<\/li>\n<li>1.0.4 (Nov 4th 2014) - View Goals by Campaign Dimension in the Goals &amp; Ecommerce reports<\/li>\n<li>1.0.3 (Oct 1st 2014) - Released for free on the <a href=\"http:\/\/plugins.piwik.org\/\">Piwik Marketplace<\/a><\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/AdvancedCampaignReporting\/download\/1.3.1"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/AdvancedCampaignReporting\/changelog"},"consumer":{"license":null}},{"name":"AnonymousPiwikUsageMeasurement",
+ "changelog":"<p>0.1.2 Tested with Piwik v2.15 and included new registerEvents() hook for compatibility with Piwik 3.0\n0.1.1 Cleanup. Removed plugin template verbiage from code files.\n0.1.0 Initial Release<\/p>"},"download":"\/api\/2.0\/plugins\/AdminNotification\/download\/0.1.2"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/AdminNotification\/changelog"},"consumer":{"license":null}},{"name":"AnonymousPiwikUsageMeasurement",
"displayName":"Anonymous Piwik Usage Measurement",
"owner":"piwik",
"description":"Help improve your Piwik experience by sending anonymized usage data to the creators of Piwik, to your own Piwik instance or to any other Piwik",
@@ -621,53 +540,7 @@
"readmeHtml":{"description":"\n\n<p>Add a new admin tab, to change the opt-out CSS Styles for each website.<\/p>\n\n",
"faq":"",
"documentation":"",
- "changelog":"<h4>CustomOptOut 0.1.4:<\/h4>\n\n<ul><li>Issue #3 Code updated to support Piwik 2.1 and newer<\/li>\n<li>Issue #2 Allow relative urls in css file field<\/li>\n<\/ul><h4>CustomOptOut 0.1.3:<\/h4>\n\n<ul><li>Issue #1 Added a p-tag around the opt-out text for better markup and easier styling. (christianseel)<\/li>\n<\/ul><h4>CustomOptOut 0.1.2:<\/h4>\n\n<ul><li>Fix wrong css escaping<\/li>\n<\/ul><h4>CustomOptOut 0.1.1:<\/h4>\n\n<ul><li>Initial Version<\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/CustomOptOut\/download\/0.1.4"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/CustomOptOut\/changelog"},"consumer":{"license":null}},{"name":"CustomTrackerJs",
- "displayName":"Custom Tracker Js",
- "owner":"PiwikPRO",
- "description":"Lets Super Users and other plugins customise the piwik.js tracker file.",
- "homepage":"https:\/\/github.com\/PiwikPRO\/plugin-CustomTrackerJs",
- "createdDateTime":"2014-10-14 04:56:03",
- "donate":{},"support":[],"isTheme":false,"keywords":[],"basePrice":0,"authors":[],"repositoryUrl":"https:\/\/github.com\/PiwikPRO\/plugin-CustomTrackerJs",
- "lastUpdated":"2016-04-12 16:00:04",
- "latestVersion":"1.1.2",
- "numDownloads":4376,"screenshots":[],"previews":[],"activity":{"numCommits":"33",
- "numContributors":"5",
- "lastCommitDate":"2016-04-15 22:59:15"},"featured":false,"isFree":true,"isPaid":false,"isCustomPlugin":false,"shop":null,"versions":[{"name":"1.0.2",
- "release":"2014-10-14 04:56:03",
- "requires":{"piwik":">=2.8.0-b4"},"numDownloads":64,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-CustomTrackerJs\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/CustomTrackerJs\/download\/1.0.2"},{"name":"1.0.3",
- "release":"2014-10-15 21:58:03",
- "requires":{"piwik":">=2.8.0-b4"},"numDownloads":3554,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-CustomTrackerJs\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/CustomTrackerJs\/download\/1.0.3"},{"name":"1.1.0",
- "release":"2016-03-08 14:28:03",
- "requires":{"piwik":">=2.8.0-b4"},"numDownloads":315,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-CustomTrackerJs\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/CustomTrackerJs\/download\/1.1.0"},{"name":"1.1.1",
- "release":"2016-04-12 14:30:04",
- "requires":{"piwik":">=2.8.0-b4"},"numDownloads":1,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-CustomTrackerJs\/commits\/v0.0.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/CustomTrackerJs\/download\/1.1.1"},{"name":"1.1.2",
- "release":"2016-04-12 16:00:04",
- "requires":{"piwik":">=2.8.0-b4"},"numDownloads":442,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-CustomTrackerJs\/commits\/v0.1.1",
- "readmeHtml":{"description":"\n\n<p>The <code>CustomTrackerJs<\/code> plugin lets the super users or other plugins add custom code to the Piwik Javascript Tracker.<\/p>\n\n",
- "faq":"",
- "documentation":"",
- "changelog":"<ul><li>1.1.2\n\n<ul><li>Marketplace release<\/li>\n<\/ul><\/li>\n<li>1.1.0\n\n<ul><li>PPCDEV-2609 Compatibility with Piwik 2.16.0<\/li>\n<\/ul><\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/CustomTrackerJs\/download\/1.1.2"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/CustomTrackerJs\/changelog"},"consumer":{"license":null}},{"name":"ExcludeByDDNS",
+ "changelog":"<h4>CustomOptOut 0.1.4:<\/h4>\n\n<ul><li>Issue #3 Code updated to support Piwik 2.1 and newer<\/li>\n<li>Issue #2 Allow relative urls in css file field<\/li>\n<\/ul><h4>CustomOptOut 0.1.3:<\/h4>\n\n<ul><li>Issue #1 Added a p-tag around the opt-out text for better markup and easier styling. (christianseel)<\/li>\n<\/ul><h4>CustomOptOut 0.1.2:<\/h4>\n\n<ul><li>Fix wrong css escaping<\/li>\n<\/ul><h4>CustomOptOut 0.1.1:<\/h4>\n\n<ul><li>Initial Version<\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/CustomOptOut\/download\/0.1.4"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/CustomOptOut\/changelog"},"consumer":{"license":null}},{"name":"ExcludeByDDNS",
"displayName":"Exclude By DDNS",
"owner":"sgiehl",
"description":"This plugin allows you to dynamically exclude a IP using DDNS update",
@@ -947,88 +820,7 @@
"readmeHtml":{"description":"\n\n<p>A Piwik plugin that adds a profile photo from Gravatar based on the email address stored in the User Id field.<\/p>\n\n",
"faq":"<p><strong>What information do I need to make this plugin work?<\/strong>\nMake sure you are capturing the email address for your visitors in the User Id field.<\/p>\n\n<p><strong>Why do some of my visitors just display the Gravatar logo instead of a photo?<\/strong>\nEither there is no email address associated with the visitor or they do not have a Gravatar set up at gravatar.com<\/p>",
"documentation":"",
- "changelog":"<ul><li>0.1.11 Fixed screenshot filename<\/li>\n<li>0.1.1 Add screenshots<\/li>\n<li>0.1.0 First beta<\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/GrabGravatar\/download\/0.2.0"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/GrabGravatar\/changelog"},"consumer":{"license":null}},{"name":"InterSites",
- "displayName":"Inter Sites",
- "owner":"PiwikPRO",
- "description":"Analyze how many visitors navigate between your websites.",
- "homepage":"http:\/\/piwik.pro",
- "createdDateTime":"2014-09-14 04:10:03",
- "donate":{},"support":[],"isTheme":false,"keywords":[],"basePrice":0,"authors":[],"repositoryUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites",
- "lastUpdated":"2016-03-08 14:16:03",
- "latestVersion":"0.4.0",
- "numDownloads":7766,"screenshots":[],"previews":[],"activity":{"numCommits":"69",
- "numContributors":"6",
- "lastCommitDate":"2016-04-15 22:58:13"},"featured":false,"isFree":true,"isPaid":false,"isCustomPlugin":false,"shop":null,"versions":[{"name":"0.1.0",
- "release":"2014-09-14 04:10:03",
- "requires":{"piwik":">=2.7.0-b3"},"numDownloads":0,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.1.0"},{"name":"0.1.1",
- "release":"2014-09-14 04:40:03",
- "requires":{"piwik":">=2.7.0-b3"},"numDownloads":1138,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.1.1"},{"name":"0.1.2",
- "release":"2014-12-08 02:56:04",
- "requires":{"piwik":">=2.10.0-b6"},"numDownloads":951,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.1.2"},{"name":"0.2.0",
- "release":"2015-03-04 13:02:04",
- "requires":{"piwik":">=2.10.0"},"numDownloads":126,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.2.0"},{"name":"0.2.1",
- "release":"2015-03-05 08:36:03",
- "requires":{"piwik":">=2.10.0"},"numDownloads":1472,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v0.1.2",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.2.1"},{"name":"0.2.3",
- "release":"2015-07-29 11:10:03",
- "requires":{"piwik":">=2.11.0"},"numDownloads":1043,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.2.3"},{"name":"0.3.0",
- "release":"2015-10-21 23:18:03",
- "requires":{"piwik":">=2.11.0"},"numDownloads":0,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.3.0"},{"name":"0.3.1",
- "release":"2015-10-21 23:24:03",
- "requires":{"piwik":">=2.15.0-rc4"},"numDownloads":372,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.3.1"},{"name":"0.3.2",
- "release":"2015-11-11 20:10:03",
- "requires":{"piwik":">=2.15.0"},"numDownloads":1597,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v1.0",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.3.2"},{"name":"0.4.0",
- "release":"2016-03-08 14:16:03",
- "requires":{"piwik":">=2.16.0"},"numDownloads":1067,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-InterSites\/commits\/v0.1.1",
- "readmeHtml":{"description":"\n\n<p>Measures number of visits and unique visitors that have navigated across two or three specific websites.<\/p>\n\n<p><em>(Unique user is determined across websites using the fingerprint config_id stored in the DB.)<\/em><\/p>\n\n",
- "faq":"",
- "documentation":"",
- "changelog":"<ul><li>0.4.0\n\n<ul><li>PPCDEV-2609 Compatibility with Piwik 2.16.0<\/li>\n<\/ul><\/li>\n<li>0.3.2\n\n<ul><li>Changed minimum required Piwik to 2.15.0<\/li>\n<\/ul><\/li>\n<li>0.3.1\n\n<ul><li>Bumping minimum required Piwik.<\/li>\n<\/ul><\/li>\n<li>0.3.0\n\n<ul><li>Compatibility w\/ Piwik 2.15.<\/li>\n<\/ul><\/li>\n<li>0.2.2:\n\n<ul><li>Fixed bug with day period<\/li>\n<li>Added tests for day and month period<\/li>\n<li>Fixed Site names display, as they were displayed as HTML entities<\/li>\n<\/ul><\/li>\n<li>0.2.1: Market release<\/li>\n<li>0.2.0: Introduced composer.json file<\/li>\n<li>0.1.2: Compatibility with Piwik 2.10.0 (Notification will explain that config setting <code>enable_fingerprinting_across_websites=1<\/code> is required)<\/li>\n<li>0.1.0: Initial release<\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/InterSites\/download\/0.4.0"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/InterSites\/changelog"},"consumer":{"license":null}},{"name":"IntranetGeoIP",
+ "changelog":"<ul><li>0.1.11 Fixed screenshot filename<\/li>\n<li>0.1.1 Add screenshots<\/li>\n<li>0.1.0 First beta<\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/GrabGravatar\/download\/0.2.0"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/GrabGravatar\/changelog"},"consumer":{"license":null}},{"name":"IntranetGeoIP",
"displayName":"Intranet Geo IP",
"owner":"ThaDafinser",
"description":"Piwik plugin to locate all locale data of a user based on the IP address\/subnetwork (country, region, city, latitude, longitude, provider, ...)",
@@ -1791,53 +1583,7 @@
"readmeHtml":{"description":"\n\n<p>This is a plugin for the Open Source Web Analytics platform Piwik. If enabled, it will add a new widget that you can add to your dashboard and a new link in the top navigation.<\/p>\n\n<p>The widget will show the performance index of a site that auto-refreshes every 30 seconds. It shows the number of visitors or visit time in a 30 minute period compared to the maximum number of visitors in any 30 minute period of the last 30 days.<\/p>\n\n<p>This plugin is inspired by the <a href=\"https:\/\/github.com\/halfdan\/piwik-barometer-plugin\">piwik barometer plugin<\/a> and uses a lightly modified jQuery-Dynameter (original by <a href=\"http:\/\/tze1.com\/dynameter\/\">Tzechiu Lei<\/a>.<\/p>\n\n<p><strong>This plugin should run fine with installations with up to 100.000 page impressions per day. If you run a very large piwik installation and have performance issues with this plugin, please contact me - there is a solution for this. I have it up and running in an installation with more than 5 million visits per day.<\/strong><\/p>\n\n<p>(Tested with piwik 2.7.0, but supposed to run with older versions)<\/p>\n\n",
"faq":"<h3>Features<\/h3>\n\n<p>Here is a list of features that are included in this project:<\/p>\n\n<ul><li>Live widget (\"Performance Monitor\") with key performance indices<\/li>\n<li>Add an item to the top navigation (\"Performance overview\") which displays the performance monitor widget for all your sites (configurable).<\/li>\n<\/ul><h3>Configuration<\/h3>\n\n<p><em>Refresh interval<\/em>: Defines how often the widgets will be updated. Every 30 seconds is a good value to choose.<\/p>\n\n<p><em>Measurement period<\/em>: Defines the measurement period in minutes. 5 minutes is a good value to choose.<\/p>\n\n<p><em>Comparison period<\/em>: Defines the period (x * 24h) the last 30 minutes are compared to. A good value for small sites with more or less static content is 30. For sites with peak days on weekends for example 1 will be a good value. 1 is also a good value for very big sites with a lot of traffic. You will have to play around with this value a little bit and figure out whalt will fit your needs.<\/p>\n\n<p><em>Sites in overview<\/em>: Defines which sites are displayed in the overview.<\/p>",
"documentation":"",
- "changelog":"<h3>0.2.5 Bugfix Release<\/h3>\n\n<ul><li>fixed bug with timezones that match \/^UTC[+-]*\/<\/li>\n<\/ul><h3>0.2.4 Bugfix Release<\/h3>\n\n<ul><li>reengineering of scheduled task<\/li>\n<\/ul><h3>0.2.3 Bugfix Release<\/h3>\n\n<ul><li>fixed bug in scheduled task<\/li>\n<\/ul><h3>0.2.2 Bugfix Release<\/h3>\n\n<ul><li>fixed an installation bug<\/li>\n<\/ul><h3>0.2.0 Second Beta<\/h3>\n\n<ul><li>made the plugin configurable by settings<\/li>\n<li>added more key performance indices<\/li>\n<li>performance overview now links to the dashboards<\/li>\n<li>fixed the timezone bug (configure timezone for each site properly)<\/li>\n<li>fixed several minor bugs<\/li>\n<\/ul><h3>0.1.0 First Beta<\/h3>\n\n<ul><li>initial release<\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/PerformanceMonitor\/download\/0.2.5"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/PerformanceMonitor\/changelog"},"consumer":{"license":null}},{"name":"PlatformsReport",
- "displayName":"Platforms Report",
- "owner":"PiwikPRO",
- "description":"New report in Visitors > Platforms that aggregates visits based on device type, OS version & browser version.",
- "homepage":"http:\/\/piwik.pro",
- "createdDateTime":"2015-10-27 02:06:03",
- "donate":{},"support":[],"isTheme":false,"keywords":[],"basePrice":0,"authors":[],"repositoryUrl":"https:\/\/github.com\/PiwikPRO\/plugin-PlatformsReport",
- "lastUpdated":"2016-01-04 08:42:03",
- "latestVersion":"1.0.4",
- "numDownloads":2347,"screenshots":[],"previews":[],"activity":{"numCommits":"24",
- "numContributors":"3",
- "lastCommitDate":"2016-03-15 04:25:00"},"featured":false,"isFree":true,"isPaid":false,"isCustomPlugin":false,"shop":null,"versions":[{"name":"1.0.0",
- "release":"2015-10-27 02:06:03",
- "requires":{"piwik":">=2.14.3"},"numDownloads":0,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-PlatformsReport\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/PlatformsReport\/download\/1.0.0"},{"name":"1.0.1",
- "release":"2015-10-27 02:14:03",
- "requires":{"piwik":">=2.14.3"},"numDownloads":0,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-PlatformsReport\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/PlatformsReport\/download\/1.0.1"},{"name":"1.0.2",
- "release":"2015-10-27 02:30:04",
- "requires":{"piwik":">=2.14.3"},"numDownloads":100,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-PlatformsReport\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/PlatformsReport\/download\/1.0.2"},{"name":"1.0.3",
- "release":"2015-10-29 23:52:03",
- "requires":{"piwik":">=2.14.3"},"numDownloads":777,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-PlatformsReport\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/PlatformsReport\/download\/1.0.3"},{"name":"1.0.4",
- "release":"2016-01-04 08:42:03",
- "requires":{"piwik":">=2.14.3"},"numDownloads":1470,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-PlatformsReport\/commits\/1.0.1",
- "readmeHtml":{"description":"\n\n<p>Includes two new reports: Platforms and Platforms With Versions.<\/p>\n\n<p>The <strong>Platforms<\/strong> report displays visitors by their device type, OS and browser.<\/p>\n\n<p>The <strong>Platforms With Versions<\/strong> report displays the same information, but includes OS version &amp; browser version information.<\/p>\n\n<p>The new reports are available via the Visitors &gt; Platforms menu.<\/p>\n\n",
- "faq":"",
- "documentation":"",
- "changelog":"<ul><li>1.0.3\n\n<ul><li>Moved sub-menu entry after 'Software'<\/li>\n<\/ul><\/li>\n<li>1.0.2\n\n<ul><li>Initial release on Marketplace.<\/li>\n<\/ul><\/li>\n<li>1.0.0\n\n<ul><li>Initial release.<\/li>\n<\/ul><\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/PlatformsReport\/download\/1.0.4"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/PlatformsReport\/changelog"},"consumer":{"license":null}},{"name":"QueuedTracking",
+ "changelog":"<h3>0.2.5 Bugfix Release<\/h3>\n\n<ul><li>fixed bug with timezones that match \/^UTC[+-]*\/<\/li>\n<\/ul><h3>0.2.4 Bugfix Release<\/h3>\n\n<ul><li>reengineering of scheduled task<\/li>\n<\/ul><h3>0.2.3 Bugfix Release<\/h3>\n\n<ul><li>fixed bug in scheduled task<\/li>\n<\/ul><h3>0.2.2 Bugfix Release<\/h3>\n\n<ul><li>fixed an installation bug<\/li>\n<\/ul><h3>0.2.0 Second Beta<\/h3>\n\n<ul><li>made the plugin configurable by settings<\/li>\n<li>added more key performance indices<\/li>\n<li>performance overview now links to the dashboards<\/li>\n<li>fixed the timezone bug (configure timezone for each site properly)<\/li>\n<li>fixed several minor bugs<\/li>\n<\/ul><h3>0.1.0 First Beta<\/h3>\n\n<ul><li>initial release<\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/PerformanceMonitor\/download\/0.2.5"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/PerformanceMonitor\/changelog"},"consumer":{"license":null}},{"name":"QueuedTracking",
"displayName":"Queued Tracking",
"owner":"piwik",
"description":"Scale your large traffic Piwik service by queuing tracking requests in Redis for better performance. ",
@@ -2239,67 +1985,7 @@
"readmeHtml":{"description":"\n\n<p>Plugin allows to turn Piwik instance into URL Shortener.<\/p>\n\n<p>Basic features:<\/p>\n\n<ul><li>easily create shortcode from any page you track in Piwik (integration with Actions report UI),<\/li>\n<li>create shortcode for any custom URL you want,<\/li>\n<li>perform redirects using your Piwik instance,<\/li>\n<li>get usage statistics for shortcodes handled by your instance\n\n<ul><li>get best performing URL's on websites you track,<\/li>\n<li>external URLs redirect statistics,<\/li>\n<\/ul><\/li>\n<li>see which URLs are being shortened and visited most often - also for external URLs not tracked in your Piwik.<\/li>\n<\/ul><p>Goodness coming:<\/p>\n\n<ul><li>for redirect performance improvement, store your shortcodes in storage like Memcache or Redis,<\/li>\n<li>attributing shortcode redirects with actual visits on your page,<\/li>\n<li>more advanced reports,<\/li>\n<\/ul><p>Before using, please read content in <a href=\"https:\/\/github.com\/mgazdzik\/plugin-ShortcodeTracker#setup\"><code>Setup<\/code><\/a> section \nas it contains steps required to make plugin work with your Piwik instance!<\/p>\n\n",
"faq":"",
"documentation":"",
- "changelog":"<ul><li><p>0.6.2<\/p>\n\n<ul><li>Sort out mistakenly pushed tag<\/li>\n<\/ul><\/li>\n<li><p>0.6.0<\/p>\n\n<ul><li>Shortcode usage report added link to shortened page to for easier recognition of what is being shortened and used most,<\/li>\n<li>Display summarized report displaying which URLs were visited most via shortcode redirects,<\/li>\n<\/ul><\/li>\n<li><p>0.5.0<\/p>\n\n<ul><li>Add statistics collection for redirects to pages not tracked with Piwik (external pages)\n\n<ul><li>collect redirect statistics into Site you choose in interface,<\/li>\n<li>aggregate and display report for external shortcodes in separate view<\/li>\n<\/ul><\/li>\n<\/ul><\/li>\n<li><p>0.4.5<\/p>\n\n<ul><li>fix README formating for sake of Plugin market<\/li>\n<\/ul><\/li>\n<li><p>0.4.4<\/p>\n\n<ul><li>add license to plugin.json<\/li>\n<\/ul><\/li>\n<li><p>0.4.3<\/p>\n\n<ul><li>fix plugin.json structure for Plugin market<\/li>\n<\/ul><\/li>\n<li><p>0.4.2<\/p>\n\n<ul><li>Added missing changelog<\/li>\n<\/ul><\/li>\n<li><p>0.4.0<\/p>\n\n<ul><li>Piwik Plugin market release<\/li>\n<\/ul><\/li>\n<li><p>0.3.0<\/p>\n\n<ul><li>Tuned travis build file<\/li>\n<li>Mark Shortcodes as internal during creating<\/li>\n<li>Track custom event with \"redirect\" category upon each redirect for internal Shortcode<\/li>\n<li>Secure API methods from anonymous user usage<\/li>\n<li>Add shortcode report for internally tracked URLs:\n\n<ul><li>Create new visit during redirect (store referrer)<\/li>\n<li>Add Shortcode usage report based on Custom Events plugin API<\/li>\n<\/ul><\/li>\n<\/ul><\/li>\n<li><p>0.2.0<\/p>\n\n<ul><li>added Travis build badges for master and develop branches<\/li>\n<li>fixed existing unit tests<\/li>\n<li>slight refactor in terms of class naming<\/li>\n<li>added integration test for API methods<\/li>\n<\/ul><\/li>\n<li><p>0.1.0<\/p>\n\n<ul><li>API allowing to create and retrieve shortcodes,<\/li>\n<li>basic storage in MySQL, but possible to add other caching layers - for ex. Memcache, Redis,<\/li>\n<li>unit tests covering core logic,<\/li>\n<li>redirect API method that will preform appropriate redirects for incoming shortcode requests,<\/li>\n<li>basic setup guide involving Apache2 and Nginx configs,<\/li>\n<li>settings section allowing user to configure Shortener base URL (which may and should be different than Piwik instance)<\/li>\n<\/ul><\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/ShortcodeTracker\/download\/0.6.2"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/ShortcodeTracker\/changelog"},"consumer":{"license":null}},{"name":"SimplePageBuilder",
- "displayName":"Simple Page Builder",
- "owner":"PiwikPRO",
- "description":"Lets you add a custom page to Piwik. The page will be visible to all users in the top menu.",
- "homepage":"https:\/\/github.com\/PiwikPRO\/SimplePageBuilder",
- "createdDateTime":"2014-12-08 04:50:03",
- "donate":{},"support":[],"isTheme":false,"keywords":[],"basePrice":0,"authors":[],"repositoryUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SimplePageBuilder",
- "lastUpdated":"2016-03-08 12:08:04",
- "latestVersion":"1.2.0",
- "numDownloads":3892,"screenshots":[],"previews":[],"activity":{"numCommits":"38",
- "numContributors":"5",
- "lastCommitDate":"2016-04-15 22:58:07"},"featured":false,"isFree":true,"isPaid":false,"isCustomPlugin":false,"shop":null,"versions":[{"name":"1.0.1",
- "release":"2014-12-08 04:50:03",
- "requires":{"piwik":">=2.10.0-b2"},"numDownloads":14,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SimplePageBuilder\/commits\/v0.1.2",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SimplePageBuilder\/download\/1.0.1"},{"name":"1.0.2",
- "release":"2014-12-09 02:18:04",
- "requires":{"piwik":">=2.10.0-b2"},"numDownloads":52,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SimplePageBuilder\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SimplePageBuilder\/download\/1.0.2"},{"name":"1.0.3",
- "release":"2014-12-12 14:08:03",
- "requires":{"piwik":">=2.10.0-b2"},"numDownloads":289,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SimplePageBuilder\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SimplePageBuilder\/download\/1.0.3"},{"name":"1.0.4",
- "release":"2015-01-19 14:28:03",
- "requires":{"piwik":">=2.9.0"},"numDownloads":1234,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SimplePageBuilder\/commits\/0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SimplePageBuilder\/download\/1.0.4"},{"name":"1.0.5",
- "release":"2015-07-28 10:00:03",
- "requires":{"piwik":">=2.9.0"},"numDownloads":557,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SimplePageBuilder\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SimplePageBuilder\/download\/1.0.5"},{"name":"1.1.0",
- "release":"2015-10-21 22:20:03",
- "requires":{"piwik":">=2.15.0-b15"},"numDownloads":1124,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SimplePageBuilder\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SimplePageBuilder\/download\/1.1.0"},{"name":"1.2.0",
- "release":"2016-03-08 12:08:04",
- "requires":{"piwik":">=2.16.0"},"numDownloads":622,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SimplePageBuilder\/commits\/v0.1.2",
- "readmeHtml":{"description":"\n\n<p>This plugin lets you add a page with custom HTML content to Piwik. The page will be linked in the top menu and can be edited by the super user.<\/p>\n\n",
- "faq":"",
- "documentation":"",
- "changelog":"<p><strong>1.2.0<\/strong><\/p>\n\n<ul><li>PPCDEV-2609 Compatibility with Piwik 2.16.0<\/li>\n<\/ul><p><strong>1.1.0<\/strong><\/p>\n\n<ul><li>Compatibility with Piwik 2.15.<\/li>\n<\/ul><p><strong>1.0.3<\/strong><\/p>\n\n<ul><li>added composer.json<\/li>\n<\/ul><p><strong>1.0.2<\/strong><\/p>\n\n<ul><li>Correctly replace {date} when period is range.<\/li>\n<li>In example use H2 in the sample text for the custom page title<\/li>\n<\/ul><p><strong>1.0.0<\/strong><\/p>\n\n<ul><li>First stable version<\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/SimplePageBuilder\/download\/1.2.0"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/SimplePageBuilder\/changelog"},"consumer":{"license":null}},{"name":"SimpleSysMon",
+ "changelog":"<ul><li><p>0.6.2<\/p>\n\n<ul><li>Sort out mistakenly pushed tag<\/li>\n<\/ul><\/li>\n<li><p>0.6.0<\/p>\n\n<ul><li>Shortcode usage report added link to shortened page to for easier recognition of what is being shortened and used most,<\/li>\n<li>Display summarized report displaying which URLs were visited most via shortcode redirects,<\/li>\n<\/ul><\/li>\n<li><p>0.5.0<\/p>\n\n<ul><li>Add statistics collection for redirects to pages not tracked with Piwik (external pages)\n\n<ul><li>collect redirect statistics into Site you choose in interface,<\/li>\n<li>aggregate and display report for external shortcodes in separate view<\/li>\n<\/ul><\/li>\n<\/ul><\/li>\n<li><p>0.4.5<\/p>\n\n<ul><li>fix README formating for sake of Plugin market<\/li>\n<\/ul><\/li>\n<li><p>0.4.4<\/p>\n\n<ul><li>add license to plugin.json<\/li>\n<\/ul><\/li>\n<li><p>0.4.3<\/p>\n\n<ul><li>fix plugin.json structure for Plugin market<\/li>\n<\/ul><\/li>\n<li><p>0.4.2<\/p>\n\n<ul><li>Added missing changelog<\/li>\n<\/ul><\/li>\n<li><p>0.4.0<\/p>\n\n<ul><li>Piwik Plugin market release<\/li>\n<\/ul><\/li>\n<li><p>0.3.0<\/p>\n\n<ul><li>Tuned travis build file<\/li>\n<li>Mark Shortcodes as internal during creating<\/li>\n<li>Track custom event with \"redirect\" category upon each redirect for internal Shortcode<\/li>\n<li>Secure API methods from anonymous user usage<\/li>\n<li>Add shortcode report for internally tracked URLs:\n\n<ul><li>Create new visit during redirect (store referrer)<\/li>\n<li>Add Shortcode usage report based on Custom Events plugin API<\/li>\n<\/ul><\/li>\n<\/ul><\/li>\n<li><p>0.2.0<\/p>\n\n<ul><li>added Travis build badges for master and develop branches<\/li>\n<li>fixed existing unit tests<\/li>\n<li>slight refactor in terms of class naming<\/li>\n<li>added integration test for API methods<\/li>\n<\/ul><\/li>\n<li><p>0.1.0<\/p>\n\n<ul><li>API allowing to create and retrieve shortcodes,<\/li>\n<li>basic storage in MySQL, but possible to add other caching layers - for ex. Memcache, Redis,<\/li>\n<li>unit tests covering core logic,<\/li>\n<li>redirect API method that will preform appropriate redirects for incoming shortcode requests,<\/li>\n<li>basic setup guide involving Apache2 and Nginx configs,<\/li>\n<li>settings section allowing user to configure Shortener base URL (which may and should be different than Piwik instance)<\/li>\n<\/ul><\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/ShortcodeTracker\/download\/0.6.2"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/ShortcodeTracker\/changelog"},"consumer":{"license":null}},{"name":"SimpleSysMon",
"displayName":"Simple Sys Mon",
"owner":"job963",
"description":"Simple System Monitor for visualizing system data like cpu load, memory use or network traffic",
@@ -2359,90 +2045,7 @@
"readmeHtml":{"description":"\n\n<p>This plugin shows how much load your webserver does have, where Piwik (and maybe your main website) is running. Additionally the free or the used memory will be displayed.<\/p>\n\n<p>The display will be refreshed automatically as often as you like. This can be setup by yourself in the plugin settings.<\/p>\n\n",
"faq":"<p><strong>How is the CPU load calculated?<\/strong>\nFor the CPU load the PHP function sys_getloadavg() is used and divided by the number of cores.<\/p>\n\n<p><strong>Why is there a difference between free and used memory?<\/strong>\nThere are three \"memory parts\" under Linux:<\/p>\n\n<ul><li>Used memory<\/li>\n<li>Cache<\/li>\n<li>Free memory<\/li>\n<\/ul><p>The sum of these three parts will be equal to the total memory. But only <code>used memory<\/code> and <code>free memory<\/code> are available as options (in settings).<\/p>\n\n<p><strong>What is the value for 100% network traffic<\/strong>\nYou can setup the value for the maximum network traffic in the plugin system settings. The value there must be specified in kB\/s (kilobyte per second). This value is used as 100% network traffic.<\/p>\n\n<p><strong>Does the plugin work on a shared webspace?<\/strong>\nIn the most cases a shared webspace doesn't have access to system information. Therefore in these cases, the plugin cannot be used. The pseudo file system \/proc must be accessible.<\/p>\n\n<p><strong>Does the plugin work on Windows system?<\/strong>\nIf the server where Piwik is running is using Windows as OS, the plugin doesn't work yet.\nIf just your browser is running under Windows (and the server runs under Linux) this plugin works well.<\/p>",
"documentation":"",
- "changelog":"<ul><li><p><strong>0.1.0 Initial release<\/strong><\/p>\n\n<ul><li>Display of CPU load<\/li>\n<li>Display of free or used memory <\/li>\n<\/ul><\/li>\n<li><p><strong>0.1.1 Initial release<\/strong><\/p>\n\n<ul><li>Corrections and error trapping for shared websites where the some values aren't accessible <\/li>\n<\/ul><\/li>\n<li><p><strong>0.2.0 Graphical display<\/strong><\/p>\n\n<ul><li>Display as bar chart for system load and memory use added <\/li>\n<\/ul><\/li>\n<li><p><strong>0.2.1 Hungarian language<\/strong><\/p>\n\n<ul><li>Hungarian language added <\/li>\n<\/ul><\/li>\n<li><p><strong>0.3.0 Bar charts for network and disk<\/strong><\/p>\n\n<ul><li>Two new bars for displaying network traffic (upload and download) and disk usage added<\/li>\n<li>Additional to the percentage values, the real values are display on hover <\/li>\n<\/ul><\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/SimpleSysMon\/download\/0.3.1"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/SimpleSysMon\/changelog"},"consumer":{"license":null}},{"name":"SiteMigration",
- "displayName":"Site Migration",
- "owner":"PiwikPRO",
- "description":"Migrate your website and all website data between two Piwik installations.",
- "homepage":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration",
- "createdDateTime":"2014-11-11 21:28:05",
- "donate":{},"support":[],"isTheme":false,"keywords":[],"basePrice":0,"authors":[],"repositoryUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration",
- "lastUpdated":"2015-11-27 02:46:04",
- "latestVersion":"1.0.8",
- "numDownloads":5191,"screenshots":[],"previews":[],"activity":{"numCommits":"70",
- "numContributors":"7",
- "lastCommitDate":"2016-05-11 09:27:40"},"featured":false,"isFree":true,"isPaid":false,"isCustomPlugin":false,"shop":null,"versions":[{"name":"1.0.0",
- "release":"2014-11-11 21:28:05",
- "requires":{"php":">=5.3.0",
- "piwik":">=2.9.0-b9"},"numDownloads":77,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SiteMigration\/download\/1.0.0"},{"name":"1.0.1",
- "release":"2014-11-12 23:34:05",
- "requires":{"php":">=5.3.0",
- "piwik":">=2.9.0-b9"},"numDownloads":127,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SiteMigration\/download\/1.0.1"},{"name":"1.0.2",
- "release":"2014-11-17 00:04:05",
- "requires":{"php":">=5.3.0",
- "piwik":">=2.9.0-b9"},"numDownloads":0,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SiteMigration\/download\/1.0.2"},{"name":"1.0.3",
- "release":"2014-11-17 00:06:05",
- "requires":{"php":">=5.3.0",
- "piwik":">=2.9.0-b9"},"numDownloads":19,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SiteMigration\/download\/1.0.3"},{"name":"1.0.4",
- "release":"2014-11-17 11:06:05",
- "requires":{"php":">=5.3.0",
- "piwik":">=2.9.1"},"numDownloads":202,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SiteMigration\/download\/1.0.4"},{"name":"1.0.5",
- "release":"2014-11-26 21:26:06",
- "requires":{"php":">=5.3.0",
- "piwik":">=2.9.1"},"numDownloads":130,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SiteMigration\/download\/1.0.5"},{"name":"1.0.6",
- "release":"2014-12-03 03:34:05",
- "requires":{"php":">=5.3.0",
- "piwik":">=2.9.1"},"numDownloads":174,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SiteMigration\/download\/1.0.6"},{"name":"1.0.7",
- "release":"2014-12-21 22:04:05",
- "requires":{"php":">=5.3.0",
- "piwik":">=2.10.0-b10"},"numDownloads":2669,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/SiteMigration\/download\/1.0.7"},{"name":"1.0.8",
- "release":"2015-11-27 02:46:04",
- "requires":{"php":">=5.3.3",
- "piwik":">=2.11.0"},"numDownloads":1793,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/commits\/v1.0.0",
- "readmeHtml":{"description":"\n\n<p>Migrate websites, and all the tracking data between two Piwik installations.<\/p>\n\n<p>This tool is useful in case you want to merge two Piwik installations, or if you want to move one or several websites to another Piwik server.<\/p>\n\n<h3>Requirements<\/h3>\n\n<p>To migrate data from one Piwik server to another server, you must:<\/p>\n\n<ul><li>First make sure that both Piwik servers are using the latest Piwik version.<\/li>\n<li>You must be able to connect to the Mysql server of the Target Piwik Server.<\/li>\n<li>You must run the console command on the Piwik Server that data will be copied from.<\/li>\n<\/ul><h3>Migrating the data<\/h3>\n\n<p>Start the migration by calling from the command line CLI the following command:<\/p>\n\n<pre><code>.\/console migration:site idSite --db-prefix piwik_\n<\/code><\/pre>\n\n<p>The command will ask for the credentials to the target database.<\/p>\n\n<p>It will then migrate the data from the current Piwik to the target Piwik.<\/p>\n\n<h3>Options<\/h3>\n\n<p>Run <code>.\/console migration:site --help<\/code> to get a full list of options.<\/p>\n\n",
- "faq":"<p><strong>How do I migrate site data between two dates only?<\/strong><\/p>\n\n<p>You can use command options: <code>--date-from<\/code> and <code>--date-to<\/code>.<\/p>\n\n<p><strong>How do I migrate tracking log data only, and skip migrating archived data?<\/strong><\/p>\n\n<p>Just add the <code>--skip-archive-data<\/code> option.<\/p>\n\n<p><strong>How do I migrate the archived data and skip the tracking data?<\/strong><\/p>\n\n<p>Just add the <code>--skip-log-data<\/code> option.<\/p>\n\n<p><strong>Can I run the command on the Target Piwik server (where data will be imported)?<\/strong><\/p>\n\n<p>No, you must run the command from the source Piwik server (the server which contains the data you want to migrate).<\/p>",
- "documentation":"",
- "changelog":"<p><strong>v1.0.7<\/strong><\/p>\n\n<ul><li>Updated the plugin for compatibility with Piwik 2.10.<\/li>\n<\/ul><p><strong>v1.0.6<\/strong><\/p>\n\n<ul><li><a href=\"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/issues\/6\">#6<\/a>: fixed a PHP 5.3 incompatibility<\/li>\n<\/ul><p><strong>v1.0.5<\/strong><\/p>\n\n<ul><li><a href=\"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/issues\/5\">#5<\/a>: fixed <code>Integrity constraint violation: 1048 Column 'idaction_url' cannot be null<\/code><\/li>\n<\/ul><p><strong>v1.0.4<\/strong><\/p>\n\n<ul><li><a href=\"https:\/\/github.com\/PiwikPRO\/plugin-SiteMigration\/issues\/3\">#3<\/a>: fixed <code>--db-prefix<\/code> option<\/li>\n<\/ul><p><strong>v1.0.3<\/strong><\/p>\n\n<ul><li>Documentation update<\/li>\n<\/ul><p><strong>v1.0.2<\/strong><\/p>\n\n<ul><li>Documentation update &amp; fixed bug when archive_blob tables are not found <\/li>\n<\/ul><p><strong>v1.0.1<\/strong><\/p>\n\n<ul><li>Documentation update<\/li>\n<\/ul><p><strong>v1.0.0<\/strong><\/p>\n\n<ul><li>First stable release<\/li>\n<li>Bugfixes<\/li>\n<\/ul><p><strong>v0.1.1<\/strong><\/p>\n\n<ul><li>Changed license to free plugin<\/li>\n<li>Changed name to SiteMigration<\/li>\n<\/ul><p><strong>v0.1.0<\/strong><\/p>\n\n<ul><li>Initial release<\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/SiteMigration\/download\/1.0.8"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/SiteMigration\/changelog"},"consumer":{"license":null}},{"name":"SnoopyBehavioralScoring",
+ "changelog":"<ul><li><p><strong>0.1.0 Initial release<\/strong><\/p>\n\n<ul><li>Display of CPU load<\/li>\n<li>Display of free or used memory <\/li>\n<\/ul><\/li>\n<li><p><strong>0.1.1 Initial release<\/strong><\/p>\n\n<ul><li>Corrections and error trapping for shared websites where the some values aren't accessible <\/li>\n<\/ul><\/li>\n<li><p><strong>0.2.0 Graphical display<\/strong><\/p>\n\n<ul><li>Display as bar chart for system load and memory use added <\/li>\n<\/ul><\/li>\n<li><p><strong>0.2.1 Hungarian language<\/strong><\/p>\n\n<ul><li>Hungarian language added <\/li>\n<\/ul><\/li>\n<li><p><strong>0.3.0 Bar charts for network and disk<\/strong><\/p>\n\n<ul><li>Two new bars for displaying network traffic (upload and download) and disk usage added<\/li>\n<li>Additional to the percentage values, the real values are display on hover <\/li>\n<\/ul><\/li>\n<\/ul>"},"download":"\/api\/2.0\/plugins\/SimpleSysMon\/download\/0.3.1"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/SimpleSysMon\/changelog"},"consumer":{"license":null}},{"name":"SnoopyBehavioralScoring",
"displayName":"Snoopy Behavioral Scoring",
"owner":"spletnik",
"description":"User behaviour scoring plugin for piwik. It allows you to score your visitors depending on goals reached, pages visited, email campaigns opened and ot",
@@ -2692,50 +2295,4 @@
"readmeHtml":{"description":"\n\n<ul><li><p>Step1 Tracking Code<\/p>\n\n<p>Reference:<\/p>\n\n<p>http:\/\/piwik.org\/docs\/custom-variables\/#track-a-custom-variable-in-javascript<\/p>\n\n<p>http:\/\/developer.piwik.org\/api-reference\/tracking-javascript#custom-variables<\/p>\n\n<p>Example:<\/p>\n\n<pre><code>\/\/ you can set up to 5 custom variables for each visitor\n_paq.push([\n \"setCustomVariable\", \n 1, \n \"RTX\", \n document.cookie.match(new RegExp(\"(^| )_login_name=([^;]*)(;|$)\"))[2], \n \"visit\"\n]);\n<\/code><\/pre><\/li>\n<li><p>Step2 Plugin Settings<\/p>\n\n<ol><li><p>Name of the custom variable :<\/p>\n\n<p>\"RTX\" (Previous set of custom variable names, no default)<\/p><\/li>\n<li><p>Visitor avatar url rules :<\/p>\n\n<p>\"\/\/rtx.oa.com\/avatars\/%s\/profile.jpg\" (The default is \"plugins\/VisitorAvatar\/images\/default_avatar.gif\")<\/p><\/li>\n<li><p>Visitor description text rules :<\/p>\n\n<p>\"my rtx is %s\" (The default is \"%s\")<\/p><\/li>\n<\/ol><\/li>\n<li><p>Step3 Visitor Profile<\/p>\n\n<p><em>View Visitors custom avatar and description<\/em><\/p><\/li>\n<\/ul>",
"faq":"",
"documentation":"",
- "changelog":""},"download":"\/api\/2.0\/plugins\/VisitorAvatar\/download\/0.2.2"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/VisitorAvatar\/changelog"},"consumer":{"license":null}},{"name":"WebsiteGroups",
- "displayName":"Website Groups",
- "owner":"PiwikPRO",
- "description":"Assign websites to groups in your 'All Websites' dashboard. Useful to get a view by client or category.",
- "homepage":"http:\/\/piwik.pro",
- "createdDateTime":"2014-11-07 03:14:03",
- "donate":{},"support":[],"isTheme":false,"keywords":[],"basePrice":0,"authors":[],"repositoryUrl":"https:\/\/github.com\/PiwikPRO\/plugin-WebsiteGroups",
- "lastUpdated":"2016-03-09 18:04:03",
- "latestVersion":"0.3.0",
- "numDownloads":5489,"screenshots":[],"previews":[],"activity":{"numCommits":"70",
- "numContributors":"6",
- "lastCommitDate":"2016-04-15 22:56:33"},"featured":false,"isFree":true,"isPaid":false,"isCustomPlugin":false,"shop":null,"versions":[{"name":"0.1.2",
- "release":"2014-11-07 03:14:03",
- "requires":{"piwik":">=2.1.1-b1"},"numDownloads":3,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-WebsiteGroups\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/WebsiteGroups\/download\/0.1.2"},{"name":"0.1.3",
- "release":"2014-11-07 03:18:03",
- "requires":{"piwik":">=2.1.1-b1"},"numDownloads":2156,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-WebsiteGroups\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/WebsiteGroups\/download\/0.1.3"},{"name":"0.1.4",
- "release":"2015-07-28 14:50:03",
- "requires":{"piwik":">=2.1.1-b1"},"numDownloads":992,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-WebsiteGroups\/commits\/v0.1.1",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/WebsiteGroups\/download\/0.1.4"},{"name":"0.2.0",
- "release":"2015-11-11 14:48:03",
- "requires":{"piwik":">=2.15.0"},"numDownloads":1320,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-WebsiteGroups\/commits\/0.1.3",
- "readmeHtml":{"description":"",
- "faq":"",
- "changelog":"",
- "documentation":""},"download":"\/api\/2.0\/plugins\/WebsiteGroups\/download\/0.2.0"},{"name":"0.3.0",
- "release":"2016-03-09 18:04:03",
- "requires":{"piwik":">=2.16.0"},"numDownloads":1018,"license":{"name":"GPLv3+",
- "url":""},"repositoryChangelogUrl":"https:\/\/github.com\/PiwikPRO\/plugin-WebsiteGroups\/commits\/v0.1.1",
- "readmeHtml":{"description":"\n\n<p>Features of this plugin:<\/p>\n\n<ul><li>Users can assign websites to groups in the UI<\/li>\n<li>'All Websites' dashboard shows websites grouped by Group, and for each group it shows the sum of visits\/actions\/revenue for websites within this group<\/li>\n<li>In the 'All Websites' dashboard, the Super User can see an aggregated number of visits\/pages for the group. Websites appear below their group row<\/li>\n<li>A user can set the groups within the 'All Websites' dashboard<\/li>\n<li>The website selector shows the website groups prefixed with the group name<\/li>\n<li>The website selector allows you to search for groups<\/li>\n<\/ul>",
- "faq":"",
- "documentation":"",
- "changelog":"<p><strong>v.0.3.0<\/strong>\n- PPCDEV-2609 Compatibility with Piwik 2.16.0<\/p>\n\n<p><strong>v.0.2.0<\/strong>\n- compatibility with Piwik 2.15.0<\/p>"},"download":"\/api\/2.0\/plugins\/WebsiteGroups\/download\/0.3.0"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/WebsiteGroups\/changelog"},"consumer":{"license":null}}]} \ No newline at end of file
+ "changelog":""},"download":"\/api\/2.0\/plugins\/VisitorAvatar\/download\/0.2.2"}],"isDownloadable":true,"changelog":{"url":"http:\/\/plugins.piwik.org\/VisitorAvatar\/changelog"},"consumer":{"license":null}}]} \ No newline at end of file
diff --git a/plugins/MobileMessaging/MobileMessaging.php b/plugins/MobileMessaging/MobileMessaging.php
index 4223db5028..05e1e3a425 100644
--- a/plugins/MobileMessaging/MobileMessaging.php
+++ b/plugins/MobileMessaging/MobileMessaging.php
@@ -61,7 +61,7 @@ class MobileMessaging extends \Piwik\Plugin
);
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php b/plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php
index 6eb8eed707..144fdcf449 100644
--- a/plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php
+++ b/plugins/MobileMessaging/tests/Integration/MobileMessagingTest.php
@@ -25,7 +25,7 @@ class MobileMessagingTest extends IntegrationTestCase
{
protected $idSiteAccess;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Monolog/Processor/ClassNameProcessor.php b/plugins/Monolog/Processor/ClassNameProcessor.php
index 3d3b654b7b..79995fc180 100644
--- a/plugins/Monolog/Processor/ClassNameProcessor.php
+++ b/plugins/Monolog/Processor/ClassNameProcessor.php
@@ -62,11 +62,7 @@ class ClassNameProcessor
private function getBacktrace()
{
- if (version_compare(phpversion(), '5.3.6', '>=')) {
- $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT);
- } else {
- $backtrace = debug_backtrace();
- }
+ $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT);
$skippedClasses = $this->skippedClasses;
$backtrace = array_filter($backtrace, function ($item) use ($skippedClasses) {
diff --git a/plugins/Monolog/tests/Integration/LogTest.php b/plugins/Monolog/tests/Integration/LogTest.php
index 0f2c32ec84..b528fff1c9 100644
--- a/plugins/Monolog/tests/Integration/LogTest.php
+++ b/plugins/Monolog/tests/Integration/LogTest.php
@@ -34,7 +34,7 @@ class LogTest extends IntegrationTestCase
public static $expectedErrorOutput = '[Monolog] [%s] dummyerrorfile.php(145): Unknown error (102) - dummy error string
dummy backtrace';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -44,7 +44,7 @@ class LogTest extends IntegrationTestCase
Log::$debugBacktraceForTests = "dummy backtrace";
}
- public function tearDown()
+ public function tearDown(): void
{
Log::unsetInstance();
diff --git a/plugins/Monolog/tests/System/TrackerLoggingTest.php b/plugins/Monolog/tests/System/TrackerLoggingTest.php
index 0942be7560..f4ff5598db 100644
--- a/plugins/Monolog/tests/System/TrackerLoggingTest.php
+++ b/plugins/Monolog/tests/System/TrackerLoggingTest.php
@@ -10,12 +10,10 @@ namespace Piwik\Plugins\Monolog\tests\System;
use Piwik\Config;
use Piwik\Date;
-use Piwik\Plugins\Monolog\Handler\EchoHandler;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
use Piwik\Tests\Framework\TestingEnvironmentVariables;
-use PiwikTracker;
-use Psr\Container\ContainerInterface;
+use MatomoTracker;
/**
* @group Monolog
@@ -26,7 +24,7 @@ class TrackerLoggingTest extends SystemTestCase
{
private $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -72,7 +70,7 @@ class TrackerLoggingTest extends SystemTestCase
return $t;
}
- private function assertTrackerResponseContainsLogOutput(PiwikTracker $t)
+ private function assertTrackerResponseContainsLogOutput(MatomoTracker $t)
{
$response = $t->doTrackPageView('incredible title!');
diff --git a/plugins/Monolog/tests/Unit/Formatter/LineMessageFormatterTest.php b/plugins/Monolog/tests/Unit/Formatter/LineMessageFormatterTest.php
index ddedff2eab..d52949b6d2 100644
--- a/plugins/Monolog/tests/Unit/Formatter/LineMessageFormatterTest.php
+++ b/plugins/Monolog/tests/Unit/Formatter/LineMessageFormatterTest.php
@@ -15,7 +15,7 @@ use Piwik\Plugins\Monolog\Formatter\LineMessageFormatter;
* @group Log
* @covers \Piwik\Plugins\Monolog\Formatter\LineMessageFormatter
*/
-class LineMessageFormatterTest extends \PHPUnit_Framework_TestCase
+class LineMessageFormatterTest extends \PHPUnit\Framework\TestCase
{
/**
* @test
diff --git a/plugins/Monolog/tests/Unit/Processor/ClassNameProcessorTest.php b/plugins/Monolog/tests/Unit/Processor/ClassNameProcessorTest.php
index 23f688c094..473c4465ad 100644
--- a/plugins/Monolog/tests/Unit/Processor/ClassNameProcessorTest.php
+++ b/plugins/Monolog/tests/Unit/Processor/ClassNameProcessorTest.php
@@ -14,7 +14,7 @@ use Piwik\Plugins\Monolog\Processor\ClassNameProcessor;
* @group Log
* @covers \Piwik\Plugins\Monolog\Processor\ClassNameProcessor
*/
-class ClassNameProcessorTest extends \PHPUnit_Framework_TestCase
+class ClassNameProcessorTest extends \PHPUnit\Framework\TestCase
{
/**
* @test
diff --git a/plugins/Monolog/tests/Unit/Processor/ExceptionToTextProcessorTest.php b/plugins/Monolog/tests/Unit/Processor/ExceptionToTextProcessorTest.php
index 24788c6f69..a3cc75e834 100644
--- a/plugins/Monolog/tests/Unit/Processor/ExceptionToTextProcessorTest.php
+++ b/plugins/Monolog/tests/Unit/Processor/ExceptionToTextProcessorTest.php
@@ -15,7 +15,7 @@ use Piwik\Plugins\Monolog\Processor\ExceptionToTextProcessor;
* @group Log
* @covers \Piwik\Plugins\Monolog\Processor\ExceptionToTextProcessor
*/
-class ExceptionToTextProcessorTest extends \PHPUnit_Framework_TestCase
+class ExceptionToTextProcessorTest extends \PHPUnit\Framework\TestCase
{
/**
* @test
diff --git a/plugins/Monolog/tests/Unit/Processor/RequestIdProcessorTest.php b/plugins/Monolog/tests/Unit/Processor/RequestIdProcessorTest.php
index 50067801d2..8dab6f9701 100644
--- a/plugins/Monolog/tests/Unit/Processor/RequestIdProcessorTest.php
+++ b/plugins/Monolog/tests/Unit/Processor/RequestIdProcessorTest.php
@@ -8,7 +8,7 @@
namespace Piwik\Plugins\Monolog\tests\Unit\Processor;
-use PHPUnit_Framework_TestCase;
+use PHPUnit\Framework\TestCase;
use Piwik\Common;
use Piwik\Plugins\Monolog\Processor\RequestIdProcessor;
@@ -16,15 +16,15 @@ use Piwik\Plugins\Monolog\Processor\RequestIdProcessor;
* @group Log
* @covers \Piwik\Plugins\Monolog\Processor\RequestIdProcessor
*/
-class RequestIdProcessorTest extends \PHPUnit_Framework_TestCase
+class RequestIdProcessorTest extends TestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Common::$isCliMode = false;
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
Common::$isCliMode = true;
@@ -40,7 +40,7 @@ class RequestIdProcessorTest extends \PHPUnit_Framework_TestCase
$result = $processor(array());
$this->assertArrayHasKey('request_id', $result['extra']);
- $this->assertInternalType('string', $result['extra']['request_id']);
+ self::assertIsString($result['extra']['request_id']);
$this->assertNotEmpty($result['extra']['request_id']);
}
diff --git a/plugins/Monolog/tests/Unit/Processor/SprintfProcessorTest.php b/plugins/Monolog/tests/Unit/Processor/SprintfProcessorTest.php
index 4ef652cd56..d630c64150 100644
--- a/plugins/Monolog/tests/Unit/Processor/SprintfProcessorTest.php
+++ b/plugins/Monolog/tests/Unit/Processor/SprintfProcessorTest.php
@@ -14,7 +14,7 @@ use Piwik\Plugins\Monolog\Processor\SprintfProcessor;
* @group Log
* @covers \Piwik\Plugins\Monolog\Processor\SprintfProcessor
*/
-class SprintfProcessorTest extends \PHPUnit_Framework_TestCase
+class SprintfProcessorTest extends \PHPUnit\Framework\TestCase
{
/**
* @test
diff --git a/plugins/Monolog/tests/Unit/Processor/TokenProcessorTest.php b/plugins/Monolog/tests/Unit/Processor/TokenProcessorTest.php
index 15dcbc5959..e6d5bf833d 100644
--- a/plugins/Monolog/tests/Unit/Processor/TokenProcessorTest.php
+++ b/plugins/Monolog/tests/Unit/Processor/TokenProcessorTest.php
@@ -14,7 +14,7 @@ use Piwik\Plugins\Monolog\Processor\TokenProcessor;
* @group Log
* @covers \Piwik\Plugins\Monolog\Processor\TokenProcessor
*/
-class TokenProcessorTest extends \PHPUnit_Framework_TestCase
+class TokenProcessorTest extends \PHPUnit\Framework\TestCase
{
/**
* @test
diff --git a/plugins/Morpheus/fonts/README.md b/plugins/Morpheus/fonts/README.md
index 7e34e7a462..d40014a490 100644
--- a/plugins/Morpheus/fonts/README.md
+++ b/plugins/Morpheus/fonts/README.md
@@ -15,5 +15,4 @@ Unfortunatly icomoon doesn't create WOFF2 files, but as WOFF2 is just a containe
- or compile it yourself as explained on https://github.com/google/woff2
- convert all .ttf
files
- - `woff2_compress piwik.ttf` (this file shouldn't change anymore)
- `woff2_compress matomo.ttf`
diff --git a/plugins/Morpheus/fonts/piwik.svg b/plugins/Morpheus/fonts/piwik.svg
deleted file mode 100644
index b6c8c67ed1..0000000000
--- a/plugins/Morpheus/fonts/piwik.svg
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata>
-<json>
-<![CDATA[
-{
- "fontFamily": "piwik",
- "majorVersion": 1,
- "minorVersion": 0,
- "fontURL": "https://piwik.org",
- "description": "Piwik\nFont generated by IcoMoon.",
- "version": "Version 1.0",
- "fontId": "piwik",
- "psName": "piwik",
- "subFamily": "Regular",
- "fullName": "piwik"
-}
-]]>
-</json>
-</metadata>
-<defs>
-<font id="piwik" horiz-adv-x="1024">
-<font-face units-per-em="1024" ascent="960" descent="-64" />
-<missing-glyph horiz-adv-x="1024" />
-<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
-<glyph unicode="&#xe01f;" glyph-name="fast-forward" data-tags="fast_forward" d="M557.5 704l394.333-277.333-394.333-277.333v554.667zM141.5 149.334v554.667l394.333-277.333z" />
-<glyph unicode="&#xe020;" glyph-name="fast-rewind" data-tags="fast_rewind" d="M488.167 426.667l394.333 277.333v-554.667zM466.5 149.334l-394.333 277.333 394.333 277.333v-554.667z" />
-<glyph unicode="&#xe035;" glyph-name="pause" data-tags="pause_circle_filled" d="M665.84 222.348v408.639h-103.362v-408.639h103.362zM461.521 222.348v408.639h-103.362v-408.639h103.362zM512 938.667c283.643 0 512-228.357 512-512s-228.357-512-512-512-512 228.357-512 512 228.357 512 512 512z" />
-<glyph unicode="&#xe038;" glyph-name="play" data-tags="play_circle_filled" d="M408.639 195.907l307.681 230.76-307.681 230.76v-461.521zM512 938.667c283.643 0 512-228.357 512-512s-228.357-512-512-512-512 228.357-512 512 228.357 512 512 512z" />
-<glyph unicode="&#xe042;" glyph-name="replay" data-tags="replay" d="M512 709.515c206.638 0 375.906-167.070 375.906-373.708s-169.268-375.906-375.906-375.906-375.906 169.268-375.906 375.906h94.525c0-156.079 125.3-281.38 281.38-281.38s281.38 125.3 281.38 281.38-125.3 281.38-281.38 281.38v-189.053l-235.216 235.216 235.216 235.216v-189.053z" />
-<glyph unicode="&#xe044;" glyph-name="skip-next" data-tags="skip_next" d="M710.334 725.333h100.334v-597.334h-100.334v597.334zM213.334 128.001v597.334l422.334-298.666z" />
-<glyph unicode="&#xe045;" glyph-name="skip-previous" data-tags="skip_previous" d="M388.332 426.667l422.33 298.668v-597.33zM213.332 725.335h100.331v-597.33h-100.331v597.33z" />
-<glyph unicode="&#xe047;" glyph-name="stop" data-tags="stop" d="M213.334 725.333h597.334v-597.334h-597.334v597.334z" />
-<glyph unicode="&#xe050;" glyph-name="audio" data-tags="volume_up" d="M598 800.667c172-38 298-192 298-374s-126-336-298-374v88c124 36 212 150 212 286s-88 250-212 286v88zM704 426.667c0-76-42-140-106-172v344c64-32 106-96 106-172zM128 554.667h170l214 214v-684l-214 214h-170v256z" />
-<glyph unicode="&#xe0cb;" glyph-name="overlay" data-tags="chat_bubble_outline" d="M854 256.667v512h-684v-598l86 86h598zM854 852.667c46 0 84-38 84-84v-512c0-46-38-86-84-86h-598l-170-170v768c0 46 38 84 84 84h684z" />
-<glyph unicode="&#xe2c6;" glyph-name="upload" data-tags="file_upload" d="M143.948 110.487h736.108v-106.216h-736.108v106.216zM353.912 216.703v316.18h-209.964l368.052 368.052 368.052-368.052h-209.964v-316.18h-316.18z" />
-<glyph unicode="&#xe600;" glyph-name="alien" data-tags="ico-alien" d="M576 896c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.346 28.654 64 64 64s64-28.654 64-64zM480 864h64v-128h-64v128zM897.024-64h-770.048c-70.144 0-126.976 56.832-126.976 126.976v0c0 70.144 56.832 126.976 126.976 126.976h769.984c70.144 0 126.976-56.832 126.976-126.976v0c0.064-70.144-56.768-126.976-126.912-126.976zM512 768c-194.432 0-352-157.568-352-352v-160h704v160c0 194.432-157.568 352-352 352zM384 352c-52.992 0-96 43.008-96 96s43.008 96 96 96 96-43.008 96-96-43.008-96-96-96zM640 352c-52.992 0-96 43.008-96 96s43.008 96 96 96 96-43.008 96-96-43.008-96-96-96z" />
-<glyph unicode="&#xe601;" glyph-name="annotation" data-tags="ico-annotation" d="M736 704h-448c-17.664 0-32-14.336-32-32s14.336-32 32-32h448c17.664 0 32 14.336 32 32s-14.336 32-32 32zM736 576h-448c-17.664 0-32-14.336-32-32s14.336-32 32-32h448c17.664 0 32 14.336 32 32s-14.336 32-32 32zM608 448h-320c-17.664 0-32-14.336-32-32s14.336-32 32-32h320c17.664 0 32 14.336 32 32s-14.336 32-32 32zM832 960h-640c-106.048 0-192-85.952-192-192v-448c0-106.048 85.952-192 192-192h320l195.2-184.32c25.024-18.816 60.8-0.896 60.8 30.4v153.92h64c106.048 0 192 85.952 192 192v448c0 106.048-85.952 192-192 192zM896 320c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v448c0 35.264 28.736 64 64 64h640c35.264 0 64-28.736 64-64v-448z" />
-<glyph unicode="&#xe602;" glyph-name="arrow-left" data-tags="ico-arrow-left" d="M704 736v-576l-321.024 286.976z" />
-<glyph unicode="&#xe603;" glyph-name="arrow-right" data-tags="ico-arrow-right" d="M414.976 768v-576l321.024 286.976z" />
-<glyph unicode="&#xe604;" glyph-name="business" data-tags="ico-business" d="M1024 640c0 35.328-28.672 64-64 64h-80.832l-36.608 118.912c-23.808 72.448-91.008 121.088-167.232 121.088h-326.656c-76.224 0-143.424-48.64-167.232-121.024l-35.072-106.624-0.256-12.352h-82.112c-35.328 0-64-28.672-64-64v-96c0-3.712 1.472-6.912 2.112-10.432-1.024-8-2.112-15.936-2.112-24.256v-74.112c112.128-88.896 295.296-147.2 502.4-147.2 219.456 0 412.032 65.408 521.6 163.456v57.856c0 8.256-1.024 16.32-2.112 24.32 0.64 3.52 2.112 6.72 2.112 10.368v96zM640 701.312v-189.312c0-70.4-57.6-128-128-128s-128 57.6-128 128v189.312h-139.84l28.544 91.648c10.816 32.96 41.28 55.040 75.968 55.040h326.656c34.688 0 65.216-22.080 76.032-55.040l30.144-91.648h-141.504zM576 512c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.346 28.654 64 64 64s64-28.654 64-64zM0 359.232v-231.232c0-7.296 1.344-14.208 2.176-21.312-0.64-3.584-2.176-6.912-2.176-10.688v-96c0-35.328 28.672-64 64-64h96c3.776 0 7.104 1.536 10.688 2.176 7.104-0.832 14.016-2.176 21.312-2.176h640c7.296 0 14.208 1.344 21.312 2.176 3.584-0.64 6.912-2.176 10.688-2.176h96c35.328 0 64 28.672 64 64v96c0 3.776-1.536 7.104-2.176 10.688 0.832 7.104 2.176 14.016 2.176 21.312v244.096c-125.12-90.432-312.448-148.096-521.6-148.096-198.976 0-377.664 52.352-502.4 135.232z" />
-<glyph unicode="&#xe605;" glyph-name="calendar" data-tags="ico-calendar" d="M320 384v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM512 384v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM704 384v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM320 192v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM512 192v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM704 192v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM832 896v64h-128v-64h-384v64h-128v-64c-106.048 0-192-85.952-192-192v-576c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v576c0 106.048-85.952 192-192 192zM896 128c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v512h768v-512z" />
-<glyph unicode="&#xe606;" glyph-name="chart-bar" data-tags="ico-chart-bar" d="M864-64v0c-52.8 0-96 43.2-96 96v288c0 52.8 43.2 96 96 96v0c52.8 0 96-43.2 96-96v-288c0-52.8-43.2-96-96-96zM480-64v0c-52.8 0-96 43.2-96 96v576c0 52.8 43.2 96 96 96v0c52.8 0 96-43.2 96-96v-576c0-52.8-43.2-96-96-96zM96-64v0c-52.8 0-96 43.2-96 96v832c0 52.8 43.2 96 96 96v0c52.8 0 96-43.2 96-96v-832c0-52.8-43.2-96-96-96z" />
-<glyph unicode="&#xe607;" glyph-name="chart-line-details" data-tags="ico-chart-line-details" d="M832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192zM896 128c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v208.32c29.888 13.504 77.312 38.4 154.304 80.32 33.152-57.472 94.528-96.64 165.696-96.64 36.544 0 70.4 10.752 99.456 28.544l143.296-143.296c17.664-17.664 46.336-17.664 64 0v0c17.664 17.664 17.664 46.336 0 64l-143.296 143.296c3.776 6.208 7.040 12.672 10.176 19.264l126.528-56.256 147.84 232.256v-479.808zM320 512c0 70.592 57.408 128 128 128 66.944 0 121.408-51.84 126.912-117.376l-128.384 57.088-13.952-7.68c-34.304-18.88-73.28-40.256-112.384-61.76 0 0.576-0.192 1.152-0.192 1.728zM449.472 508.288l113.92-50.624c-20.48-43.392-64.32-73.664-115.392-73.664-46.848 0-87.424 25.536-109.76 63.232 32.832 17.984 69.376 38.016 111.232 61.056zM896 727.040l-172.16-270.592-85.12 37.824c0.576 5.888 1.28 11.712 1.28 17.728 0 106.048-85.952 192-192 192s-192-85.952-192-192c0-11.968 1.408-23.616 3.52-34.944-51.136-28.032-98.688-54.016-131.52-71.808v362.752c0 35.264 28.736 64 64 64h640c35.264 0 64-28.736 64-64v-40.96z" />
-<glyph unicode="&#xe608;" glyph-name="chart-line" data-tags="ico-chart-line" d="M832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192zM192 832h640c35.264 0 64-28.736 64-64v-72l-188.992-141.76-128 128-236.928-177.664-68.928 103.424h-145.152v160c0 35.264 28.736 64 64 64zM896 616v-363.968l-263.68 105.536-115.328-115.328-139.328 209.024 195.328 146.496 128-128 195.008 146.24zM290.816 466.112l-162.816-122.112v200h110.848l51.968-77.888zM832 64h-640c-35.264 0-64 28.736-64 64v136l198.336 148.8 180.672-270.976 140.672 140.672 248.32-99.328v-55.168c0-35.264-28.736-64-64-64z" />
-<glyph unicode="&#xe609;" glyph-name="chart-pie" data-tags="ico-chart-pie" d="M576 484.224l404.352-242.624c27.904 63.232 43.648 132.928 43.648 206.4 0 261.056-195.52 476.032-448 507.584v-471.36zM448 411.776v543.808c-252.48-31.552-448-246.528-448-507.584 0-282.752 229.248-512 512-512 163.392 0 308.544 76.8 402.304 195.968l-466.304 279.808z" />
-<glyph unicode="&#xe60a;" glyph-name="close" data-tags="ico-close" d="M23.552 95.168l841.28 841.28c37.44 37.44 98.176 37.44 135.616 0v0c37.44-37.44 37.44-98.176 0-135.616l-841.28-841.28c-37.44-37.44-98.176-37.44-135.616 0v0c-37.44 37.44-37.44 98.176 0 135.616zM864.64-40.256l-841.28 841.28c-37.44 37.44-37.44 98.176 0 135.616v0c37.44 37.44 98.176 37.44 135.616 0l841.28-841.28c37.44-37.44 37.44-98.176 0-135.616v0c-37.504-37.44-98.176-37.44-135.616 0z" />
-<glyph unicode="&#xe60b;" glyph-name="collapsed-arrows" data-tags="ico-collapsed-arrows" d="M734.656 384h-446.656l224-320zM288 512h446.656l-224 320z" />
-<glyph unicode="&#xe60c;" glyph-name="configure" data-tags="ico-configure" d="M990.848 385.472v0c-21.184 14.016-33.216 37.248-33.152 61.952 0 0.192 0 0.384 0 0.576s0 0.384 0 0.576c-0.064 24.704 11.968 47.936 33.088 61.888l0.064 0.064c27.136 17.984 39.296 50.752 30.144 81.216-2.88 9.664-6.080 19.264-9.6 28.672-11.072 29.952-40.96 49.6-73.856 48.704v0c-25.6-0.704-49.6 11.264-64.64 31.296-0.192 0.32-0.448 0.576-0.64 0.896-15.104 19.968-19.456 45.632-10.88 68.864v0.064c11.008 29.888 0.96 63.296-25.024 82.816-8.192 6.144-16.64 12.096-25.216 17.792-27.2 18.048-63.424 16.96-89.536-2.432l-0.064-0.064c-19.904-14.784-46.080-19.2-69.888-11.648-1.152 0.384-2.368 0.768-3.52 1.088-24.064 7.36-42.624 25.792-49.728 49.088v0.128c-9.216 30.144-37.248 51.712-69.824 52.736-5.504 0.192-11.008 0.256-16.576 0.256s-11.072-0.064-16.576-0.256c-32.576-1.024-60.608-22.592-69.824-52.736v-0.128c-7.104-23.296-25.664-41.728-49.664-49.088-1.152-0.384-2.304-0.768-3.52-1.152-23.808-7.552-49.984-3.136-69.888 11.648l-0.064 0.064c-26.176 19.456-62.336 20.48-89.536 2.432-8.576-5.696-16.96-11.648-25.216-17.792-25.984-19.456-36.032-52.864-24.96-82.752v-0.064c8.576-23.296 4.16-48.96-10.88-68.864-0.192-0.32-0.448-0.576-0.64-0.896-15.040-20.032-39.040-31.936-64.64-31.296-33.024 0.896-62.912-18.688-73.984-48.704-3.456-9.408-6.656-19.008-9.6-28.672-9.152-30.464 3.008-63.232 30.144-81.216l0.064-0.064c21.12-13.952 33.152-37.184 33.088-61.888 0-0.192 0-0.384 0-0.576s0-0.384 0-0.576c0.064-24.704-11.968-47.936-33.088-61.888l-0.064-0.064c-27.136-17.984-39.296-50.752-30.144-81.216 2.88-9.664 6.080-19.264 9.6-28.672 11.072-29.952 40.96-49.6 73.92-48.704v0c25.6 0.704 49.6-11.264 64.64-31.296 0.192-0.32 0.448-0.576 0.64-0.896 15.104-19.968 19.456-45.632 10.88-68.864v-0.064c-11.008-29.888-0.96-63.296 25.024-82.816 8.192-6.144 16.64-12.096 25.216-17.792 27.2-18.048 63.424-16.96 89.536 2.432l0.064 0.064c19.904 14.784 46.080 19.2 69.888 11.648 1.152-0.384 2.368-0.768 3.52-1.088 24-7.36 42.56-25.856 49.664-49.152l0.064-0.128c9.216-30.144 37.248-51.712 69.824-52.736 5.44-0.128 10.944-0.192 16.512-0.192s11.072 0.064 16.576 0.256c32.576 1.024 60.608 22.528 69.824 52.736v0.128c7.104 23.296 25.664 41.728 49.664 49.152 1.152 0.384 2.368 0.704 3.52 1.088 23.872 7.552 49.984 3.136 69.888-11.648l0.064-0.064c26.176-19.456 62.336-20.48 89.536-2.432 8.576 5.696 17.024 11.584 25.216 17.792 25.984 19.456 36.032 52.864 25.024 82.816v0.064c-8.576 23.296-4.16 48.96 10.88 68.864 0.192 0.32 0.448 0.576 0.64 0.896 15.040 20.032 39.040 31.936 64.64 31.296v0c32.96-0.896 62.848 18.752 73.856 48.704 3.456 9.408 6.656 19.008 9.6 28.672 9.216 30.4-2.944 63.168-30.080 81.152zM512 200.832c-141.376 0-256 110.656-256 247.168s114.624 247.168 256 247.168c141.376 0 256-110.656 256-247.168s-114.624-247.168-256-247.168zM608 448c0-51.181-42.981-92.672-96-92.672s-96 41.491-96 92.672c0 51.181 42.981 92.672 96 92.672s96-41.491 96-92.672z" />
-<glyph unicode="&#xe60d;" glyph-name="datepicker-arr-l" data-tags="ico-datepicker-arr-l" d="M672 702.656v-446.656l-320 224z" />
-<glyph unicode="&#xe60e;" glyph-name="datepicker-arr-r" data-tags="ico-datepicker-arr-r" d="M416 704v-446.656l320 224z" />
-<glyph unicode="&#xe60f;" glyph-name="delete" data-tags="ico-delete" d="M192 0c0-35.328 28.672-64 64-64h512c35.328 0 64 28.672 64 64v576c0 35.328-19.648 64-55.040 64h-520.96c-35.328 0-64-28.672-64-64v-576zM640 896c-20.48 44.544-76.736 64-128 64-51.328 0-107.584-19.456-128-64h-192c-39.36 0-63.488-24.64-63.488-64l-0.512-64c0-39.232 24.64-64 64-64h640c39.232 0 64 24.768 64 64v64c0 39.36-24.768 64-64 64h-192z" />
-<glyph unicode="&#xe610;" glyph-name="document" data-tags="ico-document" d="M832 864c52.928 0 96-43.072 96-96v-736h-608v832h512zM832 960h-544c-35.328 0-64-28.672-64-64v-896c0-35.328 28.672-64 64-64h672c35.328 0 64 28.672 64 64v768c0 106.048-85.952 192-192 192v0zM837.312 448h-426.624c-14.72 0-26.688-14.336-26.688-32s11.968-32 26.688-32h426.688c14.72 0 26.688 14.336 26.688 32-0.064 17.664-12.032 32-26.752 32zM837.312 320h-426.624c-14.72 0-26.688-14.336-26.688-32s11.968-32 26.688-32h426.688c14.72 0 26.688 14.336 26.688 32-0.064 17.664-12.032 32-26.752 32zM784 192h-373.312c-14.72 0-26.688-14.336-26.688-32s11.968-32 26.688-32h373.312c14.72 0 26.688 14.336 26.688 32s-11.968 32-26.688 32zM384 768h256v-256h-256v256zM837.312 736h-106.688c-14.656 0-26.624-14.336-26.624-32s11.968-32 26.688-32h106.688c14.72 0 26.688 14.336 26.688 32-0.064 17.664-12.032 32-26.752 32zM837.312 608h-106.688c-14.656 0-26.624-14.336-26.624-32s11.968-32 26.688-32h106.688c14.72 0 26.688 14.336 26.688 32-0.064 17.664-12.032 32-26.752 32z" />
-<glyph unicode="&#xe611;" glyph-name="download" data-tags="ico-download" d="M896 224v-96c0-35.328-28.672-64-64-64h-640c-35.328 0-64 28.672-64 64v96c0 35.328-28.672 64-64 64v0c-35.328 0-64-28.672-64-64v-96c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v96c0 35.328-28.672 64-64 64v0c-35.328 0-64-28.672-64-64zM544 192v0c-52.992 0-96 43.008-96 96v576c0 52.992 43.008 96 96 96v0c52.992 0 96-43.008 96-96v-576c0-52.992-43.008-96-96-96zM476.096 220.096v0c-37.504 37.504-37.504 98.304 0 135.744l271.552 271.552c37.504 37.504 98.304 37.504 135.744 0v0c37.504-37.504 37.504-98.304 0-135.744l-271.552-271.552c-37.44-37.44-98.24-37.44-135.744 0zM595.392 220.096v0c-37.504-37.504-98.304-37.504-135.744 0l-271.552 271.552c-37.504 37.504-37.504 98.304 0 135.744v0c37.504 37.504 98.304 37.504 135.744 0l271.552-271.552c37.504-37.44 37.504-98.24 0-135.744z" />
-<glyph unicode="&#xe612;" glyph-name="drop" data-tags="ico-drop" d="M512.768-61.824c-190.848 0-346.112 148.608-346.112 331.328 0 193.088 263.68 573.376 293.824 616.128l52.288 74.368 52.352-74.432c30.080-42.688 293.696-423.040 293.696-616.128 0-182.656-155.264-331.264-346.048-331.264zM512.768 734.336c-99.84-153.728-218.112-367.68-218.112-464.832 0-112.128 97.856-203.328 218.112-203.328s218.048 91.2 218.048 203.328c0 97.152-118.336 311.040-218.048 464.832zM512 130.176c-54.976 0-95.232 17.792-119.616 52.992-47.104 67.904-10.624 170.752-6.336 182.208 6.208 16.448 24.448 24.896 41.152 18.688 16.512-6.144 24.96-24.576 18.816-41.152-8.448-22.656-24.96-89.024-0.96-123.456 11.904-16.96 33.728-25.28 66.944-25.28 17.664 0 32-14.336 32-32s-14.336-32-32-32z" />
-<glyph unicode="&#xe613;" glyph-name="ecommerce-abandoned" data-tags="ico-ecommerce-abandoned" d="M960 512h-640l-32.192 95.488c-4.16 21.568-19.84 39.040-40.768 45.504l-171.008 53.12c-31.36 9.728-64.64-7.808-74.368-39.168s7.808-64.64 39.168-74.368l136.96-42.496 104.384-458.048c3.648-19.392 16.448-35.072 33.408-42.944-0.512-4.096-0.768-8.192-0.768-12.416-0.064-55.488 45.12-100.672 100.672-100.672s100.672 45.184 100.672 100.672c0 2.304-0.128 4.608-0.256 6.912h158.912c-0.128-2.304-0.256-4.544-0.256-6.912 0-55.488 45.184-100.672 100.672-100.672s100.672 45.184 100.672 100.672c0 2.496-0.128 4.928-0.32 7.36 25.408 3.072 46.4 22.272 51.264 48l96.128 314.624c3.264 17.408-14.976 105.344-62.976 105.344zM415.488-12.352c-27.072 0-49.024 22.016-49.024 49.024 0 27.072 22.016 49.024 49.024 49.024 27.072 0 49.024-22.016 49.024-49.024s-22.016-49.024-49.024-49.024v0zM775.232-12.352c-27.072 0-49.024 22.016-49.024 49.024 0 27.072 22.016 49.024 49.024 49.024s49.024-22.016 49.024-49.024c0-27.008-22.016-49.024-49.024-49.024v0zM832 192c-34.688 0-448 0-448 0-19.712 0-19.712 64 0 64h448c19.712 0 34.688-64 0-64zM896 320h-512c-19.712 0-19.712 64 0 64h512c19.712 0 19.712-64 0-64v0zM896 832h-256c-35.328 0-64-28.672-64-64s28.672-64 64-64h256c35.328 0 64 28.672 64 64s-28.672 64-64 64z" />
-<glyph unicode="&#xe614;" glyph-name="ecommerce-order" data-tags="ico-ecommerce-order" d="M896 832h-64v64c0 35.328-28.672 64-64 64s-64-28.672-64-64v-64h-64c-35.328 0-64-28.672-64-64s28.672-64 64-64h64v-64c0-35.328 28.672-64 64-64s64 28.672 64 64v64h64c35.328 0 64 28.672 64 64s-28.672 64-64 64zM960 512h-640l-32.192 95.488c-4.16 21.568-19.84 58.048-40.768 64.512l-171.008 32c-31.36 9.728-64.64-5.696-74.368-37.056s7.808-64.64 39.168-74.368l136.96-42.496 104.384-458.048c3.648-19.392 16.448-35.072 33.408-42.944-0.512-4.096-0.768-8.192-0.768-12.416-0.064-55.488 45.12-100.672 100.672-100.672s100.672 45.184 100.672 100.672c0 2.304-0.128 4.608-0.256 6.912h158.912c-0.128-2.304-0.256-4.544-0.256-6.912 0-55.488 45.184-100.672 100.672-100.672s100.672 45.184 100.672 100.672c0 2.496-0.128 4.928-0.32 7.36 25.408 3.072 46.4 22.272 51.264 48l96.128 314.624c3.264 17.408-14.976 105.344-62.976 105.344zM415.488-12.352c-27.072 0-49.024 22.016-49.024 49.024 0 27.072 22.016 49.024 49.024 49.024 27.072 0 49.024-22.016 49.024-49.024s-22.016-49.024-49.024-49.024v0zM775.232-12.352c-27.072 0-49.024 22.016-49.024 49.024 0 27.072 22.016 49.024 49.024 49.024s49.024-22.016 49.024-49.024c0-27.008-22.016-49.024-49.024-49.024v0zM832 192c-34.688 0-448 0-448 0-19.712 0-19.712 64 0 64h448c19.712 0 34.688-64 0-64zM896 320h-512c-19.712 0-19.712 64 0 64h512c19.712 0 19.712-64 0-64v0z" />
-<glyph unicode="&#xe615;" glyph-name="email" data-tags="ico-email" d="M832 832h-640c-106.048 0-192-85.952-192-192v-384c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v384c0 106.048-85.952 192-192 192zM879.936 681.216l-341.888-299.008c-13.824-12.288-38.016-12.288-52.16 0l-341.76 299.136c11.776 13.568 28.544 22.656 47.872 22.656h640c19.392 0 36.224-9.152 47.936-22.784zM128 614.016l175.488-153.664-175.488-175.744v329.408zM832 192h-640c-17.984 0-34.048 7.552-45.696 19.456l203.392 208.192-2.112 2.368 98.24-85.952c18.56-16.512 42.24-24.512 66.176-24.512 24 0 47.616 8.384 66.496 24.512l98.304 85.952-2.432-2.368 203.456-208.192c-11.776-11.904-27.84-19.456-45.824-19.456zM720.448 460.352l175.552 153.472v-328.704l-175.552 175.232z" />
-<glyph unicode="&#xe616;" glyph-name="error" data-tags="ico-error" d="M874.048 810.048c-199.936 199.936-524.16 199.936-724.096 0s-199.936-524.16 0-724.096c199.936-199.936 524.16-199.936 724.096 0s199.936 524.16 0 724.096zM692.992 267.008c-33.344-33.344-87.36-33.344-120.64 0l-60.352 60.288-60.352-60.352c-33.344-33.344-87.36-33.344-120.64 0-33.344 33.344-33.344 87.36 0 120.704l60.352 60.352-60.352 60.352c-33.344 33.344-33.344 87.36 0 120.704s87.36 33.344 120.64 0l60.352-60.352 60.352 60.352c33.344 33.344 87.36 33.344 120.64 0 33.344-33.344 33.344-87.36 0-120.704l-60.288-60.352 60.352-60.352c33.28-33.344 33.28-87.36-0.064-120.64z" />
-<glyph unicode="&#xe617;" glyph-name="export" data-tags="ico-export" d="M712 552c-233.984 0-416-52.032-520-312 156.032 129.984 312 156.032 520 104v-156.032l312 260.032-312 260.032v-156.032zM918.656 234.688l-80-57.728c-4.16-3.008-6.656-7.872-6.656-12.992v-115.968h-720v496h175.36c4.224 0 8.32 1.664 11.328 4.672l80 80c10.048 10.112 2.944 27.328-11.328 27.328h-271.36c-52.8 0-96-43.2-96-96v-528c0-52.8 43.2-96 96-96h752c52.8 0 96 43.2 96 96v189.696c0 13.056-14.784 20.608-25.344 12.992z" />
-<glyph unicode="&#xe618;" glyph-name="feed" data-tags="ico-feed" d="M832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192zM319.68 124.16h-0.128c-17.024-16.896-40.256-27.264-66.112-27.264s-49.024 10.368-66.048 27.328v0c-16.896 16.896-27.392 40-27.392 65.728s10.496 48.896 27.392 65.92v-0.064c17.024 16.96 40.192 27.392 66.048 27.392s49.088-10.432 66.112-27.392v0c17.024-17.024 27.392-40.128 27.52-65.856-0.064-25.728-10.432-48.768-27.392-65.792zM555.072 96h-7.424c-31.104 0.128-57.408 22.656-62.4 53.376-11.008 67.968-42.88 130.688-92.288 180.032-49.344 49.472-111.872 81.408-179.52 92.416-30.784 5.056-53.376 31.424-53.376 62.592v6.72c0 38.784 34.432 69.824 72.768 63.744 98.944-15.68 187.52-62.656 255.36-130.624 67.968-67.968 114.944-156.672 130.624-255.744 6.080-38.272-25.024-72.64-63.744-72.512zM796.416 96h-6.72c-32.32 0-60.032 24.128-63.232 56.32-26.688 269.248-241.216 484.032-510.272 510.592-32 3.136-55.872 30.976-55.872 63.168v6.336c0 37.888 32.896 67.84 70.592 64.064 165.888-16.64 314.752-91.136 426.624-203.008 111.808-111.872 186.24-260.928 202.88-426.816 3.84-37.76-26.112-70.656-64-70.656z" />
-<glyph unicode="&#xe619;" glyph-name="finance" data-tags="ico-finance" d="M883.648 704h-627.648c-35.328 0-64 60.672-64 96s28.672 96 64 96h704c35.328 0 35.328 64 0 64h-819.648c-77.184 0-140.352-63.168-140.352-140.352v-743.296c0-77.184 63.168-140.352 140.352-140.352h743.296c77.184 0 140.352 63.168 140.352 140.352v487.296c0 77.184-63.168 140.352-140.352 140.352zM768 224c-52.992 0-96 43.008-96 96s43.008 96 96 96 96-43.008 96-96c0-52.992-43.008-96-96-96zM256 832h704v-64h-704v64z" />
-<glyph unicode="&#xe61a;" glyph-name="folder-charts" data-tags="ico-folder-charts" d="M744.384 800h-232.384l-69.632 129.28c-11.456 19.072-32.064 30.72-54.336 30.72h-121.344c-141.184 0-256.448-109.76-265.792-248.576-0.512-4.032-0.896-8.064-0.896-12.16v-483.584c0-154.496 125.184-279.68 279.616-279.68h464.768c154.432 0 279.616 125.184 279.616 279.616v294.144c0 154.432-125.184 290.24-279.616 290.24zM384 160c0-17.664-14.336-32-32-32h-64c-17.664 0-32 14.336-32 32v448c0 17.664 14.336 32 32 32h64c17.664 0 32-14.336 32-32v-448zM576 160c0-17.664-14.336-32-32-32h-64c-17.664 0-32 14.336-32 32v320c0 17.664 14.336 32 32 32h64c17.664 0 32-14.336 32-32v-320zM768 160c0-17.664-14.336-32-32-32h-64c-17.664 0-32 14.336-32 32v192c0 17.664 14.336 32 32 32h64c17.664 0 32-14.336 32-32v-192z" />
-<glyph unicode="&#xe61b;" glyph-name="folder" data-tags="ico-folder" d="M746.752 800h-234.752l-88.128 160h-157.184c-147.328 0-266.688-119.36-266.688-266.688h0.384c0-1.344-0.384-2.688-0.384-4.096v-486.592c0-147.264 119.36-266.624 266.688-266.624h490.688c147.264 0 266.624 119.36 266.624 266.688v320.064c0 153.088-124.16 277.248-277.248 277.248z" />
-<glyph unicode="&#xe61c;" glyph-name="fullscreen" data-tags="ico-fullscreen" d="M752.96 616.512l168.512 168.448v-80.96c0-28.544 23.040-51.264 51.264-51.264s51.264 22.72 51.264 51.264v256h-256c-28.288 0-51.264-23.040-51.264-51.264s22.72-51.264 51.264-51.264h81.216l-168.704-168.512c-20.032-19.968-20.032-52.48 0-72.448 19.968-20.032 52.48-20.032 72.448 0v0zM250.048-64c28.224 0 51.008 23.040 51.008 51.264 0 28.288-22.784 51.264-51.008 51.264h-75.008l168.512 168.512c19.968 19.968 19.968 52.48 0 72.512-10.048 9.984-23.040 14.976-36.288 14.976-12.992 0-26.24-4.992-36.224-14.976l-174.784-174.784v87.232c0 28.288-22.72 51.264-51.2 51.264-28.288 0-45.056-22.976-45.056-51.264v-256h250.048zM680.512 207.040l168.448-168.512h-80.96c-28.544 0-51.264-23.040-51.264-51.264s22.72-51.264 51.264-51.264h256v256c0 28.288-23.040 51.264-51.264 51.264s-51.264-22.72-51.264-51.264v-81.216l-168.512 168.704c-19.968 20.032-52.48 20.032-72.448 0-20.032-19.968-20.032-52.48 0-72.448v0zM0 709.952c0-28.224 23.040-51.008 51.264-51.008 28.288 0 51.264 22.784 51.264 51.008v75.008l168.512-168.512c19.968-19.968 52.48-19.968 72.512 0 9.984 10.048 14.976 23.040 14.976 36.288 0 12.992-4.992 26.24-14.976 36.224l-174.784 174.784h87.232c28.288 0 51.264 22.72 51.264 51.2 0 28.288-22.976 45.056-51.264 45.056h-256v-250.048z" />
-<glyph unicode="&#xe61d;" glyph-name="goal" data-tags="ico-goal" d="M832 832c35.264 0 64-28.736 64-64v-640c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v640c0 35.264 28.736 64 64 64h640zM832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192v0zM320 192v0c-35.328 0-64 28.672-64 64v384c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v-384c0-35.328-28.672-64-64-64zM723.712 640h-248.32c-15.104 0-27.392-12.288-27.392-27.392v-201.216c0-15.104 12.288-27.392 27.392-27.392h248.32c20.352 0 33.6 21.44 24.512 39.616l-38.080 76.16c-3.84 7.68-3.84 16.768 0 24.512l38.080 76.16c9.088 18.112-4.16 39.552-24.512 39.552z" />
-<glyph unicode="&#xe61e;" glyph-name="help-alt" data-tags="ico-help-alt" d="M512 960c-282.752 0-512-229.248-512-512s229.248-512 512-512 512 229.248 512 512-229.248 512-512 512zM896 448c0-82.816-26.624-159.36-71.36-222.144l-69.376 69.376c27.968 44.352 44.736 96.448 44.736 152.768s-16.768 108.416-44.736 152.768l69.376 69.376c44.736-62.784 71.36-139.328 71.36-222.144zM199.36 225.856c-44.736 62.784-71.36 139.328-71.36 222.144s26.624 159.36 71.36 222.144l69.376-69.376c-27.968-44.352-44.736-96.448-44.736-152.768s16.768-108.416 44.736-152.768l-69.376-69.376zM310.4 448c0 111.168 90.432 201.6 201.6 201.6s201.6-90.432 201.6-201.6c0-111.168-90.432-201.6-201.6-201.6s-201.6 90.432-201.6 201.6zM734.144 760.64l-69.376-69.376c-44.352 27.968-96.448 44.736-152.768 44.736s-108.416-16.768-152.768-44.736l-69.376 69.376c62.784 44.736 139.328 71.36 222.144 71.36s159.36-26.624 222.144-71.36zM289.856 135.36l69.376 69.376c44.352-27.968 96.448-44.736 152.768-44.736s108.416 16.768 152.768 44.736l69.376-69.376c-62.784-44.736-139.328-71.36-222.144-71.36s-159.36 26.624-222.144 71.36z" />
-<glyph unicode="&#xe61f;" glyph-name="help" data-tags="ico-help" d="M512 960c-282.752 0-512-229.248-512-512s229.248-512 512-512 512 229.248 512 512-229.248 512-512 512zM534.272 170.112h-94.4v90.56h94.4v-90.56zM534.272 357.44v-29.952h-94.4v36.864c0 111.296 126.656 128.96 126.656 208 0 36.032-32.256 63.68-74.432 63.68-43.776 0-82.112-32.192-82.112-32.192l-53.76 66.752c0 0 52.992 55.232 144.32 55.232 86.72 0 167.296-53.696 167.296-144.256 0-126.656-133.568-141.248-133.568-224.128z" />
-<glyph unicode="&#xe620;" glyph-name="code" data-tags="ico-code" d="M832 832c35.264 0 64-28.736 64-64v-640c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v640c0 35.264 28.736 64 64 64h640zM832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192v0zM851.072 451.904l-147.072 147.072c-18.752 18.752-49.152 18.752-67.904 0s-18.752-49.152 0-67.904l112-112-113.088-113.152c-18.752-18.752-18.752-49.152 0-67.904s49.152-18.752 67.904 0l141.44 141.44c2.24 1.6 4.736 2.496 6.784 4.48 18.688 18.816 18.688 49.216-0.064 67.968zM390.144 598.976c-18.752 18.752-49.152 18.752-67.904 0l-141.44-141.44c-2.176-1.6-4.736-2.496-6.72-4.544-18.752-18.752-18.752-49.152 0-67.904l147.072-147.072c18.752-18.752 49.152-18.752 67.904 0s18.752 49.152 0 67.904l-112 112 113.152 113.152c18.688 18.752 18.688 49.152-0.064 67.904zM512 768h64v-640h-64v640z" />
-<glyph unicode="&#xe621;" glyph-name="alert" data-tags="ico-alert" d="M512 960c-282.752 0-512-229.248-512-512s229.248-512 512-512 512 229.248 512 512-229.248 512-512 512zM512 96c-52.992 0-96 43.008-96 96s43.008 96 96 96 96-43.008 96-96c0-52.992-43.008-96-96-96zM576 384c-2.24-20.736-44.8-32-64-32s-61.76 11.264-64 32v384h128v-384z" />
-<glyph unicode="&#xe622;" glyph-name="edit" data-tags="ico-edit" d="M832 832c35.264 0 64-28.736 64-64v-640c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v640c0 35.264 28.736 64 64 64h640zM832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192v0zM192 288v-160h160l384 384-160 160zM853.312 632.96c14.208 14.208 14.208 35.584 0 49.792l-92.352 106.688c-14.208 14.016-35.584 14.016-49.792 0l-63.872-64.064 145.664-160 60.352 67.584z" />
-<glyph unicode="&#xe623;" glyph-name="image" data-tags="ico-image" d="M781.568 254.4l-125.76 239.424c-14.656 27.968-53.76 30.464-71.936 4.608l-93.632-133.376c-15.744-22.4-48.32-24.128-66.304-3.52l-44.16 50.496c-20.16 23.040-57.408 17.6-70.144-10.24l-68.16-149.44c-12.736-27.968 7.68-59.712 38.4-59.712h464.384c31.68-0.064 52.032 33.664 37.312 61.76zM462.976 609.792c0-51.712-41.92-93.632-93.632-93.632s-93.632 41.92-93.632 93.632c0 51.712 41.92 93.632 93.632 93.632s93.632-41.92 93.632-93.632zM832 832c35.264 0 64-28.736 64-64v-640c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v640c0 35.264 28.736 64 64 64h640zM832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192v0z" />
-<glyph unicode="&#xe624;" glyph-name="info" data-tags="ico-info" d="M512 832c211.712 0 384-172.288 384-384s-172.288-384-384-384-384 172.288-384 384 172.288 384 384 384zM512 960c-282.752 0-512-229.248-512-512s229.248-512 512-512 512 229.248 512 512-229.248 512-512 512v0zM576 640c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.346 28.654 64 64 64s64-28.654 64-64zM576 256h-128v192c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v-192zM608 192h-192c-17.664 0-32 14.336-32 32v0c0 17.664 14.336 32 32 32h192c17.664 0 32-14.336 32-32v0c0-17.664-14.336-32-32-32z" />
-<glyph unicode="&#xe625;" glyph-name="insights" data-tags="ico-insights" d="M879.936 594.752c0 203.2-164.736 367.936-367.936 367.936s-367.936-164.736-367.936-367.936c0-143.168 81.92-266.944 201.28-327.744l8.64-103.936h316.096l8.64 103.936c119.36 60.864 201.216 184.64 201.216 327.744zM512-61.248c70.4 0 130.304 47.488 148.288 113.216h-296.576c17.92-65.728 77.888-113.216 148.288-113.216z" />
-<glyph unicode="&#xe626;" glyph-name="locked-2" data-tags="ico-locked-2" d="M748.736 523.328v113.536c0 130.752-105.984 236.736-236.736 236.736s-236.8-105.984-236.8-236.736v-113.472c-62.848-13.248-110.464-69.312-110.464-135.936v-312.512c0-76.416 62.528-138.88 138.88-138.88h416.704c76.416 0 138.88 62.528 138.88 138.88v312.512c0.064 66.624-47.552 122.688-110.464 135.872zM512 769.408c73.088 0 132.608-59.456 132.608-132.608v-110.464h-265.216v110.528c0 73.088 59.52 132.544 132.608 132.544zM553.664 204.8v-29.184c0-22.912-18.752-41.664-41.664-41.664s-41.664 18.752-41.664 41.664v29.184c-16.512 12.672-27.776 31.744-27.776 54.144 0 38.336 31.104 69.44 69.44 69.44s69.44-31.104 69.44-69.44c0-22.4-11.264-41.408-27.776-54.144zM576 991.488c0-35.629-28.654-64.512-64-64.512s-64 28.883-64 64.512c0 35.629 28.654 64.512 64 64.512s64-28.883 64-64.512zM800 927.040c0-35.629-28.654-64.512-64-64.512s-64 28.883-64 64.512c0 35.629 28.654 64.512 64 64.512s64-28.883 64-64.512zM352 927.040c0-35.629-28.654-64.512-64-64.512s-64 28.883-64 64.512c0 35.629 28.654 64.512 64 64.512s64-28.883 64-64.512zM960 765.824c0-35.629-28.654-64.512-64-64.512s-64 28.883-64 64.512c0 35.629 28.654 64.512 64 64.512s64-28.883 64-64.512zM224 765.824c0-35.629-28.654-64.512-64-64.512s-64 28.883-64 64.512c0 35.629 28.654 64.512 64 64.512s64-28.883 64-64.512zM1024 576.512c0-35.629-28.654-64.512-64-64.512s-64 28.883-64 64.512c0 35.629 28.654 64.512 64 64.512s64-28.883 64-64.512zM128 576.512c0-35.629-28.654-64.512-64-64.512s-64 28.883-64 64.512c0 35.629 28.654 64.512 64 64.512s64-28.883 64-64.512z" />
-<glyph unicode="&#xe627;" glyph-name="locked" data-tags="ico-locked" d="M769.856 577.472v123.968c0 142.784-115.776 258.56-258.56 258.56s-258.56-115.776-258.56-258.56v-123.968c-68.736-14.464-120.768-75.648-120.768-148.416v-341.312c0-83.456 68.288-151.68 151.68-151.68h455.104c83.456 0 151.68 68.288 151.68 151.68v341.312c0.064 72.768-51.904 134.016-120.576 148.416zM511.232 846.208c79.872 0 144.832-64.96 144.832-144.832v-120.64h-289.6v120.704c0 79.808 64.96 144.768 144.768 144.768zM556.8 229.568v-31.936c0-25.024-20.48-45.504-45.504-45.504s-45.504 20.48-45.504 45.504v31.936c-17.984 13.888-30.336 34.624-30.336 59.136 0 41.92 33.984 75.84 75.84 75.84 41.92 0 75.84-33.984 75.84-75.84 0-24.448-12.352-45.248-30.336-59.136z" />
-<glyph unicode="&#xe628;" glyph-name="locked-3" data-tags="ico-locked-3" d="M769.856 577.472v123.968c0 142.784-115.776 258.56-258.56 258.56s-258.56-115.776-258.56-258.56v-123.968c-68.736-14.464-120.768-75.648-120.768-148.416v-341.312c0-83.456 68.288-151.68 151.68-151.68h455.104c83.456 0 151.68 68.288 151.68 151.68v341.312c0.064 72.768-51.904 134.016-120.576 148.416zM511.232 846.208c79.872 0 144.832-64.96 144.832-144.832v-120.64h-289.6v120.704c0 79.808 64.96 144.768 144.768 144.768zM556.8 229.568v-31.936c0-25.024-20.48-45.504-45.504-45.504s-45.504 20.48-45.504 45.504v31.936c-17.984 13.888-30.336 34.624-30.336 59.136 0 41.92 33.984 75.84 75.84 75.84 41.92 0 75.84-33.984 75.84-75.84 0-24.448-12.352-45.248-30.336-59.136z" />
-<glyph unicode="&#xe629;" glyph-name="locked-4" data-tags="ico-locked-4" d="M512 960c-282.752 0-512-229.248-512-512s229.248-512 512-512 512 229.248 512 512-229.248 512-512 512zM624.192 303.424c7.808-23.296-9.6-47.424-34.176-47.424h-156.032c-24.576 0-41.984 24.128-34.176 47.424l35.52 106.624c-30.976 23.36-51.328 60.16-51.328 101.952 0 70.72 57.344 128 128 128s128-57.28 128-128c0-41.792-20.352-78.592-51.328-101.952l35.52-106.624z" />
-<glyph unicode="&#xe62a;" glyph-name="maximise" data-tags="ico-maximise" d="M752.96 616.512l168.512 168.448v-80.96c0-28.544 23.040-51.264 51.264-51.264s51.264 22.72 51.264 51.264v256h-256c-28.288 0-51.264-23.040-51.264-51.264s22.72-51.264 51.264-51.264h81.216l-168.704-168.512c-20.032-19.968-20.032-52.48 0-72.448 19.968-20.032 52.48-20.032 72.448 0v0zM250.048-64c28.224 0 51.008 23.040 51.008 51.264 0 28.288-22.784 51.264-51.008 51.264h-75.008l168.512 168.512c19.968 19.968 19.968 52.48 0 72.512-10.048 9.984-23.040 14.976-36.288 14.976-12.992 0-26.24-4.992-36.224-14.976l-174.784-174.784v87.232c0 28.288-22.72 51.264-51.2 51.264-28.288 0-45.056-22.976-45.056-51.264v-256h250.048zM768 384v-128c0-35.328-28.672-64-64-64h-128c-35.328 0-64-28.672-64-64v0c0-35.328 28.672-64 64-64h128c106.048 0 192 85.952 192 192v128c0 35.328-28.672 64-64 64v0c-35.328 0-64-28.672-64-64zM256 512v128c0 35.328 28.672 64 64 64h128c35.328 0 64 28.672 64 64v0c0 35.328-28.672 64-64 64h-128c-106.048 0-192-85.952-192-192v-128c0-35.328 28.672-64 64-64v0c35.328 0 64 28.672 64 64z" />
-<glyph unicode="&#xe62b;" glyph-name="minimise" data-tags="ico-minimise" d="M0 32v0c0 52.8 43.2 96 96 96h832c52.8 0 96-43.2 96-96v0c0-52.8-43.2-96-96-96h-832c-52.8 0-96 43.2-96 96z" />
-<glyph unicode="&#xe62c;" glyph-name="minus" data-tags="ico-minus" d="M512 960c-282.752 0-512-229.248-512-512s229.248-512 512-512 512 229.248 512 512-229.248 512-512 512zM682.688 362.688h-341.376c-47.104 0-85.312 38.208-85.312 85.312s38.208 85.312 85.312 85.312h341.312c47.168 0 85.376-38.208 85.376-85.312s-38.208-85.312-85.312-85.312z" />
-<glyph unicode="&#xe62d;" glyph-name="newtab" data-tags="ico-newtab" d="M832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192zM832 64h-640c-35.264 0-64 28.736-64 64v640c0 35.264 28.736 64 64 64h256v-256h448v-448c0-35.264-28.736-64-64-64z" />
-<glyph unicode="&#xe62e;" glyph-name="ok" data-tags="ico-ok" d="M988.352 635.712l-538.944-485.056c-20.544-18.496-46.336-27.712-72.128-27.712-27.712 0-55.296 10.624-76.224 31.616l-269.504 269.504c-42.112 42.112-42.112 110.336 0 152.448s110.336 42.112 152.448 0l197.184-197.184 462.976 416.64c44.288 39.808 112.32 36.416 152.192-8 39.808-44.224 36.224-112.448-8-152.256z" />
-<glyph unicode="&#xe62f;" glyph-name="open-source" data-tags="ico-open-source" d="M450.496 956.416c-225.024-26.24-410.496-204.48-444.416-428.48-31.296-206.784 61.312-394.24 214.656-500.416 31.808-22.016 76.096-9.856 93.376 24.768l86.144 172.288c13.184 26.432 8.96 59.648-13.44 78.912-54.336 46.592-82.496 122.624-57.792 203.904 17.536 57.728 64 105.024 121.6 123.008 131.84 41.28 253.376-56.64 253.376-182.4 0-58.368-26.432-110.272-67.712-145.344-21.888-18.56-26.176-50.944-13.312-76.608l86.848-173.76c17.344-34.752 61.824-46.72 93.76-24.576 133.12 92.352 220.416 245.952 220.416 420.288 0 303.040-263.232 544.576-573.504 508.416z" />
-<glyph unicode="&#xe630;" glyph-name="add" data-tags="ico-add" d="M512 960c-282.752 0-512-229.248-512-512s229.248-512 512-512 512 229.248 512 512-229.248 512-512 512zM682.688 362.688h-85.376v-85.312c0-47.168-38.208-85.376-85.312-85.376s-85.312 38.208-85.312 85.312v85.376h-85.376c-47.104 0-85.312 38.208-85.312 85.312s38.208 85.312 85.312 85.312h85.312v85.376c0.064 47.104 38.272 85.312 85.376 85.312s85.312-38.208 85.312-85.312v-85.312h85.312c47.168-0.064 85.376-38.272 85.376-85.376s-38.208-85.312-85.312-85.312z" />
-<glyph unicode="&#xe631;" glyph-name="puzzle" data-tags="ico-puzzle" d="M825.664 590.464c-7.68 7.68-4.544 20.544 5.76 23.936 30.592 9.984 58.24 31.040 76.352 64.512 21.76 40.192 20.864 91.136-2.752 130.304-47.36 78.592-150.912 87.68-211.328 27.264-13.312-13.312-23.040-28.672-29.44-45.12-5.248-13.376-21.76-17.728-31.872-7.616l-176.256 176.256-100.736-100.672c-17.472-17.536-19.2-43.84-7.872-65.792 26.112-50.56 17.92-114.24-24.448-156.608s-106.048-50.56-156.608-24.448c-21.952 11.328-48.256 9.6-65.792-7.872v0l-100.672-100.736 176.256-176.192c10.176-10.176 5.76-26.688-7.616-31.872-16.448-6.4-31.808-16.128-45.12-29.44-60.352-60.416-51.264-163.968 27.264-211.328 39.168-23.616 90.048-24.512 130.304-2.752 33.472 18.112 54.528 45.76 64.512 76.352 3.392 10.304 16.256 13.44 23.936 5.76l181.632-181.632 100.672 100.672c17.472 17.472 19.2 43.776 7.872 65.792-26.048 50.56-17.92 114.24 24.448 156.608s106.048 50.56 156.608 24.448c22.016-11.328 48.256-9.6 65.792 7.872v0l100.672 100.672-181.568 181.632z" />
-<glyph unicode="&#xe632;" glyph-name="refresh" data-tags="ico-refresh" d="M507.84 959.744h1.984c1.024 0.384 1.472 0.192 2.24 0.192 132.48 0 261.312-52.736 356.608-145.024l79.68 80.768c20.16 20.416 54.976 6.144 54.976-22.528v-263.168c0-35.328-28.672-64-64-64l-257.6 1.6c-27.904 0.192-41.984 33.728-22.592 53.76l79.68 82.112c-61.44 59.2-141.312 91.52-229.184 91.52-179.072-0.832-324.864-147.584-324.864-329.536 1.28-160.576 119.552-294.4 275.328-320.064 31.296-5.184 54.592-31.36 54.464-63.040l-0.256-50.176c-0.192-46.144-34.56-76.48-72.832-70.976-246.784 35.456-439.808 248.064-441.472 506.88 0 279.872 227.52 509.248 507.84 511.68v0z" />
-<glyph unicode="&#xe633;" glyph-name="reload" data-tags="ico-reload" d="M268.288 680.832c113.024 113.152 285.888 129.28 416.576 49.28-44.288-43.776-95.296-94.976-95.296-94.976-35.84-42.88 4.288-67.648 24.768-66.944h289.856c35.328 0 64 28.672 64 64v287.296c1.536 29.888-31.424 59.072-65.6 25.6 0 0-56.32-54.912-95.104-93.376-199.040 145.216-479.424 128.768-659.2-50.88-87.168-87.104-135.552-197.824-146.048-311.488-3.52-37.504 26.56-69.824 64.192-69.824h41.728c33.152 0 59.84 25.344 63.36 58.304 7.808 74.112 39.872 146.112 96.768 203.008v0zM895.296 476.544c-33.152 0-59.84-25.344-63.36-58.304-7.872-74.24-39.936-146.24-96.832-203.136-113.152-112.96-285.888-129.152-416.576-49.28 44.288 43.776 95.296 94.912 95.296 94.912 35.712 42.944-4.48 67.648-24.768 66.944h-289.92c-35.2 0-64-28.8-64-64v-287.104c-1.344-30.016 31.616-59.072 65.6-25.6 0 0 56.32 54.784 95.296 93.376 198.976-145.472 479.36-128.96 658.944 50.816 87.104 86.976 135.616 197.76 146.24 311.488 3.52 37.44-26.624 69.824-64.256 69.824h-41.664z" />
-<glyph unicode="&#xe634;" glyph-name="search" data-tags="ico-search" d="M448 832c176.448 0 320-143.552 320-320s-143.552-320-320-320-320 143.552-320 320 143.552 320 320 320zM448 960c-247.424 0-448-200.576-448-448s200.576-448 448-448 448 200.576 448 448-200.576 448-448 448v0zM640 192l229.504-229.504c35.328-35.328 92.672-35.328 128 0v0c35.328 35.328 35.328 92.672 0 128l-229.504 229.504-128-128z" />
-<glyph unicode="&#xe635;" glyph-name="users" data-tags="ico-users" d="M640 576c0-84.736-43.264-192-128-192s-128 107.264-128 192 43.264 160 128 160 128-75.264 128-160zM768 64c16.576 0 64 10.688 64 10.688 0 0.128 0 0.256 0 0.32 0 135.36-143.296 308.992-320 308.992s-320-173.632-320-308.928c0-0.128 0-0.256 0-0.32s47.424-10.752 64-10.752h512zM896 512c0-59.328-36.672-128-96-128s-96 68.672-96 128 36.672 128 96 128 96-68.672 96-128zM1002.432 124.928c11.584 0 21.504 10.368 21.568 23.424 0 0.064 0 0.192 0 0.256 0 94.656-100.288 235.392-224 235.392s-224-140.736-224-235.456c0-0.064 0-0.192 0-0.256 0-13.056 9.92-23.424 21.568-23.424h404.864zM426.432 124.928c11.648 0 21.568 10.304 21.568 23.36 0 0.064 0 0.192 0 0.256 0 94.72-100.288 235.456-224 235.456s-224-140.736-224-235.456c0-0.064 0-0.192 0-0.256 0-13.056 9.92-23.424 21.568-23.424h404.864zM320 512c0-59.328-36.672-128-96-128s-96 68.672-96 128 36.672 128 96 128 96-68.672 96-128z" />
-<glyph unicode="&#xe636;" glyph-name="server-alt" data-tags="ico-server-alt" d="M870.336 32c-6.016 0-12.096 1.408-17.792 4.416-18.752 9.856-25.984 33.152-16.128 51.904 220.864 419.712 12.48 702.208 3.52 714.048-12.8 16.832-9.6 40.896 7.168 53.76 16.768 12.736 40.768 9.792 53.76-7.040 10.24-13.312 248.192-331.648 3.584-796.48-6.912-13.12-20.288-20.608-34.112-20.608zM144.128 32c-13.824 0-27.2 7.488-34.048 20.544-244.608 464.832-6.656 783.168 3.584 796.48 12.992 16.832 36.992 19.776 53.76 7.040 16.768-12.8 19.968-36.864 7.168-53.76-9.024-11.84-217.408-294.336 3.52-713.984 9.856-18.752 2.624-41.984-16.128-51.904-5.696-2.944-11.84-4.416-17.856-4.416zM736 256h-480c-35.328 0-64-28.672-64-64v-64c0-35.328 28.672-64 64-64h480c35.328 0 64 28.672 64 64v64c0 35.328-28.672 64-64 64zM512 128h-224v64h224v-64zM672 128c-17.664 0-32 14.336-32 32s14.336 32 32 32 32-14.336 32-32c0-17.664-14.336-32-32-32zM736 512h-480c-35.328 0-64-28.672-64-64v-64c0-35.328 28.672-64 64-64h480c35.328 0 64 28.672 64 64v64c0 35.328-28.672 64-64 64zM512 384h-224v64h224v-64zM672 384c-17.664 0-32 14.336-32 32s14.336 32 32 32 32-14.336 32-32c0-17.664-14.336-32-32-32zM736 768h-480c-35.328 0-64-28.672-64-64v-64c0-35.328 28.672-64 64-64h480c35.328 0 64 28.672 64 64v64c0 35.328-28.672 64-64 64zM512 640h-224v64h224v-64zM672 640c-17.664 0-32 14.336-32 32s14.336 32 32 32 32-14.336 32-32c0-17.664-14.336-32-32-32z" />
-<glyph unicode="&#xe637;" glyph-name="server" data-tags="ico-server" d="M928 0h-224c-17.6 0-32-14.4-32-32s14.4-32 32-32h224c17.6 0 32 14.4 32 32s-14.4 32-32 32zM320 0h-224c-17.6 0-32-14.4-32-32s14.4-32 32-32h224c17.6 0 32 14.4 32 32s-14.4 32-32 32zM960 320h-896c-35.328 0-64-28.672-64-64v-128c0-35.328 28.672-64 64-64h384v-128h128v128h384c35.328 0 64 28.672 64 64v128c0 35.328-28.672 64-64 64zM320 192v-64h-224v128h224v-64zM832 128c-35.328 0-64 28.672-64 64s28.672 64 64 64 64-28.672 64-64c0-35.328-28.672-64-64-64zM960 640h-896c-35.328 0-64-28.672-64-64v-128c0-35.328 28.672-64 64-64h896c35.328 0 64 28.672 64 64v128c0 35.328-28.672 64-64 64zM320 512v-64h-224v128h224v-64zM832 448c-35.328 0-64 28.672-64 64s28.672 64 64 64 64-28.672 64-64c0-35.328-28.672-64-64-64zM960 960h-896c-35.328 0-64-28.672-64-64v-128c0-35.328 28.672-64 64-64h896c35.328 0 64 28.672 64 64v128c0 35.328-28.672 64-64 64zM320 832v-64h-224v128h224v-64zM832 768c-35.328 0-64 28.672-64 64s28.672 64 64 64 64-28.672 64-64c0-35.328-28.672-64-64-64z" />
-<glyph unicode="&#xe638;" glyph-name="hide" data-tags="ico-hide" d="M801.728 692.48l94.976 94.912-45.312 45.248-112.256-112.256c-68.48 26.624-145.408 43.776-227.136 43.776-282.176 0-510.912-201.344-510.912-316.16 0-73.152 87.488-176.512 220.8-244.864l-94.528-94.528 45.248-45.248 112 112c68.544-26.56 145.536-43.52 227.392-43.52 282.176 0 510.912 200.128 510.912 316.16 0 71.744-87.616 175.616-221.184 244.48zM286.912 448c0 123.712 100.288 224 224 224 50.56 0 96.704-17.344 134.144-45.632l-68.8-68.864c-19.2 11.52-41.344 18.496-65.344 18.496-70.72 0-128-57.28-128-128 0-24 6.976-46.144 18.496-65.344l-68.864-68.864c-28.224 37.504-45.632 83.648-45.632 134.208zM510.912 224c-49.984 0-95.744 16.96-132.992 44.672l69.056 69.056c18.88-11.008 40.512-17.728 63.936-17.728 70.656 0 128 57.28 128 128 0 23.424-6.72 45.056-17.728 63.936l69.056 69.056c27.712-37.248 44.672-82.944 44.672-132.992 0-123.712-100.288-224-224-224z" />
-<glyph unicode="&#xe639;" glyph-name="show" data-tags="ico-show" d="M513.088 764.16c-282.176 0-510.976-201.344-510.976-316.16 0-118.4 228.736-316.16 510.912-316.16s510.976 200.128 510.976 316.16c0 116.032-228.736 316.16-510.912 316.16zM512 224c-123.712 0-224 100.288-224 224s100.288 224 224 224 224-100.288 224-224c0-123.712-100.288-224-224-224zM640 448c0-70.692-57.308-128-128-128s-128 57.308-128 128c0 70.692 57.308 128 128 128s128-57.308 128-128z" />
-<glyph unicode="&#xe63a;" glyph-name="arrow-top" data-tags="ico-arrow-top" d="M288.64 224h446.72l-224 320z" />
-<glyph unicode="&#xe63b;" glyph-name="arrow-bottom" data-tags="ico-arrow-bottom" d="M735.36 544h-446.72l224-320z" />
-<glyph unicode="&#xe63c;" glyph-name="star" data-tags="ico-star" d="M512 960c-282.752 0-512-229.248-512-512s229.248-512 512-512 512 229.248 512 512-229.248 512-512 512zM735.36 477.568l-85.632-83.52c-5.568-5.44-8.128-13.248-6.784-20.928l20.224-117.888c3.328-19.328-16.96-34.048-34.304-24.896l-105.856 55.68c-6.912 3.648-15.104 3.648-22.016 0l-105.856-55.68c-17.344-9.088-37.568 5.632-34.304 24.896l20.224 117.888c1.344 7.68-1.216 15.488-6.784 20.928l-85.632 83.52c-14.016 13.696-6.272 37.504 13.12 40.32l118.4 17.216c7.68 1.088 14.336 5.952 17.792 12.928l52.928 107.264c8.64 17.536 33.728 17.536 42.368 0l52.928-107.264c3.392-7.040 10.048-11.84 17.728-12.992l118.4-17.216c19.392-2.752 27.072-26.624 13.056-40.256z" />
-<glyph unicode="&#xe63d;" glyph-name="success" data-tags="ico-success" d="M966.080 525.504c-54.464 16.064-75.776 81.728-41.216 126.72 49.152 63.808-15.168 152.32-91.072 125.376v0c-53.44-19.008-109.376 21.568-107.776 78.336 2.24 80.512-101.824 114.304-147.392 47.872v0c-32.064-46.848-101.184-46.848-133.248-0.064v0c-45.504 66.496-149.568 32.64-147.392-47.872 1.6-56.768-54.336-97.344-107.776-78.336v0c-75.904 27.008-140.224-61.504-91.072-125.312 34.624-44.992 13.248-110.72-41.216-126.72-77.248-22.784-77.248-132.16 0-154.944 54.464-16.064 75.776-81.728 41.216-126.72v0c-49.152-63.808 15.168-152.32 91.072-125.376v0c53.44 19.008 109.376-21.568 107.776-78.336-2.24-80.512 101.824-114.304 147.392-47.872 32.064 46.848 101.184 46.848 133.248 0 45.504-66.432 149.568-32.64 147.392 47.872-1.6 56.768 54.336 97.344 107.776 78.336v0c75.904-27.008 140.224 61.504 91.072 125.376v0c-34.624 44.992-13.248 110.72 41.216 126.72 77.248 22.72 77.248 132.16 0 154.944zM735.296 524.096l-252.608-227.392c-9.6-8.704-21.696-12.992-33.792-12.992-12.992 0-25.92 4.992-35.712 14.784l-126.4 126.4c-19.712 19.712-19.712 51.712 0 71.424s51.712 19.712 71.424 0l92.416-92.416 217.024 195.264c20.8 18.624 52.672 17.088 71.36-3.776 18.688-20.672 17.024-52.608-3.712-71.296z" />
-<glyph unicode="&#xe63e;" glyph-name="table-more" data-tags="ico-table-more" d="M320 384v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM704 384h-192c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64h192c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM320 576v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM704 576h-192c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64h192c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM320 192v0c-35.392 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM576 192h-64c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64h64c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM832-64v0c-35.328 0-64 28.672-64 64v256c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v-256c0-35.328-28.672-64-64-64zM640 128v0c0 35.328 28.672 64 64 64h256c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64h-256c-35.328 0-64 28.672-64 64zM832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h320c35.328 0 64 28.672 64 64v0c0 35.328-28.672 64-64 64h-320c-35.328 0-64 28.672-64 64v640c0 35.328 28.672 64 64 64h640c35.328 0 64-28.672 64-64v-320c0-35.328 28.672-64 64-64v0c35.328 0 64 28.672 64 64v320c0 106.048-85.952 192-192 192z" />
-<glyph unicode="&#xe63f;" glyph-name="table" data-tags="ico-table" d="M832 832c35.264 0 64-28.736 64-64v-640c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v640c0 35.264 28.736 64 64 64h640zM832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192v0zM320 384v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM704 384h-192c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64h192c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM320 576v0c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM704 576h-192c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64h192c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM320 192v0c-35.392 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64zM704 192h-192c-35.328 0-64 28.672-64 64v0c0 35.328 28.672 64 64 64h192c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64z" />
-<glyph unicode="&#xe640;" glyph-name="tag-cloud" data-tags="ico-tag-cloud" d="M740.288 448.64c0 0.576 0.064 1.088 0.064 1.664 0 55.232-44.8 100.032-100.032 100.032-23.36 0-44.8-8.064-61.824-21.504-26.24 48.96-77.824 82.368-137.28 82.368-85.888 0-155.584-69.632-155.584-155.584 0-2.048 0.256-4.032 0.32-6.080-31.488-12.544-53.952-43.392-53.952-79.296v-0.128c0-46.976 38.4-85.376 85.376-85.376h389.312c46.976 0 85.376 38.4 85.376 85.376v0.128c-0.064 35.072-21.44 65.28-51.776 78.4zM832 832c35.264 0 64-28.736 64-64v-640c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v640c0 35.264 28.736 64 64 64h640zM832 960h-640c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v640c0 106.048-85.952 192-192 192v0z" />
-<glyph unicode="&#xe641;" glyph-name="user" data-tags="ico-user" d="M605.632 375.104c0.384 3.072 1.792 5.696 1.792 8.832 0 7.296-2.368 13.888-4.16 20.608 90.304 62.784 154.176 206.656 154.176 309.952 0 135.616-109.888 245.504-245.44 245.504s-245.44-109.888-245.44-245.44c0-103.296 63.872-247.168 154.176-309.952-1.792-6.784-4.16-13.312-4.16-20.672 0-3.136 1.472-5.824 1.792-8.832-238.016-33.728-418.368-193.152-418.368-385.088 0-0.192 0-0.384 0-0.576 0.064-29.824 22.72-53.44 49.28-53.44h925.44c26.496 0 49.216 23.616 49.28 53.504 0 0.192 0 0.384 0 0.576 0 191.872-180.352 351.296-418.368 385.024z" />
-<glyph unicode="&#xe642;" glyph-name="user-add" data-tags="ico-user-add" d="M615.424 568.576c0-110.144-89.28-277.504-199.424-277.504s-199.424 167.36-199.424 277.504 89.28 199.424 199.424 199.424 199.424-89.28 199.424-199.424zM792-64c21.568 0 40 19.2 40 43.456 0 0.128 0 0.32 0 0.448 0 175.872-186.24 318.4-416 318.4s-416-142.528-416-318.4c0-0.128 0-0.32 0-0.448 0.064-24.256 18.496-43.456 40-43.456h752zM832 576v0c-35.328 0-64 28.672-64 64v256c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v-256c0-35.328-28.672-64-64-64zM640 768v0c0 35.328 28.672 64 64 64h256c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64h-256c-35.328 0-64 28.672-64 64z" />
-<glyph unicode="&#xe644;" glyph-name="visitor-profile" data-tags="ico-visitor-profile" d="M832 768c35.264 0 64-28.736 64-64v-512c0-35.264-28.736-64-64-64h-640c-35.264 0-64 28.736-64 64v512c0 35.264 28.736 64 64 64h640zM832 896h-640c-106.048 0-192-85.952-192-192v-512c0-106.048 85.952-192 192-192h640c106.048 0 192 85.952 192 192v512c0 106.048-85.952 192-192 192v0zM570.752 581.248c0-67.776-54.976-170.752-122.752-170.752s-122.752 102.976-122.752 170.752 54.976 122.752 122.752 122.752 122.752-54.976 122.752-122.752zM679.36 192c13.248 0 24.64 11.84 24.64 26.752 0 0.064 0 0.192 0 0.256 0 108.224-114.624 195.968-256 195.968s-256-87.744-256-195.968c0-0.064 0-0.192 0-0.256 0-14.912 11.392-26.752 24.64-26.752h462.72zM800 640h-128c-17.664 0-32-14.336-32-32s14.336-32 32-32h128c17.664 0 32 14.336 32 32s-14.336 32-32 32zM800 512h-128c-17.664 0-32-14.336-32-32s14.336-32 32-32h128c17.664 0 32 14.336 32 32s-14.336 32-32 32zM800 384h-64c-17.664 0-32-14.336-32-32s14.336-32 32-32h64c17.664 0 32 14.336 32 32s-14.336 32-32 32z" />
-<glyph unicode="&#xe645;" glyph-name="zoom-in" data-tags="ico-zoom-in" d="M448 832c176.448 0 320-143.552 320-320s-143.552-320-320-320-320 143.552-320 320 143.552 320 320 320zM448 960c-247.424 0-448-200.576-448-448s200.576-448 448-448 448 200.576 448 448-200.576 448-448 448v0zM640 192l229.504-229.504c35.328-35.328 92.672-35.328 128 0v0c35.328 35.328 35.328 92.672 0 128l-229.504 229.504-128-128zM448 320v0c-35.328 0-64 28.672-64 64v256c0 35.328 28.672 64 64 64v0c35.328 0 64-28.672 64-64v-256c0-35.328-28.672-64-64-64zM256 512v0c0 35.328 28.672 64 64 64h256c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64h-256c-35.328 0-64 28.672-64 64z" />
-<glyph unicode="&#xe646;" glyph-name="zoom-out" data-tags="ico-zoom-out" d="M448 832c176.448 0 320-143.552 320-320s-143.552-320-320-320-320 143.552-320 320 143.552 320 320 320zM448 960c-247.424 0-448-200.576-448-448s200.576-448 448-448 448 200.576 448 448-200.576 448-448 448v0zM640 192l229.504-229.504c35.328-35.328 92.672-35.328 128 0v0c35.328 35.328 35.328 92.672 0 128l-229.504 229.504-128-128zM256 512v0c0 35.328 28.672 64 64 64h256c35.328 0 64-28.672 64-64v0c0-35.328-28.672-64-64-64h-256c-35.328 0-64 28.672-64 64z" />
-<glyph unicode="&#xe647;" glyph-name="sign-out" data-tags="ico-sign-out" d="M1013.184 456.256v0c0-52.992-43.008-96-96-96h-576c-52.992 0-96 43.008-96 96v0c0 52.992 43.008 96 96 96h576c52.992 0 96-43.008 96-96zM985.024 388.352v0c-37.504-37.504-98.304-37.504-135.744 0l-271.552 271.552c-37.504 37.504-37.504 98.304 0 135.744v0c37.504 37.504 98.304 37.504 135.744 0l271.552-271.552c37.504-37.44 37.504-98.24 0-135.744zM985.024 507.648v0c37.504-37.504 37.504-98.304 0-135.744l-271.552-271.552c-37.504-37.504-98.304-37.504-135.744 0v0c-37.504 37.504-37.504 98.304 0 135.744l271.552 271.552c37.504 37.504 98.304 37.504 135.744 0zM469.184 64h-277.184c-35.328 0-64 28.672-64 64v640c0 35.328 28.672 64 64 64h277.184c35.328 0 64 28.672 64 64v0c0 35.328-28.672 64-64 64h-277.184c-106.048 0-192-85.952-192-192v-640c0-106.048 85.952-192 192-192h277.184c35.328 0 64 28.672 64 64v0c0 35.328-28.672 64-64 64z" />
-<glyph unicode="&#xe648;" glyph-name="sign-in" data-tags="uniE648" d="M768 456v0q0-39-28-67.5t-68-28.5h-576q-40 0-68 28t-28 68v0q0 40 28 68t68 28h576q40 0 68-28t28-68v0zM740 388v0q-28-28-68-28t-68 28l-271 272q-29 28-29 68t29 68v0q28 28 67.5 28t67.5-28l272-272q28-28 28-68t-28-68v0zM740 508v0q28-28 28-68t-28-68l-272-272q-28-28-67.5-28t-67.5 28v0q-29 28-29 68t29 68l271 272q28 28 68 28t68-28v0zM544 832h277q27 0 45.5-19t18.5-45v-640q0-26-18.5-45t-45.5-19h-277q-26 0-45-19t-19-45v0q0-26 19-45t45-19h277q80 0 136 56t56 136v640q0 80-56 136t-136 56h-277q-26 0-45-19t-19-45v0q0-26 19-45t45-19v0z" />
-<glyph unicode="&#xe649;" glyph-name="menu-hamburger" data-tags="uniE649" d="M799 576h-576q-26 0-45 19t-19 45v0q0 26 19 45t45 19h576q27 0 45.5-19t18.5-45v0q0-26-18.5-45t-45.5-19v0zM799 384h-576q-26 0-45 19t-19 45v0q0 26 19 45t45 19h576q27 0 45.5-19t18.5-45v0q0-26-18.5-45t-45.5-19v0zM799 192h-576q-26 0-45 19t-19 45v0q0 26 19 45t45 19h576q27 0 45.5-19t18.5-45v0q0-26-18.5-45t-45.5-19v0z" />
-<glyph unicode="&#xe64a;" glyph-name="menu-horiz" data-tags="uniE64A" d="M693 416v64q0 26 18.5 45t45.5 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19h-64q-27 0-45.5 19t-18.5 45v0zM437 416v64q0 26 18.5 45t45.5 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19h-64q-27 0-45.5 19t-18.5 45v0zM181 416v64q0 26 18.5 45t45.5 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19h-64q-27 0-45.5 19t-18.5 45v0z" />
-<glyph unicode="&#xe64b;" glyph-name="menu-verti" data-tags="uniE64B" d="M501 608h-64q-27 0-45.5 19t-18.5 45v64q0 26 18.5 45t45.5 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM501 352h-64q-27 0-45.5 19t-18.5 45v64q0 26 18.5 45t45.5 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM501 96h-64q-27 0-45.5 19t-18.5 45v64q0 26 18.5 45t45.5 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0z" />
-<glyph unicode="&#xe64c;" glyph-name="admin-administration" data-tags="uniE64C" d="M991 385v0q-16 11-24.5 27.5t-8.5 34.5v2q0 18 8.5 34.5t24.5 26.5v1q20 13 28.5 35.5t1.5 45.5q-2 7-4.5 14t-5.5 14q-8 23-28.5 36.5t-44.5 12.5v0q-20 0-37 8t-28 23q0 1-0.5 1h-0.5q-11 15-14 33.5t3 35.5v0q9 23 2 45.5t-27 37.5q-6 5-12 9.5t-13 8.5q-20 13-45 12.5t-44-15.5v0q-15-11-33.5-14t-36.5 3q-1 0-2 0.5t-2 0.5q-18 5-31 18t-19 31v0q-7 23-26 37.5t-43 15.5h-34q-24-1-43-15.5t-26-37.5v0q-6-18-19-31t-31-18q-1 0-2-0.5t-2-0.5q-17-6-36-3t-33 14h-1q-19 15-44 15.5t-45-12.5q-7-4-13-8.5t-12-9.5q-20-15-27-37.5t2-45.5v0q6-17 3-35.5t-14-33.5h-0.5t-0.5-1q-11-15-28-23t-36-8q-25 1-45.5-12.5t-28.5-36.5q-3-7-5.5-14t-4.5-14q-7-23 1.5-45.5t28.5-35.5v-1q16-10 24.5-26.5t8.5-34.5v-2q0-18-8.5-34.5t-24.5-26.5v-1q-20-13-28.5-35.5t-1.5-45.5q2-7 4.5-14t5.5-14q8-23 28.5-36.5t45.5-12.5v0q19 0 36-8t28-23q0-1 0.5-1h0.5q11-15 14-33.5t-3-35.5v0q-9-23-2-45.5t27-37.5q6-5 12-9.5t13-8.5q20-13 45-12.5t44 15.5h1q14 11 33 14t36-3q1 0 2-0.5t2-0.5q18-5 31-18t19-31v0q7-23 26-37.5t43-15.5h34q24 1 43 15.5t26 37.5v0q6 18 19 31t31 18q1 1 2 1h2q17 6 36 3t33-14h1q19-15 44-15.5t45 12.5q7 4 13 8.5t12 9.5q20 15 27 37.5t-2 45.5v0q-6 17-3 35.5t14 33.5h0.5t0.5 1q11 15 28 23t36 8v0q25-1 45.5 12.5t28.5 36.5q3 7 5.5 14t4.5 14q7 23-1.5 45.5t-28.5 35.5v0zM512 201q-53 0-99.5 19.5t-81.5 53-55 78.5-20 96 20 96 55 78.5 81.5 53 99.5 19.5 99.5-19.5 81.5-53 55-78.5 20-96-20-96-55-78.5-81.5-53-99.5-19.5v0zM608 448q0-38-28-65.5t-68-27.5-68 27.5-28 65.5 28 65.5 68 27.5 68-27.5 28-65.5v0z" />
-<glyph unicode="&#xe64d;" glyph-name="admin-development" data-tags="uniE64D" d="M576 64h-128q-27 0-45.5 19t-18.5 45v128q0 26 18.5 45t45.5 19h128q27 0 45.5-19t18.5-45v-128q0-26-18.5-45t-45.5-19v0zM576 576h-128q-26 0-45 19t-19 45v128q0 26 19 45t45 19h128q26 0 45-19t19-45v-128q0-26-19-45t-45-19v0zM256 64h-128q-26 0-45 19t-19 45v128q0 26 19 45t45 19h128q27 0 45.5-19t18.5-45v-128q0-26-18.5-45t-45.5-19v0zM896 64h-128q-27 0-45.5 19t-18.5 45v128q0 26 18.5 45t45.5 19h128q27 0 45.5-19t18.5-45v-128q0-26-18.5-45t-45.5-19v0zM896 491q0 13-9.5 17t-22.5 4h-352v171q0 13-9.5 22.5t-22.5 9.5-22.5-9.5-9.5-22.5v-171h-288q-13 0-22.5-4t-9.5-17v-192q0-14 9.5-23t22.5-9 22.5 9 9.5 23v149h256v-149q0-14 9.5-23t22.5-9 22.5 9 9.5 23v149h320v-171q0-13 9.5-22.5t22.5-9.5 22.5 9.5 9.5 22.5v214z" />
-<glyph unicode="&#xe64e;" glyph-name="admin-diagnostic" data-tags="uniE64E" d="M876 836q-112 0-180.5 17.5t-106.5 39-50.5 39.5-12.5 19q-2 4-5.5 6.5t-8.5 2.5v0q-5 0-8.5-2.5t-5.5-6.5q0-1-13-19t-50.5-39.5-106-39-180.5-17.5q-7 0-11-4.5t-4-10.5v-509q0-79 56-146t124.5-117 127.5-79.5l65-32.5q1 0 2.5-0.5t3.5-0.5 3.5 0.5 2.5 0.5l65 32.5t127.5 79.5 124.5 117.5 56 145.5v509q0 6-4 10.5t-11 4.5v0 0zM809 341q0-61-44-113.5t-97.5-92-100-62.5-50.5-25q-1 0-2.5-0.5t-2.5-0.5-2.5 0.5-2.5 0.5q-4 2-50.5 25t-100 62.5-97.5 92-44 113.5v399q0 5 3.5 8.5t8.5 3.5q175 0 224.5 44.5l49.5 44.5q1 4 4 6t7 2v0q4 0 7-2t4-6l49-44.5t225-44.5q5 0 8.5-3.5t3.5-8.5v-399zM730 484l-247-222q-7-6-15.5-9.5t-17.5-3.5-18 4-16 11l-123 123q-15 14-15 34.5t15 34.5q14 15 34.5 15t34.5-15l90-90 212 191q15 13 35.5 12t33.5-16q14-15 13-35.5t-16-33.5v0z" />
-<glyph unicode="&#xe64f;" glyph-name="admin-platform" data-tags="uniE64F" d="M960 960h-896q-26 0-45-19t-19-45v-640q0-26 19-45t45-19h320l-64-128h-33q-13 0-22-9t-9-22v-2q0-13 9-22t22-9h450q13 0 22 9t9 22v2q0 13-9 22t-22 9h-33l-64 128h320q26 0 45 19t19 45v640q0 26-19 45t-45 19v0zM960 384h-896v512h896v-512z" />
-<glyph unicode="&#xe650;" glyph-name="admin-settings" data-tags="uniE650" d="M97 710h108q10-42 45-69.5t79-27.5q45 0 79.5 27.5t45.5 69.5h473q14 0 23.5 9.5t9.5 23.5q0 13-9.5 22.5t-23.5 9.5h-473q-11 42-45.5 69.5t-79.5 27.5-79.5-27.5-45.5-69.5h-107q-14 0-23.5-9.5t-9.5-22.5q0-14 9.5-23.5t23.5-9.5v0 0zM329 806q27 0 45.5-18.5t18.5-45.5q0-26-18.5-44.5t-45.5-18.5q-26 0-44.5 18.5t-18.5 44.5q0 27 18.5 45.5t44.5 18.5v0 0zM927 481h-155q-10 41-45 68.5t-79 27.5q-45 0-79.5-27.5t-45.5-68.5h-426q-14 0-23.5-9.5t-9.5-23.5 9.5-23.5 23.5-9.5h426q11-41 45.5-68.5t79.5-27.5q44 0 79 27.5t45 68.5h155q14 0 23.5 9.5t9.5 23.5-9.5 23.5-23.5 9.5v0 0zM648 385q-27 0-45.5 18.5t-18.5 44.5 18.5 44.5 45.5 18.5q26 0 44.5-18.5t18.5-44.5-18.5-44.5-44.5-18.5v0 0zM927 186h-473q-11 42-45.5 69.5t-79.5 27.5-79.5-27.5-45.5-69.5h-107q-14 0-23.5-9.5t-9.5-23.5q0-13 9.5-22.5t23.5-9.5h108q10-42 45-69.5t79-27.5q45 0 79.5 27.5t45.5 69.5h473q14 0 23.5 9.5t9.5 22.5q0 14-9.5 23.5t-23.5 9.5v0 0zM329 90q-26 0-44.5 18.5t-18.5 44.5q0 27 18.5 45.5t44.5 18.5q27 0 45.5-18.5t18.5-45.5q0-26-18.5-44.5t-45.5-18.5v0 0z" />
-<glyph unicode="&#xe651;" glyph-name="reporting-actions" data-tags="uniE651" d="M803 515q0 52-16.5 98.5t-46.5 83.5-71 63-90 37v32q0 27-20 47t-47 20-47-20-20-47v-32q-49-11-90-37t-71-63-46.5-83.5-16.5-98.5v-246l-90-90v-45h762v45l-90 90v246zM512 0h18q23 3 39.5 18.5t23.5 35.5q3 7 6 16.5t3 19.5h-180q0-37 26.5-63.5t63.5-26.5v0 0z" />
-<glyph unicode="&#xe652;" glyph-name="reporting-dashboard" data-tags="uniE652" d="M288 608h-64q-26 0-45 19t-19 45v64q0 26 19 45t45 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM288 352h-64q-26 0-45 19t-19 45v64q0 26 19 45t45 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM288 96h-64q-26 0-45 19t-19 45v64q0 26 19 45t45 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM544 608h-64q-26 0-45 19t-19 45v64q0 26 19 45t45 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM544 352h-64q-26 0-45 19t-19 45v64q0 26 19 45t45 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM544 96h-64q-26 0-45 19t-19 45v64q0 26 19 45t45 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM800 608h-64q-26 0-45 19t-19 45v64q0 26 19 45t45 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM800 352h-64q-26 0-45 19t-19 45v64q0 26 19 45t45 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0zM800 96h-64q-26 0-45 19t-19 45v64q0 26 19 45t45 19h64q26 0 45-19t19-45v-64q0-26-19-45t-45-19v0z" />
-<glyph unicode="&#xe653;" glyph-name="reporting-ecommerce" data-tags="uniE653" d="M961 638h-640l-32 96q-3 16-14 38t-27 26l-171 32q-24 8-45.5-2.5t-29.5-34.5q-7-23 4.5-45t35.5-29l137-43 104-457q3-15 12-26t21-17v-13q0-41 29.5-70.5t70.5-29.5q42 0 71.5 29.5t29.5 70.5v7h159q0-2-0.5-3.5t-0.5-3.5q0-41 29.5-70.5t71.5-29.5 71.5 29.5 29.5 70.5v4t-1 4q19 2 33.5 15t18.5 33l96 314q2 13-12.5 59t-50.5 46v0zM416 114q-20 0-34.5 14.5t-14.5 34.5q0 21 14.5 35t34.5 14q21 0 35-14t14-35q0-20-14-34.5t-35-14.5v0 0zM776 114q-20 0-34.5 14.5t-14.5 34.5q0 21 14.5 35t34.5 14 34.5-14 14.5-35q0-20-14.5-34.5t-34.5-14.5v0 0zM833 319h-448q-15 0-15 32t15 32h448q15 0 20.5-32t-20.5-32v0zM897 447h-512q-15 0-15 32t15 32h512q15 0 15-32t-15-32v0 0z" />
-<glyph unicode="&#xe654;" glyph-name="reporting-goal" data-tags="uniE654" d="M512 960q-106 0-199.5-40t-163-109.5-109.5-163-40-199.5 40-199.5 109.5-163 163-109.5 199.5-40 199.5 40 163 109.5 109.5 163 40 199.5-40 199.5-109.5 163-163 109.5-199.5 40v0zM512 32q-86 0-162 32.5t-132.5 89-89 132.5-32.5 162 32.5 162 89 132.5 132.5 89 162 32.5 162-32.5 132.5-89 89-132.5 32.5-162-32.5-162-89-132.5-132.5-89-162-32.5v0zM512 768q-66 0-124.5-25t-102-68.5-68.5-102-25-124.5 25-124.5 68.5-102 102-68.5 124.5-25 124.5 25 102 68.5 68.5 102 25 124.5-25 124.5-68.5 102-102 68.5-124.5 25v0zM512 224q-46 0-87 17.5t-71.5 48-48 71.5-17.5 87 17.5 87 48 71.5 71.5 48 87 17.5 87-17.5 71.5-48 48-71.5 17.5-87-17.5-87-48-71.5-71.5-48-87-17.5v0zM608 448q0-40-28-68t-68-28-68 28-28 68 28 68 68 28 68-28 28-68v0z" />
-<glyph unicode="&#xe655;" glyph-name="reporting-referer" data-tags="uniE655" d="M293 719q0-20-14-34t-35-14q-20 0-34 14t-14 34 14 34.5 34 14.5q21 0 35-14.5t14-34.5v0zM423 719q0-20-14-34t-34-14q-21 0-35 14t-14 34 14 34.5 35 14.5q20 0 34-14.5t14-34.5v0zM554 719q0-20-14.5-34t-34.5-14-34.5 14-14.5 34 14.5 34.5 34.5 14.5 34.5-14.5 14.5-34.5v0zM832 960h-640q-80 0-136-56t-56-136v-640q0-80 56-136t136-56h640q80 0 136 56t56 136v640q0 80-56 136t-136 56v0zM192 832h640q26 0 45-19t19-45v-128h-768v128q0 26 19 45t45 19v0zM832 64h-640q-26 0-45 19t-19 45v448h768v-448q0-26-19-45t-45-19v0z" />
-<glyph unicode="&#xe656;" glyph-name="reporting-visitors" data-tags="uniE656" d="M1003 429v1l-1 1q-4 10-9.5 19.5t-11.5 17.5q-13 23-31.5 54t-37.5 62.5-37 59.5-30 45q-31 42-68.5 75t-90.5 33q-12 0-24-2t-24-6q-38-12-71-34.5t-44-69.5h-22q-11 47-44 69.5t-71 34.5q-12 4-24 6t-24 2q-53 0-90.5-33t-68.5-75q-12-17-30-45t-37-59.5-37-62.5-32-54q-6-9-11.5-18t-9.5-19l-1-1v-1q-10-22-15.5-46t-5.5-50q0-48 18.5-90.5t50-74.5 74.5-50.5 91-18.5q57 0 105 25t80 67h186q32-42 80.5-67t104.5-25q49 0 91.5 18.5t74 50.5 50 74.5 18.5 90.5q0 26-5.5 50t-15.5 46v0 0zM234 177q-65 0-110.5 46t-45.5 110q0 65 45.5 111t110.5 46 110.5-46 45.5-111q0-64-45.5-110t-110.5-46v0 0zM790 177q-65 0-110.5 46t-45.5 110q0 65 45.5 111t110.5 46 110.5-46 45.5-111q0-64-45.5-110t-110.5-46v0 0z" />
-<glyph unicode="&#xe657;" glyph-name="user-manage" data-tags="uniE657" d="M695 501q5 1 9 2t8 1q11 0 20 5.5t16 12.5l202 202q18 17 18 41.5t-18 41.5l-63 64q-17 17-41.5 17t-41.5-17l-202-201q-8-8-13-17.5t-6-19.5q0-5-0.5-9t-2.5-8q-4-17-0.5-33.5t15.5-28.5l40-39q12-12 28-15t32 1v0zM206 167l-10 10-50-40-83-132 21-22 132 84 40 50-9 9 167 167-42 41-166-167zM434 630q14 52 1 105.5t-53 94.5q-41 40-94.5 53.5t-104.5-0.5l116-116-30-114-114-30-116 116q-14-52-0.5-105t53.5-94q42-42 98.5-54.5t109.5 5.5l478-478q14-14 32-21t37-7q18 0 36 7t32 21q28 28 28 68t-28 69l-481 480zM855 29q-16 0-26.5 11t-10.5 26 10.5 26 26.5 11q15 0 26-11t11-26-11-26-26-11v0 0z" />
-<glyph unicode="&#xe658;" glyph-name="user-personal" data-tags="uniE658" d="M600 648q0-38-14.5-83t-39.5-83.5-58.5-64-71.5-25.5-71.5 25.5-58.5 64-39.5 83.5-14.5 83q0 76 54 130t130 54 130-54 54-130v0zM763 64q15 0 26 11.5t11 28.5v0 1q0 60-30 113.5t-82.5 93.5-122 63-149.5 23-149.5-23-122-63-82.5-93.5-30-113.5v-1q0-17 11-28.5t26-11.5h694zM944 736h-192q-20 0-34-14t-14-34 14-34 34-14h192q20 0 34 14t14 34-14 34-34 14v0zM944 544h-192q-20 0-34-14t-14-34 14-34 34-14h192q20 0 34 14t14 34-14 34-34 14v0zM944 352h-96q-20 0-34-14t-14-34 14-34 34-14h96q20 0 34 14t14 34-14 34-34 14v0z" />
-<glyph unicode="&#xe659;" glyph-name="user-platform" data-tags="uniE659" d="M960 896h-896q-26 0-45-19t-19-45v-640q0-26 19-45t45-19h320l-64-128h-33q-13 0-22-9t-9-22v-2q0-13 9-22t22-9h450q13 0 22 9t9 22v2q0 13-9 22t-22 9h-33l-64 128h320q26 0 45 19t19 45v640q0 26-19 45t-45 19v0zM960 320h-896v512h896v-512z" />
-<glyph unicode="&#xe85d;" glyph-name="assignment" data-tags="assignment" d="M742.038 585.592v92.444h-460.074v-92.444h460.074zM742.038 402.852v90.296h-460.074v-90.296h460.074zM604.444 217.962v92.444h-322.482v-92.444h322.482zM512 860.778c-25.798 0-45.148-19.348-45.148-45.148s19.348-47.298 45.148-47.298 45.148 21.498 45.148 47.298-19.348 45.148-45.148 45.148zM832.332 860.778c49.448 0 92.444-42.998 92.444-92.444v-640.666c0-49.448-42.998-92.444-92.444-92.444h-640.666c-49.448 0-92.444 42.998-92.444 92.444v640.666c0 49.448 42.998 92.444 92.444 92.444h191.34c19.348 53.748 68.796 92.444 128.992 92.444s109.644-38.698 128.992-92.444h191.34z" />
-<glyph unicode="&#xe868;" glyph-name="bug" data-tags="bug_report" d="M621.89 426.667v109.89h-219.78v-109.89h219.78zM621.89 209.447v107.335h-219.78v-107.335h219.78zM949 643.887v-107.335h-115c2.555-17.89 5.11-38.335 5.11-56.22v-53.665h109.89v-109.89h-109.89v-53.665c0-17.89-2.555-35.78-5.11-53.665h115v-109.89h-153.335c-56.22-97.11-163.555-163.555-283.665-163.555s-227.445 66.445-283.665 163.555h-153.335v109.89h115c-2.555 17.89-5.11 35.78-5.11 53.665v53.665h-109.89v109.89h109.89v53.665c0 17.89 2.555 38.335 5.11 56.22h-115v107.335h153.335c25.555 43.445 58.78 79.22 99.665 107.335l-89.445 89.445 76.665 76.665 120.11-117.555c25.555 5.11 51.11 7.665 76.665 7.665s51.11-2.555 76.665-7.665l120.11 117.555 76.665-76.665-89.445-89.445c40.89-28.11 74.11-63.89 99.665-107.335h153.335z" />
-<glyph unicode="&#xe88e;" glyph-name="info2" data-tags="info" d="M562.479 580.507v103.361h-100.958v-103.361h100.958zM562.479 169.465v307.681h-100.958v-307.681h100.958zM512 938.667c283.643 0 512-228.357 512-512s-228.357-512-512-512-512 228.357-512 512 228.357 512 512 512z" />
-<glyph unicode="&#xe88f;" glyph-name="info_outline" data-tags="info_outline" d="M461.521 580.507v103.361h100.958v-103.361h-100.958zM512 15.625c225.953 0 411.042 185.089 411.042 411.042s-185.089 411.042-411.042 411.042-411.042-185.089-411.042-411.042 185.089-411.042 411.042-411.042zM512 938.667c283.643 0 512-228.357 512-512s-228.357-512-512-512-512 228.357-512 512 228.357 512 512 512zM461.521 169.465v307.681h100.958v-307.681h-100.958z" />
-<glyph unicode="&#xe8b8;" glyph-name="settings" data-tags="settings" d="M512 246.385c98.554 0 180.282 81.728 180.282 180.282s-81.728 180.282-180.282 180.282-180.282-81.728-180.282-180.282 81.728-180.282 180.282-180.282zM894.197 376.188l108.169-84.131c9.615-7.211 12.019-21.634 4.808-33.653l-103.361-177.878c-7.211-12.019-19.23-14.423-31.249-9.615l-127.399 50.479c-26.441-19.23-55.286-38.46-86.535-50.479l-19.23-134.61c-2.404-12.019-12.019-21.634-24.038-21.634h-206.723c-12.019 0-21.634 9.615-24.038 21.634l-19.23 134.61c-31.249 12.019-60.094 28.845-86.535 50.479l-127.399-50.479c-12.019-4.808-24.038-2.404-31.249 9.615l-103.361 177.878c-7.211 12.019-4.808 26.441 4.808 33.653l108.169 84.131c-2.404 16.826-2.404 33.653-2.404 50.479s0 33.653 2.404 50.479l-108.169 84.131c-9.615 7.211-12.019 21.634-4.808 33.653l103.361 177.878c7.211 12.019 19.23 14.423 31.249 9.615l127.399-50.479c26.441 19.23 55.286 38.46 86.535 50.479l19.23 134.61c2.404 12.019 12.019 21.634 24.038 21.634h206.723c12.019 0 21.634-9.615 24.038-21.634l19.23-134.61c31.249-12.019 60.094-28.845 86.535-50.479l127.399 50.479c12.019 4.808 24.038 2.404 31.249-9.615l103.361-177.878c7.211-12.019 4.808-26.441-4.808-33.653l-108.169-84.131c2.404-16.826 2.404-33.653 2.404-50.479s0-33.653-2.404-50.479z" />
-<glyph unicode="&#xe900;" glyph-name="contacts" data-tags="contacts" d="M726 212.667v64c0 72-142 108-214 108s-214-36-214-108v-64h428zM512 650.667c-52 0-96-44-96-96s44-96 96-96 96 44 96 96-44 96-96 96zM854 768.667c46 0 84-40 84-86v-512c0-46-38-86-84-86h-684c-46 0-84 40-84 86v512c0 46 38 86 84 86h684zM170-85.333v86h684v-86h-684zM854 938.667v-86h-684v86h684z" />
-<glyph unicode="&#xe922;" glyph-name="evolution" data-tags="timeline" d="M982 596.667c0-46-40-84-86-84-8 0-16 0-22 2l-152-152c2-6 4-14 4-22 0-46-40-84-86-84s-86 38-86 84c0 8 2 16 4 22l-110 110c-6-2-14-4-22-4s-16 2-22 4l-194-194c2-6 4-14 4-22 0-46-40-86-86-86s-86 40-86 86 40 84 86 84c8 0 16 0 22-2l194 194c-2 6-2 14-2 22 0 46 38 86 84 86s86-40 86-86c0-8 0-16-2-22l108-108c6 2 14 2 22 2s16 0 22-2l152 150c-2 6-4 14-4 22 0 46 40 86 86 86s86-40 86-86z" />
-<glyph unicode="&#xe95e;" glyph-name="archive" data-tags="box-add, box, download, storage, inbox, archive" d="M832 896h-640l-192-192v-672c0-17.674 14.326-32 32-32h960c17.672 0 32 14.326 32 32v672l-192 192zM512 128l-320 256h192v192h256v-192h192l-320-256zM154.51 768l64 64h586.978l64-64h-714.978z" />
-<glyph unicode="&#xe9a5;" glyph-name="rocket" data-tags="rocket, jet, speed, spaceship, fast" d="M704 896l-320-320h-192l-192-256c0 0 203.416 56.652 322.066 30.084l-322.066-414.084 421.902 328.144c58.838-134.654-37.902-328.144-37.902-328.144l256 192v192l320 320 64 320-320-64z" />
-<glyph unicode="&#xe9aa;" glyph-name="lab" data-tags="lab, beta, beaker, test, experiment" d="M956.29 155.518l-316.29 527.024v213.458h32c17.6 0 32 14.4 32 32s-14.4 32-32 32h-320c-17.6 0-32-14.4-32-32s14.4-32 32-32h32v-213.458l-316.288-527.024c-72.442-120.734-16.512-219.518 124.288-219.518h640c140.8 0 196.73 98.784 124.29 219.518zM241.038 320l206.962 344.938v231.062h128v-231.062l206.964-344.938h-541.926z" />
-<glyph unicode="&#xea30;" glyph-name="transition" data-tags="shuffle, random, player" d="M768 256h-101.49l-160 160 160 160h101.49v-160l224 224-224 224v-160h-128c-16.974 0-33.252-6.744-45.254-18.746l-178.746-178.744-178.746 178.746c-12 12-28.28 18.744-45.254 18.744h-192v-128h165.49l160-160-160-160h-165.49v-128h192c16.974 0 33.252 6.742 45.254 18.746l178.746 178.744 178.746-178.744c12.002-12.004 28.28-18.746 45.254-18.746h128v-160l224 224-224 224v-160z" />
-<glyph unicode="&#xea5b;" glyph-name="funnel" data-tags="filter, funnel" d="M512 960c-282.77 0-512-71.634-512-160v-96l384-384v-320c0-35.346 57.306-64 128-64 70.692 0 128 28.654 128 64v320l384 384v96c0 88.366-229.23 160-512 160zM94.384 821.176c23.944 13.658 57.582 26.62 97.278 37.488 87.944 24.076 201.708 37.336 320.338 37.336 118.628 0 232.394-13.26 320.338-37.336 39.696-10.868 73.334-23.83 97.28-37.488 15.792-9.006 24.324-16.624 28.296-21.176-3.972-4.552-12.506-12.168-28.296-21.176-23.946-13.658-57.584-26.62-97.28-37.488-87.942-24.076-201.708-37.336-320.338-37.336s-232.394 13.26-320.338 37.336c-39.696 10.868-73.334 23.83-97.278 37.488-15.792 9.008-24.324 16.624-28.298 21.176 3.974 4.552 12.506 12.168 28.298 21.176z" />
-<glyph unicode="&#xea80;" glyph-name="embed" data-tags="embed, code, html, xml" horiz-adv-x="1280" d="M832 224l96-96 320 320-320 320-96-96 224-224zM448 672l-96 96-320-320 320-320 96 96-224 224zM701.298 809.481l69.468-18.944-191.987-704.026-69.468 18.944 191.987 704.026z" />
-<glyph unicode="&#xf102;" glyph-name="angle-double-up" data-tags="angle-double-up" horiz-adv-x="658" d="M614.286 201.143c0-4.571-2.286-9.714-5.714-13.143l-28.571-28.571c-3.429-3.429-8-5.714-13.143-5.714-4.571 0-9.714 2.286-13.143 5.714l-224.571 224.571-224.571-224.571c-3.429-3.429-8.571-5.714-13.143-5.714s-9.714 2.286-13.143 5.714l-28.571 28.571c-3.429 3.429-5.714 8.571-5.714 13.143s2.286 9.714 5.714 13.143l266.286 266.286c3.429 3.429 8.571 5.714 13.143 5.714s9.714-2.286 13.143-5.714l266.286-266.286c3.429-3.429 5.714-8.571 5.714-13.143zM614.286 420.571c0-4.571-2.286-9.714-5.714-13.143l-28.571-28.571c-3.429-3.429-8-5.714-13.143-5.714-4.571 0-9.714 2.286-13.143 5.714l-224.571 224.571-224.571-224.571c-3.429-3.429-8.571-5.714-13.143-5.714s-9.714 2.286-13.143 5.714l-28.571 28.571c-3.429 3.429-5.714 8.571-5.714 13.143s2.286 9.714 5.714 13.143l266.286 266.286c3.429 3.429 8.571 5.714 13.143 5.714s9.714-2.286 13.143-5.714l266.286-266.286c3.429-3.429 5.714-8.571 5.714-13.143z" />
-<glyph unicode="&#xf103;" glyph-name="angle-double-down" data-tags="angle-double-down" horiz-adv-x="658" d="M614.286 457.143c0-4.571-2.286-9.714-5.714-13.143l-266.286-266.286c-3.429-3.429-8.571-5.714-13.143-5.714s-9.714 2.286-13.143 5.714l-266.286 266.286c-3.429 3.429-5.714 8.571-5.714 13.143s2.286 9.714 5.714 13.143l28.571 28.571c3.429 3.429 8 5.714 13.143 5.714 4.571 0 9.714-2.286 13.143-5.714l224.571-224.571 224.571 224.571c3.429 3.429 8.571 5.714 13.143 5.714s9.714-2.286 13.143-5.714l28.571-28.571c3.429-3.429 5.714-8.571 5.714-13.143zM614.286 676.571c0-4.571-2.286-9.714-5.714-13.143l-266.286-266.286c-3.429-3.429-8.571-5.714-13.143-5.714s-9.714 2.286-13.143 5.714l-266.286 266.286c-3.429 3.429-5.714 8.571-5.714 13.143s2.286 9.714 5.714 13.143l28.571 28.571c3.429 3.429 8 5.714 13.143 5.714 4.571 0 9.714-2.286 13.143-5.714l224.571-224.571 224.571 224.571c3.429 3.429 8.571 5.714 13.143 5.714s9.714-2.286 13.143-5.714l28.571-28.571c3.429-3.429 5.714-8.571 5.714-13.143z" />
-</font></defs></svg> \ No newline at end of file
diff --git a/plugins/Morpheus/fonts/piwik.ttf b/plugins/Morpheus/fonts/piwik.ttf
deleted file mode 100644
index fe43033eec..0000000000
--- a/plugins/Morpheus/fonts/piwik.ttf
+++ /dev/null
Binary files differ
diff --git a/plugins/Morpheus/fonts/piwik.woff b/plugins/Morpheus/fonts/piwik.woff
deleted file mode 100644
index 2771e83c66..0000000000
--- a/plugins/Morpheus/fonts/piwik.woff
+++ /dev/null
Binary files differ
diff --git a/plugins/Morpheus/fonts/piwik.woff2 b/plugins/Morpheus/fonts/piwik.woff2
deleted file mode 100644
index 087a47c87b..0000000000
--- a/plugins/Morpheus/fonts/piwik.woff2
+++ /dev/null
Binary files differ
diff --git a/plugins/Morpheus/javascripts/ajaxHelper.js b/plugins/Morpheus/javascripts/ajaxHelper.js
index 56531ed1e6..03d15be891 100644
--- a/plugins/Morpheus/javascripts/ajaxHelper.js
+++ b/plugins/Morpheus/javascripts/ajaxHelper.js
@@ -72,12 +72,6 @@ function ajaxHelper() {
this.format = 'json';
/**
- * Should ajax request be asynchronous
- * @type {Boolean}
- */
- this.async = true;
-
- /**
* A timeout for the request which will override any global timeout
* @type {Boolean}
*/
@@ -372,17 +366,9 @@ function ajaxHelper() {
/**
* Send the request
- *
- * Note: Sending synchronous requests will be removed in Matomo 4
- *
- * @param {Boolean} [sync] indicates if the request should be synchronous (defaults to false)
* @return {void}
*/
- this.send = function (sync) {
- if (sync === true) {
- this.async = false;
- }
-
+ this.send = function () {
if ($(this.errorElement).length) {
$(this.errorElement).hide();
}
@@ -433,7 +419,7 @@ function ajaxHelper() {
url += $.param(parameters);
var ajaxCall = {
type: 'POST',
- async: this.async !== false,
+ async: true,
url: url,
dataType: this.format || 'json',
complete: this.completeCallback,
diff --git a/plugins/Morpheus/stylesheets/base/icons.css b/plugins/Morpheus/stylesheets/base/icons.css
index 5227e8720f..9f3d0c37dd 100644
--- a/plugins/Morpheus/stylesheets/base/icons.css
+++ b/plugins/Morpheus/stylesheets/base/icons.css
@@ -1,17 +1,3 @@
-/* piwik font is deprecated, please use matomo instead */
-
-/* @todo remove piwik font in Matomo 4.0 */
-@font-face {
- font-family: 'piwik';
- src:
- url('plugins/Morpheus/fonts/piwik.woff2?gnoj5m') format('woff2'),
- url('plugins/Morpheus/fonts/piwik.woff?gnoj5m') format('woff'),
- url('plugins/Morpheus/fonts/piwik.ttf?gnoj5m') format('truetype'),
- url('plugins/Morpheus/fonts/piwik.svg?gnoj5m#piwik') format('svg');
- font-weight: normal;
- font-style: normal;
-}
-
@font-face {
font-family: 'matomo';
src:
diff --git a/plugins/Morpheus/templates/demo.twig b/plugins/Morpheus/templates/demo.twig
index 50be27cbfc..c0a881c6d6 100644
--- a/plugins/Morpheus/templates/demo.twig
+++ b/plugins/Morpheus/templates/demo.twig
@@ -348,26 +348,68 @@
</div>
<div piwik-field uicontrol="multituple" name="multitupletext"
- data-title="Multiple values"
+ data-title="Multiple values (two)"
value="[]"
inline-help="Multi Tuple text and text"
ui-control-attributes='{"field1":{"key":"index","title":"Index","uiControl":"text","availableValues":null},"field2":{"key":"value","title":"Value","uiControl":"text","availableValues":null}}'>
</div>
<div piwik-field uicontrol="multituple" name="multitupletextvalue"
- data-title="Multiple values with values"
+ data-title="Multiple values with values (two)"
value='[{"index": "test", "value":"myfoo"},{"index": "test 2", "value":"myfoo 2"}]'
inline-help="Multi Tuple again."
ui-control-attributes='{"field1":{"key":"index","title":"Index","uiControl":"text","availableValues":null},"field2":{"key":"value","title":"Value","uiControl":"text","availableValues":null}}'>
</div>
<div piwik-field uicontrol="multituple" name="multitupleselect"
- data-title="Multiple values with select"
+ data-title="Multiple values with select (two)"
value='[{"index": "test", "value": "myfoo"}]'
inline-help="Multi Tuple select and text"
ui-control-attributes='{"field1":{"key":"index","title":"Index","uiControl":"select","availableValues":{"test":"test"}},"field2":{"key":"value","title":"Value","uiControl":"text","availableValues":null}}'>
</div>
+<div piwik-field uicontrol="multituple" name="multitupletext"
+ data-title="Multiple values (three)"
+ value="[]"
+ inline-help="Multi Tuple text and text"
+ ui-control-attributes='{"field1":{"key":"index","title":"Index","uiControl":"text","availableValues":null},"field2":{"key":"value","title":"Value","uiControl":"text","availableValues":null},"field3":{"key":"value2","title":"Value","uiControl":"text","availableValues":null}}'>
+</div>
+
+<div piwik-field uicontrol="multituple" name="multitupletextvalue"
+ data-title="Multiple values with values (three)"
+ value='[{"index": "test", "value":"myfoo"},{"index": "test 2", "value":"myfoo 2"}]'
+ inline-help="Multi Tuple again."
+ ui-control-attributes='{"field1":{"key":"index","title":"Index","uiControl":"text","availableValues":null},"field2":{"key":"value","title":"Value","uiControl":"text","availableValues":null},"field3":{"key":"value2","title":"Value","uiControl":"text","availableValues":null}}'>
+</div>
+
+<div piwik-field uicontrol="multituple" name="multitupleselect"
+ data-title="Multiple values with select (three)"
+ value='[{"index": "test", "value": "myfoo"}]'
+ inline-help="Multi Tuple select and text"
+ ui-control-attributes='{"field1":{"key":"index","title":"Index","uiControl":"select","availableValues":{"test":"test"}},"field2":{"key":"value","title":"Value","uiControl":"text","availableValues":null},"field3":{"key":"value2","title":"Value","uiControl":"text","availableValues":null}}'>
+</div>
+
+<div piwik-field uicontrol="multituple" name="multitupletext"
+ data-title="Multiple values (four)"
+ value="[]"
+ inline-help="Multi Tuple text and text"
+ ui-control-attributes='{"field1":{"key":"index","title":"Index","uiControl":"text","availableValues":null},"field2":{"key":"value","title":"Value","uiControl":"text","availableValues":null},"field3":{"key":"value2","title":"Value","uiControl":"text","availableValues":null},"field4":{"key":"value3","title":"Value","uiControl":"text","availableValues":null}}'>
+</div>
+
+<div piwik-field uicontrol="multituple" name="multitupletextvalue"
+ data-title="Multiple values with values (four)"
+ value='[{"index": "test", "value":"myfoo"},{"index": "test 2", "value":"myfoo 2"}]'
+ inline-help="Multi Tuple again."
+ ui-control-attributes='{"field1":{"key":"index","title":"Index","uiControl":"text","availableValues":null},"field2":{"key":"value","title":"Value","uiControl":"text","availableValues":null},"field3":{"key":"value2","title":"Value","uiControl":"text","availableValues":null},"field4":{"key":"value3","title":"Value","uiControl":"text","availableValues":null}}'>
+</div>
+
+<div piwik-field uicontrol="multituple" name="multitupleselect"
+ data-title="Multiple values with select (four)"
+ value='[{"index": "test", "value": "myfoo"}]'
+ inline-help="Multi Tuple select and text"
+ ui-control-attributes='{"field1":{"key":"index","title":"Index","uiControl":"select","availableValues":{"test":"test"}},"field2":{"key":"value","title":"Value","uiControl":"text","availableValues":null},"field3":{"key":"value2","title":"Value","uiControl":"text","availableValues":null},"field4":{"key":"value3","title":"Value","uiControl":"text","availableValues":null}}'>
+</div>
+
<div piwik-field uicontrol="multituple" name="multituplesingleselect"
data-title="Multi One Select"
value='[{"index": "test", "value": "myfoo"}]'
diff --git a/plugins/Morpheus/templates/layout.twig b/plugins/Morpheus/templates/layout.twig
index 54fc4b27c2..3eb7ba74ed 100644
--- a/plugins/Morpheus/templates/layout.twig
+++ b/plugins/Morpheus/templates/layout.twig
@@ -26,7 +26,7 @@
{% include "_jsGlobalVariables.twig" %}
{% include "_jsCssIncludes.twig" %}
- {%- if not isCustomLogo %}<link rel="manifest" href="plugins/CoreHome/javascripts/manifest.json">{% endif %}
+ {%- if not isCustomLogo %}<link rel="manifest" href="plugins/CoreHome/javascripts/manifest.json" crossorigin="use-credentials">{% endif %}
{% endblock %}
</head>
diff --git a/plugins/Morpheus/tests/UI/expected-screenshots/Morpheus_load.png b/plugins/Morpheus/tests/UI/expected-screenshots/Morpheus_load.png
index 1f169c6d72..2603bea45c 100644
--- a/plugins/Morpheus/tests/UI/expected-screenshots/Morpheus_load.png
+++ b/plugins/Morpheus/tests/UI/expected-screenshots/Morpheus_load.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6ba4b8e30468e93d5720ddc23baa0877eb424fadd808165cb2996cc75f59d26c
-size 1423939
+oid sha256:3185e9518fd5e6f0bb1829999511e9462fdee63a580d6b06aea41e0e15abff99
+size 1663363
diff --git a/plugins/MultiSites/API.php b/plugins/MultiSites/API.php
index 8caa71d0c6..fc4a5e34ae 100644
--- a/plugins/MultiSites/API.php
+++ b/plugins/MultiSites/API.php
@@ -161,7 +161,7 @@ class API extends \Piwik\Plugin\API
/**
* Same as getAll but for a unique Matomo site
- * @see Piwik\Plugins\MultiSites\API::getAll()
+ * @see \Piwik\Plugins\MultiSites\API::getAll()
*
* @param int $idSite Id of the Matomo site
* @param string $period The period type to get data for.
diff --git a/plugins/MultiSites/MultiSites.php b/plugins/MultiSites/MultiSites.php
index c4fbd355f9..f23379bb2d 100644
--- a/plugins/MultiSites/MultiSites.php
+++ b/plugins/MultiSites/MultiSites.php
@@ -13,7 +13,7 @@ use Piwik\Piwik;
class MultiSites extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/MultiSites/lang/de.json b/plugins/MultiSites/lang/de.json
index 1d33a6b86d..fa242b2271 100644
--- a/plugins/MultiSites/lang/de.json
+++ b/plugins/MultiSites/lang/de.json
@@ -3,6 +3,6 @@
"Evolution": "Entwicklung",
"LoadingWebsites": "Lade Websites",
"PluginDescription": "Zeige und vergleiche alle Websites und Apps im hilfreichen 'Alle Websites' Dashboard.",
- "TopLinkTooltip": "Vergleichen Sie Webanalytikstatistiken für alle Ihre Websites."
+ "TopLinkTooltip": "Vergleichen Sie Web-Analyse-Statistiken für alle Ihre Websites."
}
} \ No newline at end of file
diff --git a/plugins/MultiSites/tests/Fixtures/ManySitesWithVisits.php b/plugins/MultiSites/tests/Fixtures/ManySitesWithVisits.php
index 8305ad9b33..e8dc82b5cf 100644
--- a/plugins/MultiSites/tests/Fixtures/ManySitesWithVisits.php
+++ b/plugins/MultiSites/tests/Fixtures/ManySitesWithVisits.php
@@ -20,7 +20,7 @@ class ManySitesWithVisits extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
$this->trackFirstVisit($this->idSite);
@@ -31,7 +31,7 @@ class ManySitesWithVisits extends Fixture
$this->trackSecondVisit($siteId = 4);
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/MultiSites/tests/Integration/DashboardTest.php b/plugins/MultiSites/tests/Integration/DashboardTest.php
index 782d98e372..c382bc4790 100644
--- a/plugins/MultiSites/tests/Integration/DashboardTest.php
+++ b/plugins/MultiSites/tests/Integration/DashboardTest.php
@@ -13,7 +13,6 @@ use Piwik\Period;
use Piwik\Plugins\MultiSites\Dashboard;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
/**
* @group MultiSites
@@ -30,7 +29,7 @@ class DashboardTest extends IntegrationTestCase
private $numSitesToCreate = 3;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -38,7 +37,7 @@ class DashboardTest extends IntegrationTestCase
Fixture::createWebsite('2012-12-12 00:00:00', $ecommerce = 0, 'Site ' . $i);
}
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$this->dashboard = $this->getMockBuilder('Piwik\Plugins\MultiSites\Dashboard')
->setMethods(null)
diff --git a/plugins/MultiSites/tests/Integration/MultiSitesTest.php b/plugins/MultiSites/tests/Integration/MultiSitesTest.php
index 38505af702..d3d1b5eb59 100644
--- a/plugins/MultiSites/tests/Integration/MultiSitesTest.php
+++ b/plugins/MultiSites/tests/Integration/MultiSitesTest.php
@@ -23,7 +23,7 @@ class MultiSitesTest extends IntegrationTestCase
{
protected $idSiteAccess;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -68,9 +68,9 @@ class MultiSitesTest extends IntegrationTestCase
$output = FrontController::getInstance()->fetchDispatch('API');
- $this->assertContains('<item>', $output);
- $this->assertContains('</rss>', $output);
- $this->assertNotContains('error', $output);
+ self::assertStringContainsString('<item>', $output);
+ self::assertStringContainsString('</rss>', $output);
+ self::assertStringNotContainsString('error', $output);
$_GET = array();
}
diff --git a/plugins/Overlay/Overlay.php b/plugins/Overlay/Overlay.php
index 58d2f01349..4706be5ab9 100644
--- a/plugins/Overlay/Overlay.php
+++ b/plugins/Overlay/Overlay.php
@@ -12,7 +12,7 @@ namespace Piwik\Plugins\Overlay;
class Overlay extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
function registerEvents()
{
diff --git a/plugins/PrivacyManager/API.php b/plugins/PrivacyManager/API.php
index 26189dc030..c3405ca0e1 100644
--- a/plugins/PrivacyManager/API.php
+++ b/plugins/PrivacyManager/API.php
@@ -218,14 +218,15 @@ class API extends \Piwik\Plugin\API
$settings['delete_reports_older_than'] = $deleteReportsOlderThan;
- $settings['delete_reports_keep_basic_metrics'] = (int) $keepBasic;
- $settings['delete_reports_keep_day_reports'] = (int) $keepDay;
- $settings['delete_reports_keep_week_reports'] = (int) $keepWeek;
- $settings['delete_reports_keep_month_reports'] = (int) $keepMonth;
- $settings['delete_reports_keep_year_reports'] = (int) $keepYear;
- $settings['delete_reports_keep_range_reports'] = (int) $keepRange;
- $settings['delete_reports_keep_segment_reports'] = (int) $keepSegments;
- $settings['delete_logs_max_rows_per_query'] = PiwikConfig::getInstance()->Deletelogs['delete_logs_max_rows_per_query'];
+ $settings['delete_reports_keep_basic_metrics'] = (int) $keepBasic;
+ $settings['delete_reports_keep_day_reports'] = (int) $keepDay;
+ $settings['delete_reports_keep_week_reports'] = (int) $keepWeek;
+ $settings['delete_reports_keep_month_reports'] = (int) $keepMonth;
+ $settings['delete_reports_keep_year_reports'] = (int) $keepYear;
+ $settings['delete_reports_keep_range_reports'] = (int) $keepRange;
+ $settings['delete_reports_keep_segment_reports'] = (int) $keepSegments;
+ $settings['delete_logs_max_rows_per_query'] = PiwikConfig::getInstance()->Deletelogs['delete_logs_max_rows_per_query'];
+ $settings['delete_logs_unused_actions_max_rows_per_query'] = PiwikConfig::getInstance()->Deletelogs['delete_logs_unused_actions_max_rows_per_query'];
return $this->savePurgeDataSettings($settings);
}
diff --git a/plugins/PrivacyManager/Controller.php b/plugins/PrivacyManager/Controller.php
index 643e40a098..ec0af38070 100644
--- a/plugins/PrivacyManager/Controller.php
+++ b/plugins/PrivacyManager/Controller.php
@@ -59,14 +59,15 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
$settings['delete_reports_enable'] = Common::getRequestVar("enableDeleteReports", 0);
$deleteReportsOlderThan = Common::getRequestVar("deleteReportsOlderThan", 3);
$settings['delete_reports_older_than'] = $deleteReportsOlderThan < 2 ? 2 : $deleteReportsOlderThan;
- $settings['delete_reports_keep_basic_metrics'] = Common::getRequestVar("keepBasic", 0);
- $settings['delete_reports_keep_day_reports'] = Common::getRequestVar("keepDay", 0);
- $settings['delete_reports_keep_week_reports'] = Common::getRequestVar("keepWeek", 0);
- $settings['delete_reports_keep_month_reports'] = Common::getRequestVar("keepMonth", 0);
- $settings['delete_reports_keep_year_reports'] = Common::getRequestVar("keepYear", 0);
- $settings['delete_reports_keep_range_reports'] = Common::getRequestVar("keepRange", 0);
- $settings['delete_reports_keep_segment_reports'] = Common::getRequestVar("keepSegments", 0);
- $settings['delete_logs_max_rows_per_query'] = PiwikConfig::getInstance()->Deletelogs['delete_logs_max_rows_per_query'];
+ $settings['delete_reports_keep_basic_metrics'] = Common::getRequestVar("keepBasic", 0);
+ $settings['delete_reports_keep_day_reports'] = Common::getRequestVar("keepDay", 0);
+ $settings['delete_reports_keep_week_reports'] = Common::getRequestVar("keepWeek", 0);
+ $settings['delete_reports_keep_month_reports'] = Common::getRequestVar("keepMonth", 0);
+ $settings['delete_reports_keep_year_reports'] = Common::getRequestVar("keepYear", 0);
+ $settings['delete_reports_keep_range_reports'] = Common::getRequestVar("keepRange", 0);
+ $settings['delete_reports_keep_segment_reports'] = Common::getRequestVar("keepSegments", 0);
+ $settings['delete_logs_max_rows_per_query'] = PiwikConfig::getInstance()->Deletelogs['delete_logs_max_rows_per_query'];
+ $settings['delete_logs_unused_actions_max_rows_per_query'] = PiwikConfig::getInstance()->Deletelogs['delete_logs_unused_actions_max_rows_per_query'];
return $settings;
}
diff --git a/plugins/PrivacyManager/Dao/LogDataAnonymizer.php b/plugins/PrivacyManager/Dao/LogDataAnonymizer.php
index d4d7319acc..0ddf6c8ef2 100644
--- a/plugins/PrivacyManager/Dao/LogDataAnonymizer.php
+++ b/plugins/PrivacyManager/Dao/LogDataAnonymizer.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\PrivacyManager\Dao;
use Piwik\Common;
use Piwik\Db;
use Piwik\DbHelper;
-use Piwik\Network\IP;
+use Matomo\Network\IP;
use Piwik\Plugins\PrivacyManager\Config;
use Piwik\Plugins\PrivacyManager\IPAnonymizer;
use Piwik\Plugins\PrivacyManager\Tracker\RequestProcessor;
diff --git a/plugins/PrivacyManager/IPAnonymizer.php b/plugins/PrivacyManager/IPAnonymizer.php
index f92b4dccd1..2280492d55 100644
--- a/plugins/PrivacyManager/IPAnonymizer.php
+++ b/plugins/PrivacyManager/IPAnonymizer.php
@@ -9,7 +9,7 @@
namespace Piwik\Plugins\PrivacyManager;
use Piwik\Common;
-use Piwik\Network\IP;
+use Matomo\Network\IP;
/**
* Anonymize visitor IP addresses to comply with the privacy laws/guidelines in countries, such as Germany.
diff --git a/plugins/PrivacyManager/PrivacyManager.php b/plugins/PrivacyManager/PrivacyManager.php
index 99deb31fce..2586468eca 100644
--- a/plugins/PrivacyManager/PrivacyManager.php
+++ b/plugins/PrivacyManager/PrivacyManager.php
@@ -53,6 +53,7 @@ class PrivacyManager extends Plugin
'delete_logs_older_than' => 'Deletelogs',
'delete_logs_max_rows_per_query' => 'Deletelogs',
'delete_logs_unused_actions_schedule_lowest_interval' => 'Deletelogs',
+ 'delete_logs_unused_actions_max_rows_per_query' => 'Deletelogs',
'enable_auto_database_size_estimate' => 'Deletelogs',
'enable_database_size_estimate' => 'Deletelogs',
'delete_reports_enable' => 'Deletereports',
@@ -169,7 +170,7 @@ class PrivacyManager extends Plugin
}
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
@@ -193,9 +194,63 @@ class PrivacyManager extends Plugin
public function getClientSideTranslationKeys(&$translationKeys)
{
+ $translationKeys[] = 'General_Visit';
+ $translationKeys[] = 'General_Action';
+ $translationKeys[] = 'General_Details';
+ $translationKeys[] = 'General_VisitId';
+ $translationKeys[] = 'General_VisitorID';
+ $translationKeys[] = 'General_VisitorIP';
+ $translationKeys[] = 'General_UserId';
+ $translationKeys[] = 'General_Website';
+ $translationKeys[] = 'Live_ViewVisitorProfile';
$translationKeys[] = 'CoreAdminHome_SettingsSaveSuccess';
$translationKeys[] = 'CoreAdminHome_OptOutExplanation';
$translationKeys[] = 'CoreAdminHome_OptOutExplanationIntro';
+ $translationKeys[] = 'PrivacyManager_OptOutCustomize';
+ $translationKeys[] = 'PrivacyManager_FontColor';
+ $translationKeys[] = 'PrivacyManager_BackgroundColor';
+ $translationKeys[] = 'PrivacyManager_FontSize';
+ $translationKeys[] = 'PrivacyManager_FontFamily';
+ $translationKeys[] = 'PrivacyManager_OptOutHtmlCode';
+ $translationKeys[] = 'PrivacyManager_OptOutPreview';
+ $translationKeys[] = 'PrivacyManager_AnonymizeSites';
+ $translationKeys[] = 'PrivacyManager_AnonymizeRowDataFrom';
+ $translationKeys[] = 'PrivacyManager_AnonymizeRowDataTo';
+ $translationKeys[] = 'PrivacyManager_AnonymizeIp';
+ $translationKeys[] = 'PrivacyManager_AnonymizeIpHelp';
+ $translationKeys[] = 'PrivacyManager_AnonymizeLocation';
+ $translationKeys[] = 'PrivacyManager_AnonymizeLocationHelp';
+ $translationKeys[] = 'PrivacyManager_AnonymizeUserId';
+ $translationKeys[] = 'PrivacyManager_AnonymizeUserIdHelp';
+ $translationKeys[] = 'PrivacyManager_AnonymizeProcessInfo';
+ $translationKeys[] = 'PrivacyManager_AnonymizeDataNow';
+ $translationKeys[] = 'PrivacyManager_AnonymizeDataConfirm';
+ $translationKeys[] = 'PrivacyManager_UnsetVisitColumns';
+ $translationKeys[] = 'PrivacyManager_UnsetVisitColumnsHelp';
+ $translationKeys[] = 'PrivacyManager_UnsetActionColumns';
+ $translationKeys[] = 'PrivacyManager_UnsetActionColumnsHelp';
+ $translationKeys[] = 'PrivacyManager_SearchForDataSubject';
+ $translationKeys[] = 'PrivacyManager_FindDataSubjectsBy';
+ $translationKeys[] = 'PrivacyManager_NoDataSubjectsFound';
+ $translationKeys[] = 'PrivacyManager_DeleteVisitsConfirm';
+ $translationKeys[] = 'PrivacyManager_ResultTruncated';
+ $translationKeys[] = 'PrivacyManager_AddVisitorIdToSearch';
+ $translationKeys[] = 'PrivacyManager_AddVisitorIPToSearch';
+ $translationKeys[] = 'PrivacyManager_AddUserIdToSearch';
+ $translationKeys[] = 'PrivacyManager_ExportSelectedVisits';
+ $translationKeys[] = 'PrivacyManager_DeleteSelectedVisits';
+ $translationKeys[] = 'PrivacyManager_SelectWebsite';
+ $translationKeys[] = 'PrivacyManager_MatchingDataSubjects';
+ $translationKeys[] = 'PrivacyManager_VisitsMatchedCriteria';
+ $translationKeys[] = 'PrivacyManager_ExportingNote';
+ $translationKeys[] = 'PrivacyManager_DeletionFromMatomoOnly';
+ $translationKeys[] = 'PrivacyManager_ResultIncludesAllVisits';
+ $translationKeys[] = 'PrivacyManager_GdprTools';
+ $translationKeys[] = 'PrivacyManager_GdprToolsPageIntro1';
+ $translationKeys[] = 'PrivacyManager_GdprToolsPageIntro2';
+ $translationKeys[] = 'PrivacyManager_GdprToolsPageIntroAccessRight';
+ $translationKeys[] = 'PrivacyManager_GdprToolsPageIntroEraseRight';
+ $translationKeys[] = 'PrivacyManager_GdprToolsOverviewHint';
}
public function setTrackerCacheGeneral(&$cacheContent)
diff --git a/plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html b/plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html
index 37062f5d23..00b699fd85 100644
--- a/plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html
+++ b/plugins/PrivacyManager/angularjs/anonymize-log-data/anonymize-log-data.directive.html
@@ -3,7 +3,7 @@
<div class="form-group row">
<div class="col s12 input-field">
<div>
- <label for="anonymizeSite" class="siteSelectorLabel">Anonymize the data of this site(s)</label>
+ <label for="anonymizeSite" class="siteSelectorLabel">{{ 'PrivacyManager_AnonymizeSites'|translate }}</label>
<div piwik-siteselector
class="sites_autocomplete"
ng-model="anonymizeLogData.site"
@@ -18,7 +18,7 @@
<div class="form-group row">
<div class="col s6 input-field">
<div>
- <label for="anonymizeStartDate" class="active">Anonymize all raw data starting from:</label>
+ <label for="anonymizeStartDate" class="active">{{ 'PrivacyManager_AnonymizeRowDataFrom'|translate }}</label>
<input type="text" ng-model="anonymizeLogData.start_date"
class="anonymizeStartDate"
name="anonymizeStartDate">
@@ -26,7 +26,7 @@
</div>
<div class="col s6 input-field">
<div>
- <label for="anonymizeEndDate" class="active">Anonymize all raw data up to:</label>
+ <label for="anonymizeEndDate" class="active">{{ 'PrivacyManager_AnonymizeRowDataTo'|translate }}</label>
<input type="text" ng-model="anonymizeLogData.end_date"
class="anonymizeEndDate"
name="anonymizeEndDate">
@@ -35,28 +35,28 @@
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeIp"
- data-title="Anonymize IP"
+ data-title="{{ 'PrivacyManager_AnonymizeIp'|translate }}"
ng-model="anonymizeLogData.anonymizeIp"
- introduction="Visit"
- inline-help="This action cannot be undone. If enabled, for all visits during this duration the IP will be anonymized by at least 2 bytes, for example '192.168.xxx.xxx'. If you have currently configured to anonymize by 3 bytes, then this setting will be respected and all IPs will be anonymized by 3 bytes.">
+ introduction="{{ 'General_Visit'|translate }}"
+ inline-help="{{ 'PrivacyManager_AnonymizeIpHelp'|translate }}">
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeLocation"
- data-title="Anonymize Location"
+ data-title="{{ 'PrivacyManager_AnonymizeLocation'|translate }}"
ng-model="anonymizeLogData.anonymizeLocation"
- inline-help="This action cannot be undone. Re-evaluates the location based on the anonymized IP (at least 2 bytes of the IP will be anonymized).">
+ inline-help="{{ 'PrivacyManager_AnonymizeLocationHelp'|translate }}">
</div>
<div piwik-field uicontrol="checkbox" name="anonymizeTheUserId"
- data-title="Replace User ID with a pseudonym"
+ data-title="{{ 'PrivacyManager_AnonymizeUserId'|translate }}"
ng-model="anonymizeLogData.anonymizeUserId"
- inline-help="When you enable this option, the User ID will be replaced by a pseudonym to avoid directly storing and displaying personally identifiable information such as an email address. In technical terms: given your User ID, Matomo will process the User ID pseudonym using a salted hash function.<br/><br/><em>Note: replacing with a pseudonym is not the same as anonymisation. In GDPR terms: the User ID pseudonym still counts as personal data. The original User ID could still be identified if certain additional information is available (which only Matomo and your data processor has access to).</em>">
+ inline-help="{{ 'PrivacyManager_AnonymizeUserIdHelp'|translate }}">
</div>
<div class="form-group row">
<div class="col s12 m6">
<div>
- <label for="visit_columns">Unset visit columns</label>
+ <label for="visit_columns">{{ 'PrivacyManager_UnsetVisitColumns'|translate }}</label>
<div ng-repeat="(index, visitColumn) in anonymizeLogData.selectedVisitColumns"
class="selectedVisitColumns selectedVisitColumns{{ index }} multiple valign-wrapper">
@@ -79,23 +79,19 @@
<div class="col s12 m6">
<div class="form-help">
- <span class="inline-help">
- This action cannot be undone. A list of database columns in scope visit that you want to unset.
- Each value for that column will be set to its default value. Please note that if the same
- column exists in scope 'conversion', then this column will be deleted as well
- </span>
+ <span class="inline-help">{{ 'PrivacyManager_UnsetVisitColumnsHelp'|translate }}</span>
</div>
</div>
</div>
<div class="form-group row">
- <div class="col s12"><h3>Action</h3></div>
+ <div class="col s12"><h3>{{ 'General_Action'|translate }}</h3></div>
</div>
<div class="form-group row">
<div class="col s12 m6">
<div>
- <label for="action_columns">Unset action columns</label>
+ <label for="action_columns">{{ 'PrivacyManager_UnsetActionColumns'|translate }}</label>
<div ng-repeat="(index, actionColumn) in anonymizeLogData.selectedActionColumns"
class="selectedActionColumns selectedActionColumns{{ index }} multiple valign-wrapper">
@@ -118,24 +114,22 @@
<div class="col s12 m6">
<div class="form-help">
- <span class="inline-help">
- This action cannot be undone. A list of database columns in scope action that you want to unset. Each value for that column will be set to its default value.
- </span>
+ <span class="inline-help">{{ 'PrivacyManager_UnsetActionColumnsHelp'|translate }}</span>
</div>
</div>
</div>
- <p><span class="icon-info"></span> This action may take a long time and will therefore not be executed right away. You will be able to follow the current state of the process below. The anonymization should typically start within one hour.</p>
+ <p><span class="icon-info"></span> {{ 'PrivacyManager_AnonymizeProcessInfo'|translate }}</p>
<div piwik-save-button
class="anonymizePastData"
onconfirm="anonymizeLogData.scheduleAnonymization()"
data-disabled="!anonymizeLogData.anonymizeIp && !anonymizeLogData.anonymizeLocation && !anonymizeLogData.selectedVisitColumns && !anonymizeLogData.selectedActionColumns"
- value="Anonymize past data for the selected site and time">
+ value="{{ 'PrivacyManager_AnonymizeDataNow'|translate }}">
</div>
<div class="ui-confirm" id="confirmAnonymizeLogData">
- <h2>Are you sure you want to anonymize the data for the selected website(s) and time range? This action cannot be undone, data may be deleted as requested, and this process may take a long time.</h2>
+ <h2>{{ 'PrivacyManager_AnonymizeDataConfirm'|translate }}</h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>
diff --git a/plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html b/plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html
index e9fa7ea347..9d901734cd 100644
--- a/plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html
+++ b/plugins/PrivacyManager/angularjs/manage-gdpr/managegdpr.directive.html
@@ -1,24 +1,24 @@
<div class="manageGdpr">
- <div piwik-content-block content-title="GDPR Tools">
+ <div piwik-content-block content-title="{{ 'PrivacyManager_GdprTools'|translate }}">
<div class="intro">
<p>
- This page has been designed in order for you to exercise data subject rights.
+ {{ 'PrivacyManager_GdprToolsPageIntro1'|translate }}
<br /><br />
- Here you can exercise the rights of your users with our GDPR-friendly procedures:
+ {{ 'PrivacyManager_GdprToolsPageIntro2'|translate }}
<br />
</p>
<ol>
- <li>the right of access to all of their data (and the right to data portability),</li>
- <li>the right to erase some or all of their data (and the right to rectification).</li>
+ <li>{{ 'PrivacyManager_GdprToolsPageIntroAccessRight'|translate }}</li>
+ <li>{{ 'PrivacyManager_GdprToolsPageIntroEraseRight'|translate }}</li>
</ol>
- <p><br />In case you do not know what GDPR is, please refer to the <a ng-href="{{ manageGdpr.linkTo('gdprOverview') }}">GDPR overview</a>.</p>
+ <p><br /><span ng-bind-html="'PrivacyManager_GdprToolsOverviewHint'|translate:('<a href=\'' + manageGdpr.linkTo('gdprOverview') + '\'>'):('</a>')"></span></p>
</div>
- <h3>Search for a data subject</h3>
+ <h3>{{ 'PrivacyManager_SearchForDataSubject'|translate }}</h3>
<div class="form-group row">
<div class="col s12 input-field">
<div>
- <label for="gdprsite" class="siteSelectorLabel">Select a website</label>
+ <label for="gdprsite" class="siteSelectorLabel">{{ 'PrivacyManager_SelectWebsite'|translate }}</label>
<div piwik-siteselector
class="sites_autocomplete"
ng-model="manageGdpr.site"
@@ -33,7 +33,7 @@
<div class="form-group row segmentFilterGroup">
<div class="col s12">
<div>
- <label style="margin: 8px 0;display: inline-block;">Find data subjects by</label>
+ <label style="margin: 8px 0;display: inline-block;">{{ 'PrivacyManager_FindDataSubjectsBy'|translate }}</label>
<div piwik-segment-generator
visit-segments-only="1"
idsite="manageGdpr.site.id"
@@ -52,19 +52,17 @@
</div>
<div ng-show="!manageGdpr.dataSubjects.length && manageGdpr.hasSearched">
- <h2>No data subjects found</h2>
+ <h2>{{ 'PrivacyManager_NoDataSubjectsFound'|translate }}</h2>
</div>
<div ng-show="manageGdpr.dataSubjects.length">
- <h2>Matching data subjects</h2>
- <p>These visits match the selected criteria.
- In case you are exporting the data to exercise the right of access, please make sure the selected visits are actually performed by the data subject you want to export the data for.
- <br />
- <br />
- Please also note that any data will be only deleted from the Matomo database but not from your webserver logs. Also note that if you re-import any historical data, for example from logs, that any previously deleted data may be imported again.
-
+ <h2>{{ 'PrivacyManager_MatchingDataSubjects'|translate }}</h2>
+ <p>{{ 'PrivacyManager_VisitsMatchedCriteria'|translate }}
+ {{ 'PrivacyManager_ExportingNote'|translate }}
+ <br /> <br />
+ {{ 'PrivacyManager_DeletionFromMatomoOnly'|translate }}
<br /><br />
- The found results include all visits without any time restriction and include today.
+ {{ 'PrivacyManager_ResultIncludesAllVisits'|translate }}
</p>
<table piwik-content-table>
<thead>
@@ -75,18 +73,19 @@
ng-change="manageGdpr.toggleActivateAll()"
full-width="true">
</div>
- </th><th>Site</th>
- <th>Visit ID</th>
- <th>Visitor ID</th>
- <th>Visitor IP</th>
- <th>User ID</th>
- <th>Info</th>
- <th>Action</th>
+ </th>
+ <th>{{ 'General_Website'|translate }}</th>
+ <th>{{ 'General_VisitId'|translate }}</th>
+ <th>{{ 'General_VisitorID'|translate }}</th>
+ <th>{{ 'General_VisitorIP'|translate }}</th>
+ <th>{{ 'General_UserId'|translate }}</th>
+ <th>{{ 'General_Details'|translate }}</th>
+ <th>{{ 'General_Action'|translate }}</th>
</tr>
</thead>
<tbody>
<tr ng-show="(manageGdpr.dataSubjects|length) > 400">
- <td colspan="8">More than 400 results were found and the result was truncated to the first 400 visits.</td>
+ <td colspan="8">{{ 'PrivacyManager_ResultTruncated'|translate:('400') }}</td>
</tr>
<tr ng-repeat="(index, dataSubject) in manageGdpr.dataSubjects" title="Last action: {{ dataSubject.lastActionDateTime }}">
<td class="checkInclude">
@@ -97,9 +96,9 @@
</td>
<td class="site" title="(ID {{dataSubject.idSite}})">{{ dataSubject.siteName }}</td>
<td class="visitId">{{ dataSubject.idVisit }}</td>
- <td class="visitorId"><a ng-click="manageGdpr.addFilter('visitorId', dataSubject.visitorId)" title="Click to add this visitorID to the search">{{ dataSubject.visitorId }}</a></td>
- <td class="visitorIp"><a ng-click="manageGdpr.addFilter('visitIp', dataSubject.visitIp)" title="Click to add this visitorIP to the search">{{ dataSubject.visitIp }}</a></td>
- <td class="userId"><a ng-click="manageGdpr.addFilter('userId', dataSubject.userId)" title="Click to add this userID to the search">{{ dataSubject.userId }}</a></td>
+ <td class="visitorId"><a ng-click="manageGdpr.addFilter('visitorId', dataSubject.visitorId)" title="{{ 'PrivacyManager_AddVisitorIdToSearch'|translate }}">{{ dataSubject.visitorId }}</a></td>
+ <td class="visitorIp"><a ng-click="manageGdpr.addFilter('visitIp', dataSubject.visitIp)" title="{{ 'PrivacyManager_AddVisitorIPToSearch'|translate }}">{{ dataSubject.visitIp }}</a></td>
+ <td class="userId"><a ng-click="manageGdpr.addFilter('userId', dataSubject.userId)" title="{{ 'PrivacyManager_AddUserIdToSearch'|translate }}">{{ dataSubject.userId }}</a></td>
<td>
<span title="{{ dataSubject.deviceType }} {{ dataSubject.deviceModel }}"><img height="16" ng-src="{{ dataSubject.deviceTypeIcon }}"></span>
<span title="{{ dataSubject.operatingSystem }}"><img height="16" ng-src="{{ dataSubject.operatingSystemIcon }}"></span>
@@ -107,7 +106,7 @@
<span title="{{ dataSubject.country }} {{ dataSubject.region }}"><img height="16" ng-src="{{ dataSubject.countryFlag }}"></span>
</td>
<td><a class="visitorLogTooltip" title="View visitor profile" ng-click="manageGdpr.showProfile(dataSubject.visitorId, dataSubject.idSite)">
- <img src="plugins/Live/images/visitorProfileLaunch.png"> <span>View visitor profile</span>
+ <img src="plugins/Live/images/visitorProfileLaunch.png"> <span>{{ 'Live_ViewVisitorProfile'|translate }}</span>
</a></td>
</tr>
</tbody>
@@ -117,18 +116,18 @@
class="exportDataSubjects"
onconfirm="manageGdpr.exportDataSubject()"
data-disabled="!manageGdpr.hasActiveDataSubjects()"
- value="Export selected visits">
+ value="{{ 'PrivacyManager_ExportSelectedVisits'|translate }}">
</div>
<div piwik-save-button
class="deleteDataSubjects"
onconfirm="manageGdpr.deleteDataSubject()"
data-disabled="!manageGdpr.hasActiveDataSubjects() || manageGdpr.isDeleting"
- value="Delete selected visits">
+ value="{{ 'PrivacyManager_DeleteSelectedVisits'|translate }}">
</div>
</div>
<div class="ui-confirm" id="confirmDeleteDataSubject">
- <h2>Are you sure you want to delete the selected visits? This action cannot be undone. </h2>
+ <h2>{{ 'PrivacyManager_DeleteVisitsConfirm'|translate }}</h2>
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
</div>
diff --git a/plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html b/plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html
index cc1363d084..1afa765676 100644
--- a/plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html
+++ b/plugins/PrivacyManager/angularjs/opt-out-customizer/opt-out-customizer.directive.html
@@ -4,21 +4,21 @@
<span ng-bind-html="'General_ReadThisToLearnMore'|translate:'&lt;a rel=\'noreferrer noopener\' target=\'_blank\' href=\'https://matomo.org/faq/how-to/faq_25918/\'>':'&lt;/a>'"></span>
</p>
- <h3>Customize the Opt-out iframe</h3>
+ <h3>{{ 'PrivacyManager_OptOutCustomize'|translate }}</h3>
<div>
<p>
<span>
- Font Color:
+ {{ 'PrivacyManager_FontColor'|translate }}:
<input type="color" ng-model="optOutCustomizer.fontColor" ng-change="optOutCustomizer.onUpdate()">
</span>
<span>
- Background Color:
+ {{ 'PrivacyManager_BackgroundColor'|translate }}:
<input type="color" ng-model="optOutCustomizer.backgroundColor" ng-change="optOutCustomizer.onUpdate()">
</span>
<span>
- Font Size:
+ {{ 'PrivacyManager_FontSize'|translate }}:
<input id=FontSizeInput type="number" min="1" max="100" ng-model="optOutCustomizer.fontSize" ng-change="optOutCustomizer.updateFontSize()">
</span>
@@ -33,20 +33,20 @@
</span>
<span>
- Font Family:
+ {{ 'PrivacyManager_FontFamily'|translate }}:
<input id=FontFamilyInput type="text" ng-model="optOutCustomizer.fontFamily" ng-change="optOutCustomizer.onUpdate()">
</span>
</p>
</div>
</p>
- <h3>HTML code to embed on your website</h3>
+ <h3>{{ 'PrivacyManager_OptOutHtmlCode'|translate }}</h3>
<pre piwik-select-on-focus>&lt;iframe
style="border: 0; height: 200px; width: 600px;"
src="{{ optOutCustomizer.iframeUrl }}"
&gt;&lt;/iframe&gt;</pre>
<p ng-bind-html="'CoreAdminHome_OptOutExplanationIntro'|translate:'&lt;a href=\'' + optOutCustomizer.iframeUrl + '\' rel=\'noreferrer noopener\' target=\'_blank\'>':'&lt;/a>'">
</p>
- <h3>Preview of the Opt-out as it will appear on your website</h3>
+ <h3>{{ 'PrivacyManager_OptOutPreview'|translate }}</h3>
<iframe id="previewIframe" ng-src="{{ optOutCustomizer.iframeUrl }}" style="border: 1px solid #333; height: 200px; width: 600px;" />
</div>
diff --git a/plugins/PrivacyManager/lang/da.json b/plugins/PrivacyManager/lang/da.json
index 9d2b63c19b..fdf135a5e7 100644
--- a/plugins/PrivacyManager/lang/da.json
+++ b/plugins/PrivacyManager/lang/da.json
@@ -6,6 +6,7 @@
"AnonymizeIpMaskLength": "%1$s bytes - f.eks %2$s",
"AskingForConsent": "Samtykkeanmodning",
"ClickHereSettings": "Klik her for at få adgang til %s indstillinger.",
+ "AnonymizeUserId": "Erstat bruger-ID med et pseudonym",
"CurrentDBSize": "Nuværende databasestørrelse",
"DBPurged": "Databasen er opryddet.",
"DeleteDataInterval": "Slet gamle data hver",
diff --git a/plugins/PrivacyManager/lang/de.json b/plugins/PrivacyManager/lang/de.json
index c52fc82b27..6d6e8f7f35 100644
--- a/plugins/PrivacyManager/lang/de.json
+++ b/plugins/PrivacyManager/lang/de.json
@@ -8,6 +8,18 @@
"AnonymizeIpMaskLength": "%1$s byte(s) - z.B. %2$s",
"AskingForConsent": "Um Erlaubnis bitten",
"ClickHereSettings": "Hier klicken, um die %s Einstellungen zu bearbeiten.",
+ "WhenDoINeedConsent": "Wann muss ich die Zustimmung der Benutzer einholen?",
+ "HowDoIAskForConsent": "Wie bitte ich die Benutzer um Zustimmung?",
+ "AskForConsentFollowSteps": "Befolgen Sie die folgenden Schritte, um Ihre Benutzer um ihre Zustimmung zu bitten, bevor ihre Daten durch Matomo verarbeitet werden.",
+ "AskForConsentStep1": "Schritt 1: Zustimmung voraussetzen",
+ "AskForConsentStep3": "Schritt 3: Benutzer gibt seine Zustimmung",
+ "AskForConsentStep3DescANote3": "Es ist erforderlich, dass Sie Cookies nicht deaktivieren.",
+ "AskForConsentStep3DescB": "B) wenn Sie Ihr eigenes Tool zur Speicherung der Einwilligung verwenden",
+ "AskForConsentStep3DescBNote2": "Wenn der Benutzer seine Zustimmung gegeben hat, könnten Sie auch den Aufruf von %1$s von vornherein vermeiden.",
+ "AskForConsentStep4": "Schritt 4: Benutzer widerruft Zustimmung",
+ "AskForConsentStep4DescB": "B) wenn Sie Ihr eigenes Tool zur Speicherung der Einwilligung verwenden",
+ "AskForConsentStepNotes": "Anmerkungen:",
+ "AnonymizeUserId": "Benutzer ID mit Pseudonym austauschen",
"CurrentDBSize": "Aktuelle Größe der Datenbank",
"DBPurged": "Datenbank bereinigt.",
"DeleteBothConfirm": "Sie sind dabei, das Löschen von sowohl Berichts- als auch unbearbeiteten Daten zu aktivieren. Das wird Ihnen dauerhaft die Möglichkeit nehmen, auf alte Analysedaten zuzugreifen. Sind Sie sicher, dass Sie das wollen?",
diff --git a/plugins/PrivacyManager/lang/el.json b/plugins/PrivacyManager/lang/el.json
index c98216fd62..a09a5f2413 100644
--- a/plugins/PrivacyManager/lang/el.json
+++ b/plugins/PrivacyManager/lang/el.json
@@ -7,8 +7,69 @@
"AnonymizeIpMaskLengtDescription": "Επιλέξτε πόσα bytes από τις διευθύνσεις IP των επισκεπτών πρέπει να κρύβονται.",
"AnonymizeIpMaskLength": "%1$s byte - πχ. %2$s",
"AskingForConsent": "Ερώτημα για συναίνεση",
+ "ConsentExplanation": "Η συναίνεση σημαίνει την παροχή διαφορετικών επιλογών και τον έλεγχο του πως γίνεται η επεξεργασία των προσωπικών τους δεδομένων.",
"ClickHereSettings": "Πατήστε εδώ για να έχετε πρόσβαση στις ρυθμίσεις %s.",
+ "WhenDoINeedConsent": "Πότε χρειάζεται να ζητάω τη συναίνεση χρήστη;",
+ "WhenConsentIsNeeded1": "Στο πλαίσιο του κανονισμού ιδιωτικότητας GDPR, όταν επεξεργάζεστε προσωπικά δεδομένα, σε ορισμένες περιπτώσεις απαιτείται να ζητάτε τη συναίνεση από το χρήστη. Για να καθορίσετε αν πρέπει να ζητάτε τη συναίνεση, πρέπει να καθορίσετε αν η νομική σας βάση για την επεξεργασία προσωπικών δεδομένων είναι \"Συναίνεση\" ή \"Νόμιμο συμφέρον\" ή αν μπορείτε να αποφύγετε την συλλογή προσωπικών δεδομένων εξαρχής. Προτείνουμε να μάθετε περισσότερα για τη νομική βάση υπό το GDPR για το Matomo.",
+ "WhenConsentIsNeeded2": "Πρέπει να σημειωθεί ότι όταν απαιτείται να έχετε τις συναινέσεις χρηστών και δεν μπορείτε να αποδείξετε ότι λάβατε τη \"Συναίνεση\" των χρηστών στο παρελθόν, τότε προτείνουμε να %1$s ανωνυμοποιείτε τα ανεπεξέργαστα δεδομένα των ιχνηλατημένων χρηστών%2$s.",
+ "HowDoIAskForConsent": "Πώς ζητάω συναίνεση από το χρήστη;",
+ "AskForConsentFollowSteps": "Ακολουθήστε τα παρακάτω βήματα για να ζητήσετε την συναίνεση χρήστη προτού τα δεδομένα επεξεργαστούν από το Matomo.",
+ "AskForConsentStep1": "Βήμα 1: απαιτήστε συναίνεση",
+ "AskForConsentStep1Desc1": "Για να ζητάτε συναίνεση, εισάγετε την παρακάτω γραμμή στην αρχή του υπάρχοντος κώδικα ιχνηλάτησης του Matomo σε όλες τις σελίδες:",
+ "AskForConsentStep1Desc2": "Αφού η συνάρτηση 'requireConsent' εκτελεστεί δε θα αποστέλλεται καμία αίτηση ιχνηλάτησης στο Matomo. Πρέπει να σημειωθεί ότι ορισμένα %1$scookies ιχνηλάτησης%2$s θα οριστούν κατά την ανάγνωση της σελίδας αλλά θα διαγραφούν αφού ο χρήστης μεταβεί σε άλλη σελίδα ή κλείσει το πρόγραμμα πλοήγησης.",
+ "AskForConsentStep2": "Βήμα 2: ζητάτε την συναίνεση μέσα από ένα μήνυμα ιδιωτικότητας",
+ "AskForConsentStep2Desc": "Τώρα μπορείτε να ρωτάτε το χρήστη για συναίνεση για παράδειγμα ότι εμφανίζετε ένα ξεκάθαρο μήνυμα ιδιωτικότητας στις σελίδες σας. Μάθετε περισσότερα για τα μηνύματα ιδιωτικότητας και πως να ρωτάτε το χρήστη για συναίνεση. Πρέπει να σημειωθεί ότι το Matomo δεν προσφέρει ακόμη το χαρακτηριστικό για εμφάνιση μηνύματος ιδιωτικότητας, αλλά μπορεί μελλοντικά να υλοποιηθεί ένα τέτοιο χαρακτηριστικό ώστε να μπορείτε εύκολα να εμφανίζετε την ειδοποίηση και να λαμβάνετε την συναίνεση του χρήστη.",
+ "AskForConsentStep3": "Βήμα 3: ο χρήστης παραχωρεί τη συναίνεσή του",
+ "AskForConsentStep3Desc": "Αφού ο χρήστης παραχωρήσει τη συναίνεσή του, μπορείτε Α) να επιτρέπετε το Matomo να θυμάται την συναίνεση ή Β) να χρησιμοποιήσετε το δικό σας εργαλείο για να θυμάστε την συναίνεση. Παραθέτουμε παρακάτω τις δύο λύσεις:",
+ "AskForConsentStep3DescA": "Α) αν θέλετε το Matomo να θυμάται την συναίνεση",
+ "AskForConsentStep3DescADesc1": "Αφού ο χρήστης συναινέσει, μπορείτε να ορίσετε το Matomo να θυμάται ότι ο χρήστης έχει συναινέσει καλώντας απλά την παρακάτω μέθοδο αφού ο χρήστης έχει συναινέσει:",
+ "AskForConsentStep3DescADesc2": "Το Matomo θα θυμάται στις επακόλουθες αιτήσεις ότι ο χρήστης έχει δώσει την συναίνεσή του με χρήση ενός cookie με όνομα \"consent\". Όσο το cookie υφίσταται, το Matomo θα ξέρει ότι έχει δοθεί η συναίνεση και θα επεξεργάζεται αυτόματα τα δεδομένα. Αυτό σημαίνει ότι χρειάζεται να καλείτε το %1$s μόνο μία φορά και δεν χρειάζεται να καλείτε το %2$s σε κάθε ανάγνωση σελίδας.",
+ "AskForConsentStep3DescANote1": "Εξ' ορισμού, το cookie και η συναίνεση θα μένουν για πάντα. Μπορείτε να ορίσετε μια προαιρετική περίοδο λήξης για τη συναίνεση χρήστη καλώντας:",
+ "AskForConsentStep3DescANote2": "Όταν ιχνηλατείτε πολλαπλά υπο-ονόματα χώρου στον ίδιο ιστοτόπο στο Matomo, πρέπει να βεβαιωθείτε ότι όταν ζητάτε Συναίνεση, ο χρήστης δίνει τη συναίνεσή του για όλα τα υπο-ονόματα χώρου για τα οποία μαζεύετε δεδομένα. Αν ο χρήστης συναινέσει μόνο για ένα όνομα ή υπο-όνομα χώρου, θα πρέπει να μπορείτε να περιορίσετε ή αυξήσετε το πεδίο του cookie συναίνεσης και τη διαδρομή με χρήση του 'setCookieDomain' και 'setCookiePath' (μάθετε περισσότερα στον οδηγό ιχνηλάτησης JavaScript).",
+ "AskForConsentStep3DescANote3": "Πρέπει να μην απενεργοποιείτε τα cookies.",
+ "AskForConsentStep3DescB": "Β) αν χρησιμοποιείτε το δικό σας εργαλείο συναίνεσης για να θυμάστε την κατάσταση συναίνεσης",
+ "AskForConsentStep3DescBDesc1": "Σε ορισμένες περιπτώσεις, καταγράφετε την πληροφορία ότι ο χρήστης έχει συναινέσει απευθείας στο δικό σας σύστημα ή CMS (για παράδειγμα όταν χρησιμοποιείτε ένα cookie για να θυμάστε τη συναίνεση χρήστη). Αφού λάβετε τη συναίνεση χρήστη για την επεξεργασία των δεδομένων του, θα πρέπει να καλέσετε τη μέθοδο 'setConsentGiven':",
+ "AskForConsentStep3DescBDesc2": "Αυτό επιτρέπει την ιχνηλάτηση JavaScript να γνωρίζει ότι ο χρήστης έχει συναινέσει και βεβαιώνει ότι η ιχνηλάτηση λειτουργεί όπως πρέπει. Η συνάρτηση αυτή πρέπει να καλείται μετά το %1$s.",
+ "AskForConsentStep3DescBNote1": "όταν καλείτε το %1$s, το Matomo δε θα θυμάται στις επακόλουθες αιτήσεις ότι ο χρήστης έχει συναινέσει: είναι σημαντικό να καλείτε την setConsentGiven σε κάθε σελίδα.",
+ "AskForConsentStep3DescBNote2": "όταν ο χρήστης έχει συναινέσει, μπορείτε να μην καλείτε το %1$s εξαρχής.",
+ "AskForConsentStep4": "Βήμα 4: ο χρήστης ακυρώνει την συναίνεση",
+ "AskForConsentStep4Desc": "Προκειμένου ο χρήστης να αφαιρέσει τη συναίνεσή του, θα πρέπει να εκτελέσει μια συγκεκριμένη ενέργεια, για παράδειγμα: κλικ σε ένα πλήκτρο \"Δε θέλω πλέον να ιχνηλατούμαι\".",
+ "AskForConsentStep4DescA": "Α) αν θέλετε το Matomo να θυμάται την συναίνεση",
+ "AskForConsentStep4DescADesc": "Όταν ο χρήστης έχει εκφράσει ότι δεν δίνει πλέον τη συναίνεσή του, θα πρέπει να καλέσετε μία φορά την παρακάτω μέθοδο:",
+ "AskForConsentStep4DescADesc2": "Αυτό βεβαιώνει ότι το cookie που χρησιμοποιείται για την παραχώρηση της συναίνεσης διαγράφεται.",
+ "AskForConsentStep4DescB": "Β) αν χρησιμοποιείτε το δικό σας εργαλείο συναίνεσης για να θυμάστε την κατάσταση συναίνεσης",
+ "AskForConsentStep4DescBDesc": "Όταν ο χρήστης εκφράσει ότι δεν επιθυμεί πλέον την παραχώρηση της συναίνεσής του, θα πρέπει να μην καλείτε πλέον την παρακάτω μέθοδο:",
+ "AskForConsentStepNotes": "Σημειώσεις:",
+ "AnonymizeSites": "Ανωνυμοποίηση των δεδομένων για τον ιστοτόπο",
+ "AnonymizeRowDataFrom": "Ανωνυμοποίηση όλων των ανεπεξέργαστων δεδομένων αρχίζοντας από:",
+ "AnonymizeRowDataTo": "Ανωνυμοποίηση όλων των ανεπεξέργαστων δεδομένων μέχρι:",
+ "AnonymizeIp": "Ανωνυμοποίηση διευθύνσεων IP",
+ "AnonymizeIpHelp": "Η ενέργεια είναι μη αναστρέψιμη. Αν ενεργοποιηθεί, για όλες τις επισκέψεις σε αυτή τη διάρκεια η διεύθυνση IP θα ανωνυμοποιείται για τουλάχιστον 2 bytes, για παράδειγμα '192.168.xxx.xxx'. Αν έχετε ρυθμίσει την ανωνυμοποίηση στα 3 bytes, τότε η ρύθμιση θα λαμβάνεται υπόψη και όλες οι διευθύνσεις IP θα ανωνυμοποιούνται για 3 bytes.",
+ "AnonymizeLocation": "Ανωνυμοποίηση Τοποθεσίας",
+ "AnonymizeLocationHelp": "Η ενέργεια είναι μη αναστρέψιμη. Γίνεται επαναϋπολογισμός της τοποθεσίας βάσει της ανωνυμοποιημένης διεύθυνσης IP (τουλάχιστον 2 bytes από τη διεύθυνση θα ανωνυμοποιούνται).",
+ "AnonymizeUserId": "Αντικατάσταση του αναγνωριστικού χρήστη με ψευδώνυμο",
+ "AnonymizeUserIdHelp": "Αν ενεργοποιήστε την επιλογή αυτή, το αναγνωριστικό χρήστη θα αντικατασταθεί από ένα ψευδώνυμο για να αποφευχθεί η αποθήκευση και εμφάνιση πληροφοριών που ενδέχεται να ταυτοποιήσουν το άτομο, όπως μια διεύθυνση ηλεκτρονικού ταχυδρομείου. Σε τεχνικούς όρους, έχοντας ως δεδομένο το αναγνωριστικό χρήστη, το Matomo θα επεξεργαστεί το ψευδώνυμο με χρήση μιας συνάρτησης κατακερματισμού. <br\/><br\/><em>Σημείωση: η αντικατάσταση με ένα ψευδώνυμο δεν είναι το ίδιο με ανωνυμοποίηση. Σε όρους GDPR: το ψευδώνυμο αναγνωριστικού χρήστη συνεχίζει να μετράει ακόμη ως προσωπικό δεδομένο. Το αρχικό αναγνωριστικό χρήστη μπορεί ακόμη να ταυτοποιηθεί αν ορισμένες πρόσθετες πληροφορίες είναι διαθέσιμες (στις οποίες μόνο το Matomo και ο επεξεργαστής δεδομένων σας έχουν πρόσβαση).<\/em>",
+ "AnonymizeProcessInfo": "Η ενέργεια αυτή ενδέχεται να διαρκέσει αρκετό χρόνο, επομένως δε θα εκτελεστεί κατευθείαν. Μπορείτε να παρακολουθείτε παρακάτω την τρέχουσα κατάσταση της διαδικασίας. Η ανωνυμοποίηση τυπικά θα ξεκινήσει εντός μιας ώρας.",
+ "AnonymizeDataNow": "Ανωνυμοποίηση προηγούμενων δεδομένων για τον επιλεγμένο ιστοτόπο και χρόνο",
+ "AnonymizeDataConfirm": "Είστε σίγουροι ότι επιθυμείτε την ανωνυμοποίηση των δεδομένων για τους επιλεγμένους ιστοτόπους και χρονικό εύρος; Η ενέργεια είναι μη αναστρέψιμη, δεδομένα ενδέχεται να διαγραφούν αν αυτό ζητηθεί και η διαδικασία μπορεί να διαρκέσει αρκετό χρόνο.",
+ "UnsetVisitColumns": "Να αφαιρεθούν οι στήλες επισκέψεων",
+ "UnsetVisitColumnsHelp": "Η ενέργεια είναι μη αναστρέψιμη. Μια λίστα στηλών της βάσης δεδομένων στην εμβέλεια επίσκεψης που επιθυμείτε να διαγράψετε. Κάθε τιμή για τη στήλη θα πάρει την προκαθορισμένη τιμή της. Πρέπει να σημειωθεί ότι αν κάποια στήλη υπάρχει στην εμβέλεια 'μετατροπή', τότε αυτή η στήλη επίσης θα διαγραφεί",
+ "UnsetActionColumns": "Να αφαιρεθούν οι στήλες ενεργειών",
+ "UnsetActionColumnsHelp": "Η ενέργεια είναι μη αναστρέψιμη. Μια λίστα στηλών της βάσης δεδομένων στην εμβέλεια ενέργειας που επιθυμείτε να διαγράψετε. Κάθε τιμή για τη στήλη θα πάρει την προκαθορισμένη τιμή.",
+ "AwarenessDocumentation": "Επίγνωση & τεκμηρίωση",
+ "AwarenessDocumentationIntro": "Ενημερώστε τους χρήστες σας με σαφήνεια και διαφάνεια και ενημερώστε τους συναδέλφους σας για τα δεδομένα που συλλέγονται και πως χρησιμοποιούνται:",
+ "AwarenessDocumentationDesc1": "Ενημερώστε τους επισκέπτες σας μέσω μιας σαφούς σημείωσης ιδιωτικότητας όποτε συγκεντρώνετε προσωπικά δεδομένα.",
+ "AwarenessDocumentationDesc2": "Να πληροφορήσετε τους χρήστες σας στην πολιτική ιδιωτικότητάς σας σχετικά με την συλλογή των δεδομένων και το πως αυτά χρησιμοποιούνται.",
+ "AwarenessDocumentationDesc3": "Ενημερώστε την ομάδας ότι χρησιμοποιείτε το Matomo Analytics και %1$sποια δεδομένα συλλέγονται από την πλατφόρμα των αναλυτικών%2$s.",
+ "AwarenessDocumentationDesc4": "Τεκμηριώστε τη χρήση του Matomo στην %1$sκαταγραφή περιουσιακών αγαθών πληροφορίας%2$s.",
"CurrentDBSize": "Τρέχον μέγεθος βάσης δεδομένων",
+ "DataRetention": "Φύλαξη δεδομένων",
+ "DataRetentionInMatomo": "Φύλαξη δεδομένων για τα αποθηκευμένα δεδομένα στο Matomo:",
+ "DataRetentionOverall": "Ο ρυθμός συνολικής φύλαξης δεδομένων για την πολιτική ιδιωτικότητάς σας είναι ο ρυθμός φύλαξης ανεπεξέργαστων δεδομένων. Πρέπει να σημειωθεί ότι οι συγκεντρωτικές αναφορές ενδέχεται να περιέχουν επίσης και προσωπικά δεδομένα. Αν χρησιμοποιείτε χαρακτηριστικά όπως το αναγνωριστικό χρήστη, προσαρμοσμένες μεταβλητές, προσαρμοσμένη διάσταση ή ιχνηλατείτε δεδομένα με άλλους τρόπους όπως τα συμβάντα, διευθύνσεις URL σελίδων ή τίτλους σελίδων, τότε ο συνολικός ρυθμός φύλαξης δεδομένων για την πολιτική ιδιωτικότητάς σας είναι το μεγαλύτερο από τα δύο.",
+ "RawDataRemovedAfter": "τα ανεπεξέργαστα δεδομένα όλων των επισκέψεων και των ενεργειών διαγράφονται μετά %1$s.",
+ "RawDataNeverRemoved": "τα ανεπεξέργαστα δεδομένα επισκέψεων και ενεργειών <strong>δεν διαγράφονται<\/strong> ποτέ.",
+ "ReportsRemovedAfter": "όλες οι συγκεντρωτικές αναφορές διαγράφονται μετά από %1$s.",
+ "ReportsNeverRemoved": "συγκεντρωτικές αναφορές <strong>ποτέ<\/strong> δεν διαγράφονται.",
"DBPurged": "Η βάση δεδομένων διαγράφτηκε.",
"DeleteBothConfirm": "Πρόκειται να ενεργοποιήσετε τη διαγραφή δεδομένων καταγραφής και αναφορών. Αυτό θα αφαιρέσει μόνιμα τη δυνατότητα να βλέπετε παλαιά δεδομένα αναλυτικών. Σίγουρα επιθυμείτε να συνεχίσετε;",
"DeleteDataDescription": "Μπορείτε να παραμετροποιήσετε το Matomo να διαγράφει τακτικά παλιά ανεπεξέργαστα δεδομένα και\/ή συγκεντρωτικές αναφορές για να κρατάει το μέγεθος της βάσης δεδομένων μικρό ή να πληρεί τους κανονισμούς ιδιωτικότητας όπως το GDPR.",
@@ -43,9 +104,23 @@
"GeolocationAnonymizeIpNote": "Σημείωση: Η Γεωτοποθεσία θα έχει περίπου τα ίδια αποτελέσματα με 1 byte ανώνυμο. Με 2 bytes ή περισσότερο, η Γεωτοποθεσία θα είναι ανακριβής.",
"GDPR": "GDPR",
"GdprManager": "Διαχειριστής GDPR",
+ "GdprChecklists": "Λίστα ελέγχου ενεργειών για το GDPR",
+ "GdprChecklistDesc1": "Αν επεξεργάζεστε προσωπικά δεδομένων Ευρωπαίων πολιτών μέσα από το Matomo, ακόμη και αν η επιχείρησή σας βρίσκεται εκτός Ευρώπης, πρέπει να εκπληρώνετε τις υποχρεώσεις σας για το GDPR και ο παρών οδηγός θα σας βοηθήσει σε αυτό.",
+ "GdprChecklistDesc2": "Βρείτε παρακάτω τα εργαλεία μας για να εξασκείτε τα δικαιώματα των χρηστών σας με ευκολία και τη λίστα ενεργειών που θα κάνετε προκειμένου να κάνετε το Matomo συμβατό με το GDPR και να ασφαλίσετε τα δεδομένα σας. Επισκεφτείτε τον %1$sΟδηγό Χρήστη GDPR%2$s για να μάθετε ακόμη περισσότερα.",
"GdprOverview": "Σύνοψη GDPR",
+ "GdprOverviewIntro1": "Ο Γενικός Κανονισμός για την Προστασία των Δεδομένων (GDPR) είναι ένας κανονισμός που ενισχύει και ενοποιεί την προστασία των δεδομένων για όλα τα άτομα εντός της Ευρωπαϊκής Ένωσης (EU).",
+ "GdprOverviewIntro2": "Αν εφαρμόσετε ενέργειες για να βεβαιωθείτε ότι δεν συλλέγονται προσωπικά δεδομένα στο Matomo, τότε ίσως να σας απασχολεί το GDRP για το Matomo (αν δεν συλλέγετε διευθύνσεις IP, αναγνωριστικά χρηστών, δεδομένα γεωτοποθεσίας, κτλ.).",
"GdprTools": "Εργαλεία GDPR",
"GetPurgeEstimate": "Λάβετε εκτίμηση διαγραφής",
+ "IndividualsRights": "Δικαιώματα ατόμων",
+ "IndividualsRightsIntro": "Εξασκήστε τα δικαιώματα των χρηστών σας με τις φιλικές για το GDPR διαδικασίες μας:",
+ "IndividualsRightsInform": "Το δικαίωμα στην ενημέρωση: ενημερώστε τους χρήστες σας με μια σαφή ειδοποίηση για την ιδιωτικότητα.",
+ "IndividualsRightsAccess": "Το δικαίωμα της πρόσβασης: %1$sαναζήτηση για ένα υποκείμενο δεδομένων%2$s και εξαγωγή όλων των δεδομένων του.",
+ "IndividualsRightsErasure": "Το δικαίωμα στη λήθη: %1$sαναζήτηση για ένα υποκείμενο δεδομένων%2$s και διαγραφή ορισμένων ή όλων των δεδομένων του.",
+ "IndividualsRightsRectification": "Το δικαίωμα στη διόρθωση: %1$sαναζήτηση για ένα υποκείμενο δεδομένων%2$s και διαγραφή ορισμένων ή όλων των δεδομένων του.",
+ "IndividualsRightsPortability": "Το δικαίωμα στην φορητότητα των δεδομένων: %1$sαναζήτηση για ένα υποκείμενο δεδομένων%2$s και εξαγωγή όλων των δεδομένων του.",
+ "IndividualsRightsObject": "Το δικαίωμα στην εναντίωση: %1$sεπιτρέψτε τους χρήστες σας να κάνουν εύκολα opt-out%2$s στην σελίδα της πολιτικής ιδιωτικότητάς σας.",
+ "IndividualsRightsChildren": "Αν προσφέρετε online υπηρεσίες σε παιδιά και βασίζεστε στην συγκατάθεση για την συλλογή πληροφοριών σχετικά με αυτά, τότε ενδέχεται να χρειαστείτε την συγκατάθεση του γονέα ή κηδεμόνα προκειμένου να επεξεργαστείτε τα προσωπικά δεδομένα των παιδιών νόμιμα.",
"KeepBasicMetrics": "Διατήρηση βασικών μετρήσεων (επισκέψεις, προβολές σελίδας, βαθμός αναπήδησης, μετατροπή στόχου, μετατροπές ηλεκτρονικού εμπορίου, κλπ.)",
"KeepDataFor": "Να διατηρούνται όλα τα δεδομένα για",
"KeepReportSegments": "Για να διατηρήσετε τα παραπάνω δεδομένα, κρατείστε, επίσης, και τις τεμαχισμένες αναφορές",
@@ -60,8 +135,35 @@
"PurgingData": "Εκκαθάριση δεδομενων...",
"RecommendedForPrivacy": "Προτείνεται για λόγους ιδιωτικότητας",
"ReportsDataSavedEstimate": "Μέγεθος βάσης δεδομένων",
+ "SearchForDataSubject": "Αναζήτηση για υποκείμενο δεδομένων",
+ "FindDataSubjectsBy": "Εύρεση υποκειμένων δεδομένων ανά",
+ "NoDataSubjectsFound": "Δε βρέθηκαν υποκείμενα δεδομένων",
+ "DeleteVisitsConfirm": "Είστε σίγουροι ότι επιθυμείτε να διαγράψετε τις επιλεγμένες επισκέψεις; Η ενέργεια είναι μη αναστρέψιμη.",
+ "ResultTruncated": "Βρέθηκαν περισσότερα από %1$s αποτελέσματα και τα αποτελέσματα ελαττώθηκαν στις πρώτες %1$s επισκέψεις.",
+ "AddVisitorIdToSearch": "Κάντε κλικ για προσθήκη του αναγνωριστικού επισκέπτη στην αναζήτηση",
+ "AddVisitorIPToSearch": "Κάντε κλικ για προσθήκη της διεύθυνσης IP επισκέπτη στην αναζήτηση",
+ "AddUserIdToSearch": "Κάντε κλικ για προσθήκη του αναγνωριστικού χρήστη στην αναζήτηση",
+ "ExportSelectedVisits": "Εξαγωγή επιλεγμένων επισκέψεων",
+ "DeleteSelectedVisits": "Διαγραφή επιλεγμένων επισκέψεων",
+ "SelectWebsite": "Επιλέξτε ιστοτόπο",
+ "MatchingDataSubjects": "Εύρεση δεδομένων υποκειμένων",
+ "VisitsMatchedCriteria": "Αυτές οι επισκέψεις ταιριάζουν με τα επιλεγμένα κριτήρια.",
+ "ExportingNote": "Σε περίπτωση που εξαγάγετε δεδομένα για την άσκηση του δικαιώματος της πρόσβασης, βεβαιωθείτε ότι οι επιλεγμένες επισκέψεις έχουν γίνει από το υποκείμενο για το οποίο εξαγάγετε τα δεδομένα.",
+ "DeletionFromMatomoOnly": "Πρέπει να σημειωθεί ότι οποιαδήποτε δεδομένα θα διαγραφούν μόνο από τη βάση δεδομένων του Matomo αλλά όχι από τα ημερολόγια επισκέψεων του διακομιστή ιστού σας. Επίσης πρέπει να σημειωθεί ότι αν επαναεισάγετε τυχόν ιστορικά δεδομένα, για παράδειγμα από ημερολόγια επισκέψεων, τυχόν δεδομένα που διαγράφηκαν παλιότερα ενδέχεται να εισαχθούν ξανά.",
+ "ResultIncludesAllVisits": "Τα αποτελέσματα που βρέθηκαν περιλαμβάνουν όλες τις επισκέψεις χωρίς χρονικό περιορισμό και περιλαμβάνουν και σήμερα.",
+ "GdprToolsPageIntro1": "Η σελίδα έχει σχεδιαστεί για εσάς προκειμένου να εφαρμόσετε τα δικαιώματα στα δεδομένα των υποκειμένων.",
+ "GdprToolsPageIntro2": "Εδώ μπορείτε να εξασκήσετε τα δικαιώματα των χρηστών σας με τις φιλικές για το GDPR διαδικασίες μας:",
+ "GdprToolsPageIntroAccessRight": "το δικαίωμα στην προσπέλαση όλων των δεδομένων τους (και το δικαίωμα στην φορητότητα δεδομένων).",
+ "GdprToolsPageIntroEraseRight": "το δικαίωμα στην διαγραφή ορισμένων ή όλων των δεδομένων τους (και το δικαίωμα στην διόρθωση).",
+ "GdprToolsOverviewHint": "Στην περίπτωση που δεν γνωρίζετε τι είναι το GDPR, ανατρέξτε στην %1$sΣύνοψη GDPR%2$s.",
"SaveSettingsBeforePurge": "Έχετε αλλάξει τις ρυθμίσεις διαγραφής δεδομένων. Αποθηκεύστε τις πριν αρχίσετε την εκκαθάριση.",
"SeeAlsoOurOfficialGuidePrivacy": "Δείτε επίσης τον επίσημο οδηγό μας: %1$sΙδιωτικότητα στα Αναλυτικά Ιστού%2$s",
+ "SecurityProcedures": "Διαδικασίες ασφάλειας",
+ "SecurityProceduresIntro": "Ενημερώστε τους χρήστες σας με σαφήνεια και διαφάνεια και τους συναδέλφους σας για τα δεδομένα που συλλέγονται και πως χρησιμοποιούνται:",
+ "SecurityProceduresDesc1": "Εφαρμόστε τις %1$sσυστάσεις ασφάλειας%2$s προκειμένου να διατηρείτε τα δεδομένα του Matomo σας ασφαλή.",
+ "SecurityProceduresDesc2": "Ελέγξτε ότι έχετε γραπτό συμβόλαιο με την εταιρία που σας παρέχει τον διακομιστή του Matomo ή την φιλοξενία ώστε να εξασφαλίζετε ότι υπάρχουν %1$sκατάλληλες δικλείδες ασφαλείας%2$s.",
+ "SecurityProceduresDesc3": "Να συμπεριληφθεί το Matomo στην %1$sδιαδικασία παραβίασης δεδομένων%2$s.",
+ "SecurityProceduresDesc4": "Να συμπεριληφθεί το Matomo στην %1$sαξιολόγηση αντίκτυπου ιδιωτικότητας δεδομένων (DPIA)%2$s, αν είναι εφαρμόσιμο.",
"TeaserHeader": "Στη σελίδα αυτή, μπορείτε να κάνετε το Matomo συμβατό με την νομοθεσία για την ιδιωτικότητα, με: %1$sανωνυμοποίηση της διεύθυνσης IP του επισκέπτη%2$s, %3$sαυτόματη διαγραφή παλιών εγγραφών επισκεπτών από τη βάση δεδομένων%4$s και %5$sανωνυμοποίηση παλιών δεδομένων επισκεπτών χρηστών%6$s.",
"TeaserHeadline": "Ρυθμίσεις ιδιωτικού απορρήτου",
"UseAnonymizedIpForVisitEnrichment": "Χρησιμοποιήστε παράλληλα και τις Ανώνυμες Διευθύνσεις IP κατά τον εμπλουτισμό των επισκέψεων.",
@@ -73,6 +175,14 @@
"UseAnonymizeTrackingData": "Ανωνυμοποίηση Παρακολούθησης Δεδομένων",
"UseAnonymizeUserId": "Ανωνυμοποίηση αναγνωριστικού χρήστη",
"PseudonymizeUserId": "Αντικατάσταση του αναγνωριστικού χρήστη με ψευδώνυμο",
+ "OptOutCustomize": "Προσαρμογή του iframe Opt-out",
+ "OptOutHtmlCode": "Κώδικας HTML για ενσωμάτωση στον ιστοτόπο σας",
+ "OptOutPreview": "Προεπισκόπηση του Opt-out όπως αυτό θα εμφανίζεται στον ιστοτόπο σας",
+ "FontColor": "Χρώμα Γραμματοσειράς",
+ "FontSize": "Μέγεθος Γραμματοσειράς",
+ "FontFamily": "Οικογένεια Γραμματοσειράς",
+ "BackgroundColor": "Χρώμα Υποβάθρου",
+ "TrackingOptOut": "Να επιτρέπεται στους χρήστες να κάνουν opt-out από την ιχνηλάτηση",
"UseAnonymizeOrderId": "Ανωνυμοποίηση αναγνωριστικού παραγγελίας",
"UseDeleteLog": "Τακτική διαγραφή παλιών ανεπεξέργαστων δεδομένων από τη βάση δεδομένων",
"UseDeleteReports": "Τακτική διαγραφή παλαιών αναφορών από τη βάση δεδομένων",
diff --git a/plugins/PrivacyManager/lang/en.json b/plugins/PrivacyManager/lang/en.json
index 34bd5b5bb3..e5d54baf83 100644
--- a/plugins/PrivacyManager/lang/en.json
+++ b/plugins/PrivacyManager/lang/en.json
@@ -7,8 +7,69 @@
"AnonymizeIpMaskLengtDescription": "Select how many bytes of the visitors' IPs should be masked.",
"AnonymizeIpMaskLength": "%1$s byte(s) - e.g. %2$s",
"AskingForConsent": "Asking for consent",
+ "ConsentExplanation": "Consent means offering individuals choice and control about how their personal data is processed.",
"ClickHereSettings": "Click here to access the %s settings.",
+ "WhenDoINeedConsent": "When do I need to ask for user consent?",
+ "WhenConsentIsNeeded1": "In the context of the GDPR privacy regulations, when you are processing personal data, in some cases you will need to ask for your users' consent. To identify whether you need to ask for consent, you need to determine whether your lawful basis for processing personal data is \"Consent\" or \"Legitimate interest\", or whether you can avoid collecting personal data altogether. We recommend to learn more about the lawful basis under the GDPR for Matomo.",
+ "WhenConsentIsNeeded2": "Note that when you require to have your users' consents and if you cannot prove that you got the \"Consent\" of your users in the past, then we recommend to %1$sanonymise your previously tracked users' raw data%2$s.",
+ "HowDoIAskForConsent": "How do I ask users for consent?",
+ "AskForConsentFollowSteps": "Follow the steps below to ask your user for their consents before their data is processed within Matomo.",
+ "AskForConsentStep1": "Step 1: require consent",
+ "AskForConsentStep1Desc1": "To require consent, insert the following line at top of your existing Matomo Tracking code on all your pages:",
+ "AskForConsentStep1Desc2": "Once this function ‘requireConsent' is executed then no tracking request will be sent to Matomo. Note that some %1$stracking cookies%2$s will be set during this page view but will be deleted as soon as the user navigates to a different page or closes the browser.",
+ "AskForConsentStep2": "Step 2: asking for consent through your privacy notice",
+ "AskForConsentStep2Desc": "Now you can ask the user for consent for example by displaying a clear privacy notice on your pages. Learn more about privacy notices and asking for user consent. Note that Matomo does not yet offer the feature to display a privacy notice, but may implement such a feature in the future to easily let you display the notice and gather user consent.",
+ "AskForConsentStep3": "Step 3: user gives consent",
+ "AskForConsentStep3Desc": "Once a user gives consent, you can either A) let Matomo remember the consent, or B) use your own consent tool to remember the consent. We present the two solutions below:",
+ "AskForConsentStep3DescA": "A) if you want to let Matomo remember the consent",
+ "AskForConsentStep3DescADesc1": "Once a user gives their consent, you can let Matomo remember that the user has given consent by simply calling the following method once the user has given her or his consent:",
+ "AskForConsentStep3DescADesc2": "Matomo will then remember on subsequent requests that the user has given her or his consent by setting a cookie named \"consent\". As long as this cookie exists, Matomo will know that consent has been given and will automatically process the data. This means that you only need to call %1$s once, and it is not needed to call %2$s on any page view.",
+ "AskForConsentStep3DescANote1": "By default, the cookie and consent will be remembered forever. It is possible to define an optional expiry period for your user consent by calling:",
+ "AskForConsentStep3DescANote2": "When you're tracking multiple sub-domains into the same website in Matomo, you want to ensure that when you ask for Consent, the user gives consent for all the sub-domains on which you are collecting data. If the user only gives consent for a particular domain or sub-domain(s), you may need to restrict or widen the scope of the consent cookie domain and path by using 'setCookieDomain' and ‘setCookiePath' (learn more in the JavaScript tracking guide).",
+ "AskForConsentStep3DescANote3": "It is required that you do not disable cookies.",
+ "AskForConsentStep3DescB": "B) if you use your own consent tool to remember the consent",
+ "AskForConsentStep3DescBDesc1": "In some cases, you record the information that the user has given consent to be tracked directly in your own system or CMS (for example when you use your own a cookie to remember user consent). Once you have the consent by the user to process their data, you need to call the 'setConsentGiven' method:",
+ "AskForConsentStep3DescBDesc2": "This lets the JavaScript tracker know that the user has given consent and ensures the tracking is working as expected. This function needs to be called anytime after %1$s.",
+ "AskForConsentStep3DescBNote1": "when you call %1$s, Matomo will not remember on subsequent requests that this user has given consent: it is important that you call setConsentGiven on every page.",
+ "AskForConsentStep3DescBNote2": "when the user has given consent, you could also avoid calling %1$s in the first place.",
+ "AskForConsentStep4": "Step 4: user removes consent",
+ "AskForConsentStep4Desc": "In order to remove his consent the user needs to perform a specific action, for example: clicking on a button \"I do not want to be tracked anymore\".",
+ "AskForConsentStep4DescA": "A) if you want to let Matomo remember the consent",
+ "AskForConsentStep4DescADesc": "When the user has expressed she or he no longer gives consent, you need to call the following method once:",
+ "AskForConsentStep4DescADesc2": "This makes sure the cookie that remembered the given consent is deleted.",
+ "AskForConsentStep4DescB": "B) if you use your own consent tool to remember the consent",
+ "AskForConsentStep4DescBDesc": "When the user has expressed she or he no longer gives consent, you shall not call the following method anymore:",
+ "AskForConsentStepNotes": "Notes:",
+ "AnonymizeSites": "Anonymize the data of this site(s)",
+ "AnonymizeRowDataFrom": "Anonymize all raw data starting from:",
+ "AnonymizeRowDataTo": "Anonymize all raw data up to:",
+ "AnonymizeIp": "Anonymize IP",
+ "AnonymizeIpHelp": "This action cannot be undone. If enabled, for all visits during this duration the IP will be anonymized by at least 2 bytes, for example '192.168.xxx.xxx'. If you have currently configured to anonymize by 3 bytes, then this setting will be respected and all IPs will be anonymized by 3 bytes.",
+ "AnonymizeLocation": "Anonymize Location",
+ "AnonymizeLocationHelp": "This action cannot be undone. Re-evaluates the location based on the anonymized IP (at least 2 bytes of the IP will be anonymized).",
+ "AnonymizeUserId": "Replace User ID with a pseudonym",
+ "AnonymizeUserIdHelp": "When you enable this option, the User ID will be replaced by a pseudonym to avoid directly storing and displaying personally identifiable information such as an email address. In technical terms: given your User ID, Matomo will process the User ID pseudonym using a salted hash function.<br/><br/><em>Note: replacing with a pseudonym is not the same as anonymisation. In GDPR terms: the User ID pseudonym still counts as personal data. The original User ID could still be identified if certain additional information is available (which only Matomo and your data processor has access to).</em>",
+ "AnonymizeProcessInfo": "This action may take a long time and will therefore not be executed right away. You will be able to follow the current state of the process below. The anonymization should typically start within one hour.",
+ "AnonymizeDataNow": "Anonymize past data for the selected site and time",
+ "AnonymizeDataConfirm": "Are you sure you want to anonymize the data for the selected website(s) and time range? This action cannot be undone, data may be deleted as requested, and this process may take a long time.",
+ "UnsetVisitColumns": "Unset visit columns",
+ "UnsetVisitColumnsHelp": "This action cannot be undone. A list of database columns in scope visit that you want to unset. Each value for that column will be set to its default value. Please note that if the same column exists in scope 'conversion', then this column will be deleted as well",
+ "UnsetActionColumns": "Unset action columns",
+ "UnsetActionColumnsHelp": "This action cannot be undone. A list of database columns in scope action that you want to unset. Each value for that column will be set to its default value.",
+ "AwarenessDocumentation": "Awareness & documentation",
+ "AwarenessDocumentationIntro": "Inform your users clearly and transparently, and make your colleagues aware of the data being collected and how it is used:",
+ "AwarenessDocumentationDesc1": "Inform your visitors through a clear privacy notice whenever you’re collecting personal data.",
+ "AwarenessDocumentationDesc2": "Inform your users in your privacy policy about what data you collect and how the data is used.",
+ "AwarenessDocumentationDesc3": "Make your team aware that you are using Matomo Analytics and %1$swhat data is being collected by your analytics platform%2$s.",
+ "AwarenessDocumentationDesc4": "Document your use of Matomo within your %1$sinformation asset register%2$s.",
"CurrentDBSize": "Current database size",
+ "DataRetention": "Data retention",
+ "DataRetentionInMatomo": "Data retention for data stored in Matomo:",
+ "DataRetentionOverall": "The overall data retention rate for your privacy policy is the raw data retention rate. Please note that aggregated reports may contain personal data as well. If you are using features like User ID, Custom Variables, Custom Dimension, or track personal data in other ways such as events, page URLs or page titles, etc, then the overall data retention rate for your privacy policy is the higher of the two.",
+ "RawDataRemovedAfter": "all visits and actions raw data are deleted after %1$s.",
+ "RawDataNeverRemoved": "visits and actions raw data are <strong>never</strong> deleted.",
+ "ReportsRemovedAfter": "all aggregated reports are deleted after %1$s.",
+ "ReportsNeverRemoved": "aggregated reports are <strong>never</strong> deleted.",
"DBPurged": "DB purged.",
"DeleteBothConfirm": "You are about to enable both raw data deletion & report data deletion. This will permanently remove your ability to view old analytics data. Are you sure you want to do this?",
"DeleteDataDescription": "You can configure Matomo to regularly delete old raw data and\/or aggregated reports to keep your database small or to meet privacy regulations such as GDPR.",
@@ -43,9 +104,23 @@
"GeolocationAnonymizeIpNote": "Note: Geolocation will have approximately the same results with 1 byte anonymized. With 2 bytes or more, Geolocation will be inaccurate.",
"GDPR": "GDPR",
"GdprManager": "GDPR Manager",
+ "GdprChecklists": "GDPR checklists",
+ "GdprChecklistDesc1": "If you are processing personal data of European citizens through Matomo, even if your company is located outside Europe, you need to fulfill GDPR obligations and this guide will help you.",
+ "GdprChecklistDesc2": "Find below our tools that let you exercise your users’ rights easily, and the list of actions to take in order to make your use of Matomo compliant with the GDPR and safeguard your data. Visit our %1$sGDPR User guide%2$s to learn even more.",
"GdprOverview": "GDPR Overview",
+ "GdprOverviewIntro1": "The General Data Protection Regulation (GDPR) is a regulation which strengthens and unifies data protection for all individuals within the European Union (EU).",
+ "GdprOverviewIntro2": "If you take steps to ensure no personal data is collected in Matomo, then you may not be concerned by the GDPR for Matomo (if you track no IP addresses, no user IDs, no geolocation data, etc.).",
"GdprTools": "GDPR Tools",
"GetPurgeEstimate": "Get purge estimate",
+ "IndividualsRights": "Individuals' rights",
+ "IndividualsRightsIntro": "Exercise the rights of your users with our GDPR-friendly procedures:",
+ "IndividualsRightsInform": "The right to be informed: inform your users with a clear privacy notice.",
+ "IndividualsRightsAccess": "The right of access: %1$ssearch for a data subject%2$s and export all of their data.",
+ "IndividualsRightsErasure": "The right to erasure: %1$ssearch for a data subject%2$s and delete some or all of their data.",
+ "IndividualsRightsRectification": "The right to rectification: you can %1$ssearch for a data subject%2$s and delete some or all of their data.",
+ "IndividualsRightsPortability": "The right to data portability: %1$ssearch for a data subject%2$s and export all of their data.",
+ "IndividualsRightsObject": "The right to object: %1$slet your users easily opt-out%2$s on your privacy policy page.",
+ "IndividualsRightsChildren": "If you offer online services to children and rely on consent to collect information about them, then you may need a parent or guardian’s consent in order to process the children’s personal data lawfully.",
"KeepBasicMetrics": "Keep basic metrics (visits, page views, bounce rate, goal conversions, ecommerce conversions, etc.)",
"KeepDataFor": "Keep all data for",
"KeepReportSegments": "For kept data above, also keep segmented reports",
@@ -54,14 +129,41 @@
"LeastMonthsInput": "Please specify a number of months greater than %s.",
"MenuPrivacySettings": "Privacy",
"NextDelete": "Next scheduled deletion in",
- "PluginDescription": "Increase Privacy for your users and make your Matomo instance privacy compliant with your local legislation. ",
+ "PluginDescription": "Increase Privacy for your users and make your Matomo instance privacy compliant with your local legislation.",
"PurgeNow": "Purge DB Now",
"PurgeNowConfirm": "You are about to permanently delete data from your database. Are you sure you want to continue?",
"PurgingData": "Purging data...",
"RecommendedForPrivacy": "Recommended for privacy",
"ReportsDataSavedEstimate": "Database size",
+ "SearchForDataSubject": "Search for a data subject",
+ "FindDataSubjectsBy": "Find data subjects by",
+ "NoDataSubjectsFound": "No data subjects found",
+ "DeleteVisitsConfirm": "Are you sure you want to delete the selected visits? This action cannot be undone.",
+ "ResultTruncated": "More than %1$s results were found and the result was truncated to the first %1$s visits.",
+ "AddVisitorIdToSearch": "Click to add this visitorID to the search",
+ "AddVisitorIPToSearch": "Click to add this visitorIP to the search",
+ "AddUserIdToSearch": "Click to add this userID to the search",
+ "ExportSelectedVisits": "Export selected visits",
+ "DeleteSelectedVisits": "Delete selected visits",
+ "SelectWebsite": "Select a website",
+ "MatchingDataSubjects": "Matching data subjects",
+ "VisitsMatchedCriteria": "These visits match the selected criteria.",
+ "ExportingNote": "In case you are exporting the data to exercise the right of access, please make sure the selected visits are actually performed by the data subject you want to export the data for.",
+ "DeletionFromMatomoOnly": "Please also note that any data will be only deleted from the Matomo database but not from your webserver logs. Also note that if you re-import any historical data, for example from logs, that any previously deleted data may be imported again.",
+ "ResultIncludesAllVisits": "The found results include all visits without any time restriction and include today.",
+ "GdprToolsPageIntro1": "This page has been designed in order for you to exercise data subject rights.",
+ "GdprToolsPageIntro2": "Here you can exercise the rights of your users with our GDPR-friendly procedures:",
+ "GdprToolsPageIntroAccessRight": "the right of access to all of their data (and the right to data portability),",
+ "GdprToolsPageIntroEraseRight": "the right to erase some or all of their data (and the right to rectification).",
+ "GdprToolsOverviewHint": "In case you do not know what GDPR is, please refer to the %1$sGDPR overview%2$s.",
"SaveSettingsBeforePurge": "You have changed the data deletion settings. Please save them before starting a purge.",
"SeeAlsoOurOfficialGuidePrivacy": "See also our official guide: %1$sWeb Analytics Privacy%2$s",
+ "SecurityProcedures": "Security procedures",
+ "SecurityProceduresIntro": "Inform your users clearly and transparently, and make your colleagues aware of the data being collected and how it is used:",
+ "SecurityProceduresDesc1": "Apply our %1$ssecurity recommendations%2$s in order to keep your Matomo data safe.",
+ "SecurityProceduresDesc2": "Check that you have a written contract with the company providing you the Matomo server or hosting which ensures %1$sappropriate safeguards are provided%2$s.",
+ "SecurityProceduresDesc3": "Include Matomo in your %1$sdata breach procedure%2$s.",
+ "SecurityProceduresDesc4": "Include Matomo in your %1$sdata privacy impact assessment (DPIA)%2$s, if applicable.",
"TeaserHeader": "On this page, you can customize Matomo to make it privacy compliant with existing legislations, by: %1$s anonymizing the visitor IP%2$s, %3$s automatically remove old visitor logs from the database%4$s, and %5$s anonymize previously tracked raw users' data%6$s.",
"TeaserHeadline": "Privacy Settings",
"UseAnonymizedIpForVisitEnrichment": "Also use the Anonymized IP addresses when enriching visits.",
@@ -73,6 +175,14 @@
"UseAnonymizeTrackingData": "Anonymize Tracking Data",
"UseAnonymizeUserId": "Anonymize User ID",
"PseudonymizeUserId": "Replace User ID with a pseudonym",
+ "OptOutCustomize": "Customize the Opt-out iframe",
+ "OptOutHtmlCode": "HTML code to embed on your website",
+ "OptOutPreview": "Preview of the Opt-out as it will appear on your website",
+ "FontColor": "Font Color",
+ "FontSize": "Font Size",
+ "FontFamily": "Font Family",
+ "BackgroundColor": "Background Color",
+ "TrackingOptOut": "Let users opt-out of tracking",
"UseAnonymizeOrderId": "Anonymize Order ID",
"UseDeleteLog": "Regularly delete old raw data from the database",
"UseDeleteReports": "Regularly delete old reports from the database",
diff --git a/plugins/PrivacyManager/lang/es-ar.json b/plugins/PrivacyManager/lang/es-ar.json
index cf7b12329a..d409f492c2 100644
--- a/plugins/PrivacyManager/lang/es-ar.json
+++ b/plugins/PrivacyManager/lang/es-ar.json
@@ -8,6 +8,7 @@
"AnonymizeIpMaskLength": "%1$s byte\/s - ej. %2$s",
"AskingForConsent": "Pedir consentimiento",
"ClickHereSettings": "Hacé clic acá para acceder a la configuración de %s.",
+ "AnonymizeUserId": "Reemplazar identificación del usuario con un pseudónimo",
"CurrentDBSize": "Tamaño actual de la base de datos",
"DBPurged": "Base da datos purgada.",
"DeleteBothConfirm": "Estás a punto de habilitar tanto la eliminación de datos en crudo como la eliminación de datos de informes. Esto quitará permanentemente tu habilidad de ver datos analíticos antiguos. ¿Estás seguro que querés hacer esto?",
diff --git a/plugins/PrivacyManager/lang/es.json b/plugins/PrivacyManager/lang/es.json
index 0d64fde583..827840287f 100644
--- a/plugins/PrivacyManager/lang/es.json
+++ b/plugins/PrivacyManager/lang/es.json
@@ -8,6 +8,7 @@
"AnonymizeIpMaskLength": "%1$s byte(s) - ej. %2$s",
"AskingForConsent": "Pidiendo consentimiento",
"ClickHereSettings": "Haga clic aquí para acceder a la configuración de %s",
+ "AnonymizeUserId": "Reemplazar ID de usuario con un seudónimo",
"CurrentDBSize": "Tamaño de la actual base de datos",
"DBPurged": "Base de datos purgada.",
"DeleteBothConfirm": "Está a punto de habilitar la eliminación de datos de informes y registros. Esta acción permanentemente quitará la posibilidad de disponer de información analítica añeja. ¿Está seguro que desea llevarlo a cabo?",
diff --git a/plugins/PrivacyManager/lang/fi.json b/plugins/PrivacyManager/lang/fi.json
index d619d29f31..b74a671c42 100644
--- a/plugins/PrivacyManager/lang/fi.json
+++ b/plugins/PrivacyManager/lang/fi.json
@@ -7,6 +7,7 @@
"AnonymizeIpMaskLength": "%1$s tavua - esim. %2$s",
"AskingForConsent": "Hyväksynnän kysyminen",
"ClickHereSettings": "Muokkaa %s:n asetuksia.",
+ "AnonymizeUserId": "Korvaa käyttäjän ID pseudonyymilla",
"CurrentDBSize": "Nykyinen tietokannan koko",
"DBPurged": "Tietokannasta poistettiin vanhat tiedot.",
"DeleteDataInterval": "Poista vanhat tiedot joka",
diff --git a/plugins/PrivacyManager/lang/fr.json b/plugins/PrivacyManager/lang/fr.json
index fabaa59e3a..ce32d18166 100644
--- a/plugins/PrivacyManager/lang/fr.json
+++ b/plugins/PrivacyManager/lang/fr.json
@@ -8,6 +8,7 @@
"AnonymizeIpMaskLength": "%1$s byte(s) - ex %2$s",
"AskingForConsent": "Demande de permission",
"ClickHereSettings": "Cliquez ici pour accéder aux paramètres %s.",
+ "AnonymizeUserId": "Remplacer l'identifiant utilisateur par un pseudonyme",
"CurrentDBSize": "Taille actuelle de la base de données",
"DBPurged": "BDD purgée.",
"DeleteBothConfirm": "Vous êtes sur le point d'activer la suppression des données primaires et des données de rapports. Ceci vous empêchera définitivement de visualiser d'anciennes données de statistique. Êtes-vous sûr(e) de vouloir effectuer cela ?",
diff --git a/plugins/PrivacyManager/lang/it.json b/plugins/PrivacyManager/lang/it.json
index 8c7de473e6..64b12a6ae3 100644
--- a/plugins/PrivacyManager/lang/it.json
+++ b/plugins/PrivacyManager/lang/it.json
@@ -7,7 +7,47 @@
"AnonymizeIpMaskLengtDescription": "Seleziona quanti byte degli indirizzi IP dei visitatori devono essere nascosti.",
"AnonymizeIpMaskLength": "%1$s byte(s) - es. %2$s",
"AskingForConsent": "Richiesta consenso",
+ "ConsentExplanation": "Consenso significa offrire alle singole persone la scelta e il controllo su come vengono trattati i loro dati personali.",
"ClickHereSettings": "Accedi alle impostazioni %s.",
+ "WhenDoINeedConsent": "Quando devi richiedere il consenso dell'utente?",
+ "WhenConsentIsNeeded1": "Nel contesto delle norme sulla privacy del GDPR, quando si elaborano dati personali, in alcuni casi è necessario richiedere il consenso degli utenti. Per identificare se è necessario richiedere il consenso, è necessario determinare se la base legale per l'elaborazione dei dati personali è il \"consenso\" o \"interesse legittimo\" o se è possibile evitare la raccolta totale di dati personali. Raccomandiamo capire di più circa la base legale ai sensi del GDPR per Matomo.",
+ "WhenConsentIsNeeded2": "Tieni presente che quando chiedi il consenso ai tuoi utenti e se non riesci a dimostrare di aver ottenuto il \"Consenso\" dei tuoi utenti in passato, ti consigliamo di %1$srendere anonimi i dati grezzi dei tuoi utenti precedentemente monitorati%2$s.",
+ "HowDoIAskForConsent": "Come devo chiedere il consenso agli utenti?",
+ "AskForConsentFollowSteps": "Segui i passaggi seguenti per chiedere all'utente il consenso prima che i dati vengano elaborati all'interno di Matomo.",
+ "AskForConsentStep1": "Passo 1: chiedi il consenso",
+ "AskForConsentStep1Desc1": "Per chiedere il consenso, inserisci la riga seguente in cima al codice di tracking di Matomo già esistente in tutte le pagine:",
+ "AskForConsentStep1Desc2": "Una volta eseguita questa funzione \"requestConsent\", nessuna richiesta di tracciamento verrà inviata a Matomo. Si noti che alcuni %1$scookie di tracciamento%2$s verranno impostati durante questa visualizzazione della pagina ma verranno eliminati non appena l'utente accederà a una pagina diversa o chiuderà il browser.",
+ "AskForConsentStep2": "Passo 2: chiedi il consenso tramite l'avviso sulla privacy",
+ "AskForConsentStep2Desc": "Ora puoi chiedere il consenso all'utente, ad esempio visualizzando una chiara informativa sulla privacy nelle tue pagine. Ulteriori informazioni sugli avvisi sulla privacy e sulla richiesta del consenso dell'utente. Si noti che Matomo non offre ancora la funzione per visualizzare un avviso sulla privacy, ma potrebbe implementare tale funzione in futuro per consentire all'utente di visualizzare facilmente l'avviso e ottenerne il consenso.",
+ "AskForConsentStep3": "Passo 3: l'utente dà il consenso",
+ "AskForConsentStep3Desc": "Una volta che l'utente ha dato il consenso, puoi A) lasciare che Matomo ricordi il consenso o B) utilizzare il tuo strumento di consenso per ricordare il consenso. Presentiamo di seguito le due soluzioni:",
+ "AskForConsentStep3DescA": "A) se vuoi lasciare che Matomo ricordi il consenso",
+ "AskForConsentStep3DescADesc1": "Una volta che un utente avrà dato il proprio consenso, è possibile far ricordare a Matomo che l'utente lo ha fatto semplicemente chiamando il seguente metodo dopo che l'utente ha dato il proprio consenso:",
+ "AskForConsentStep3DescADesc2": "Matomo ricorderà quindi nelle successive richieste che l'utente ha dato il proprio consenso impostando un cookie denominato \"consenso\". Finché esisterà questo cookie, Matomo saprà che è stato dato il consenso e elaborerà automaticamente i dati. Ciò significa che è necessario chiamare %1$s una sola volta e non è necessario chiamare %2$s per tutte le visualizzazioni di pagina.",
+ "AskForConsentStep3DescANote1": "Per impostazione predefinita, il cookie e il consenso saranno ricordati per sempre. È possibile definire un periodo di scadenza opzionale per il consenso dell'utente chiamando:",
+ "AskForConsentStep3DescANote2": "Quando stai monitorando più sottodomini nello stesso sito Web in Matomo, vuoi assicurarti che quando chiedi il Consenso, l'utente fornisca il consenso per tutti i sottodomini su cui stai raccogliendo dati. Se l'utente fornisce il consenso solo per un determinato dominio o sottodomini, potrebbe essere necessario limitare o ampliare l'ambito del dominio e del percorso dei cookie di consenso utilizzando 'setCookieDomain' e 'setCookiePath' (ulteriori informazioni nella guida di JavaScript sul tracking).",
+ "AskForConsentStep3DescANote3": "È necessario che tu non disabiliti i cookies.",
+ "AskForConsentStep3DescB": "B) se si utilizza il proprio strumento di consenso per ricordare il consenso",
+ "AskForConsentStep3DescBDesc1": "In alcuni casi, si registra l'informazione che l'utente ha dato il consenso per essere tracciato direttamente nel proprio sistema o CMS (ad esempio quando si utilizza il proprio cookie per ricordare il consenso dell'utente). Una volta ottenuto il consenso dell'utente per l'elaborazione dei propri dati, è necessario chiamare il metodo 'setConsentGiven':",
+ "AskForConsentStep3DescBDesc2": "Ciò consente al tracker JavaScript di sapere che l'utente ha dato il consenso e garantisce che il tracking funzioni come previsto. Questa funzione deve essere chiamata in qualsiasi momento dopo %1$s.",
+ "AskForConsentStep3DescBNote1": "quando chiami, %1$s Matomo non ricorderà nelle successive richieste che questo utente ha dato il consenso: è importante chiamare setConsentGiven su ogni pagina.",
+ "AskForConsentStep3DescBNote2": "quando l'utente ha dato il consenso, puoi anche evitare di chiamare %1$s in primo luogo.",
+ "AskForConsentStep4": "Passo 4: l'utente rimuove il consenso",
+ "AskForConsentStep4Desc": "Per rimuovere il suo consenso, l'utente deve eseguire un'azione specifica, ad esempio: facendo clic su un pulsante \"Non voglio più essere tracciato\".",
+ "AskForConsentStep4DescA": "A) se vuoi lasciare che Matomo ricordi il consenso",
+ "AskForConsentStep4DescADesc": "Quando l'utente ha espresso di non voler più dare il proprio consenso, è necessario chiamare una volta il seguente metodo:",
+ "AskForConsentStep4DescADesc2": "Ciò assicura che il cookie che ricorda il consenso dato venga eliminato.",
+ "AskForConsentStep4DescB": "B) se si utilizza il proprio strumento di consenso per ricordare il consenso",
+ "AskForConsentStep4DescBDesc": "Quando l'utente ha espresso che non dà più il consenso, non dovrai più chiamare il seguente metodo:",
+ "AskForConsentStepNotes": "Note:",
+ "AnonymizeSites": "Rendi anonimi i dati di questo sito",
+ "AnonymizeRowDataFrom": "Rendi anonimi tutti i dati grezzi a partire da:",
+ "AnonymizeRowDataTo": "Rendi anonimi tutti i dati grezzi fino a:",
+ "AnonymizeIp": "Rendi anonimi gli IP",
+ "AnonymizeIpHelp": "Questa azione non può essere annullata. Se abilitato, per tutte le visite durante questo periodo di tempo l'IP verrà reso anonimo di almeno 2 byte, ad esempio \"192.168.xxx.xxx\". Se al momento è stato configurato per rendere anonimi 3 byte, questa impostazione verrà rispettata e tutti gli IP saranno resi anonimi di 3 byte.",
+ "AnonymizeLocation": "Rendi anonima la Posizione",
+ "AnonymizeLocationHelp": "Questa azione non può essere annullata. Rivaluta la posizione in base all'IP anonimo (almeno 2 byte dell'IP saranno resi anonimi).",
+ "AnonymizeUserId": "Sostituisci l'ID Utente con uno pseudonimo",
"CurrentDBSize": "Dimensione corrente del database",
"DBPurged": "DB ripulito.",
"DeleteBothConfirm": "Stai per abilitare sia l'eliminazione dei dati grezzi che la cancellazione dei dati dei report. Questo rimuoverà permanentemente la possibilità di visualizzare i vecchi dati di analisi. Sei sicuro di volerlo fare?",
diff --git a/plugins/PrivacyManager/lang/ja.json b/plugins/PrivacyManager/lang/ja.json
index 371e1821f5..e954ff64b8 100644
--- a/plugins/PrivacyManager/lang/ja.json
+++ b/plugins/PrivacyManager/lang/ja.json
@@ -8,6 +8,7 @@
"AnonymizeIpMaskLength": "%1$s バイト- 例. %2$s",
"AskingForConsent": "同意を求める",
"ClickHereSettings": "%s 設定はこちらをクリック",
+ "AnonymizeUserId": "ユーザー IDを仮名に置き換える",
"CurrentDBSize": "現在のデータベースサイズ",
"DBPurged": "データベースがパージされました。",
"DeleteBothConfirm": "生データ削除とレポートデータ削除の両方を有効にしようとしています。 これにより、古いアナリティクスデータを表示する機能が完全に削除されます。 これを実行しますか?",
diff --git a/plugins/PrivacyManager/lang/lt.json b/plugins/PrivacyManager/lang/lt.json
index 60232d7d25..ee3a11e581 100644
--- a/plugins/PrivacyManager/lang/lt.json
+++ b/plugins/PrivacyManager/lang/lt.json
@@ -8,6 +8,7 @@
"DeleteOldRawData": "Reguliariai ištrinti senus neapdorotus duomenis",
"DeleteLogsOlderThan": "Ištrinti įrašus senesnius nei",
"DeleteMaxRows": "Maksimalus vienu metu trinamų eilučių kiekis:",
+ "IndividualsRights": "Asmenų teisės",
"LastDelete": "Paskutinis išvalymas atliktas",
"MenuPrivacySettings": "Privatumas",
"NextDelete": "Kitas suplanuotas ištrynimas po",
diff --git a/plugins/PrivacyManager/lang/nl.json b/plugins/PrivacyManager/lang/nl.json
index e44eda9c45..e424e0757a 100644
--- a/plugins/PrivacyManager/lang/nl.json
+++ b/plugins/PrivacyManager/lang/nl.json
@@ -7,6 +7,7 @@
"AnonymizeIpMaskLength": "%1$s byte(s) - bijv. %2$s",
"AskingForConsent": "Vragen om toestemming",
"ClickHereSettings": "Klik hier om naar de %s-instellingen te gaan.",
+ "AnonymizeUserId": "Gebruikers-ID vervangen door een pseudoniem",
"CurrentDBSize": "Huidige databasegrootte",
"DBPurged": "Database geleegd.",
"DeleteDataInterval": "Verwijder oude gegevens elke",
diff --git a/plugins/PrivacyManager/lang/pl.json b/plugins/PrivacyManager/lang/pl.json
index 7503de6cdf..9a27a329bd 100644
--- a/plugins/PrivacyManager/lang/pl.json
+++ b/plugins/PrivacyManager/lang/pl.json
@@ -7,6 +7,7 @@
"AnonymizeIpMaskLength": "%1$s bajt(ów) - np. %2$s",
"AskingForConsent": "Zapytanie o zgodę",
"ClickHereSettings": "Kliknij tutaj, aby uzyskać dostęp do %s ustawień.",
+ "AnonymizeUserId": "Zamień ID użytkownika na pseudonim",
"CurrentDBSize": "Obecny rozmiar bazy danych",
"DBPurged": "Baza danych wyczyszczona.",
"DeleteBothConfirm": "Zamierzasz włączyć kasowanie nieobrobionych danych i raportów. To na zawsze pozbawi Cię możliwości przeglądania archiwalnych danych. Czy na pewno chcesz to zrobić?",
diff --git a/plugins/PrivacyManager/lang/pt-br.json b/plugins/PrivacyManager/lang/pt-br.json
index 1b96386ad0..49ed87bf1e 100644
--- a/plugins/PrivacyManager/lang/pt-br.json
+++ b/plugins/PrivacyManager/lang/pt-br.json
@@ -8,6 +8,7 @@
"AnonymizeIpMaskLength": "%1$s byte(s) - e.g. %2$s",
"AskingForConsent": "Pedir consentimento",
"ClickHereSettings": "Clique aqui para acessar as configurações do %s.",
+ "AnonymizeUserId": "Substituir ID de usuário por um pseudônimo",
"CurrentDBSize": "Tamanho atual da base de dados",
"DBPurged": "BD purgada.",
"DeleteBothConfirm": "Você está prestes a habilitar tanto a exclusão de dados brutos como a exclusão de dados de relatórios. Isto irá remover permanentemente sua capacidade de visualizar dados antigos de análises. Você tem certeza de que deseja fazer isto?",
diff --git a/plugins/PrivacyManager/lang/pt.json b/plugins/PrivacyManager/lang/pt.json
index e26ac8a77e..9b946ca44a 100644
--- a/plugins/PrivacyManager/lang/pt.json
+++ b/plugins/PrivacyManager/lang/pt.json
@@ -7,7 +7,46 @@
"AnonymizeIpMaskLengtDescription": "Selecione quantos bytes dos IPs dos visitantes devem ser mascarados.",
"AnonymizeIpMaskLength": "%1$s byte(s) - por exemplo %2$s",
"AskingForConsent": "Solicitando consentimento",
+ "ConsentExplanation": "O consentimento significa dar a opção de escolha e de controlo a indivíduos sobre como os respetivos dados pessoais são processados.",
"ClickHereSettings": "Clique aqui para aceder às definições %s.",
+ "WhenDoINeedConsent": "Quando necessito de pedir o consentimento do utilizador?",
+ "WhenConsentIsNeeded1": "No contexto das leis de privacidade do RGPD, quando está a processar dados pessoais, em alguns casos precisa de solicitar o consentimento dos utilizadores. Para identificar se necessita de solicitar o consentimento, precisa de determinar se a base legal para processar os dados pessoais é o \"Consentimento\" ou o \"Interesse legítimo\", ou se pode mesmo evitar completamente a recolha de dados pessoais. Nós recomendamos que procure mais informação sobre as bases legais sob o RGPD para o Matomo.",
+ "WhenConsentIsNeeded2": "Note que quando necessita de ter o consentimento dos utilizadores e não pode provar que obteve o \"consentimento\" dos utilizadores no passado, recomendamos que %1$sanonimize os dados em bruto dos utilizadores monitorizados anteriormente%2$s.",
+ "HowDoIAskForConsent": "Como solicito o consentimento dos utilizadores?",
+ "AskForConsentFollowSteps": "Siga os passos abaixo para solicitar os consentimentos aos seus utilizadores antes dos seus dados serem processados no Matomo.",
+ "AskForConsentStep1": "Passo 1: solicitar o consentimento",
+ "AskForConsentStep1Desc1": "Para solicitar o consentimento, insira a linha seguinte no topo do seu código anterior de acompanhamento do Matomo em todas as páginas:",
+ "AskForConsentStep1Desc2": "Assim que esta função ‘requireConsent' for executada, então nenhum pedido de acompanhamento será enviado para o Matomo. Note que algumas %1$scookies de acompanhamento%2$s serão definidas durante a visualização desta página, mas serão eliminadas assim que o utilizador navegar para uma página diferente ou fechar o navegador.",
+ "AskForConsentStep2": "Passo 2: solicitar o consentimento através do seu aviso de privacidade",
+ "AskForConsentStep2Desc": "Agora pode solicitar o consentimento do utilizador mostrando, por exemplo, um aviso de privacidade claro em todas as suas páginas. Saiba mais sobre avisos de privacidade e solicitação de pedidos de consentimento aos utilizadores. Note que o Matomo ainda não fornece a funcionalidade para apresentar um aviso de privacidade, mas poderá implementar esta funcionalidade no futuro para permitir que possa apresentar o aviso e recolher o consentimento dos utilizadores facilmente.",
+ "AskForConsentStep3": "Passo 3: o utilizador dá o consentimento",
+ "AskForConsentStep3Desc": "Após o utilizador dar o consentimento, pode A) deixar que o Matomo memorize a opção do consentimento, ou B) utilizar a sua própria ferramenta de consentimento para guardar o consentimento. Apresentamos as duas soluções abaixo:",
+ "AskForConsentStep3DescA": "A) se quiser que o Matomo memorize a opção de consentimento",
+ "AskForConsentStep3DescADesc1": "Assim que um utilizador dá o seu consentimento, pode permitir que o Matomo memorize que o utilizar deu o consentimento invocando, simplesmente, o método seguinte assim que o utilizador tiver dado o consentimento:",
+ "AskForConsentStep3DescADesc2": "O Matomo irá assim saber, em pedidos subsequentes, que o utilizador deu o seu consentimento, definindo uma cookie denominada por \"consent\". Desde que esta cookie exista, o Matomo saberá que foi dado o consentimento e irá processar a informação automaticamente. Isto significa que apenas necessita de invocar %1$s uma vez e que não necessita de invocar %2$s em cada visualização de página.",
+ "AskForConsentStep3DescANote1": "Por predefinição, a cookie e o consentimento serão lembrados para sempre. Opcionalmente, é possível definir um período de expiração para o consentimento do seu utilizador, invocando:",
+ "AskForConsentStep3DescANote2": "Quando está a acompanhar múltiplos sub-domínios no mesmo site no Matomo, tem de garantir que quando pede o consentimento, o utilizador dá o consentimento para todos os sub-domínios nos quais está a recolher dados. Se o utilizador apenas fornece o consentimento para determinado(s) domínio(s) ou sub-domínio(s), pode necessitar de restringir ou alargar o âmbito do domínio e caminho da cookie de consentimento utilizando 'setCookieDomain' e ‘setCookiePath' (saber mais no guia de acompanhamento por JavaScript).",
+ "AskForConsentStep3DescANote3": "A não desativação de cookies é obrigatória.",
+ "AskForConsentStep3DescB": "B) se utiliza a sua própria ferramenta de consentimento para guardar o consentimento",
+ "AskForConsentStep3DescBDesc1": "Em alguns casos, pode guardar a informação que o utilizador deu o consentimento para ser acompanhado diretamente no seu próprio sistema ou CMS (por exemplo, quando utiliza a sua própria cookie para registar o consentimento do utilizador). Assim que tiver o consentimento do utilizador para processar os seus dados, necessita de invocar o método 'setConsentGiven':",
+ "AskForConsentStep3DescBDesc2": "Isto irá informar o JavaScript de acompanhamento que o utilizador deu o seu consentimento e garantir que o acompanhamento está a funcionar como é suposto. Esta função tem de ser invocada em qualquer altura após %1$s.",
+ "AskForConsentStep3DescBNote1": "quando invocar %1$s, o Matomo não irá memorizar em pedidos subsequentes que este utilizador deu o consentimento: é importante que invoque setConsentGiven em todas as páginas.",
+ "AskForConsentStep3DescBNote2": "quando o utilizador deu o consentimento, pode também evitar invocar %1$s em primeiro lugar.",
+ "AskForConsentStep4": "Passo 4: o utilizar retira o consentimento",
+ "AskForConsentStep4Desc": "Para retirar o seu consentimento, o utilizador necessita de executar uma ação específica, por exemplo: clicar num botão \"Eu não quero deixar de ser monitorizado\".",
+ "AskForConsentStep4DescA": "A) se quiser que o Matomo memorize a opção de consentimento",
+ "AskForConsentStep4DescADesc": "Quando o utilizador expressar o desejo de retirar o consentimento, deve invocar uma vez o seguinte método:",
+ "AskForConsentStep4DescADesc2": "Isto garante que a cookie que regista o consentimento do utilizador é eliminada.",
+ "AskForConsentStep4DescB": "B) se utiliza a sua própria ferramenta de consentimento para guardar o consentimento",
+ "AskForConsentStep4DescBDesc": "Quando o utilizador expressar o desejo de retirar o consentimento, deve deixar de invocar o seguinte método:",
+ "AskForConsentStepNotes": "Notas:",
+ "AnonymizeSites": "Anonimizar os dados deste(s) site(s)",
+ "AnonymizeRowDataFrom": "Anonimizar todos os dados em bruto a começar em:",
+ "AnonymizeRowDataTo": "Anonimizar todos os dados em bruto até:",
+ "AnonymizeIp": "Anonimizar IP",
+ "AnonymizeIpHelp": "Esta ação não pode ser anulada. Se ativada, para todas as visitas durante este período, o IP será anonimizado por, pelo menos, 2 bytes (por exemplo, '192.168.xxx.xxx'). Se atualmente tiver configurada a anonimização por 3 bytes, então esta definição será respeitada e todos os IPs serão anonimizados em 3 bytes.",
+ "AnonymizeLocation": "Anonimizar localização",
+ "AnonymizeUserId": "Substituir o ID de utilizador por um pseudónimo",
"CurrentDBSize": "Tamanho atual da base de dados",
"DBPurged": "Base de dados limpa.",
"DeleteBothConfirm": "Está prestes a ativar a eliminação tanto dos dados em bruto como os dados dos relatórios. Isto vai remover permanentemente a sua capacidade de ver dados analíticos antigos. Tem a certeza que pretende fazer isto?",
@@ -73,6 +112,14 @@
"UseAnonymizeTrackingData": "Anonimizar as informações de acompanhamento",
"UseAnonymizeUserId": "Anonimizar ID de utilizador",
"PseudonymizeUserId": "Substituir o ID de utilizador por um pseudónimo",
+ "OptOutCustomize": "Personalizar a frame de exclusão",
+ "OptOutHtmlCode": "Código HTML para incorporar no seu site",
+ "OptOutPreview": "Pré-visualização de como a exclusão será apresentada no seu site",
+ "FontColor": "Cor do tipo de letra",
+ "FontSize": "Tamanho do tipo de letra",
+ "FontFamily": "Família do tipo de letra",
+ "BackgroundColor": "Cor de fundo",
+ "TrackingOptOut": "Permitir aos utilizadores a exclusão do acompanhamento",
"UseAnonymizeOrderId": "Anonimizar o ID de um pedido",
"UseDeleteLog": "Eliminar com regularidade dados em bruto antigos da base de dados",
"UseDeleteReports": "Apagar com regularidade os relatórios antigos da base de dados",
diff --git a/plugins/PrivacyManager/lang/ru.json b/plugins/PrivacyManager/lang/ru.json
index 0fdcac2bd9..7e21b8aedb 100644
--- a/plugins/PrivacyManager/lang/ru.json
+++ b/plugins/PrivacyManager/lang/ru.json
@@ -6,6 +6,7 @@
"AnonymizeIpMaskLengtDescription": "Выберите, как много байтов IP-адреса посетителей должно быть скрыто.",
"AnonymizeIpMaskLength": "%1$s байт(ов), например, %2$s",
"ClickHereSettings": "Нажмите здесь, чтобы перейти к настройкам: %s.",
+ "AnonymizeUserId": "Заменить ID пользователя всевдонимом",
"CurrentDBSize": "Текущий размер базы данных",
"DBPurged": "База данных очищена.",
"DeleteDataInterval": "Удалять старые данные каждые",
diff --git a/plugins/PrivacyManager/lang/sq.json b/plugins/PrivacyManager/lang/sq.json
index 8ad1ece5c1..25b8ed846c 100644
--- a/plugins/PrivacyManager/lang/sq.json
+++ b/plugins/PrivacyManager/lang/sq.json
@@ -7,7 +7,51 @@
"AnonymizeIpMaskLengtDescription": "Përzgjidhni sa bajte të maskohen te IP-ja e vizitorit.",
"AnonymizeIpMaskLength": "%1$s bajt(e) - p.sh. %2$s",
"AskingForConsent": "Kërkim pranimi",
+ "ConsentExplanation": "Pranim do të thotë t’u ofrohet individëve zgjedhje dhe kontroll rreth se si përpunohen të dhënat e tyre personale.",
"ClickHereSettings": "Klikoni këtu që të shkoni te rregullimet mbi %s.",
+ "WhenDoINeedConsent": "Kur më duhet të kërkoj për pranim nga përdoruesi?",
+ "WhenConsentIsNeeded1": "Sipas rregullave GDPR mbi privatësinë, kur përpunoni të dhëna personale, në dusa raste do t’ju duhet të kërkoni për pranim nga përdoruesit tuaj. Që të përcaktoni nëse ju duhet apo jo të kërkoni pranim, ju duhet të përcaktoni nëse baza juaj ligjore për përpunim të dhënash personale është \"Pranim\" apo \"Interes i ligjshëm\", ose nëse mund të shmangni fare grumbullim të dhënash personale. Këshillojmë të mësoni më tepër mbi bazën ligjore sipas GDPR-së për Matomo-n.",
+ "WhenConsentIsNeeded2": "Mbani parasysh se kur e keni detyrim të merrni pranimin e përdoruesve dhe nuk provoni dot se patët \"Pranimin\" e përdoruesve tuaj në të kaluarën, atëherë këshillojmë të %1$sanonimizoni të dhënat e papërpunuara të përdoruesve të ndjekur dikur%2$s.",
+ "HowDoIAskForConsent": "Si ta kërkoj pranimin nga përdoruesit?",
+ "AskForConsentFollowSteps": "Ndiqni hapat vijues për t’u kërkuar përdoruesve tuaj pranimin, përpara se të dhënat e tyre përpunohen me Matomo-n.",
+ "AskForConsentStep1": "Hapi 1: kërkoni pranim",
+ "AskForConsentStep1Desc1": "Për të kërkuar pranim, futni rreshtin vijues në krye të kodit tuaj ekzistues për Ndjekje me Matomo në krejt faqet tuaja:",
+ "AskForConsentStep1Desc2": "Pasi të jetë ekzekutuar ky funksion ‘requireConsent', te Matomo s’do të dërgohen kërkesa ndjekjeje. Kini parasysh që gjatë parjes së kësaj faqeje do të depozitohen ca %1$scookies ndjekjeje%2$s, por që do të fshihen sapo përdoruesi të kalojë në një faqe tjetër ose të mbyllë shfletuesin.",
+ "AskForConsentStep2": "Hapi 2: kërkim pranimi nëpër njoftimin tuaj për privatësinë",
+ "AskForConsentStep2Desc": "Tani mund t’i kërkoni përdoruesit tuaj pranimin, për shembull duke i shfaqur një shënim të qartë privatësie në faqet tuaja. Mësoni më tepër rreth shënimesh mbi privatësinë dhe kërkim pranimi nga përdoruesi. Mbani parasysh se Matomo nuk ofron ende veçorinë e shfaqjes së një shënimi privatësie, por mund të sendërtojë një veçori të tillë në të ardhmen, për t’ju lejuar të shfaqni me lehtësi shënimin dhe të merrni pranime nga përdoruesit.",
+ "AskForConsentStep3": "Hapi 3: përdoruesi jep pranimin",
+ "AskForConsentStep3Desc": "Pasi një përdorues jep pranimin, mundeni ose A) ta lini Matomo-s ta mbajë mend pranimin, ose B) të përdorni mjetin tuaj të pranimeve që të mbani mend pranimin. Më poshtë paraqesim dy zgjidhjet:",
+ "AskForConsentStep3DescA": "A) nëse doni t’ia lini Matomo-s të mbajë mend pranimin",
+ "AskForConsentStep3DescADesc1": "Pasi një përdorues jep pranimin e vet, mund t’i lini Matomo-s ta mbajë mend që përdoruesi ka dhënë pranimin, thjesht duke thirrur metodën vijuese, pasi përdoruesi të ketë dhënë pranimin:",
+ "AskForConsentStep3DescADesc2": "Matomo-ja kështu do të mbajë mend, gjatë kërkesash më pas, se përdoruesi ka dhënë pranimin e tij, duke depozituar një <em>cookie <\/em> të quajtur \"consent\". Për sa kohë që ekziston kjo <em>cookie<\/em>, Matomo do të dijë se është dhënë pranim dhe do të përpunojë automatikisht të dhënat. Kjo do të thotë se ju duhet ta thirrni %1$s vetëm një herë, dhe se s’ka nevojë të thirret %2$s në çdo parje faqeje.",
+ "AskForConsentStep3DescANote1": "Si parazgjedhje, <em>cookie<\/em> do të ruhet dhe pranimi do të mbahet mend përgjithmonë. Është e mundur të përcaktohet një periudhë opsionale skadimi për pranimin e përdoruesit tuaj, duke thirrur:",
+ "AskForConsentStep3DescANote2": "Kur ndiqni njëherësh shumë nënpërkatësi të të njëjtit sajt në Matomo, doni të bëni të mundur që kur kërkoni për Pranim, përdoruesi jep pranimin për krejt nënpërkatësitë te të cilat grumbulloni të dhëna. Nëse përdoruesi jep pranim vetëm për një përkatësi ose nënpërkatësi të dhënë, lypset të kufizoni ose zgjeroni shtrirjen e përkatësisë dhe shtegut të cookie-t të pranimit duke përdorur 'setCookieDomain' dhe ‘setCookiePath' (mësoni më tepër te udhërrëfyesi i ndjekjes me JavaScript).",
+ "AskForConsentStep3DescANote3": "Është e domosdoshme të mos çaktivizoni cookie-t.",
+ "AskForConsentStep3DescB": "B) nëse përdorni një mjet tuajin për mbajtje mend pranimesh",
+ "AskForConsentStep3DescBDesc1": "Në disa raste, të dhënat që përdoruesi ka dhënë pranim të ndiqet, i regjistroni drejtpërsëdrejti në sistemin ose CMS-në tuaj (për shembull, kur përdorni një <em>cookie<\/em> tuajën për të mbajtur mend pranim përdoruesi). Pasi të keni pranimin nga përdoruesi që të përpunoni të dhëna të tyre, lypset të vini në punë metodën 'setConsentGiven':",
+ "AskForConsentStep3DescBDesc2": "Kjo i lejon gjurmuesit JavaScript të dijë që përdoruesi ka dhënë pranimin dhe të sigurojë që gjurmimi po funksionon si duhet. Ky funksion është e domosdoshme të thirret sa herë pas %1$s.",
+ "AskForConsentStep3DescBNote1": "kur vini në punë %1$s, Matomo-ja s’do të mbajë mend gjatë kërkesash në vazhdim se ky përdorues ka dhënë pranim: është e rëndësishme të thirrni setConsentGiven në çdo faqe.",
+ "AskForConsentStep3DescBNote2": "kur përdoruesi e ka dhënë pranimin, mundeni edhe të shmgani fillimisht thirrjen e %1$s.",
+ "AskForConsentStep4": "Hapi 4: përdoruesi nuk e pranon më",
+ "AskForConsentStep4Desc": "Që të mund të heqë pranimin e tij përdoruesit i duhet të kryejë një veprim specifik, për shembull: klikimi mbi një buton “S’dua të ndiqem më”.",
+ "AskForConsentStep4DescA": "A) nëse doni t’ia lini Matomo-s të mbajë mend pranimin",
+ "AskForConsentStep4DescADesc": "Kur përdorues ka shprehur se nuk jep më pranimin, duhet të vini në punë menjëherë metodën vijuese:",
+ "AskForConsentStep4DescADesc2": "Kjo garanton që <em>cookie<\/em> e cila shërbente për të mbajtur mend pranimin fshihet.",
+ "AskForConsentStep4DescB": "B) nëse përdorni një mjet tuajin për mbajtje mend pranimesh",
+ "AskForConsentStep4DescBDesc": "Kur përdoruesi ka shprehur se nuk jep më pranim, s’duhet ta vini më në punë metodën vijuese:",
+ "AskForConsentStepNotes": "Shënime:",
+ "AnonymizeSites": "Anonimizo të dhënat e këtij sajti(eve)",
+ "AnonymizeRowDataFrom": "Anonimizo krejt të dhënat e papërpunuara duke filluar nga:",
+ "AnonymizeRowDataTo": "Anonimizo krejt të dhënat e papërpunuara deri më:",
+ "AnonymizeIp": "Anonimizo IP",
+ "AnonymizeIpHelp": "Ky veprim s’mund të zhbëhet. Në u aktivizoftë, për krejt vizitat gjatë kohëzgjatjes, IP-ja do të anonimizohet të paktën me 2 bajte, për shembull '192.168.xxx.xxx'. Nëse keni formësuar të anonimizohen 3 bajte, atëherë ky rregullim do të respektohet dhe krejt IP-të do të anonimizohen me 3 bajte.",
+ "AnonymizeLocation": "Anonimizo Vendndodhje",
+ "AnonymizeLocationHelp": "Ky veprim s’mund të zhbëhet. Rivlerëson vendndodhjen bazuar bë IP-në e anonimizuar (do të anonimizohen të paktën 2 bajte të IP-së).",
+ "AnonymizeUserId": "Zëvendëso ID Përdoruesi me një pseudonim",
+ "AnonymizeUserIdHelp": "Kur aktivizoni këtë mundësi, ID-ja e Përdoruesit do të zëvendësohet me një pseudonim, që të shmanget depozitimi dhe shfaqja e drejtpërdrejtë e të dhënash që lejojnë identifikim personal, bie fjala, një adresë email. Në terma teknikë: me bazë ID-në tuaj të Përdoruesit, Matomo-ja do të përpunojë pseudonimin e ID-së së Përdoruesit duke përdorur një funksion hash <em>salted<\/em>.<br\/><br\/><em>Shënim: zëvendësimi me një pseudonim s’është e njëjta gjë si anonimizimi. Sipas termave të GDPR-së: pseudonimi i ID-së së Përdoruesit ende konsiderohet e dhënë personale. ID-ja origjinale e Përdoruesit ende mund të identifikohet, nëse kihen disa të dhëna shtesë (te të cilat mund të hyjnë vetëm Matomo dhe përpunuesi juaj i të dhënave).<\/em>",
+ "AnonymizeProcessInfo": "Ky veprim mund të zgjasë një kohë të gjatë, ndaj edhe s’do të kryhet menjëherë. Më poshtë do të jeni në gjendje të ndiqni gjendjen aktuale të procesit. Anonimizimi normalisht duhet të fillojë brenda një ore.",
+ "AnonymizeDataNow": "Anonimizo të dhëna të dikurshme për sajtin dhe kohën e përzgjedhur",
+ "AnonymizeDataConfirm": "Jeni i sigurt se doni të anonimizohen të dhënat për sajtin(et) e përzgjedhur dhe intervalin e dhënë të kohës? Ky veprim s’mund të zhbëhet, të dhëna mund të fshihen, në u dashtë, dhe ky proces do të hajë një kohë të gjatë.",
"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 si për të dhënat e papërpunuara, ashtu edhe për të dhëna raportesh. Kjo do t’ju heqë përgjithmonë aftësinë të shihni të dhëna analitike të vjetra. Jeni i sigurt se doni të bëhet kjo?",
diff --git a/plugins/PrivacyManager/lang/sv.json b/plugins/PrivacyManager/lang/sv.json
index 360557a328..3b60576337 100644
--- a/plugins/PrivacyManager/lang/sv.json
+++ b/plugins/PrivacyManager/lang/sv.json
@@ -7,6 +7,7 @@
"AnonymizeIpMaskLength": "%1$s byte(s) - t.ex. %2$s",
"AskingForConsent": "Begär samtycke",
"ClickHereSettings": "Klicka här för att komma åt inställningar för %s.",
+ "AnonymizeUserId": "Byt ut användar-Id mot ett pseudonym",
"CurrentDBSize": "Aktuell databasstorlek",
"DBPurged": "DB rensad.",
"DeleteBothConfirm": "Du är på väg att aktivera radering av både loggar och rapportdata. Det innebär att du permanent kommer att förlora möjligheterna att visa gammal analysdata. Är du säker på att du vill göra detta?",
diff --git a/plugins/PrivacyManager/lang/tr.json b/plugins/PrivacyManager/lang/tr.json
index d42318f26a..56433d89fc 100644
--- a/plugins/PrivacyManager/lang/tr.json
+++ b/plugins/PrivacyManager/lang/tr.json
@@ -6,8 +6,48 @@
"AnonymizeIpExtendedHelp": "Bu seçenek etkinleştirildiğinde, Matomo web sitenize gelen ziyaretçilerin IP adresini (%1$s gibi) kullanmaz ve IP adresini anonim kılar (%2$s gibi). IP adresinin anonim kılınması Almanya gibi bazı ülkelerde kişisel verilerin korunması yasalarına göre zorunludur.",
"AnonymizeIpMaskLengtDescription": "Ziyaretçi IP adreslerinin kaç baytının maskeleneceğini seçin.",
"AnonymizeIpMaskLength": "%1$s bayt - Örnek: %2$s",
- "AskingForConsent": "Onay Sorma",
+ "AskingForConsent": "Onay sorma",
+ "ConsentExplanation": "Onay sorma, kişilere kendi kişisel verilerinin nasıl işleneceğini seçme ve denetleme olanağı sunar.",
"ClickHereSettings": "%s ayarlarına erişmek için buraya tıklayın.",
+ "WhenDoINeedConsent": "Kullanıcı onayını ne zaman sormalıyım?",
+ "WhenConsentIsNeeded1": "GDPR kişisel gizlilik düzenlemeleri kapsamında, kişisel verileri işlerken, bazı durumlarda kullanıcılarınızın onayını istemeniz gerekir. Onay istemeniz gerekip gerekmediğini belirlemek için kişisel verilerin işlenmesine ilişkin yasal dayanağınızın \"Onay\" ya da \"Meşru menfaat\" olup olmadığını veya kişisel verilerin toplanmasından tamamen kaçınıp kaçınamayacağınızı belirlemeniz gerekir. Matomo için GDPR kapsamındaki yasal dayanak hakkında daha fazla bilgi edinmenizi öneririz.",
+ "WhenConsentIsNeeded2": "Kullanıcılarınızın onayını almanız gerektiğinde ve geçmişte kullanıcılarınızın \"Onayını\" aldığınızı kanıtlayamıyorsanız, %1$sönceden izlediğiniz ham kullanıcı verilerini anonimleştirmeniz%2$s önerilir.",
+ "HowDoIAskForConsent": "Kullanıcılardan nasıl onay isterim?",
+ "AskForConsentFollowSteps": "Verilerinin Matomo tarafından işlenmesinden önce kullanıcılardan onay istemek için aşağıdaki adımları izleyin.",
+ "AskForConsentStep1": "1. Adım: Onay istenir",
+ "AskForConsentStep1Desc1": "Onay istemek için aşağıdaki satırları tüm sayfalarınızda var olan Matomo İzleme kodunun üstüne ekleyin:",
+ "AskForConsentStep1Desc2": "Bu 'requireConsent' işlevi yürütüldükten sonra Matomo tarafına hiçbir izleme isteği gönderilmez. Bu sayfa görüntülenirken bazı %1$sizleme çerezlerinin%2$s kullanılabileceğini unutmayın. Ancak bu çerezler kullanıcı başka bir sayfaya geçtiğinde ya da web tarayıcıyı kapattığında silinir.",
+ "AskForConsentStep2": "2. Adım: Kişisel gizlilik bildirimi yoluyla onay istenir",
+ "AskForConsentStep2Desc": "Şimdi kullanıcılardan, örneğin sayfalarınızda açık bir kişisel gizlilik bildirimi görüntüleyerek onay vermesini isteyebilirsiniz. Kişisel gizlilik bildirimleri ve kullanıcı onayı isteme hakkında ayrıntılı bilgi alın. Matomo tarafından henüz bir kişisel gizlilik bildirimi görüntüleme özelliği sunulmadığını, ancak gelecekte kişisel gizlilik bildiriminin kolayca görüntülenmesini ve kullanıcının onayının alınmasını sağlayacak bir özelliğin eklenebileceğini unutmayın.",
+ "AskForConsentStep3": "3. Adım: Kullanıcı onay verir",
+ "AskForConsentStep3Desc": "Kullanıcı onay verdiğinde, A) Matomo tarafından verilmiş onayın hatırlanmasına izin verebilir ya da B) onayın hatırlanması için kendi onay aracınızı kullanabilirsiniz. Aşağıda bu iki çözümü sunuyoruz:",
+ "AskForConsentStep3DescA": "A) Matomo tarafından verilmiş onayın hatırlanmasına izin veriyorsanız",
+ "AskForConsentStep3DescADesc1": "Kullanıcı onay verdiğinde, aşağıdaki yöntemi çağırarak Matomo tarafından kullanıcının onay verdiğinin hatırlanmasına izin verebilirsiniz:",
+ "AskForConsentStep3DescADesc2": "Matomo \"consent\" adında bir çerez ayarlayarak sonraki isteklerde kullanıcının onay verdiğini hatırlar. Bu çerez var olduğu sürece, Matomo onay verildiğini bilir ve verileri otomatik olarak işler. Böylece %1$s yöntemini bir kez çağırmanız yeterlidir ve her sayfa görüntülemesi için %2$s yöntemini çağırmanız gerekmez.",
+ "AskForConsentStep3DescANote1": "Varsayılan olarak, çerez ve onay sonsuza kadar hatırlanır. Şunu çağırarak kullanıcı onayı için isteğe bağlı bir son kullanma süresi belirtilebilir:",
+ "AskForConsentStep3DescANote2": "Matomo üzerinde aynı web sitesindeki birden çok alt alanı izliyorsanız, onay isterken kullanıcının veri topladığınız tüm alt etki alanları için izin verdiğinden emin olmak istersiniz. Kullanıcı yalnız belirli bir etki alanı ya da alt etki alanları için onay verirse, 'setCookieDomain' ve 'setCookiePath' seçeneklerini kullanarak onay çerezi etki alanı adı ve yolunun kapsamını kısıtlamanız ya da genişletmeniz gerekebilir (JavaScript izleme rehberinden ayrıntılı bilgi alabilirsiniz).",
+ "AskForConsentStep3DescANote3": "Çerezlerin devre dışı bırakılmaması gerekir.",
+ "AskForConsentStep3DescB": "B) Onayın hatırlanması için kendi onay aracınızı kullanıyorsanız",
+ "AskForConsentStep3DescBDesc1": "Bazı durumlarda, kullanıcının kendi sisteminizde ya da İçerik Yönetim Sisteminizde doğrudan izlenmesine onay verdiği bilgileri kaydedersiniz (kullanıcı onayını anımsamak için kendi çerezinizi kullanmanız gibi). Kullanıcıdan verilerini işleme iznini aldıktan sonra, 'setConsentGiven' işlevini çağırmanız gerekir:",
+ "AskForConsentStep3DescBDesc2": "Bununla kullanıcının JavaScript izleyiciye onay verdiği bilinir ve izleme olması gerektiği gibi çalışır. Bu işlev %1$s sonrasında çağrılmalıdır.",
+ "AskForConsentStep3DescBNote1": "%1$s işlevini çağırdığınızda, Matomo sonraki isteklerde bu kullanıcının onay verdiğini hatırlamaz: her sayfada setConsentGiven  işlevini çağırmanız önemlidir.",
+ "AskForConsentStep3DescBNote2": "kullanıcı onay verdiğinde, öncelikle %1$s işlevini çağırmaktan kaçınmanız gerekir.",
+ "AskForConsentStep4": "4. Adım: Kullanıcı onayını geri alır",
+ "AskForConsentStep4Desc": "Kullanıcının, onayını kaldırmak için belirli bir işlem yapması gerekir. Örneğin: \"Artık izlenmek istemiyorum\" gibi bir düğmeye tıklar.",
+ "AskForConsentStep4DescA": "A) Verilmiş onayın Matomo tarafından hatırlanmasını istiyorsanız",
+ "AskForConsentStep4DescADesc": "Kullanıcı artık onay vermediğini belirttiğinde, şu yöntemi bir kez çağırmanız gerekir:",
+ "AskForConsentStep4DescADesc2": "Bu işlem verilmiş onayın hatırlanmasını sağlayan çerezi siler.",
+ "AskForConsentStep4DescB": "B) Onayın hatırlanması için kendi onay aracınızı kullanıyorsanız",
+ "AskForConsentStep4DescBDesc": "Kullanıcı artık onay vermediğini belirttiğinde, şu yöntemi artık çağırmamalısınız:",
+ "AskForConsentStepNotes": "Notlar:",
+ "AnonymizeSites": "Şu sitelerin verileri anonimleştirilsin",
+ "AnonymizeRowDataFrom": "Şu tarihten sonraki tüm ham veriler anonim kılınsın:",
+ "AnonymizeRowDataTo": "Şu tarihten önceki tüm ham veriler anonim kılınsın:",
+ "AnonymizeIp": "IP Adresi Anonim Kılınsın",
+ "AnonymizeIpHelp": "Bu işlem geri alınamaz. Bu seçenek etkinleştirildiğinde, bu sürede yapılan tüm ziyaretlerin IP adresleri '192.168.xxx.xxx' gibi en az 2 bayt kullanılarak anonim kılınır. Anonim kılmak seçeneğini 3 bayt olarak yapılandırdıysanız, bu ayara uyulur ve tüm IP adresleri 3 bayt kullanılarak anonim kılınır.",
+ "AnonymizeLocation": "Konum Anonim Kılınsın",
+ "AnonymizeLocationHelp": "Bu işlem geri alınamaz. Konum, anonim kılınmış IP adresine göre yeniden değerlendirilir (IP adresinin en az 2 baytı anonim kılınır).",
+ "AnonymizeUserId": "Kullanıcı Kodu Sahte Kullanıcı Koduna Dönüştürülsün",
"CurrentDBSize": "Geçerli veritabanı boyutu",
"DBPurged": "Veritabanı temizlendi.",
"DeleteBothConfirm": "Hem ham verileri hem de rapor verilerini silmeyi seçtiniz. Bu işlemin sonunda eski istatistik verileriniz kalıcı olarak silinecek ve raporları da yeniden oluşturamayacaksınız. Bu işlemi yapmak istediğinize emin misiniz?",
diff --git a/plugins/PrivacyManager/lang/zh-tw.json b/plugins/PrivacyManager/lang/zh-tw.json
index aad6f74ef2..9655961efa 100644
--- a/plugins/PrivacyManager/lang/zh-tw.json
+++ b/plugins/PrivacyManager/lang/zh-tw.json
@@ -7,6 +7,7 @@
"AnonymizeIpMaskLength": "%1$s 字節,例如 %2$s",
"AskingForConsent": "要求同意",
"ClickHereSettings": "點擊這裡查看 %s 設定。",
+ "AnonymizeUserId": "以假名取代使用者 ID",
"CurrentDBSize": "目前資料庫大小",
"DBPurged": "資料庫已清理。",
"DeleteBothConfirm": "你將啟用原始資料刪除和報表刪除功能。這將永久刪除舊資料,你將無法再查看舊有分析資料。確定要繼續嗎?",
diff --git a/plugins/PrivacyManager/templates/askingForConsent.twig b/plugins/PrivacyManager/templates/askingForConsent.twig
index 6927505d1b..1ef5450a6d 100644
--- a/plugins/PrivacyManager/templates/askingForConsent.twig
+++ b/plugins/PrivacyManager/templates/askingForConsent.twig
@@ -4,64 +4,64 @@
{% block content %}
<div piwik-content-intro>
- <h2>Asking for consent</h2>
- <p>Consent means offering individuals choice and control about how their personal data is processed.</p>
+ <h2>{{ 'PrivacyManager_AskingForConsent'|translate }}</h2>
+ <p>{{ 'PrivacyManager_ConsentExplanation'|translate }}</p>
</div>
- <div piwik-content-block content-title="When do I need to ask for user consent?" class="privacyAskingForConsent">
+ <div piwik-content-block content-title="{{ 'PrivacyManager_WhenDoINeedConsent'|translate|e('html_attr') }}" class="privacyAskingForConsent">
<p>
- In the context of the GDPR privacy regulations, when you are processing personal data, in some cases you will need to ask for your users' consent. To identify whether you need to ask for consent, you need to determine whether your lawful basis for processing personal data is "Consent" or "Legitimate interest", or whether you can avoid collecting personal data altogether. We recommend to learn more about the lawful basis under the GDPR for Matomo.
+ {{ 'PrivacyManager_WhenConsentIsNeeded1'|translate }}
<br /><br />
- Note that when you require to have your users' consents and if you cannot prove that you got the "Consent" of your users in the past, then we recommend to <a href="{{ linkTo({module: 'PrivacyManager', action: 'privacySettings'}) }}">anonymise your previously tracked users' raw data</a>.
+ {{ 'PrivacyManager_WhenConsentIsNeeded2'|translate('<a href="' ~ linkTo({module: 'PrivacyManager', action: 'privacySettings'}) ~ '">', '</a>.')|raw }}
</p>
</div>
- <div piwik-content-block content-title="How do I ask users for consent?" class="privacyAskingForConsent">
+ <div piwik-content-block content-title="{{ 'PrivacyManager_HowDoIAskForConsent'|translate|e('html_attr') }}" class="privacyAskingForConsent">
<p>
- Follow the steps below to ask your user for their consents before their data is processed within Matomo.
+ {{ 'PrivacyManager_AskForConsentFollowSteps'|translate }}
</p>
- <h3>Step 1: require consent</h3>
+ <h3>{{ 'PrivacyManager_AskForConsentStep1'|translate }}</h3>
<p>
- To require consent, insert the following line at top of your existing Matomo Tracking code on all your pages:
+ {{ 'PrivacyManager_AskForConsentStep1Desc1'|translate }}
</p>
<pre piwik-select-on-focus><code>// require user consent before processing data
_paq.push(['requireConsent']);
_paq.push(['trackPageview']);
[...]</code></pre>
<p>
- Once this function ‘requireConsent' is executed then no tracking request will be sent to Matomo. Note that some <a href="https://matomo.org/faq/general/faq_146/" target="_blank" rel="noreferrer noopener">tracking cookies</a> will be set during this page view but will be deleted as soon as the user navigates to a different page or closes the browser.
+ {{ 'PrivacyManager_AskForConsentStep1Desc2'|translate('<a href="https://matomo.org/faq/general/faq_146/" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}
</p>
- <h3>Step 2: asking for consent through your privacy notice</h3>
- <p>Now you can ask the user for consent for example by displaying a clear privacy notice on your pages. Learn more about privacy notices and asking for user consent. Note that Matomo does not yet offer the feature to display a privacy notice, but may implement such a feature in the future to easily let you display the notice and gather user consent.
+ <h3>{{ 'PrivacyManager_AskForConsentStep2'|translate }}</h3>
+ <p>
+ {{ 'PrivacyManager_AskForConsentStep2Desc'|translate }}
</p>
- <h3>Step 3: user gives consent</h3>
+ <h3>{{ 'PrivacyManager_AskForConsentStep3'|translate }}</h3>
<p>
- Once a user gives consent, you can either A) let Matomo remember the consent, or B) use your own consent tool to remember the consent. We present the two solutions below:
+ {{ 'PrivacyManager_AskForConsentStep3Desc'|translate }}
<br /><br />
- <strong>A) if you want to let Matomo remember the consent</strong>
+ <strong>{{ 'PrivacyManager_AskForConsentStep3DescA'|translate }}</strong>
<br />
- Once a user gives their consent, you can let Matomo remember that the user has given consent by simply calling the following method once the user has given her or his consent:
+ {{ 'PrivacyManager_AskForConsentStep3DescADesc1'|translate }}
</p>
<pre piwik-select-on-focus><code>_paq.push(['rememberConsentGiven'])</code></pre>
<p>
- Matomo will then remember on subsequent requests that the user has given her or his consent by setting a cookie named "consent". As long as this cookie exists, Matomo will know that consent has been given and will automatically process the data. This means that you only need to call <code piwik-select-on-focus>_paq.push(['rememberConsentGiven'])</code> once, and it is not needed to call <code piwik-select-on-focus>_paq.push(['setConsentGiven'])</code> on any page view.
+ {{ 'PrivacyManager_AskForConsentStep3DescADesc2'|translate("<code piwik-select-on-focus>_paq.push(['rememberConsentGiven'])</code>", "<code piwik-select-on-focus>_paq.push(['setConsentGiven'])</code>")|raw }}
<br /><br />
- Notes:
+ {{ 'PrivacyManager_AskForConsentStepNotes'|translate }}
</p>
<ol>
- <li>By default, the cookie and consent will be remembered forever. It is possible to define an optional expiry period for your user consent by calling:
-
+ <li>{{ 'PrivacyManager_AskForConsentStep3DescANote1'|translate }}
<br /><code piwik-select-on-focus>_paq.push(['rememberConsentGiven', optionallyExpireConsentInHours])</code>.</li>
- <li>When you're tracking multiple sub-domains into the same website in Matomo, you want to ensure that when you ask for Consent, the user gives consent for all the sub-domains on which you are collecting data. If the user only gives consent for a particular domain or sub-domain(s), you may need to restrict or widen the scope of the consent cookie domain and path by using 'setCookieDomain' and ‘setCookiePath' (learn more in the JavaScript tracking guide). </li>
- <li>It is required that you do not disable cookies.</li>
+ <li>{{ 'PrivacyManager_AskForConsentStep3DescANote2'|translate }}</li>
+ <li>{{ 'PrivacyManager_AskForConsentStep3DescANote3'|translate }}</li>
</ol>
<p>
<br />
<br />
- <strong>B) if you use your own consent tool to remember the consent</strong>
+ <strong>{{ 'PrivacyManager_AskForConsentStep3DescB'|translate }}</strong>
<br />
- In some cases, you record the information that the user has given consent to be tracked directly in your own system or CMS (for example when you use your own a cookie to remember user consent). Once you have the consent by the user to process their data, you need to call the 'setConsentGiven' method:
+ {{ 'PrivacyManager_AskForConsentStep3DescBDesc1'|translate }}
</p>
<pre piwik-select-on-focus><code>// require user consent before processing data
_paq.push(['requireConsent']);
@@ -71,31 +71,31 @@ _paq.push([‘trackPageview']);
// user has given consent to process their data
_paq.push(['setConsentGiven']);</code></pre>
<p>
- This lets the JavaScript tracker know that the user has given consent and ensures the tracking is working as expected. This function needs to be called anytime after <code piwik-select-on-focus>_paq.push(['requireConsent'])</code>.
+ {{ 'PrivacyManager_AskForConsentStep3DescBDesc2'|translate("<code piwik-select-on-focus>_paq.push(['requireConsent'])</code>")|raw }}
<br />
<br />
- Notes:
+ {{ 'PrivacyManager_AskForConsentStepNotes'|translate }}
</p>
<ol>
- <li>when you call <code piwik-select-on-focus>_paq.push(['setConsentGiven'])</code>, Matomo will not remember on subsequent requests that this user has given consent: it is important that you call setConsentGiven on every page.</li>
- <li>when the user has given consent, you could also avoid calling <code piwik-select-on-focus>_paq.push(['requireConsent'])</code> in the first place. </li>
+ <li>{{ 'PrivacyManager_AskForConsentStep3DescBNote1'|translate("<code piwik-select-on-focus>_paq.push(['setConsentGiven'])</code>")|raw }}</li>
+ <li>{{ 'PrivacyManager_AskForConsentStep3DescBNote2'|translate("<code piwik-select-on-focus>_paq.push(['requireConsent'])</code>")|raw }}</li>
</ol>
- <h3>Step 4: user removes consent</h3>
+ <h3>{{ 'PrivacyManager_AskForConsentStep4'|translate }}</h3>
<p>
- In order to remove his consent the user needs to perform a specific action, for example: clicking on a button "I do not want to be tracked anymore".
+ {{ 'PrivacyManager_AskForConsentStep4Desc'|translate }}
<br /><br />
- <strong>A) if you want to let Matomo remember the consent</strong>
+ <strong>{{ 'PrivacyManager_AskForConsentStep4DescA'|translate }}</strong>
<br />
- When the user has expressed she or he no longer gives consent, you need to call the following method once:
+ {{ 'PrivacyManager_AskForConsentStep4DescADesc'|translate }}
</p>
<pre piwik-select-on-focus><code> _paq.push(['forgetConsentGiven']);</code></pre>
- <p>This makes sure the cookie that remembered the given consent is deleted.
-
+ <p>
+ {{ 'PrivacyManager_AskForConsentStep4DescADesc2'|translate }}
<br />
<br />
- <strong>B) if you use your own consent tool to remember the consent</strong><br />
- When the user has expressed she or he no longer gives consent, you shall not call the following method anymore:
+ <strong>{{ 'PrivacyManager_AskForConsentStep4DescB'|translate }}</strong><br />
+ {{ 'PrivacyManager_AskForConsentStep4DescBDesc'|translate }}
<br />
</p>
<pre piwik-select-on-focus><code>// do not call this once user has removed their consent
diff --git a/plugins/PrivacyManager/templates/gdprOverview.twig b/plugins/PrivacyManager/templates/gdprOverview.twig
index f461cad7a9..9dfed7aa6d 100644
--- a/plugins/PrivacyManager/templates/gdprOverview.twig
+++ b/plugins/PrivacyManager/templates/gdprOverview.twig
@@ -5,74 +5,72 @@
{% block content %}
<div class="gdprOverview">
<div piwik-content-intro>
- <h2>GDPR overview</h2>
+ <h2>{{ 'PrivacyManager_GdprOverview'|translate }}</h2>
<p>
- The General Data Protection Regulation (GDPR) is a regulation which strengthens and unifies data protection for all individuals within the European Union (EU).
+ {{ 'PrivacyManager_GdprOverviewIntro1'|translate }}
<br /><br />
- If you take steps to ensure no personal data is collected in Matomo, then you may not be concerned by the GDPR for Matomo (if you track no IP addresses, no user IDs, no geolocation data, etc.).
-
+ {{ 'PrivacyManager_GdprOverviewIntro2'|translate }}
</p>
</div>
{{ postEvent('Template.afterGDPROverviewIntro') }}
- <div piwik-content-block content-title="GDPR checklists">
- <p>If you are processing personal data of European citizens through Matomo, even if your company is located outside Europe, you need to fulfill GDPR obligations and this guide will help you.
+ <div piwik-content-block content-title="{{ 'PrivacyManager_GdprChecklists'|translate|e('html_attr') }}">
+ <p>{{ 'PrivacyManager_GdprChecklistDesc1'|translate }}
<br /><br />
- Find below our tools that let you exercise your users’ rights easily, and the list of actions to take in order to make your use of Matomo compliant with the GDPR and safeguard your data. Visit our <a rel="noreferrer noopener" target="_blank" href="https://matomo.org/docs/gdpr">GDPR User guide</a> to learn even more.</p>
+ {{ 'PrivacyManager_GdprChecklistDesc2'|translate('<a rel="noreferrer noopener" target="_blank" href="https://matomo.org/docs/gdpr">', '</a>')|raw }}</p>
</div>
- <div piwik-content-block content-title="Individuals' rights">
- <p>Exercise the rights of your users with our GDPR-friendly procedures:
- </p>
+ <div piwik-content-block content-title="{{ 'PrivacyManager_IndividualsRights'|translate|e('html_attr') }}">
+ <p>{{ 'PrivacyManager_IndividualsRightsIntro'|translate }}</p>
<ol>
- <li>The right to be informed: inform your users with a clear privacy notice.</li>
- <li>The right of access: <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) }}">search for a data subject</a> and export all of their data.</li>
- <li>The right to erasure: <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) }}">search for a data subject</a> and delete some or all of their data.</li>
- <li>The right to rectification: you can <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) }}">search for a data subject</a> and delete some or all of their data.</li>
- <li>The right to data portability: <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) }}">search for a data subject</a> and export all of their data.</li>
- <li>The right to object: <a target="_blank" rel="noreferrer noopener" href="{{ linkTo({module: 'PrivacyManager', action: 'usersOptOut'}) }}">let your users easily opt-out</a> on your privacy policy page.</li>
- <li>If you offer online services to children and rely on consent to collect information about them, then you may need a parent or guardian’s consent in order to process the children’s personal data lawfully.</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsInform'|translate }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsAccess'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsErasure'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsRectification'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsPortability'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'gdprTools'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsObject'|translate('<a target="_blank" rel="noreferrer noopener" href="' ~ linkTo({module: 'PrivacyManager', action: 'usersOptOut'}) ~ '">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_IndividualsRightsChildren'|translate }}</li>
</ol>
</div>
- <div piwik-content-block content-title="Awareness & documentation">
- <p>Inform your users clearly and transparently, and make your colleagues aware of the data being collected and how it is used:</p>
+ <div piwik-content-block content-title="{{ 'PrivacyManager_AwarenessDocumentation'|translate|e('html_attr') }}">
+ <p>{{ 'PrivacyManager_AwarenessDocumentationIntro'|translate }}</p>
<ol>
- <li>Inform your visitors through a clear privacy notice whenever you’re collecting personal data.</li>
- <li>Inform your users in your privacy policy about what data you collect and how the data is used.</li>
- <li>Make your team aware that you are using Matomo Analytics and <a target="_blank" rel="noreferrer noopener" href="https://matomo.org/faq/general/faq_18254/">what data is being collected by your analytics platform</a>.</li>
- <li>Document your use of Matomo within your <a href="https://matomo.org/blog/2018/04/gdpr-how-to-fill-in-the-information-asset-register-when-using-matomo/" target="_blank" rel="noreferrer noopener">information asset register</a>.</li>
+ <li>{{ 'PrivacyManager_AwarenessDocumentationDesc1'|translate }}</li>
+ <li>{{ 'PrivacyManager_AwarenessDocumentationDesc2'|translate }}</li>
+ <li>{{ 'PrivacyManager_AwarenessDocumentationDesc3'|translate('<a target="_blank" rel="noreferrer noopener" href="https://matomo.org/faq/general/faq_18254/">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_AwarenessDocumentationDesc4'|translate('<a href="https://matomo.org/blog/2018/04/gdpr-how-to-fill-in-the-information-asset-register-when-using-matomo/" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}</li>
</ol>
</div>
- <div piwik-content-block content-title="Security procedures">
- <p>Inform your users clearly and transparently, and make your colleagues aware of the data being collected and how it is used:</p>
+ <div piwik-content-block content-title="{{ 'PrivacyManager_SecurityProcedures'|translate|e('html_attr') }}">
+ <p>{{ 'PrivacyManager_SecurityProceduresIntro'|translate }}</p>
<ol>
- <li>Apply our <a href="https://matomo.org/docs/security/" target="_blank" rel="noreferrer noopener">security recommendations</a> in order to keep your Matomo data safe.</li>
- <li>Check that you have a written contract with the company providing you the Matomo server or hosting which ensures <a href="https://ico.org.uk/for-organisations/guide-to-the-general-data-protection-regulation-gdpr/international-transfers/" target="_blank" rel="noreferrer noopener">appropriate safeguards are provided</a>.</li>
- <li>Include Matomo in your <a href="https://ico.org.uk/for-organisations/guide-to-the-general-data-protection-regulation-gdpr/personal-data-breaches/" target="_blank" rel="noreferrer noopener">data breach procedure</a>.</li>
- <li>Include Matomo in your <a href="https://www.cnil.fr/en/guidelines-dpia" target="_blank" rel="noreferrer noopener">data privacy impact assessment (DPIA)</a>, if applicable.</li>
+ <li>{{ 'PrivacyManager_SecurityProceduresDesc1'|translate('<a href="https://matomo.org/docs/security/" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_SecurityProceduresDesc2'|translate('<a href="https://ico.org.uk/for-organisations/guide-to-the-general-data-protection-regulation-gdpr/international-transfers/" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_SecurityProceduresDesc3'|translate('<a href="https://ico.org.uk/for-organisations/guide-to-the-general-data-protection-regulation-gdpr/personal-data-breaches/" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}</li>
+ <li>{{ 'PrivacyManager_SecurityProceduresDesc4'|translate('<a href="https://www.cnil.fr/en/guidelines-dpia" target="_blank" rel="noreferrer noopener">', '</a>')|raw }}</li>
</ol>
</div>
- <div piwik-content-block content-title="Data retention">
+ <div piwik-content-block content-title="{{ 'PrivacyManager_DataRetention'|translate|e('html_attr') }}">
<p>
- Data retention for data stored in Matomo:
+ {{ 'PrivacyManager_DataRetentionInMatomo'|translate }}
</p>
<ul>
{% if deleteLogsEnable %}
- <li>all visits and actions raw data are deleted after <strong>{{ rawDataRetention }}</strong>.</li>
+ <li>{{ 'PrivacyManager_RawDataRemovedAfter'|translate('<strong>' ~ rawDataRetention ~ '</strong>')|raw }}</li>
{% else %}
- <li>visits and actions raw data are <strong>never</strong> deleted.</li>
+ <li>{{ 'PrivacyManager_RawDataNeverRemoved'|translate|raw }}</li>
{% endif %}
{% if deleteReportsEnable %}
- <li>all aggregated reports are deleted after <strong>{{ reportRetention }}</strong>.</li>
+ <li>{{ 'PrivacyManager_ReportsRemovedAfter'|translate('<strong>' ~ reportRetention ~ '</strong>')|raw }}</li>
{% else %}
- <li>aggregated reports are <strong>never</strong> deleted.</li>
+ <li>{{ 'PrivacyManager_ReportsNeverRemoved'|translate|raw }}</li>
{% endif %}
</ul>
<p>
<br />
- The overall data retention rate for your privacy policy is the raw data retention rate. Please note that aggregated reports may contain personal data as well. If you are using features like User ID, Custom Variables, Custom Dimension, or track personal data in other ways such as events, page URLs or page titles, etc, then the overall data retention rate for your privacy policy is the higher of the two.
+ {{ 'PrivacyManager_DataRetentionOverall'|translate }}
</p>
</div>
diff --git a/plugins/PrivacyManager/templates/usersOptOut.twig b/plugins/PrivacyManager/templates/usersOptOut.twig
index f0615d87c1..51fc9050a1 100644
--- a/plugins/PrivacyManager/templates/usersOptOut.twig
+++ b/plugins/PrivacyManager/templates/usersOptOut.twig
@@ -3,7 +3,7 @@
{% set title %}{{ 'PrivacyManager_GDPR'|translate }}{% endset %}
{% block content %}
- <div piwik-content-block content-title="Let users opt-out of tracking">
+ <div piwik-content-block content-title="{{ 'PrivacyManager_TrackingOptOut'|translate|e('html_attr') }}">
<div piwik-opt-out-customizer piwikurl="{{ piwikUrl }}" language="{{ language }}">
</div>
diff --git a/plugins/PrivacyManager/tests/Fixtures/FewVisitsAnonymizedFixture.php b/plugins/PrivacyManager/tests/Fixtures/FewVisitsAnonymizedFixture.php
index 9b11219ef0..19906d9560 100644
--- a/plugins/PrivacyManager/tests/Fixtures/FewVisitsAnonymizedFixture.php
+++ b/plugins/PrivacyManager/tests/Fixtures/FewVisitsAnonymizedFixture.php
@@ -20,7 +20,7 @@ class FewVisitsAnonymizedFixture extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
Option::set(PrivacyManager::OPTION_USERID_SALT, 'simpleuseridsalt1');
Cache::clearCacheGeneral();
@@ -30,7 +30,7 @@ class FewVisitsAnonymizedFixture extends Fixture
$this->trackAnonymizedOrderId();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/PrivacyManager/tests/Fixtures/MultipleSitesMultipleVisitsFixture.php b/plugins/PrivacyManager/tests/Fixtures/MultipleSitesMultipleVisitsFixture.php
index 73e47b5a86..69252ff65e 100644
--- a/plugins/PrivacyManager/tests/Fixtures/MultipleSitesMultipleVisitsFixture.php
+++ b/plugins/PrivacyManager/tests/Fixtures/MultipleSitesMultipleVisitsFixture.php
@@ -160,14 +160,14 @@ class MultipleSitesMultipleVisitsFixture extends Fixture
public $idSite = 1;
public $numVisitsPerIteration = 32;
/**
- * @var \PiwikTracker
+ * @var \MatomoTracker
*/
private $tracker;
private $numSites = 5;
private $currentUserId;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->installLogTables();
@@ -176,7 +176,7 @@ class MultipleSitesMultipleVisitsFixture extends Fixture
$this->trackVisitsForMultipleSites();
}
- public function tearDown()
+ public function tearDown(): void
{
$this->tearDownLocation();
}
diff --git a/plugins/PrivacyManager/tests/Integration/Dao/LogDataAnonymizerTest.php b/plugins/PrivacyManager/tests/Integration/Dao/LogDataAnonymizerTest.php
index c5b50bdd1d..c7a1e45679 100644
--- a/plugins/PrivacyManager/tests/Integration/Dao/LogDataAnonymizerTest.php
+++ b/plugins/PrivacyManager/tests/Integration/Dao/LogDataAnonymizerTest.php
@@ -16,9 +16,9 @@ use Piwik\Plugins\PrivacyManager\API;
use Piwik\Plugins\PrivacyManager\Dao\LogDataAnonymizer;
use Piwik\Plugins\PrivacyManager\PrivacyManager;
use Piwik\Plugins\PrivacyManager\tests\Fixtures\MultipleSitesMultipleVisitsFixture;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Piwik\Tracker\Cache;
-use Piwik\Translate;
/**
* Class LogDataAnonymizationsTest
@@ -36,20 +36,20 @@ class LogDataAnonymizerTest extends IntegrationTestCase
*/
private $theFixture;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Option::set(PrivacyManager::OPTION_USERID_SALT, 'simpleuseridsalt1');
Cache::clearCacheGeneral();
- Translate::loadEnglishTranslation();
+ Fixture::loadAllTranslations();
$this->anonymizer = new LogDataAnonymizer();
$this->theFixture = new MultipleSitesMultipleVisitsFixture();
$this->theFixture->setUpLocation();
}
- public function tearDown()
+ public function tearDown(): void
{
$this->theFixture->tearDownLocation();
}
@@ -64,30 +64,27 @@ class LogDataAnonymizerTest extends IntegrationTestCase
$this->assertNull($this->anonymizer->checkAllVisitColumns(array('visitor_localtime', 'location_region')));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The column "foobarbaz" seems to not exist in log_visit or cannot be unset
- */
public function test_checkAllVisitColumns_notExistingColumnGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The column "foobarbaz" seems to not exist in log_visit or cannot be unset');
+
$this->anonymizer->checkAllVisitColumns(array('visitor_localtime', 'foobarbaz'));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The column "idsite" seems to not exist in log_visit or cannot be unset
- */
public function test_checkAllVisitColumns_blacklistedColumnGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The column "idsite" seems to not exist in log_visit or cannot be unset');
+
$this->anonymizer->checkAllVisitColumns(array('visitor_localtime', 'idsite'));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The column "visit_total_time" seems to not exist in log_visit or cannot be unset
- */
public function test_checkAllVisitColumns_columnWithoutDefaultValueGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The column "visit_total_time" seems to not exist in log_visit or cannot be unset');
+
$this->anonymizer->checkAllVisitColumns(array('visitor_localtime', 'visit_total_time'));
}
@@ -101,21 +98,19 @@ class LogDataAnonymizerTest extends IntegrationTestCase
$this->assertNull($this->anonymizer->checkAllLinkVisitActionColumns(array('time_spent_ref_action', 'idaction_content_piece')));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The column "foobarbaz" seems to not exist in log_link_visit_action or cannot be unset
- */
public function test_checkAllLinkVisitActionColumns_notExistingColumnGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The column "foobarbaz" seems to not exist in log_link_visit_action or cannot be unset');
+
$this->anonymizer->checkAllLinkVisitActionColumns(array('time_spent_ref_action', 'foobarbaz'));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The column "idsite" seems to not exist in log_link_visit_action or cannot be unset
- */
public function test_checkAllLinkVisitActionColumns_blacklistedColumnGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The column "idsite" seems to not exist in log_link_visit_action or cannot be unset');
+
$this->anonymizer->checkAllLinkVisitActionColumns(array('time_spent_ref_action', 'idsite'));
}
diff --git a/plugins/PrivacyManager/tests/Integration/DataPurgingTest.php b/plugins/PrivacyManager/tests/Integration/DataPurgingTest.php
index a077bbb230..9c1c95dde4 100644
--- a/plugins/PrivacyManager/tests/Integration/DataPurgingTest.php
+++ b/plugins/PrivacyManager/tests/Integration/DataPurgingTest.php
@@ -96,7 +96,7 @@ class DataPurgingTest extends IntegrationTestCase
$fixture->createSuperUser = true;
}
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -124,6 +124,7 @@ class DataPurgingTest extends IntegrationTestCase
$settings['delete_logs_older_than'] = 35 + $daysSinceToday;
$settings['delete_logs_schedule_lowest_interval'] = 7;
$settings['delete_logs_max_rows_per_query'] = 100000;
+ $settings['delete_logs_unused_actions_max_rows_per_query'] = 100000;
$settings['delete_reports_enable'] = 1;
$settings['delete_reports_older_than'] = $monthsSinceToday;
$settings['delete_reports_keep_basic_metrics'] = 0;
@@ -138,7 +139,7 @@ class DataPurgingTest extends IntegrationTestCase
$this->instance = new PrivacyManager();
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
diff --git a/plugins/PrivacyManager/tests/Integration/Model/DataSubjectsTest.php b/plugins/PrivacyManager/tests/Integration/Model/DataSubjectsTest.php
index 9d299998a1..27a8dbc52b 100644
--- a/plugins/PrivacyManager/tests/Integration/Model/DataSubjectsTest.php
+++ b/plugins/PrivacyManager/tests/Integration/Model/DataSubjectsTest.php
@@ -43,7 +43,7 @@ class DataSubjectsTest extends IntegrationTestCase
private $originalTimezone;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -57,7 +57,7 @@ class DataSubjectsTest extends IntegrationTestCase
$this->originalTrackingTime = $this->theFixture->trackingTime;
}
- public function tearDown()
+ public function tearDown(): void
{
$this->theFixture->uninstallLogTables();
$this->theFixture->tearDownLocation();
diff --git a/plugins/PrivacyManager/tests/Integration/Model/LogDataAnonymizationsTest.php b/plugins/PrivacyManager/tests/Integration/Model/LogDataAnonymizationsTest.php
index a45f7a121e..d105df85e2 100644
--- a/plugins/PrivacyManager/tests/Integration/Model/LogDataAnonymizationsTest.php
+++ b/plugins/PrivacyManager/tests/Integration/Model/LogDataAnonymizationsTest.php
@@ -27,7 +27,7 @@ class LogDataAnonymizationsTest extends IntegrationTestCase
private $tableName;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -42,12 +42,11 @@ class LogDataAnonymizationsTest extends IntegrationTestCase
$this->assertEquals(array('idlogdata_anonymization', 'idsites', 'date_start', 'date_end', 'anonymize_ip', 'anonymize_location', 'anonymize_userid', 'unset_visit_columns', 'unset_link_visit_action_columns', 'output', 'scheduled_date', 'job_start_date', 'job_finish_date', 'requester'), $columns);
}
- /**
- * @expectedException \Zend_Db_Statement_Exception
- * @expectedExceptionMessage privacy_logdata_anonymizations
- */
public function test_shouldBeAbleToUninstallTable()
{
+ $this->expectException(\Zend_Db_Statement_Exception::class);
+ $this->expectExceptionMessage('privacy_logdata_anonymizations');
+
$this->dao->uninstall();
try {
@@ -61,48 +60,43 @@ class LogDataAnonymizationsTest extends IntegrationTestCase
$this->dao->install();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ValidatorErrorEmptyValue
- */
public function test_scheduleEntry_fails_whenNoDateGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorEmptyValue');
+
$this->scheduleEntry(null, null);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ExceptionInvalidDateFormat
- */
public function test_scheduleEntry_fails_whenInvalidDateGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ExceptionInvalidDateFormat');
+
$this->scheduleEntry(null, 'foobar');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The column "visitor_foobar_Baz" seems to not exist in log_visit
- */
public function test_scheduleEntry_fails_whenInvalidVisitColumnsGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The column "visitor_foobar_Baz" seems to not exist in log_visit');
+
$this->scheduleEntry(null, '2018-01-02', false, false, false, ['visitor_localtime', 'visitor_foobar_Baz', 'config_device_type']);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The column "idaction_foobar_baz" seems to not exist in log_link_visit_action
- */
public function test_scheduleEntry_fails_whenInvalidLinkVisitActionColumnsGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The column "idaction_foobar_baz" seems to not exist in log_link_visit_action');
+
$this->scheduleEntry(null, '2018-01-02', false, false, false, [], ['idaction_event_category', 'idaction_foobar_baz']);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Nothing is selected to be anonymized
- */
public function test_scheduleEntry_fails_whenNoWorkScheduled()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Nothing is selected to be anonymized');
+
$this->scheduleEntry(null, '2018-01-02', false, false, false, [], []);
}
@@ -159,12 +153,11 @@ class LogDataAnonymizationsTest extends IntegrationTestCase
), $entry);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Specified date range is invalid.
- */
public function test_scheduleEntry_failsInvalidDateRange()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Specified date range is invalid.');
+
$this->scheduleStartedEntry(null, '2018-04-06,2017-03-01', false, true, [], false, 'mylogin2');
}
diff --git a/plugins/PrivacyManager/tests/Integration/PrivacyManagerConfigTest.php b/plugins/PrivacyManager/tests/Integration/PrivacyManagerConfigTest.php
index 9e9810e9d7..bc01193698 100644
--- a/plugins/PrivacyManager/tests/Integration/PrivacyManagerConfigTest.php
+++ b/plugins/PrivacyManager/tests/Integration/PrivacyManagerConfigTest.php
@@ -22,7 +22,7 @@ class PrivacyManagerConfigTest extends IntegrationTestCase
*/
private $config;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php b/plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php
index d8369ef2e6..7e3f1bf46b 100644
--- a/plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php
+++ b/plugins/PrivacyManager/tests/Integration/PrivacyManagerTest.php
@@ -28,7 +28,7 @@ class PrivacyManagerTest extends IntegrationTestCase
*/
private $manager;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -38,7 +38,7 @@ class PrivacyManagerTest extends IntegrationTestCase
\Piwik\Option::set('delete_reports_keep_week_reports', 1);
}
- public function tearDown()
+ public function tearDown(): void
{
unset($_GET['date']);
unset($_GET['period']);
@@ -149,6 +149,7 @@ class PrivacyManagerTest extends IntegrationTestCase
'delete_logs_schedule_lowest_interval' => 7,
'delete_logs_older_than' => 180,
'delete_logs_max_rows_per_query' => 100000,
+ 'delete_logs_unused_actions_max_rows_per_query' => 100000,
'delete_logs_unused_actions_schedule_lowest_interval' => 30,
'enable_auto_database_size_estimate' => 1,
'enable_database_size_estimate' => 1,
diff --git a/plugins/PrivacyManager/tests/Integration/Tracker/RequestProcessorTest.php b/plugins/PrivacyManager/tests/Integration/Tracker/RequestProcessorTest.php
index ffb5fee0ea..13caa149a4 100644
--- a/plugins/PrivacyManager/tests/Integration/Tracker/RequestProcessorTest.php
+++ b/plugins/PrivacyManager/tests/Integration/Tracker/RequestProcessorTest.php
@@ -36,7 +36,7 @@ class RequestProcessorTest extends IntegrationTestCase
*/
private $requestProcessor;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/PrivacyManager/tests/System/APITest.php b/plugins/PrivacyManager/tests/System/APITest.php
index bcd05f829c..c46f7416cc 100644
--- a/plugins/PrivacyManager/tests/System/APITest.php
+++ b/plugins/PrivacyManager/tests/System/APITest.php
@@ -31,18 +31,17 @@ class APITest extends SystemTestCase
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->api = API::getInstance();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage No list of visits given
- */
public function test_exportDataSubjects_failsWhenNoVisitsGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('No list of visits given');
+
$this->assertNull($this->api->exportDataSubjects(false));
}
@@ -65,12 +64,11 @@ class APITest extends SystemTestCase
$this->assertJsonResponse('exportDataSubject_allVisits', $result);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage No idsite key set for visit at index 1
- */
public function test_exportDataSubjects_failsWhenMissingIdSite()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('No idsite key set for visit at index 1');
+
$this->assertNull($this->api->exportDataSubjects([['idsite' => '9999', 'idvisit' => '9999'], []]));
}
diff --git a/plugins/PrivacyManager/tests/System/AnonymizationTest.php b/plugins/PrivacyManager/tests/System/AnonymizationTest.php
index 3d839cf3df..03e3a6ea6e 100644
--- a/plugins/PrivacyManager/tests/System/AnonymizationTest.php
+++ b/plugins/PrivacyManager/tests/System/AnonymizationTest.php
@@ -31,7 +31,7 @@ class AnonymizationTest extends SystemTestCase
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->api = API::getInstance();
diff --git a/plugins/PrivacyManager/tests/System/PurgeDataTest.php b/plugins/PrivacyManager/tests/System/PurgeDataTest.php
index 1b48fdee99..efc536c09f 100644
--- a/plugins/PrivacyManager/tests/System/PurgeDataTest.php
+++ b/plugins/PrivacyManager/tests/System/PurgeDataTest.php
@@ -22,7 +22,7 @@ class PurgeDataTest extends SystemTestCase
{
public static $fixture = null; // initialized below class definition
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
}
@@ -31,12 +31,12 @@ class PurgeDataTest extends SystemTestCase
}
- public function setUp()
+ public function setUp(): void
{
parent::setUpBeforeClass();
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDownAfterClass();
}
diff --git a/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_allSitesAllDates.json b/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_allSitesAllDates.json
index ed2e34f975..71f53d2307 100755
--- a/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_allSitesAllDates.json
+++ b/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_allSitesAllDates.json
@@ -5233,16 +5233,14 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
"idlink_va": "4",
"idsite": "1",
"idvisit": "1",
"idvisitor": "08aa728aec13d68d",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-02 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -5965,16 +5963,14 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
"idlink_va": "61",
"idsite": "1",
"idvisit": "15",
"idvisitor": "0e64dad0a7ea5650",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-02 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -6474,14 +6470,14 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
"idlink_va": "101",
"idsite": "1",
"idvisit": "27",
"idvisitor": "d57f2b2bcf932329",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-02 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -6703,16 +6699,14 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
"idlink_va": "120",
"idsite": "1",
"idvisit": "33",
"idvisitor": "08aa728aec13d68d",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-05 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -7435,16 +7429,14 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
"idlink_va": "177",
"idsite": "1",
"idvisit": "47",
"idvisitor": "0e64dad0a7ea5650",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-05 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -7944,14 +7936,14 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
"idlink_va": "217",
"idsite": "1",
"idvisit": "59",
"idvisitor": "d57f2b2bcf932329",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-05 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -8173,16 +8165,14 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
"idlink_va": "236",
"idsite": "2",
"idvisit": "65",
"idvisitor": "08aa728aec13d68d",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-05 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -8905,16 +8895,14 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
"idlink_va": "293",
"idsite": "2",
"idvisit": "79",
"idvisitor": "0e64dad0a7ea5650",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-05 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -9414,14 +9402,14 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
"idlink_va": "333",
"idsite": "2",
"idvisit": "91",
"idvisitor": "d57f2b2bcf932329",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-05 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -9827,6 +9815,7 @@
"log_conversion": [
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -9849,6 +9838,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -9870,6 +9860,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -9891,6 +9882,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -9912,6 +9904,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -9933,6 +9926,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -9954,6 +9948,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -9981,6 +9976,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10001,6 +9997,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10021,6 +10018,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10043,6 +10041,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10063,6 +10062,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10083,6 +10083,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10110,6 +10111,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10130,6 +10132,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10150,6 +10153,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10170,6 +10174,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -10192,6 +10197,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10213,6 +10219,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10234,6 +10241,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10255,6 +10263,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10276,6 +10285,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10297,6 +10307,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10317,6 +10328,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10337,6 +10349,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10359,6 +10372,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10379,6 +10393,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10399,6 +10414,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10419,6 +10435,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10439,6 +10456,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10459,6 +10477,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -10481,6 +10500,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10502,6 +10522,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10523,6 +10544,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10544,6 +10566,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10565,6 +10588,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10586,6 +10610,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10613,6 +10638,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10633,6 +10659,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10653,6 +10680,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10675,6 +10703,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10695,6 +10724,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10715,6 +10745,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10742,6 +10773,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10762,6 +10794,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10782,6 +10815,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
diff --git a/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_anonymizeUserId.json b/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_anonymizeUserId.json
index c57900e2ae..9bab6f815b 100755
--- a/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_anonymizeUserId.json
+++ b/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_anonymizeUserId.json
@@ -1734,10 +1734,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -1747,6 +1743,8 @@
"idvisit": "1",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-02 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -2631,10 +2629,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -2644,6 +2638,8 @@
"idvisit": "15",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-02 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -3257,8 +3253,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -3268,6 +3262,8 @@
"idvisit": "27",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-02 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -3620,6 +3616,7 @@
"log_conversion": [
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -3642,6 +3639,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3663,6 +3661,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3684,6 +3683,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3705,6 +3705,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3726,6 +3727,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3747,6 +3749,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3774,6 +3777,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3794,6 +3798,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3814,6 +3819,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3836,6 +3842,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3856,6 +3863,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3876,6 +3884,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3903,6 +3912,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3923,6 +3933,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -3943,6 +3954,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
diff --git a/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictDate.json b/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictDate.json
index 9386d21d1b..4d09f5d106 100755
--- a/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictDate.json
+++ b/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictDate.json
@@ -5123,16 +5123,14 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
"idlink_va": "4",
"idsite": "1",
"idvisit": "1",
"idvisitor": "08aa728aec13d68d",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-02 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -5903,16 +5901,14 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
"idlink_va": "61",
"idsite": "1",
"idvisit": "15",
"idvisitor": "0e64dad0a7ea5650",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-02 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -6441,14 +6437,14 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
"idlink_va": "101",
"idsite": "1",
"idvisit": "27",
"idvisitor": "d57f2b2bcf932329",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-02 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -6697,10 +6693,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -6710,6 +6702,8 @@
"idvisit": "33",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-05 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -7594,10 +7588,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -7607,6 +7597,8 @@
"idvisit": "47",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-05 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -8220,8 +8212,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -8231,6 +8221,8 @@
"idvisit": "59",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-05 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -8510,10 +8502,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -8523,6 +8511,8 @@
"idvisit": "65",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-05 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -9407,10 +9397,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -9420,6 +9406,8 @@
"idvisit": "79",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-05 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -10033,8 +10021,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -10044,6 +10030,8 @@
"idvisit": "91",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-05 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -10498,6 +10486,7 @@
"log_conversion": [
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -10520,6 +10509,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10541,6 +10531,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10562,6 +10553,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10583,6 +10575,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10604,6 +10597,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10625,6 +10619,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10652,6 +10647,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10672,6 +10668,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10692,6 +10689,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10714,6 +10712,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10734,6 +10733,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10754,6 +10754,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10781,6 +10782,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10801,6 +10803,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10821,6 +10824,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10841,6 +10845,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -10863,6 +10868,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10884,6 +10890,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10905,6 +10912,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10926,6 +10934,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10947,6 +10956,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10968,6 +10978,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10988,6 +10999,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11008,6 +11020,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11030,6 +11043,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11050,6 +11064,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11070,6 +11085,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11090,6 +11106,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11110,6 +11127,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11130,6 +11148,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -11152,6 +11171,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11173,6 +11193,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11194,6 +11215,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11215,6 +11237,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11236,6 +11259,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11257,6 +11281,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11284,6 +11309,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11304,6 +11330,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11324,6 +11351,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11346,6 +11374,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11366,6 +11395,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11386,6 +11416,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11413,6 +11444,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11433,6 +11465,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11453,6 +11486,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
diff --git a/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictSites.json b/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictSites.json
index fc1aa417ef..efbc74c61c 100755
--- a/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictSites.json
+++ b/plugins/PrivacyManager/tests/System/expected/anonymizeVisitInformation_restrictSites.json
@@ -5187,16 +5187,14 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
"idlink_va": "4",
"idsite": "1",
"idvisit": "1",
"idvisitor": "08aa728aec13d68d",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-02 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -5919,16 +5917,14 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
"idlink_va": "61",
"idsite": "1",
"idvisit": "15",
"idvisitor": "0e64dad0a7ea5650",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-02 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -6428,14 +6424,14 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
"idlink_va": "101",
"idsite": "1",
"idvisit": "27",
"idvisitor": "d57f2b2bcf932329",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-02 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -6657,16 +6653,14 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
"idlink_va": "120",
"idsite": "1",
"idvisit": "33",
"idvisitor": "08aa728aec13d68d",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-05 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -7389,16 +7383,14 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
"idlink_va": "177",
"idsite": "1",
"idvisit": "47",
"idvisitor": "0e64dad0a7ea5650",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-05 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -7898,14 +7890,14 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
"idlink_va": "217",
"idsite": "1",
"idvisit": "59",
"idvisitor": "d57f2b2bcf932329",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-05 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -8136,10 +8128,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -8149,6 +8137,8 @@
"idvisit": "65",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-05 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -9033,10 +9023,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -9046,6 +9032,8 @@
"idvisit": "79",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-05 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -9659,8 +9647,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -9670,6 +9656,8 @@
"idvisit": "91",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-05 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -10124,6 +10112,7 @@
"log_conversion": [
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -10146,6 +10135,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10167,6 +10157,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10188,6 +10179,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10209,6 +10201,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10230,6 +10223,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10251,6 +10245,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10278,6 +10273,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10298,6 +10294,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10318,6 +10315,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10340,6 +10338,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10360,6 +10359,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10380,6 +10380,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10407,6 +10408,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10427,6 +10429,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10447,6 +10450,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10467,6 +10471,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -10489,6 +10494,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10510,6 +10516,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10531,6 +10538,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10552,6 +10560,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10573,6 +10582,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10594,6 +10604,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10614,6 +10625,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10634,6 +10646,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10656,6 +10669,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10676,6 +10690,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10696,6 +10711,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10716,6 +10732,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10736,6 +10753,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10756,6 +10774,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -10778,6 +10797,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10799,6 +10819,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10820,6 +10841,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10841,6 +10863,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10862,6 +10885,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10883,6 +10907,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10910,6 +10935,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10930,6 +10956,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10950,6 +10977,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10972,6 +11000,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -10992,6 +11021,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11012,6 +11042,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11039,6 +11070,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11059,6 +11091,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -11079,6 +11112,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
diff --git a/plugins/PrivacyManager/tests/System/expected/exportDataSubject_allVisits.json b/plugins/PrivacyManager/tests/System/expected/exportDataSubject_allVisits.json
index 07c929c029..8828d32ed2 100755
--- a/plugins/PrivacyManager/tests/System/expected/exportDataSubject_allVisits.json
+++ b/plugins/PrivacyManager/tests/System/expected/exportDataSubject_allVisits.json
@@ -11844,10 +11844,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -11857,6 +11853,8 @@
"idvisit": "1",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-02 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -12741,10 +12739,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -12754,6 +12748,8 @@
"idvisit": "15",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-02 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -13367,8 +13363,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -13378,6 +13372,8 @@
"idvisit": "27",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-02 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -13657,10 +13653,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -13670,6 +13662,8 @@
"idvisit": "33",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-05 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -14554,10 +14548,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -14567,6 +14557,8 @@
"idvisit": "47",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-05 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -15180,8 +15172,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -15191,6 +15181,8 @@
"idvisit": "59",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-05 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -15470,10 +15462,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -15483,6 +15471,8 @@
"idvisit": "65",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-08 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -16367,10 +16357,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -16380,6 +16366,8 @@
"idvisit": "79",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-08 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -16993,8 +16981,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -17004,6 +16990,8 @@
"idvisit": "91",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-08 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -17283,10 +17271,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -17296,6 +17280,8 @@
"idvisit": "97",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-11 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -18180,10 +18166,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -18193,6 +18175,8 @@
"idvisit": "111",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-11 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -18806,8 +18790,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -18817,6 +18799,8 @@
"idvisit": "123",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-11 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -19096,10 +19080,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -19109,6 +19089,8 @@
"idvisit": "129",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-11 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -19993,10 +19975,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -20006,6 +19984,8 @@
"idvisit": "143",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-11 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -20619,8 +20599,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -20630,6 +20608,8 @@
"idvisit": "155",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-11 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -20909,10 +20889,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -20922,6 +20898,8 @@
"idvisit": "161",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-11 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -21806,10 +21784,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -21819,6 +21793,8 @@
"idvisit": "175",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-11 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -22432,8 +22408,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -22443,6 +22417,8 @@
"idvisit": "187",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-11 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -22722,10 +22698,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -22735,6 +22707,8 @@
"idvisit": "193",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-05 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -23619,10 +23593,6 @@
},
{
"custom_float": "9 min 45s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "web",
- "custom_var_v5": "205",
"idaction_name": "48",
"idaction_name_ref": "3",
"idaction_url_ref": "47",
@@ -23632,6 +23602,8 @@
"idvisit": "207",
"idvisitor": "0e64dad0a7ea5650",
"interaction_position": "3",
+ "search_cat": "web",
+ "search_count": "205",
"server_time": "2017-01-05 00:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -24245,8 +24217,6 @@
},
{
"custom_float": "17 min 10s",
- "custom_var_k5": "_pk_scount",
- "custom_var_v5": "210",
"idaction_name": "66",
"idaction_name_ref": "1",
"idaction_url_ref": "65",
@@ -24256,6 +24226,8 @@
"idvisit": "219",
"idvisitor": "d57f2b2bcf932329",
"interaction_position": "2",
+ "search_cat": "",
+ "search_count": "210",
"server_time": "2017-01-05 03:04:05",
"time_spent_ref_action": "00:00:00"
},
@@ -24880,6 +24852,7 @@
"log_conversion": [
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -24902,6 +24875,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -24923,6 +24897,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -24944,6 +24919,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -24965,6 +24941,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -24986,6 +24963,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25007,6 +24985,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25034,6 +25013,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25054,6 +25034,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25074,6 +25055,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25096,6 +25078,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25116,6 +25099,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25136,6 +25120,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25163,6 +25148,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25183,6 +25169,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25203,6 +25190,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25223,6 +25211,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -25245,6 +25234,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25266,6 +25256,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25287,6 +25278,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25308,6 +25300,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25329,6 +25322,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25350,6 +25344,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25370,6 +25365,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25390,6 +25386,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25412,6 +25409,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25432,6 +25430,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25452,6 +25451,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25472,6 +25472,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25492,6 +25493,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25512,6 +25514,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -25534,6 +25537,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25555,6 +25559,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25576,6 +25581,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25597,6 +25603,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25618,6 +25625,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25639,6 +25647,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25659,6 +25668,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25679,6 +25689,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25701,6 +25712,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25721,6 +25733,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25741,6 +25754,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25761,6 +25775,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25781,6 +25796,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25801,6 +25817,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -25823,6 +25840,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25844,6 +25862,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25865,6 +25884,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25886,6 +25906,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25907,6 +25928,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25928,6 +25950,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25948,6 +25971,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25968,6 +25992,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -25990,6 +26015,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26010,6 +26036,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26030,6 +26057,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26050,6 +26078,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26070,6 +26099,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26090,6 +26120,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -26112,6 +26143,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26133,6 +26165,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26154,6 +26187,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26175,6 +26209,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26196,6 +26231,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26217,6 +26253,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26244,6 +26281,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26264,6 +26302,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26284,6 +26323,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26306,6 +26346,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26326,6 +26367,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26346,6 +26388,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26373,6 +26416,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26393,6 +26437,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26413,6 +26458,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26433,6 +26479,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -26455,6 +26502,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26476,6 +26524,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26497,6 +26546,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26518,6 +26568,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26539,6 +26590,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26560,6 +26612,7 @@
},
{
"buster": "3940711799",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26587,6 +26640,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26607,6 +26661,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26627,6 +26682,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26649,6 +26705,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26669,6 +26726,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26689,6 +26747,7 @@
},
{
"buster": "3944101671",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26716,6 +26775,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26736,6 +26796,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26756,6 +26817,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26776,6 +26838,7 @@
},
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
@@ -26798,6 +26861,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26819,6 +26883,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26840,6 +26905,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26861,6 +26927,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26882,6 +26949,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26903,6 +26971,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26923,6 +26992,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26943,6 +27013,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26965,6 +27036,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -26985,6 +27057,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -27005,6 +27078,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -27025,6 +27099,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
@@ -27045,6 +27120,7 @@
},
{
"buster": "0",
+ "config_browser_name": "UNK",
"config_device_brand": "",
"config_device_model": "",
"custom_var_k1": "myCustomUserId",
diff --git a/plugins/PrivacyManager/tests/System/expected/exportDataSubject_oneVisitGiven.json b/plugins/PrivacyManager/tests/System/expected/exportDataSubject_oneVisitGiven.json
index 799e0c4872..04f156202e 100755
--- a/plugins/PrivacyManager/tests/System/expected/exportDataSubject_oneVisitGiven.json
+++ b/plugins/PrivacyManager/tests/System/expected/exportDataSubject_oneVisitGiven.json
@@ -101,10 +101,6 @@
},
{
"custom_float": "9 min 5s",
- "custom_var_k4": "_pk_scat",
- "custom_var_k5": "_pk_scount",
- "custom_var_v4": "images",
- "custom_var_v5": "200",
"idaction_name": "7",
"idaction_name_ref": "5",
"idaction_url_ref": "6",
@@ -114,6 +110,8 @@
"idvisit": "1",
"idvisitor": "08aa728aec13d68d",
"interaction_position": "4",
+ "search_cat": "images",
+ "search_count": "200",
"server_time": "2017-01-02 03:10:05",
"time_spent_ref_action": "00:00:00"
},
@@ -270,6 +268,7 @@
"log_conversion": [
{
"buster": "0",
+ "config_browser_name": "CH",
"config_device_brand": "",
"config_device_model": "generic desktop",
"config_device_type": "0",
diff --git a/plugins/PrivacyManager/tests/System/expected/test___PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml b/plugins/PrivacyManager/tests/System/expected/test___PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
index e552d62330..da3d21a6ab 100644
--- a/plugins/PrivacyManager/tests/System/expected/test___PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
+++ b/plugins/PrivacyManager/tests/System/expected/test___PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
@@ -117,6 +117,14 @@
<default_value />
</row>
<row>
+ <column_name>search_cat</column_name>
+ <default_value />
+ </row>
+ <row>
+ <column_name>search_count</column_name>
+ <default_value />
+ </row>
+ <row>
<column_name>time_spent</column_name>
<default_value />
</row>
diff --git a/plugins/PrivacyManager/tests/System/expected/test_allSites__Live.getLastVisitsDetails_year.xml b/plugins/PrivacyManager/tests/System/expected/test_allSites__Live.getLastVisitsDetails_year.xml
index cf6a73d172..82d5c09856 100644
--- a/plugins/PrivacyManager/tests/System/expected/test_allSites__Live.getLastVisitsDetails_year.xml
+++ b/plugins/PrivacyManager/tests/System/expected/test_allSites__Live.getLastVisitsDetails_year.xml
@@ -94,24 +94,16 @@
<pageId>352</pageId>
<bandwidth />
<siteSearchKeyword>mobile</siteSearchKeyword>
+ <siteSearchCategory>images</siteSearchCategory>
+ <siteSearchCount>200</siteSearchCount>
<generationTimeMilliseconds>545</generationTimeMilliseconds>
<generationTime>0.55s</generationTime>
<interactionPosition>4</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>mobile</subtitle>
+ <subtitle>mobile - Search Category: images - Search Results Count: 200</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>images</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>200</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -1640,24 +1632,16 @@
<pageId>468</pageId>
<bandwidth />
<siteSearchKeyword>mobile</siteSearchKeyword>
+ <siteSearchCategory>images</siteSearchCategory>
+ <siteSearchCount>200</siteSearchCount>
<generationTimeMilliseconds>545</generationTimeMilliseconds>
<generationTime>0.55s</generationTime>
<interactionPosition>4</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>mobile</subtitle>
+ <subtitle>mobile - Search Category: images - Search Results Count: 200</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>images</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>200</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -3186,24 +3170,16 @@
<pageId>584</pageId>
<bandwidth />
<siteSearchKeyword>mobile</siteSearchKeyword>
+ <siteSearchCategory>images</siteSearchCategory>
+ <siteSearchCount>200</siteSearchCount>
<generationTimeMilliseconds>545</generationTimeMilliseconds>
<generationTime>0.55s</generationTime>
<interactionPosition>4</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>mobile</subtitle>
+ <subtitle>mobile - Search Category: images - Search Results Count: 200</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>images</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>200</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -4995,7 +4971,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5017,7 +4993,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5039,7 +5015,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5061,7 +5037,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -5080,7 +5056,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -5367,20 +5343,16 @@
<timeSpent>0</timeSpent>
<timeSpentPretty>0s</timeSpentPretty>
<siteSearchKeyword>analytics</siteSearchKeyword>
+ <siteSearchCategory />
+ <siteSearchCount>210</siteSearchCount>
<generationTimeMilliseconds>1030</generationTimeMilliseconds>
<generationTime>1.03s</generationTime>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>analytics</subtitle>
+ <subtitle>analytics - Search Results Count: 210</subtitle>
- <customVariables>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>210</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -5400,7 +5372,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5422,7 +5394,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5444,7 +5416,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5466,7 +5438,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -5485,7 +5457,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -5945,7 +5917,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5967,7 +5939,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -5989,7 +5961,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -6011,7 +5983,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -6032,7 +6004,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -6319,20 +6291,16 @@
<timeSpent>0</timeSpent>
<timeSpentPretty>0s</timeSpentPretty>
<siteSearchKeyword>analytics</siteSearchKeyword>
+ <siteSearchCategory />
+ <siteSearchCount>210</siteSearchCount>
<generationTimeMilliseconds>1030</generationTimeMilliseconds>
<generationTime>1.03s</generationTime>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>analytics</subtitle>
+ <subtitle>analytics - Search Results Count: 210</subtitle>
- <customVariables>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>210</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -6352,7 +6320,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -6374,7 +6342,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -6396,7 +6364,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -6418,7 +6386,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -6437,7 +6405,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -6899,7 +6867,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -6921,7 +6889,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -6943,7 +6911,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -6965,7 +6933,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -6984,7 +6952,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -7271,20 +7239,16 @@
<timeSpent>0</timeSpent>
<timeSpentPretty>0s</timeSpentPretty>
<siteSearchKeyword>analytics</siteSearchKeyword>
+ <siteSearchCategory />
+ <siteSearchCount>210</siteSearchCount>
<generationTimeMilliseconds>1030</generationTimeMilliseconds>
<generationTime>1.03s</generationTime>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>analytics</subtitle>
+ <subtitle>analytics - Search Results Count: 210</subtitle>
- <customVariables>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>210</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -7304,7 +7268,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -7326,7 +7290,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -7348,7 +7312,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -7370,7 +7334,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -7389,7 +7353,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -9526,7 +9490,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -9548,7 +9512,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -9570,7 +9534,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -9592,7 +9556,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -9611,7 +9575,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -9761,7 +9725,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -9783,7 +9747,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -9805,7 +9769,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -9827,7 +9791,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -9846,7 +9810,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -9996,7 +9960,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -10018,7 +9982,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -10040,7 +10004,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -10062,7 +10026,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -10081,7 +10045,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -10408,24 +10372,16 @@
<pageId>409</pageId>
<bandwidth />
<siteSearchKeyword>ecommerce</siteSearchKeyword>
+ <siteSearchCategory>web</siteSearchCategory>
+ <siteSearchCount>205</siteSearchCount>
<generationTimeMilliseconds>585</generationTimeMilliseconds>
<generationTime>0.59s</generationTime>
<interactionPosition>3</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>ecommerce</subtitle>
+ <subtitle>ecommerce - Search Category: web - Search Results Count: 205</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>web</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>205</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -10951,24 +10907,16 @@
<pageId>525</pageId>
<bandwidth />
<siteSearchKeyword>ecommerce</siteSearchKeyword>
+ <siteSearchCategory>web</siteSearchCategory>
+ <siteSearchCount>205</siteSearchCount>
<generationTimeMilliseconds>585</generationTimeMilliseconds>
<generationTime>0.59s</generationTime>
<interactionPosition>3</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>ecommerce</subtitle>
+ <subtitle>ecommerce - Search Category: web - Search Results Count: 205</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>web</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>205</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -11494,24 +11442,16 @@
<pageId>641</pageId>
<bandwidth />
<siteSearchKeyword>ecommerce</siteSearchKeyword>
+ <siteSearchCategory>web</siteSearchCategory>
+ <siteSearchCount>205</siteSearchCount>
<generationTimeMilliseconds>585</generationTimeMilliseconds>
<generationTime>0.59s</generationTime>
<interactionPosition>3</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>ecommerce</subtitle>
+ <subtitle>ecommerce - Search Category: web - Search Results Count: 205</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>web</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>205</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -11831,7 +11771,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -11853,7 +11793,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -11875,7 +11815,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -11897,7 +11837,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -11916,7 +11856,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -12066,7 +12006,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -12088,7 +12028,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -12110,7 +12050,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -12132,7 +12072,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -12151,7 +12091,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -12301,7 +12241,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -12323,7 +12263,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -12345,7 +12285,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -12367,7 +12307,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -12386,7 +12326,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -18429,24 +18369,16 @@
<pageId>236</pageId>
<bandwidth />
<siteSearchKeyword>mobile</siteSearchKeyword>
+ <siteSearchCategory>images</siteSearchCategory>
+ <siteSearchCount>200</siteSearchCount>
<generationTimeMilliseconds>545</generationTimeMilliseconds>
<generationTime>0.55s</generationTime>
<interactionPosition>4</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>mobile</subtitle>
+ <subtitle>mobile - Search Category: images - Search Results Count: 200</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>images</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>200</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -20238,7 +20170,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -20260,7 +20192,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -20282,7 +20214,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -20304,7 +20236,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -20323,7 +20255,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -20610,20 +20542,16 @@
<timeSpent>0</timeSpent>
<timeSpentPretty>0s</timeSpentPretty>
<siteSearchKeyword>analytics</siteSearchKeyword>
+ <siteSearchCategory />
+ <siteSearchCount>210</siteSearchCount>
<generationTimeMilliseconds>1030</generationTimeMilliseconds>
<generationTime>1.03s</generationTime>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>analytics</subtitle>
+ <subtitle>analytics - Search Results Count: 210</subtitle>
- <customVariables>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>210</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -20643,7 +20571,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -20665,7 +20593,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -20687,7 +20615,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -20709,7 +20637,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -20728,7 +20656,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -21521,7 +21449,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -21543,7 +21471,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -21565,7 +21493,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -21587,7 +21515,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -21606,7 +21534,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -21933,24 +21861,16 @@
<pageId>293</pageId>
<bandwidth />
<siteSearchKeyword>ecommerce</siteSearchKeyword>
+ <siteSearchCategory>web</siteSearchCategory>
+ <siteSearchCount>205</siteSearchCount>
<generationTimeMilliseconds>585</generationTimeMilliseconds>
<generationTime>0.59s</generationTime>
<interactionPosition>3</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>ecommerce</subtitle>
+ <subtitle>ecommerce - Search Category: web - Search Results Count: 205</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>web</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>205</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -22270,7 +22190,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -22292,7 +22212,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -22314,7 +22234,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -22336,7 +22256,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -22355,7 +22275,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -24502,24 +24422,16 @@
<pageId>120</pageId>
<bandwidth />
<siteSearchKeyword>mobile</siteSearchKeyword>
+ <siteSearchCategory>images</siteSearchCategory>
+ <siteSearchCount>200</siteSearchCount>
<generationTimeMilliseconds>545</generationTimeMilliseconds>
<generationTime>0.55s</generationTime>
<interactionPosition>4</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>mobile</subtitle>
+ <subtitle>mobile - Search Category: images - Search Results Count: 200</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>images</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>200</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -26048,24 +25960,16 @@
<pageId>700</pageId>
<bandwidth />
<siteSearchKeyword>mobile</siteSearchKeyword>
+ <siteSearchCategory>images</siteSearchCategory>
+ <siteSearchCount>200</siteSearchCount>
<generationTimeMilliseconds>545</generationTimeMilliseconds>
<generationTime>0.55s</generationTime>
<interactionPosition>4</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>mobile</subtitle>
+ <subtitle>mobile - Search Category: images - Search Results Count: 200</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>images</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>200</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -27857,7 +27761,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -27879,7 +27783,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -27901,7 +27805,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -27923,7 +27827,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -27942,7 +27846,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -28229,20 +28133,16 @@
<timeSpent>0</timeSpent>
<timeSpentPretty>0s</timeSpentPretty>
<siteSearchKeyword>analytics</siteSearchKeyword>
+ <siteSearchCategory />
+ <siteSearchCount>210</siteSearchCount>
<generationTimeMilliseconds>1030</generationTimeMilliseconds>
<generationTime>1.03s</generationTime>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>analytics</subtitle>
+ <subtitle>analytics - Search Results Count: 210</subtitle>
- <customVariables>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>210</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -28262,7 +28162,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -28284,7 +28184,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -28306,7 +28206,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -28328,7 +28228,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -28347,7 +28247,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -28809,7 +28709,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -28831,7 +28731,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -28853,7 +28753,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -28875,7 +28775,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -28894,7 +28794,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -29181,20 +29081,16 @@
<timeSpent>0</timeSpent>
<timeSpentPretty>0s</timeSpentPretty>
<siteSearchKeyword>analytics</siteSearchKeyword>
+ <siteSearchCategory />
+ <siteSearchCount>210</siteSearchCount>
<generationTimeMilliseconds>1030</generationTimeMilliseconds>
<generationTime>1.03s</generationTime>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>analytics</subtitle>
+ <subtitle>analytics - Search Results Count: 210</subtitle>
- <customVariables>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>210</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -29214,7 +29110,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -29236,7 +29132,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -29258,7 +29154,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -29280,7 +29176,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -29299,7 +29195,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -30735,7 +30631,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -30757,7 +30653,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -30779,7 +30675,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -30801,7 +30697,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -30820,7 +30716,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -30970,7 +30866,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -30992,7 +30888,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -31014,7 +30910,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -31036,7 +30932,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -31055,7 +30951,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -31382,24 +31278,16 @@
<pageId>177</pageId>
<bandwidth />
<siteSearchKeyword>ecommerce</siteSearchKeyword>
+ <siteSearchCategory>web</siteSearchCategory>
+ <siteSearchCount>205</siteSearchCount>
<generationTimeMilliseconds>585</generationTimeMilliseconds>
<generationTime>0.59s</generationTime>
<interactionPosition>3</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>ecommerce</subtitle>
+ <subtitle>ecommerce - Search Category: web - Search Results Count: 205</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>web</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>205</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -31896,24 +31784,16 @@
<pageId>757</pageId>
<bandwidth />
<siteSearchKeyword>ecommerce</siteSearchKeyword>
+ <siteSearchCategory>web</siteSearchCategory>
+ <siteSearchCount>205</siteSearchCount>
<generationTimeMilliseconds>585</generationTimeMilliseconds>
<generationTime>0.59s</generationTime>
<interactionPosition>3</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>ecommerce</subtitle>
+ <subtitle>ecommerce - Search Category: web - Search Results Count: 205</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>web</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>205</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -32233,7 +32113,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -32255,7 +32135,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -32277,7 +32157,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -32299,7 +32179,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -32318,7 +32198,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -32468,7 +32348,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -32490,7 +32370,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -32512,7 +32392,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -32534,7 +32414,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -32553,7 +32433,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -36648,24 +36528,16 @@
<pageId>4</pageId>
<bandwidth />
<siteSearchKeyword>mobile</siteSearchKeyword>
+ <siteSearchCategory>images</siteSearchCategory>
+ <siteSearchCount>200</siteSearchCount>
<generationTimeMilliseconds>545</generationTimeMilliseconds>
<generationTime>0.55s</generationTime>
<interactionPosition>4</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>mobile</subtitle>
+ <subtitle>mobile - Search Category: images - Search Results Count: 200</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>images</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>200</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -38457,7 +38329,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -38479,7 +38351,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -38501,7 +38373,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -38523,7 +38395,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -38542,7 +38414,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -38829,20 +38701,16 @@
<timeSpent>0</timeSpent>
<timeSpentPretty>0s</timeSpentPretty>
<siteSearchKeyword>analytics</siteSearchKeyword>
+ <siteSearchCategory />
+ <siteSearchCount>210</siteSearchCount>
<generationTimeMilliseconds>1030</generationTimeMilliseconds>
<generationTime>1.03s</generationTime>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>analytics</subtitle>
+ <subtitle>analytics - Search Results Count: 210</subtitle>
- <customVariables>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>210</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -38862,7 +38730,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -38884,7 +38752,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -38906,7 +38774,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -38928,7 +38796,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -38947,7 +38815,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -39769,7 +39637,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -39791,7 +39659,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -39813,7 +39681,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -39835,7 +39703,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -39854,7 +39722,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -40210,24 +40078,16 @@
<pageId>61</pageId>
<bandwidth />
<siteSearchKeyword>ecommerce</siteSearchKeyword>
+ <siteSearchCategory>web</siteSearchCategory>
+ <siteSearchCount>205</siteSearchCount>
<generationTimeMilliseconds>585</generationTimeMilliseconds>
<generationTime>0.59s</generationTime>
<interactionPosition>3</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>ecommerce</subtitle>
+ <subtitle>ecommerce - Search Category: web - Search Results Count: 205</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>web</customVariablePageValue4>
- </row>
- <row>
- <customVariablePageName5>Search Results Count</customVariablePageName5>
- <customVariablePageValue5>205</customVariablePageValue5>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -40547,7 +40407,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>Test Name</eventName>
<eventValue>2</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -40569,7 +40429,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>3</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -40591,7 +40451,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;stop&quot;</subtitle>
<eventName>My Sound</eventName>
<eventValue>1</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -40613,7 +40473,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;resume&quot;</subtitle>
<eventName>Another Sound</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -40632,7 +40492,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Sound', Action: &quot;play&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png
index 415d2ce10a..e7ca8b21f1 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2fb4c62c3680b09b50cc846b0f39073f71b7002084ef52bd2f1023df73abaadb
-size 245111
+oid sha256:418badecf2d2dae40299140d7ffdda25695e752f5480247fca2fa3c6dbab932b
+size 245277
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png
index e6e6575483..85942b1c6d 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_overview_no_retention.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1312c2a758603bee46da2415a0ab148fa3d06af4d453c7bc86079b588cd805f1
-size 242153
+oid sha256:992cc4534cadcb7764af8060090157ca7dc2545a1a5fac8abdf41e813b054804
+size 242300
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png
index d47260c242..65a83dd1fe 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d84b46c2698d65715ea9030081117abc91fbbe8e82ebf8ae6fddf59812861574
-size 578891
+oid sha256:b00314e0cba0c69a98f343279feff75ae4f107b13ba7ec6d7b5c5f6844df1b27
+size 579805
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png
index 095649e649..98775ad05e 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_cancelled_verified_no_data_deleted.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9f4d53010eef0f766c887b90fe54b65db0e802aa236c92950367db910f682a6d
-size 573065
+oid sha256:7476c7d52efb3846c1efdc9cbd7d1206e628cdee4f7127787fd89db1137ddd4d
+size 574188
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png
index 958e5069ca..23fc01a02f 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_delete_visit_confirmed.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:aa6bb1f494a881cebf2066e29993e0422e5e3f66e0d2f8a77204ccd0f0b671cb
-size 128504
+oid sha256:bba5c60c6b8fa7395acc123f5e1e3775d7b04e7beae395c5ac4d12ab5e778397
+size 129590
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png
index d226aeba91..f44f438eca 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_enrich_segment_by_ip.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:339c7870fa7f06734f81ecffd150be3d6f65ddfe9f9e81121c5ebecb24102c62
-size 579155
+oid sha256:21b050201b2fdf455349522a66524758434c3db06fa4da11905e32db7dedc682
+size 580214
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png
index d47260c242..65a83dd1fe 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_uncheck_one_visit.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d84b46c2698d65715ea9030081117abc91fbbe8e82ebf8ae6fddf59812861574
-size 578891
+oid sha256:b00314e0cba0c69a98f343279feff75ae4f107b13ba7ec6d7b5c5f6844df1b27
+size 579805
diff --git a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png
index 284c8c0e28..3f3aebfe4e 100644
--- a/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png
+++ b/plugins/PrivacyManager/tests/UI/expected-screenshots/PrivacyManager_gdpr_tools_visits_found.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f40e1455411670f82f7ccfca272fef800849aa6b09490bc70630921186178750
-size 573449
+oid sha256:30d755e33da141fd68564e2118f20ff1e36a0646fa3dbe6cd63393ab4ddd6ae7
+size 574557
diff --git a/plugins/PrivacyManager/tests/Unit/AnonymizeIPTest.php b/plugins/PrivacyManager/tests/Unit/AnonymizeIPTest.php
index c9ae38e952..b63b8ddab1 100644
--- a/plugins/PrivacyManager/tests/Unit/AnonymizeIPTest.php
+++ b/plugins/PrivacyManager/tests/Unit/AnonymizeIPTest.php
@@ -8,12 +8,12 @@
namespace Piwik\Plugins\PrivacyManager\tests;
-use Piwik\Network\IP;
+use Matomo\Network\IP;
use Piwik\Plugins\PrivacyManager\IPAnonymizer;
require_once PIWIK_INCLUDE_PATH . '/plugins/PrivacyManager/IPAnonymizer.php';
-class AnonymizeIPTest extends \PHPUnit_Framework_TestCase
+class AnonymizeIPTest extends \PHPUnit\Framework\TestCase
{
// IPv4 addresses and expected results
public function getipv4Addresses()
diff --git a/plugins/PrivacyManager/tests/Unit/DoNotTrackHeaderCheckerTest.php b/plugins/PrivacyManager/tests/Unit/DoNotTrackHeaderCheckerTest.php
index 644138aeb6..9d8abac821 100644
--- a/plugins/PrivacyManager/tests/Unit/DoNotTrackHeaderCheckerTest.php
+++ b/plugins/PrivacyManager/tests/Unit/DoNotTrackHeaderCheckerTest.php
@@ -16,16 +16,16 @@ use Piwik\Plugins\PrivacyManager\DoNotTrackHeaderChecker;
* Class DoNotTrackHeaderCheckerTest
* @group DoNotTrackHeaderCheckerTest
*/
-class DoNotTrackHeaderCheckerTest extends \PHPUnit_Framework_TestCase
+class DoNotTrackHeaderCheckerTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
$this->cleanupServerGlobals();
$this->setUserAgentToChrome();
}
- public function tearDown()
+ public function tearDown(): void
{
$this->cleanupServerGlobals();
}
diff --git a/plugins/Provider b/plugins/Provider
new file mode 160000
+Subproject 65ad2d63ab289ca3dc032a3e4dc4d28c35582cc
diff --git a/plugins/Provider/API.php b/plugins/Provider/API.php
deleted file mode 100644
index 0dfd675454..0000000000
--- a/plugins/Provider/API.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\Provider;
-
-use Piwik\Archive;
-use Piwik\Metrics;
-use Piwik\Piwik;
-
-/**
- * @see plugins/Provider/functions.php
- */
-require_once PIWIK_INCLUDE_PATH . '/plugins/Provider/functions.php';
-
-/**
- * The Provider API lets you access reports for your visitors Internet Providers.
- *
- * @method static \Piwik\Plugins\Provider\API getInstance()
- */
-class API extends \Piwik\Plugin\API
-{
- public function getProvider($idSite, $period, $date, $segment = false)
- {
- Piwik::checkUserHasViewAccess($idSite);
- $archive = Archive::build($idSite, $period, $date, $segment);
- $dataTable = $archive->getDataTable(Archiver::PROVIDER_RECORD_NAME);
- $dataTable->filter('ColumnCallbackAddMetadata', array('label', 'url', __NAMESPACE__ . '\getHostnameUrl'));
- $dataTable->filter('GroupBy', array('label', __NAMESPACE__ . '\getPrettyProviderName'));
- $dataTable->filter('AddSegmentValue', array(function ($label) {
- if ($label === Piwik::translate('General_Unknown')) {
- return '';
- }
-
- return $label;
- }));
- $dataTable->queueFilter('ReplaceColumnNames');
- $dataTable->queueFilter('ReplaceSummaryRowLabel');
- return $dataTable;
- }
-}
diff --git a/plugins/Provider/Archiver.php b/plugins/Provider/Archiver.php
deleted file mode 100644
index b0f0e94a61..0000000000
--- a/plugins/Provider/Archiver.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\Provider;
-
-use Piwik\Metrics;
-
-class Archiver extends \Piwik\Plugin\Archiver
-{
- const PROVIDER_RECORD_NAME = 'Provider_hostnameExt';
- const PROVIDER_FIELD = "location_provider";
-
- public function aggregateDayReport()
- {
- $metrics = $this->getLogAggregator()->getMetricsFromVisitByDimension(self::PROVIDER_FIELD)->asDataTable();
- $report = $metrics->getSerialized($this->maximumRows, null, Metrics::INDEX_NB_VISITS);
- $this->getProcessor()->insertBlobRecord(self::PROVIDER_RECORD_NAME, $report);
- }
-
- public function aggregateMultipleReports()
- {
- $columnsAggregationOperation = null;
-
- $this->getProcessor()->aggregateDataTableRecords(
- array(self::PROVIDER_RECORD_NAME),
- $this->maximumRows,
- $maximumRowsInSubDataTable = null,
- $columnToSortByBeforeTruncation = null,
- $columnsAggregationOperation,
- $columnsToRenameAfterAggregation = null,
- $countRowsRecursive = array()
- );
- }
-}
diff --git a/plugins/Provider/Columns/Provider.php b/plugins/Provider/Columns/Provider.php
deleted file mode 100644
index 4d15833ad8..0000000000
--- a/plugins/Provider/Columns/Provider.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\Provider\Columns;
-
-use Piwik\Common;
-use Piwik\Network\IP;
-use Piwik\Network\IPUtils;
-use Piwik\Plugin\Dimension\VisitDimension;
-use Piwik\Tracker\Action;
-use Piwik\Tracker\Request;
-use Piwik\Tracker\Visitor;
-use Piwik\Plugins\PrivacyManager\Config as PrivacyManagerConfig;
-use Piwik\Plugins\Provider\Provider as ProviderPlugin;
-
-class Provider extends VisitDimension
-{
- protected $columnName = 'location_provider';
- protected $segmentName = 'provider';
- protected $category = 'UserCountry_VisitLocation';
- protected $nameSingular = 'Provider_ColumnProvider';
- protected $namePlural = 'Provider_WidgetProviders';
- protected $acceptValues = 'comcast.net, proxad.net, etc.';
- protected $type = self::TYPE_TEXT;
-
- /**
- * @param Request $request
- * @param Visitor $visitor
- * @param Action|null $action
- * @return mixed
- */
- public function onNewVisit(Request $request, Visitor $visitor, $action)
- {
- // Adding &dp=1 will disable the provider plugin, this is an "unofficial" parameter used to speed up log importer
- $disableProvider = $request->getParam('dp');
-
- if (!empty($disableProvider)) {
- return false;
- }
-
- // if provider info has already been set, abort
- $locationValue = $visitor->getVisitorColumn('location_provider');
- if (!empty($locationValue)) {
- return false;
- }
-
- $ip = $visitor->getVisitorColumn('location_ip');
-
- $privacyConfig = new PrivacyManagerConfig();
- if (!$privacyConfig->useAnonymizedIpForVisitEnrichment) {
- $ip = $request->getIp();
- }
-
- $ip = IPUtils::binaryToStringIP($ip);
-
- // In case the IP was anonymized, we should not continue since the DNS reverse lookup will fail and this will slow down tracking
- if (substr($ip, -2, 2) == '.0') {
- Common::printDebug("IP Was anonymized so we skip the Provider DNS reverse lookup...");
- return false;
- }
-
- $hostname = $this->getHost($ip);
- $hostnameExtension = ProviderPlugin::getCleanHostname($hostname);
-
- // add the provider value in the table log_visit
- $locationProvider = substr($hostnameExtension, 0, 100);
-
- return $locationProvider;
- }
-
- public function getRequiredVisitFields()
- {
- return array('location_ip');
- }
-
- /**
- * Returns the hostname given the IP address string
- *
- * @param string $ipStr IP Address
- * @return string hostname (or human-readable IP address)
- */
- private function getHost($ipStr)
- {
- $ip = IP::fromStringIP($ipStr);
-
- $host = $ip->getHostname();
- $host = ($host === null ? $ipStr : $host);
-
- return trim(strtolower($host));
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/Controller.php b/plugins/Provider/Controller.php
deleted file mode 100644
index 25f2e421e4..0000000000
--- a/plugins/Provider/Controller.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\Provider;
-
-/**
- *
- */
-class Controller extends \Piwik\Plugin\Controller
-{
-}
-
diff --git a/plugins/Provider/Provider.php b/plugins/Provider/Provider.php
deleted file mode 100644
index 6783c04afc..0000000000
--- a/plugins/Provider/Provider.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\Provider;
-
-use Exception;
-use Piwik\ArchiveProcessor;
-use Piwik\Common;
-use Piwik\Db;
-use Piwik\FrontController;
-use Piwik\Piwik;
-
-class Provider extends \Piwik\Plugin
-{
- public function install()
- {
- // add column hostname / hostname ext in the visit table
- $query = "ALTER TABLE `" . Common::prefixTable('log_visit') . "` ADD `location_provider` VARCHAR(200) NULL";
-
- // if the column already exist do not throw error. Could be installed twice...
- try {
- Db::exec($query);
- } catch (Exception $e) {
- if (!Db::get()->isErrNo($e, '1060')) {
- throw $e;
- }
- }
- }
-
- public function uninstall()
- {
- // add column hostname / hostname ext in the visit table
- $query = "ALTER TABLE `" . Common::prefixTable('log_visit') . "` DROP `location_provider`";
- Db::exec($query);
- }
-
- public function postLoad()
- {
- Piwik::addAction('Template.footerUserCountry', array('Piwik\Plugins\Provider\Provider', 'footerUserCountry'));
- }
-
- public static function footerUserCountry(&$out)
- {
- $out .= '<h2 piwik-enriched-headline>' . Piwik::translate('Provider_WidgetProviders') . '</h2>';
- $out .= FrontController::getInstance()->fetchDispatch('Provider', 'getProvider');
- }
-
- /**
- * Returns the hostname extension (site.co.jp in fvae.VARG.ceaga.site.co.jp)
- * given the full hostname looked up from the IP
- *
- * @param string $hostname
- *
- * @return string
- */
- public static function getCleanHostname($hostname)
- {
- $extToExclude = array(
- 'com', 'net', 'org', 'co'
- );
-
- $off = strrpos($hostname, '.');
- $ext = substr($hostname, $off);
-
- if (empty($off) || is_numeric($ext) || strlen($hostname) < 5) {
- return 'Ip';
- } else {
- $cleanHostname = null;
-
- /**
- * Triggered when prettifying a hostname string.
- *
- * This event can be used to customize the way a hostname is displayed in the
- * Providers report.
- *
- * **Example**
- *
- * public function getCleanHostname(&$cleanHostname, $hostname)
- * {
- * if ('fvae.VARG.ceaga.site.co.jp' == $hostname) {
- * $cleanHostname = 'site.co.jp';
- * }
- * }
- *
- * @param string &$cleanHostname The hostname string to display. Set by the event
- * handler.
- * @param string $hostname The full hostname.
- */
- Piwik::postEvent('Provider.getCleanHostname', array(&$cleanHostname, $hostname));
- if ($cleanHostname !== null) {
- return $cleanHostname;
- }
-
- $e = explode('.', $hostname);
- $s = sizeof($e);
-
- // if extension not correct
- if (isset($e[$s - 2]) && in_array($e[$s - 2], $extToExclude)) {
- return $e[$s - 3] . "." . $e[$s - 2] . "." . $e[$s - 1];
- } else {
- return $e[$s - 2] . "." . $e[$s - 1];
- }
- }
- }
-
-}
diff --git a/plugins/Provider/Reports/GetProvider.php b/plugins/Provider/Reports/GetProvider.php
deleted file mode 100644
index 748209c067..0000000000
--- a/plugins/Provider/Reports/GetProvider.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\Provider\Reports;
-
-use Piwik\Common;
-use Piwik\Piwik;
-use Piwik\Plugin\Report;
-use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\Provider\Columns\Provider;
-use Piwik\Report\ReportWidgetFactory;
-use Piwik\Widget\WidgetsList;
-
-class GetProvider extends Report
-{
- protected function init()
- {
- $this->categoryId = 'General_Visitors';
- $this->dimension = new Provider();
- $this->name = Piwik::translate('Provider_ColumnProvider');
- $this->documentation = Piwik::translate('Provider_ProviderReportDocumentation', '<br />');
- $this->order = 50;
-
- $this->subcategoryId = 'UserCountry_SubmenuLocations';
- }
-
- public function configureWidgets(WidgetsList $widgetsList, ReportWidgetFactory $factory)
- {
- $widget = $factory->createWidget()->setName('Provider_WidgetProviders');
- $widgetsList->addWidgetConfig($widget);
- }
-
- public function configureView(ViewDataTable $view)
- {
- $view->requestConfig->filter_limit = 5;
- $view->config->addTranslation('label', $this->dimension->getName());
-
- $message = Piwik::translate("General_Note") . ': ' . Piwik::translate('Provider_ProviderReportFooter', '');
- if (! Common::getRequestVar('disableLink', 0, 'int')) {
- $message .= ' ' . Piwik::translate(
- 'General_SeeThisFaq',
- array('<a href="https://matomo.org/faq/general/faq_52/" rel="noreferrer noopener" target="_blank">', '</a>')
- );
- }
- $view->config->show_footer_message = $message;
- }
-}
diff --git a/plugins/Provider/Updates/3.0.0-b1.php b/plugins/Provider/Updates/3.0.0-b1.php
deleted file mode 100644
index e9eeeca10e..0000000000
--- a/plugins/Provider/Updates/3.0.0-b1.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-
-namespace Piwik\Plugins\Provider;
-
-use Piwik\Updater;
-use Piwik\Updates as PiwikUpdates;
-use Piwik\Updater\Migration;
-use Piwik\Updater\Migration\Factory as MigrationFactory;
-
-/**
- * Update for version 3.0.0-b1.
- */
-class Updates_3_0_0_b1 extends PiwikUpdates
-{
- /**
- * @var MigrationFactory
- */
- private $migration;
-
- public function __construct(MigrationFactory $factory)
- {
- $this->migration = $factory;
- }
-
- public function getMigrations(Updater $updater)
- {
- return array(
- $this->migration->db->changeColumnType('log_visit', 'location_provider', 'VARCHAR(200) NULL')
- );
- }
-
- public function doUpdate(Updater $updater)
- {
- $updater->executeMigrations(__FILE__, $this->getMigrations($updater));
- }
-}
diff --git a/plugins/Provider/VisitorDetails.php b/plugins/Provider/VisitorDetails.php
deleted file mode 100644
index d0f8f146b7..0000000000
--- a/plugins/Provider/VisitorDetails.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?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\Plugins\Provider;
-
-use Piwik\Piwik;
-use Piwik\Plugins\Live\VisitorDetailsAbstract;
-use Piwik\View;
-
-/**
- * @see plugins/Provider/functions.php
- */
-require_once PIWIK_INCLUDE_PATH . '/plugins/Provider/functions.php';
-
-class VisitorDetails extends VisitorDetailsAbstract
-{
- public function extendVisitorDetails(&$visitor)
- {
- $visitor['provider'] = $this->details['location_provider'];
- $visitor['providerName'] = $this->getProviderName();
- $visitor['providerUrl'] = $this->getProviderUrl();
- }
-
- public function renderVisitorDetails($visitorDetails)
- {
- if (empty($visitorDetails['provider'])) {
- return [];
- }
-
- $view = new View('@Provider/_visitorDetails.twig');
- $view->visitInfo = $visitorDetails;
- return [[ 20, $view->render() ]];
- }
-
- protected function getProvider()
- {
- if (isset($this->details['location_provider'])) {
- return $this->details['location_provider'];
- }
- return Piwik::translate('General_Unknown');
- }
-
- protected function getProviderName()
- {
- return getPrettyProviderName($this->getProvider());
- }
-
- protected function getProviderUrl()
- {
- return getHostnameUrl(@$this->details['location_provider']);
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/config/config.php b/plugins/Provider/config/config.php
deleted file mode 100644
index d266508bcd..0000000000
--- a/plugins/Provider/config/config.php
+++ /dev/null
@@ -1,2 +0,0 @@
-<?php
-return array();
diff --git a/plugins/Provider/config/tracker.php b/plugins/Provider/config/tracker.php
deleted file mode 100644
index ca2affec34..0000000000
--- a/plugins/Provider/config/tracker.php
+++ /dev/null
@@ -1,2 +0,0 @@
-<?php
-return array();
diff --git a/plugins/Provider/functions.php b/plugins/Provider/functions.php
deleted file mode 100644
index 38a56f345a..0000000000
--- a/plugins/Provider/functions.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\Provider;
-
-use Piwik\Common;
-use Piwik\DataTable;
-use Piwik\Piwik;
-use Zend_Validate_Hostname as HostnameValidator;
-
-/**
- * Return hostname portion of a domain name
- *
- * @param string $in
- * @return string Host name, IP (if IP address didn't resolve), or Unknown
- */
-function getHostnameName($in)
-{
- if (empty($in) || strtolower($in) === 'ip') {
- return Piwik::translate('General_Unknown');
- }
- if (($positionDot = strpos($in, '.')) !== false) {
- return ucfirst(substr($in, 0, $positionDot));
- }
- return $in;
-}
-
-/**
- * Return URL for a given domain name
- *
- * @param string $in hostname
- * @return string URL
- */
-function getHostnameUrl($in)
-{
- if ($in == DataTable::LABEL_SUMMARY_ROW || empty($in) || strtolower($in) === 'ip') {
- return null;
- }
-
- // if the name is a valid hostname, return a URL - otherwise link to startpage
- $validator = new HostnameValidator;
- if ($validator->isValid($in)) {
- return "http://" . $in . "/";
- } else {
- return "https://startpage.com/do/search?q=" . urlencode(getPrettyProviderName($in));
- }
-}
-
-/**
- * Return a pretty provider name for a given domain name
- *
- * @param string $in hostname
- * @return string Real ISP name, IP (if IP address didn't resolve), or Unknown
- */
-function getPrettyProviderName($in)
-{
- $providerName = getHostnameName($in);
-
- $prettyNames = Common::getProviderNames();
-
- if (is_array($prettyNames)
- && array_key_exists(strtolower($providerName), $prettyNames)
- ) {
- $providerName = $prettyNames[strtolower($providerName)];
- }
-
- return $providerName;
-}
diff --git a/plugins/Provider/lang/am.json b/plugins/Provider/lang/am.json
deleted file mode 100644
index 1c6787d220..0000000000
--- a/plugins/Provider/lang/am.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "አቅራቢ",
- "WidgetProviders": "አቅራቢዎች"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/ar.json b/plugins/Provider/lang/ar.json
deleted file mode 100644
index ed794cfc77..0000000000
--- a/plugins/Provider/lang/ar.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "مزود الخدمة",
- "PluginDescription": "يوضح مزود خدمة الإنترنت للزوار.",
- "ProviderReportDocumentation": "يُظهر هذا التقرير ما مزود خدمة الإنترنت الذي استخدمه زوارك للوصول إلى الموقع. يمكنك الضغط على اسم المزوّد لمزيد من التفاصيل. %s إذا لم يتمكن Matomo من تحديد مزود الزائر فسيظهر في القائمة باسم IP.",
- "WidgetProviders": "مزودو الخدمة",
- "ProviderReportFooter": "مزود غير معروف تعني أنه لم يتم العثور على عنوان IP للمزود."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/be.json b/plugins/Provider/lang/be.json
deleted file mode 100644
index 3645a72230..0000000000
--- a/plugins/Provider/lang/be.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Правайдар",
- "ProviderReportDocumentation": "Гэтая справаздача паказвае, якія інтэрнэт-правайдэры наведвальнікаў выкарыстоўваюцца для доступу да вэб-сайту. Вы можаце націснуць на імя правайдэра для больш падрабязнай інфармацыі. %s Калі Matomo не можа вызначыць, правайдэра наведвальніка, ён паказваецца ў якасці IP-адраса.",
- "WidgetProviders": "Правайдары"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/bg.json b/plugins/Provider/lang/bg.json
deleted file mode 100644
index e6801a7d35..0000000000
--- a/plugins/Provider/lang/bg.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Интернет доставчик",
- "ProviderReportDocumentation": "Отчетът показва кои доставчици на интернет услуги използват вашите потребители за достъп до уеб сайта. Можете да щракнете върху името на доставчика за повече детайли. %s Ако Matomo не може да определи доставчика на потребителя, той е показан само като IP.",
- "WidgetProviders": "Доставчици"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/ca.json b/plugins/Provider/lang/ca.json
deleted file mode 100644
index ec64133c16..0000000000
--- a/plugins/Provider/lang/ca.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Proveïdor",
- "ProviderReportDocumentation": "Aquest informe mostra quin Proveïdor d'Internet han utiltizat els vostres visitants per accedir al lloc. Podeu click al nom del proveïdor per més detalls. %s Si el Matomo no pot determinar el proveïdor del visitant, es mostra la seva adreça IP.",
- "WidgetProviders": "Proveïdors"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/cs.json b/plugins/Provider/lang/cs.json
deleted file mode 100644
index e71759a511..0000000000
--- a/plugins/Provider/lang/cs.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Poskytovatel",
- "PluginDescription": "Hlásí poskytovatele internetového připojení návštěvníků.",
- "ProviderReportDocumentation": "Toto hlášení poskytuje informace o tom, jakého poskytovatele internetového připojení vaši návštěvníci při přístupu na stránky použili. Pokud kliknete na jméno poskytovatele, zobrazí se podrobnosti. %s Pokud Matomo nebyl schopen poskytovatele zjistit, je zobrazen jako IP.",
- "WidgetProviders": "Poskytovatelé",
- "ProviderReportFooter": "Neznámý poskytovatel znamená, že IP adresu nebylo možné vyhledat."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/da.json b/plugins/Provider/lang/da.json
deleted file mode 100644
index 502cfeb7b2..0000000000
--- a/plugins/Provider/lang/da.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Udbyder",
- "PluginDescription": "Rapporterer den besøgendes internetudbyder.",
- "ProviderReportDocumentation": "Rapporten viser hvilken Internet udbyder de besøgende bruger. Klik på en udbyders navn for flere oplysninger. %s Hvis Matomo ikke kan bestemme besøgendes udbyder, er den opført som IP.",
- "WidgetProviders": "Udbydere",
- "ProviderReportFooter": "Ukendt udbyder betyder at IP-adressen kunne ikke slås op."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/de.json b/plugins/Provider/lang/de.json
deleted file mode 100644
index 1803d43d5d..0000000000
--- a/plugins/Provider/lang/de.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Provider",
- "PluginDescription": "Liefert den Internet Service Provider der Besucher.",
- "ProviderReportDocumentation": "Dieser Bericht zeigt Ihnen, welche Internetanbieter die Besucher Ihrer Website nutzen. Sie können auf den Namen eines Anbieters klicken, um mehr Informationen dazu zu erhalten. %s Wenn Matomo den Internetanbieter eines Besuchers nicht feststellen kann, wird er unter IP gelistet.",
- "WidgetProviders": "Provider",
- "ProviderReportFooter": "Unbekannter Provider bedeutet die IP-Adresse konnte nicht aufgelöst werden."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/el.json b/plugins/Provider/lang/el.json
deleted file mode 100644
index ef79adc061..0000000000
--- a/plugins/Provider/lang/el.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Πάροχος",
- "PluginDescription": "Αναφέρει τον πάροχο διαδικτύου των επισκεπτών σας.",
- "ProviderReportDocumentation": "Αυτή η αναφορά εμφανίζει ποιος Πάροχος Υπηρεσιών Διαδικτύου χρησιμοποιείται από τους επισκέπτες σας για να προσπελάσουν την ιστοσελίδα σας. Μπορείτε να πατήσετε σε ένα όνομα Παρόχου για περισσότερες λεπτομέρειες. %s Αν το Matomo δεν μπορεί να ανιχνεύσει τον πάροχο του επισκέπτη, χαρακτηρίζεται ως IP.",
- "WidgetProviders": "Πάροχοι",
- "ProviderReportFooter": "Άγνωστος πάροχος σημαίνει ότι δεν ήταν δυνατή η εύρεση της διεύθυνσης IP."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/en.json b/plugins/Provider/lang/en.json
deleted file mode 100644
index 1ef8e05874..0000000000
--- a/plugins/Provider/lang/en.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Provider",
- "PluginDescription": "Reports the Internet Service Provider of the visitors.",
- "ProviderReportDocumentation": "This report shows which Internet Service Providers your visitors used to access the website. You can click on a provider name for more details. %s If Matomo can't determine a visitor's provider, it is listed as IP.",
- "WidgetProviders": "Providers",
- "ProviderReportFooter": "Unknown provider means the IP address could not be looked up."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/es-ar.json b/plugins/Provider/lang/es-ar.json
deleted file mode 100644
index 99b3c2dcfc..0000000000
--- a/plugins/Provider/lang/es-ar.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Proveedor",
- "PluginDescription": "Informa el proveedor de Internet de los visitantes.",
- "ProviderReportDocumentation": "Este informe muestra qué proveedores de Internet (ISPs) usan tus visitantes para acceder al sitio web. Podés hacer clic en el nombre de un proveedor para más detalles. %s Si Matomo no puede determinar el proveedor de un visitante, se mostrará la IP.",
- "WidgetProviders": "Proveedores",
- "ProviderReportFooter": "Un proveedor desconocido significa que la dirección IP no pudo ser resuelta."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/es.json b/plugins/Provider/lang/es.json
deleted file mode 100644
index c9393dc7a8..0000000000
--- a/plugins/Provider/lang/es.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Proveedor",
- "PluginDescription": "Informa el proveedor del servicio de internet de sus visitantes.",
- "ProviderReportDocumentation": "Este informe muestra que Proveedores de Servicios de Internet (ISPs) usan sus visitantes para acceder al sitio de internet. Puede hacer clic en el nombre de un proveedor para más detalles. %s Si Matomo no puede determinar el proveedor de un visitante, será puesto como la IP.",
- "WidgetProviders": "Proveedores",
- "ProviderReportFooter": "Proveedor desconocido significa que la dirección IP no puede ser identificada."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/et.json b/plugins/Provider/lang/et.json
deleted file mode 100644
index 6200fe1913..0000000000
--- a/plugins/Provider/lang/et.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Teenusepakkuja",
- "WidgetProviders": "Teenusepakkujad"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/eu.json b/plugins/Provider/lang/eu.json
deleted file mode 100644
index 776906791b..0000000000
--- a/plugins/Provider/lang/eu.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Hornitzailea",
- "WidgetProviders": "Hornitzaileak"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/fa.json b/plugins/Provider/lang/fa.json
deleted file mode 100644
index 4992ba4d37..0000000000
--- a/plugins/Provider/lang/fa.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "ارائه دهنده خدمات",
- "WidgetProviders": "ارائه دهندگان"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/fi.json b/plugins/Provider/lang/fi.json
deleted file mode 100644
index 5e88458467..0000000000
--- a/plugins/Provider/lang/fi.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Palveluntarjoajat",
- "PluginDescription": "Raportoi kävijöiden internetoperaattorin.",
- "ProviderReportDocumentation": "Tämä raportti näyttää, mitä internetin palveluntarjoajia kävijäsi käyttivät sivuillasi. Saat lisätietoja klikkaamalla toimittajan nimeä. %s Jos Matomo ei tunnista palveluntarjoajan nimeä, kävijästä näytetään IP-osoite.",
- "WidgetProviders": "Palveluntarjoajat",
- "ProviderReportFooter": "Tuntematon palveluntarjoaja tarkoittaa, ettei IP-osoitteen avulla voitu etsiä tietoja."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/fr.json b/plugins/Provider/lang/fr.json
deleted file mode 100644
index e4fa112b09..0000000000
--- a/plugins/Provider/lang/fr.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "FAI",
- "PluginDescription": "Rapporte le Fournisseur d'Accès Internet des visiteurs.",
- "ProviderReportDocumentation": "Ce rapport affiche quel Fournisseur d'Accès à Internet vos visiteurs ont utilisé pour accéder à votre site web. Vous pouvez cliquer sur le nom d'un FAI pour plus de détails. %s Si Matomo ne peut déterminer le FAI d'un visiteur, il est listé en tant qu'IP.",
- "WidgetProviders": "Fournisseurs d'accès à Internet",
- "ProviderReportFooter": "Fournisseur d'accès inconnu signifie que l'adresse IP ne peut pas être déterminée"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/gl.json b/plugins/Provider/lang/gl.json
deleted file mode 100644
index e983b9143d..0000000000
--- a/plugins/Provider/lang/gl.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "Provider": {
- "WidgetProviders": "Provedores"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/hi.json b/plugins/Provider/lang/hi.json
deleted file mode 100644
index 87dd6f258f..0000000000
--- a/plugins/Provider/lang/hi.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "प्रदाता",
- "PluginDescription": "आगंतुकों की इंटरनेट सेवा प्रदाता रिपोर्ट।",
- "ProviderReportDocumentation": "इस रिपोर्ट से पता चलता है आपके आगंतुकों को वेबसाइट का उपयोग करने के लिए जो इंटरनेट सेवा प्रदाता इस्तेमाल किया है. आप अधिक जानकारी के लिए एक प्रदाता के नाम पर क्लिक कर सकते हैं. %sMatomo एक आगंतुक प्रदाता निर्धारित नहीं कर सकते हैं, यह आईपी के रूप में सूचीबद्ध किया जाता है.",
- "WidgetProviders": "प्रदाता",
- "ProviderReportFooter": "अज्ञात प्रदाता IP पते को देखा नहीं जा सकता है इसका मतलब है।"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/hu.json b/plugins/Provider/lang/hu.json
deleted file mode 100644
index 49bb8c5ebc..0000000000
--- a/plugins/Provider/lang/hu.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Internetszolgáltató",
- "WidgetProviders": "Internetszolgáltatók"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/id.json b/plugins/Provider/lang/id.json
deleted file mode 100644
index 715c8f54a5..0000000000
--- a/plugins/Provider/lang/id.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Penyedia",
- "ProviderReportDocumentation": "Laporan ini menampilkan Penyedia Layanan Internet yang digunakan oleh pengunjung Anda untuk mengunjungi situs. Anda dapat mengeklik nama penyedia untuk melihat rinciannya. %s Bila Matomo tak dapat menentukan penyedia pengunjung, ini akan ditampikan sebagai IP.",
- "WidgetProviders": "Penyedia"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/is.json b/plugins/Provider/lang/is.json
deleted file mode 100644
index 75add91b2d..0000000000
--- a/plugins/Provider/lang/is.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Veitandi",
- "WidgetProviders": "Veitendur"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/it.json b/plugins/Provider/lang/it.json
deleted file mode 100644
index 93cde02059..0000000000
--- a/plugins/Provider/lang/it.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Provider",
- "PluginDescription": "Restituisce gli Internet Service Provider dei visitatori.",
- "ProviderReportDocumentation": "Questo report mostra quali Internet Service Provider i tuoi visitatori hanno utilizzato per accedere al sito web. È possibile fare clic su un nome per maggiori dettagli. %s Se Matomo non può determinare il provider di un visitatore, questo viene elencato come IP.",
- "WidgetProviders": "Providers",
- "ProviderReportFooter": "Provider sconosciuto significa che non è possibile trovare l'indirizzo IP"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/ja.json b/plugins/Provider/lang/ja.json
deleted file mode 100644
index 75a490e1d0..0000000000
--- a/plugins/Provider/lang/ja.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "プロバイダ",
- "PluginDescription": "ビジターのインターネットサービスプロバイダを報告します",
- "ProviderReportDocumentation": "このリポートは、ウェブサイトにアクセスするビジターが使っているインターネットサービスプロバイダを示しています。詳細については、プロバイダ名をクリックしてください。 %s Matomo がビジターのプロバイダを判別できない場合は、IP として表示されます。",
- "WidgetProviders": "プロバイダ",
- "ProviderReportFooter": "未知のプロバイダーとは IP アドレスが検索できなかったことを意味します。"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/ka.json b/plugins/Provider/lang/ka.json
deleted file mode 100644
index 0fe0d090b1..0000000000
--- a/plugins/Provider/lang/ka.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "პროვაიდერი",
- "WidgetProviders": "პროვაიდერები"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/ko.json b/plugins/Provider/lang/ko.json
deleted file mode 100644
index 62d479cda4..0000000000
--- a/plugins/Provider/lang/ko.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "공급자",
- "PluginDescription": "방문자의 인터넷 서비스 공급자 확인",
- "ProviderReportDocumentation": "이 보고서는 웹사이트를 방문하는 방문자가 사용하고있는 인터넷 서비스 공급자를 보여줍니다. 자세한 내용은 공급자 이름을 클릭하세요. %s Matomo가 방문자의 공급자를 확인할 수없는 경우는 IP로 표시됩니다.",
- "WidgetProviders": "공급자",
- "ProviderReportFooter": "알 수 없는 공급자는 해당 IP 주소가 검색되지 않았음을 의미합니다."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/lt.json b/plugins/Provider/lang/lt.json
deleted file mode 100644
index c316d068a1..0000000000
--- a/plugins/Provider/lang/lt.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "IP tiekėjas",
- "WidgetProviders": "IP tiekėjai"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/lv.json b/plugins/Provider/lang/lv.json
deleted file mode 100644
index f1f456274b..0000000000
--- a/plugins/Provider/lang/lv.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Pakalpojumu sniedzējs",
- "WidgetProviders": "Pakalpojumu sniedzēji"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/nb.json b/plugins/Provider/lang/nb.json
deleted file mode 100644
index 4fb102c83b..0000000000
--- a/plugins/Provider/lang/nb.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Internett-leverandør",
- "PluginDescription": "Rapporterer internett-leverandøren (ISP-en) til besøkere.",
- "ProviderReportDocumentation": "Denne rapporten viser hvilken internett-leverandør (ISP) dine besøkere bruker for å besøke nettstedet. Du kan klikke på et ISP-navn for flere detaljer. %s Hvis Matomo ikke kan finne en besøkers ISP, listes den som IP.",
- "WidgetProviders": "Internett-leverandører",
- "ProviderReportFooter": "Ukjent internett-leverandør betyr at IP-adressen ikke kunne slås opp."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/nl.json b/plugins/Provider/lang/nl.json
deleted file mode 100644
index 46bb412f6c..0000000000
--- a/plugins/Provider/lang/nl.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Provider",
- "PluginDescription": "Rapporteert de Internet Service Provider van de bezoekers.",
- "ProviderReportDocumentation": "Dit rapport toont de Internet Service Providers die uw bezoekers gebruiken om de website te bezoeken. Klik op een provider naam voor meer informatie. %s Als Matomo de naam van de provider niet kan achterhalen, dan wordt deze vermeld als IP.",
- "WidgetProviders": "Providers",
- "ProviderReportFooter": "Onbekende provider betekent dat het IP-adres niet kon worden opgezocht."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/pl.json b/plugins/Provider/lang/pl.json
deleted file mode 100644
index 3787bcce69..0000000000
--- a/plugins/Provider/lang/pl.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Dostawca",
- "PluginDescription": "Raport przedstawiający dostawców internetu - ISP - odwiedzających.",
- "ProviderReportDocumentation": "Ten raport przedstawia Dostawców Internetu, ISP, z których usług korzystają Twoi odwiedzający. Kliknij na nazwie dostawcy po więcej informacji. %s W sytuacji, gdy Matomo nie potrafi określić dostawcy, wyświetla adres IP.",
- "WidgetProviders": "Dostawcy",
- "ProviderReportFooter": "Nieznany dostawca oznacza, że nie udało się odczytać danych przypisanych do adresu IP."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/pt-br.json b/plugins/Provider/lang/pt-br.json
deleted file mode 100644
index 04b5a84f5f..0000000000
--- a/plugins/Provider/lang/pt-br.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Provedor",
- "PluginDescription": "Informa o Provedor de Serviços de Internet dos visitantes.",
- "ProviderReportDocumentation": "Este relatório mostra como o Internet Service Providers de seus visitantes -e usado para acessar o site. Você pode clicar no nome de um provedor para obter mais detalhes. %s Se o Matomo não puder determinar o fornecedor de um visitante, ele será listado como IP.",
- "WidgetProviders": "Provedores",
- "ProviderReportFooter": "Provedor desconhecido significa que o endereço de IP não pôde ser visto."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/pt.json b/plugins/Provider/lang/pt.json
deleted file mode 100644
index ffa4afb282..0000000000
--- a/plugins/Provider/lang/pt.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Fornecedor",
- "PluginDescription": "Regista os fornecedores do serviço de Internet dos visitantes.",
- "ProviderReportDocumentation": "Este relatório mostra quais os fornecedores do serviço de Internet que os seus visitantes utilizaram para aceder ao site. Pode clicar num nome de um fornecedor para obter mais detalhes. %s Se o Matomo não conseguir determinar um fornecedor para o visitante, este será listado como um IP.",
- "WidgetProviders": "Fornecedores",
- "ProviderReportFooter": "Um fornecedor desconhecido, significa que não foi possível procurar o endereço de IP."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/ro.json b/plugins/Provider/lang/ro.json
deleted file mode 100644
index 45a2a5317c..0000000000
--- a/plugins/Provider/lang/ro.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Operator",
- "ProviderReportDocumentation": "Acest raport arată care furnizorii de servicii de Internet vizitatorii dvs. au folosit pentru a accesa site-ul. Puteți face clic pe un nume de furnizor pentru mai multe detalii. %s Daca Matomo nu poate determina furnizor un vizitator, acesta este listat ca IP.",
- "WidgetProviders": "Provideri"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/ru.json b/plugins/Provider/lang/ru.json
deleted file mode 100644
index 1355e9d573..0000000000
--- a/plugins/Provider/lang/ru.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Провайдер",
- "PluginDescription": "Сообщает о поставщике интернет услуг (ISP) у посетителей.",
- "ProviderReportDocumentation": "Этот отчет показывает, какие интернет-провайдеры у посетителей вашего сайта. Вы можете кликнуть на имя провайдера, чтобы посмотреть детали. %s Если Matomo не может определить провайдера, отображается просто IP.",
- "WidgetProviders": "Провайдеры",
- "ProviderReportFooter": "Неизвестный провайдер означает, что IP-адрес не может быть найден."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/sk.json b/plugins/Provider/lang/sk.json
deleted file mode 100644
index 63f13daa69..0000000000
--- a/plugins/Provider/lang/sk.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Poskytovateľ",
- "WidgetProviders": "Poskytovatelia"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/sl.json b/plugins/Provider/lang/sl.json
deleted file mode 100644
index d7f73ed339..0000000000
--- a/plugins/Provider/lang/sl.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Ponudnik",
- "PluginDescription": "Poročilo o obiskovalčevem ponudniku dostopa do internetnih storitev.",
- "ProviderReportDocumentation": "To poročilo prikazuje ponudnike dostopa do internetnih storitve prek katerih so obiskovalci dostopali do vaše spletne strani. Za podrobnosti lahko kliknete na ime posameznega ponudnika. %s Če Matomo ne more določiti obiskovalčevega ponudnika, je le-ta naveden kot IP naslov.",
- "WidgetProviders": "Ponudniki",
- "ProviderReportFooter": "Neznan ponudnik pomeni, da IP številke ni bilo mogoče povezati s ponudnikom."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/sq.json b/plugins/Provider/lang/sq.json
deleted file mode 100644
index 65ee31b8f9..0000000000
--- a/plugins/Provider/lang/sq.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "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 Matomo 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/Provider/lang/sr.json b/plugins/Provider/lang/sr.json
deleted file mode 100644
index ea65c47c67..0000000000
--- a/plugins/Provider/lang/sr.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Provajder",
- "PluginDescription": "Prikazuje Internet provajdere posetilaca.",
- "ProviderReportDocumentation": "Ovaj izveštaj prikazuje koje Internet provajdere koriste vaši posetioci kako bi pristupili sajtu. Možete kliknuti na naziv provajdera kako biste videli više detalja. %s Ako Matomo ne može da odredi koji provajder je u pitanju, onda prikazuje IP.",
- "WidgetProviders": "Provajderi",
- "ProviderReportFooter": "Nepoznat provajder znači da nije moguće razrešiti IP adresu."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/sv.json b/plugins/Provider/lang/sv.json
deleted file mode 100644
index f34660df06..0000000000
--- a/plugins/Provider/lang/sv.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Internetleverantör",
- "PluginDescription": "Rapporterar besökarnas Internetleverantör.",
- "ProviderReportDocumentation": "Denna rapport visar vilka Internetleverantörer dina besökare använde för att få åtkomst till webbplatsen. Du kan klicka på en leverantörs namn för mer information. %s Om Matomo inte kan avgöra en besökares leverantör, så listas den som IP.",
- "WidgetProviders": "Internetleverantör",
- "ProviderReportFooter": "Okänd internetleverantör betyder att IP-adressen inte kunde slås upp."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/ta.json b/plugins/Provider/lang/ta.json
deleted file mode 100644
index 05a6f93a93..0000000000
--- a/plugins/Provider/lang/ta.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "வழங்குநர்",
- "WidgetProviders": "வழங்குவோர்"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/th.json b/plugins/Provider/lang/th.json
deleted file mode 100644
index 612f7edc3e..0000000000
--- a/plugins/Provider/lang/th.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "ผู้ให้บริการ",
- "WidgetProviders": "ผู้ให้บริการ"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/tl.json b/plugins/Provider/lang/tl.json
deleted file mode 100644
index 2d14826c81..0000000000
--- a/plugins/Provider/lang/tl.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Tagapagtustos",
- "ProviderReportDocumentation": "Ang ulat na itoy ang nagpapakita kung anong Internet Server Providers ang gamit ng iyung bisita upang ma-access ang website. Maari mong e-click ang pangalan ng provider para sa karagdagang detalye. %s kung ang Matomo ay hindi matukoy ang provider ng bisita. ito ay nakalista bilang IP.",
- "WidgetProviders": "Mga Tagapagtustos",
- "ProviderReportFooter": "Ang hindi kilalang provider ay hindi makikita ang IP address."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/tr.json b/plugins/Provider/lang/tr.json
deleted file mode 100644
index 6fe28c9392..0000000000
--- a/plugins/Provider/lang/tr.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Hizmet Sağlayıcı",
- "PluginDescription": "Bu raporda ziyaretçilerin İnternet hizmeti aldığı Hizmet Sağlayıcı bilgileri bulunur.",
- "ProviderReportDocumentation": "Bu raporda ziyaretçilerinizin web sitenize hangi İnternet Hizmeti Sağlayıcıları üzerinden eriştiğini ile ilgili bilgiler bulunur. Bir hizmet sağlayıcının adına tıklayarak ayrıntılı bilgi alabilirsiniz. %s Matomo bir ziyaretçinin hizmet sağlayıcısını belirleyemediğinde IP adresini görüntüler.",
- "WidgetProviders": "Hizmet Sağlayıcılar",
- "ProviderReportFooter": "Bilinmeyen sağlayıcılar IP adresine bakılamadığı anlamına gelir."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/uk.json b/plugins/Provider/lang/uk.json
deleted file mode 100644
index 0fc66c24aa..0000000000
--- a/plugins/Provider/lang/uk.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Провайдер",
- "PluginDescription": "Повідомляє про постачальника інтернет послуг (ISP) у відвідувачів.",
- "ProviderReportDocumentation": "Цей звіт показує, які інтернет-провайдери у відвідувачів вашого сайту. Ви можете клікнути на ім'я провайдера, щоб подивитися деталі. %s Якщо Matomo не може визначити провайдера, відображається просто IP.",
- "WidgetProviders": "Провайдери",
- "ProviderReportFooter": "Невідомий постачальник означає IP адресу, яка не може бути визначена."
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/vi.json b/plugins/Provider/lang/vi.json
deleted file mode 100644
index 5b3b360f5a..0000000000
--- a/plugins/Provider/lang/vi.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "Nhà cung cấp",
- "ProviderReportDocumentation": "Báo cáo này cho thấy Nhà cung cấp dịch vụ Internet mà khách truy cập sử dụng để truy cập website. Bạn có thể ckick trên tên nhà cung cấp để biết thêm chi tiết. %s Nếu Matomo không thể xác định được nhà cung cấp của khách truy cập, nó liệt kê danh sách IP.",
- "WidgetProviders": "Các nhà cung cấp"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/zh-cn.json b/plugins/Provider/lang/zh-cn.json
deleted file mode 100644
index 864aca4ab9..0000000000
--- a/plugins/Provider/lang/zh-cn.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "网络服务商",
- "PluginDescription": "报告访问者的Internet服务提供商。",
- "ProviderReportDocumentation": "本报表显示访客的网络服务商。点击服务商名字查看详细资料。%s 如果 Matomo 无法判断访客的网络服务商,就列出IP地址。",
- "WidgetProviders": "网络服务商",
- "ProviderReportFooter": "未知的提供程序意味着无法查找IP地址。"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/lang/zh-tw.json b/plugins/Provider/lang/zh-tw.json
deleted file mode 100644
index 7b9b0230f0..0000000000
--- a/plugins/Provider/lang/zh-tw.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "Provider": {
- "ColumnProvider": "網路供應商",
- "PluginDescription": "報告訪客的網際網路服務供應商(ISP)。",
- "ProviderReportDocumentation": "這份報表顯示你訪客常用的網路供應商。你可以點擊供應商名稱來查看詳情。%s如果 Matomo 無法判定訪客的供應商,則會以 IP 列出。",
- "WidgetProviders": "網路供應商",
- "ProviderReportFooter": "未知的供應商代表 IP 位址無法被查詢。"
- }
-} \ No newline at end of file
diff --git a/plugins/Provider/templates/_visitorDetails.twig b/plugins/Provider/templates/_visitorDetails.twig
deleted file mode 100644
index c0ab546750..0000000000
--- a/plugins/Provider/templates/_visitorDetails.twig
+++ /dev/null
@@ -1,9 +0,0 @@
-<div class="visitorProvider">
- <br />
- {{ 'Provider_ColumnProvider'|translate }}:
- {% if visitInfo.getColumn('providerUrl') %}
- <a href="{{ visitInfo.getColumn('providerUrl') }}" rel="noreferrer noopener" target="_blank" class="visitorLogTooltip" title="{{ visitInfo.getColumn('providerName') }} {{ visitInfo.getColumn('providerUrl') }}" style="text-decoration:underline;">
- {%- endif %}
- {{ visitInfo.getColumn('providerName') }}
- {%- if visitInfo.getColumn('providerUrl') %}</a>{% endif %}
-</div>
diff --git a/plugins/Proxy/tests/Unit/ProxyTest.php b/plugins/Proxy/tests/Unit/ProxyTest.php
index b6f10a74b7..6d7558ab4c 100644
--- a/plugins/Proxy/tests/Unit/ProxyTest.php
+++ b/plugins/Proxy/tests/Unit/ProxyTest.php
@@ -15,7 +15,7 @@ use Piwik\Plugins\Proxy\Controller;
* @group ProxyTest
* @group Plugins
*/
-class ProxyTest extends \PHPUnit_Framework_TestCase
+class ProxyTest extends \PHPUnit\Framework\TestCase
{
public function getAcceptableRemoteUrls()
{
diff --git a/plugins/QueuedTracking b/plugins/QueuedTracking
-Subproject db6b4372a86dd926703a584faa8ca36ea7b6faa
+Subproject b6ca21ac8bc4cb582762d44520c86a61c387199
diff --git a/plugins/Referrers/Columns/Base.php b/plugins/Referrers/Columns/Base.php
index 41e846b028..a4f63c376f 100644
--- a/plugins/Referrers/Columns/Base.php
+++ b/plugins/Referrers/Columns/Base.php
@@ -599,7 +599,7 @@ abstract class Base extends VisitDimension
private function truncateReferrerName($name)
{
- return Common::mb_substr($name, 0, 70);
+ return Common::mb_substr($name, 0, 255);
}
private function truncateReferrerKeyword($refererKeyword)
diff --git a/plugins/Referrers/Columns/ReferrerName.php b/plugins/Referrers/Columns/ReferrerName.php
index 6a6b195e90..44b5a580d5 100644
--- a/plugins/Referrers/Columns/ReferrerName.php
+++ b/plugins/Referrers/Columns/ReferrerName.php
@@ -16,7 +16,7 @@ use Piwik\Tracker\Action;
class ReferrerName extends Base
{
protected $columnName = 'referer_name';
- protected $columnType = 'VARCHAR(70) NULL';
+ protected $columnType = 'VARCHAR(255) NULL';
protected $type = self::TYPE_TEXT;
protected $nameSingular = 'Referrers_ReferrerName';
diff --git a/plugins/Referrers/Columns/ReferrerUrl.php b/plugins/Referrers/Columns/ReferrerUrl.php
index 0c4401105e..d98d4591d3 100644
--- a/plugins/Referrers/Columns/ReferrerUrl.php
+++ b/plugins/Referrers/Columns/ReferrerUrl.php
@@ -16,7 +16,7 @@ use Piwik\Tracker\Action;
class ReferrerUrl extends Base
{
protected $columnName = 'referer_url';
- protected $columnType = 'TEXT NULL';
+ protected $columnType = 'VARCHAR(4000) NULL';
protected $type = self::TYPE_TEXT;
protected $segmentName = 'referrerUrl';
protected $nameSingular = 'Live_Referrer_URL';
diff --git a/plugins/Referrers/VisitorDetails.php b/plugins/Referrers/VisitorDetails.php
index e413d5386d..b59c7b5802 100644
--- a/plugins/Referrers/VisitorDetails.php
+++ b/plugins/Referrers/VisitorDetails.php
@@ -32,6 +32,7 @@ class VisitorDetails extends VisitorDetailsAbstract
public function renderVisitorDetails($visitorDetails)
{
$view = new View('@Referrers/_visitorDetails.twig');
+ $view->sendHeadersWhenRendering = false;
$view->visitInfo = $visitorDetails;
return [[ 10, $view->render() ]];
}
diff --git a/plugins/Referrers/lang/zh-tw.json b/plugins/Referrers/lang/zh-tw.json
index ddd060b762..a496748bb6 100644
--- a/plugins/Referrers/lang/zh-tw.json
+++ b/plugins/Referrers/lang/zh-tw.json
@@ -3,18 +3,29 @@
"AllReferrersReportDocumentation": "這份報表顯示你所有的參照連結,列出所有你訪客找到你網站透過的參照連結網站、搜尋關鍵字和廣告活動。",
"Campaigns": "廣告活動",
"CampaignsDocumentation": "訪客透過廣告活動前往你的網站。%1$s查看 %2$s 報表以取得更多細節。",
+ "CampaignsReportDocumentation": "這份報表顯示哪個廣告活動引導訪客到你的網站。",
"ColumnCampaign": "廣告活動",
+ "CampaignPageUrlHelp": "這個廣告目的地網頁的 URL,例如 'http:\/\/example.org\/offer.html'。",
+ "CampaignNameHelp": "為此廣告選擇一個名字,用來分辨你的這個廣告與你的其他廣告。例如「夏日優惠 - Email」或「夏日優惠 - 付費廣告」。",
+ "CampaignKeywordHelp": "你可以利用關鍵字或子類別來分辨多個同名的廣告。",
+ "CampaignSource": "廣告活動來源",
+ "CampaignContent": "廣告活動內容",
+ "CampaignMedium": "廣告活動媒介",
"ColumnSearchEngine": "搜尋引擎",
"ColumnSocial": "社群網站",
"ColumnWebsite": "網站",
"ColumnWebsitePage": "網站網頁",
"DirectEntry": "直接流量",
"DirectEntryDocumentation": "訪客在瀏覽器上輸入網址並瀏覽你的網站-他們是直接進入網站的。",
+ "Distinct": "不同頻道的參照連結",
"DistinctCampaigns": "不同廣告活動",
"DistinctKeywords": "不同關鍵字",
"DistinctSearchEngines": "不同搜尋引擎",
+ "DistinctSocialNetworks": "不同社群網站",
"DistinctWebsites": "不同網站",
+ "DistinctWebsiteUrls": "不同的網址",
"EvolutionDocumentation": "這是領導訪客到你網站的參照連結總覽。",
+ "EvolutionDocumentationMoreInfo": "查看更多關於不同頻道類型的資訊,請見 %s 表格的說明文件。",
"Keywords": "關鍵字",
"KeywordsReportDocumentation": "這份報表顯示當使用者被導入你的網站前是使用什麼關鍵字搜尋。%s點擊表格中的資料列以查看每個搜尋引擎搜尋時所使用的關鍵字。",
"KeywordsReportDocumentationNote": "注意:這份報表中多數關鍵字未定義,因為多數搜尋引擎並不會傳送搜尋時真正使用的關鍵字。",
@@ -24,6 +35,7 @@
"ReferrerNames": "參照連結名稱",
"Referrers": "參造連結",
"ReferrersOverview": "參照連結總覽",
+ "ReferrerTypes": "頻道類型",
"ReferrerURLs": "參造連結網址",
"SearchEngines": "搜尋引擎",
"SearchEnginesDocumentation": "訪客透過搜尋引擎導向你的網站。%1$s查看 %2$s 報表以取得更多細節。",
@@ -32,20 +44,34 @@
"SocialsReportDocumentation": "這份報表顯示哪個社群網站引導訪客到你的網站。<br \/>點擊表格中的資料列以查看訪客從哪個社群網站頁面訪問你的網站。",
"SubmenuSearchEngines": "搜尋引擎和關鍵字",
"SubmenuWebsitesOnly": "網站",
+ "Type": "頻道類型",
"TypeCampaigns": "%s 個來自廣告活動",
"TypeDirectEntries": "%s 個來自直接流量",
+ "TypeReportDocumentation": "此表格包含頻道類型的分布資訊。",
"TypeSearchEngines": "%s 個來自搜尋引擎",
+ "TypeSocialNetworks": "%s 個來自社群網站",
"TypeWebsites": "%s 個來自網站",
"UsingNDistinctUrls": "(使用 %s 個不同網址)",
+ "GenerateUrl": "產生 URL",
+ "URLCampaignBuilder": "廣告活動 URL 建立精靈",
+ "URLCampaignBuilderIntro": "這個 %1$s URL 建立精靈 %2$s 可以讓你產生 Matomo 追蹤廣告用的 URL。請參考說明文件 %3$s 的廣告活動追蹤 %4$s 以了解更多。",
+ "URLCampaignBuilderResult": "產生可以讓你貼在廣告、信件、新聞稿、或 Facebook 廣告的 URL。",
"ViewAllReferrers": "查看所有參照連結",
"ViewReferrersBy": "查看來自 %s 的參照連結",
"Websites": "網站",
"WebsitesDocumentation": "訪客透過其他網站的連結導向你的網站。%1$s查看 %2$s 報表以取得更多細節。",
"WebsitesReportDocumentation": "在這個表格中你可以看到哪個網站引導訪客到你的網站。%s點擊表格中的資料列以查看哪個網站網址中的連結引導訪客到你的網站。",
"WidgetExternalWebsites": "參造連結網站",
+ "WidgetGetAll": "所有頻道",
"WidgetSocials": "社群網站清單",
"WidgetTopKeywordsForPages": "網頁網址的熱門關鍵字",
"XPercentOfVisits": "佔整體訪問 %s",
- "Acquisition": "收穫"
+ "Acquisition": "收穫",
+ "VisitorsFromSearchEngines": "來自搜尋引擎的訪客",
+ "PercentOfX": "%s 百分比",
+ "VisitorsFromSocialNetworks": "來自社群網站的訪客",
+ "VisitorsFromDirectEntry": "來自直接流量的訪客",
+ "VisitorsFromWebsites": "來自網站的訪客",
+ "VisitorsFromCampaigns": "來自廣告活動的訪客"
}
} \ No newline at end of file
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
index 3977d25b9e..64fc503aff 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerKeywordTest.php
@@ -32,7 +32,7 @@ class ReferrerKeywordTest extends IntegrationTestCase
private $idSite2 = 2;
private $idSite3 = 3;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
index 2abd7b02c0..ca39ec2632 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerNameTest.php
@@ -27,7 +27,7 @@ use Piwik\Tracker\Visitor;
class ReferrerNameTest extends IntegrationTestCase
{
/**
- * @var ReferrerType
+ * @var ReferrerName
*/
private $referrerName;
private $idSite1 = 1;
@@ -35,7 +35,7 @@ class ReferrerNameTest extends IntegrationTestCase
private $idSite3 = 3;
private $idSite4 = 4;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -52,7 +52,7 @@ class ReferrerNameTest extends IntegrationTestCase
$this->referrerName = new ReferrerName();
}
- public function tearDown()
+ public function tearDown(): void
{
// clean up your test here if needed
Cache::clearCacheGeneral();
@@ -76,6 +76,8 @@ class ReferrerNameTest extends IntegrationTestCase
$url = 'http://piwik.org/foo/bar';
$referrer = 'http://piwik.org';
+ $longString = str_repeat('very_long_', 25);
+
$directEntryReferrerName = null;
return array(
@@ -106,6 +108,7 @@ class ReferrerNameTest extends IntegrationTestCase
array('test', $this->idSite1, $url . '?pk_campaign=test', $referrer),
array('testfoobar', $this->idSite2, $url . '?pk_campaign=testfoobar', $referrer),
array('test', $this->idSite3, $url . '?pk_campaign=test', $referrer),
+ array($longString, $this->idSite3, $url . '?pk_campaign='.$longString, $referrer),
array('Google', $this->idSite3, $url, 'http://google.com/search?q=piwik'),
diff --git a/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
index 6b75f8d027..b101ddc89c 100644
--- a/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
+++ b/plugins/Referrers/tests/Integration/Columns/ReferrerTypeTest.php
@@ -35,7 +35,7 @@ class ReferrerTypeTest extends IntegrationTestCase
private $idSite4 = 4;
private $idSite5 = 5;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -53,7 +53,7 @@ class ReferrerTypeTest extends IntegrationTestCase
$this->referrerType = new ReferrerType();
}
- public function tearDown()
+ public function tearDown(): void
{
// clean up your test here if needed
Cache::clearCacheGeneral();
diff --git a/plugins/Referrers/tests/System/ApiTest.php b/plugins/Referrers/tests/System/ApiTest.php
index a6537c4e35..ffcd06a46a 100644
--- a/plugins/Referrers/tests/System/ApiTest.php
+++ b/plugins/Referrers/tests/System/ApiTest.php
@@ -181,6 +181,10 @@ class ApiTest extends SystemTestCase
$this->assertEquals(1, $visits->getFirstRow()->getColumn('nb_visits'));
$this->assertEquals(2, $visits->getFirstRow()->getColumn('nb_actions'));
+
+ /** @var DataTable $referrers */
+ $referrers = Request::processRequest('Referrers.getCampaigns', array('idSite' => 1, 'period' => 'day', 'date' => $dateTime));
+ $this->assertEquals(substr($longReferrer, 0, 255), $referrers->getFirstRow()->getColumn('label'));
}
public function test_forceNewVisit_shouldNotForceNewVisitWhenReferrerNameIsLongerThanDbColumnLength()
diff --git a/plugins/Referrers/tests/Unit/DataTable/Filter/UrlsFromWebsiteIdTest.php b/plugins/Referrers/tests/Unit/DataTable/Filter/UrlsFromWebsiteIdTest.php
index 47590690e2..5eec014e28 100644
--- a/plugins/Referrers/tests/Unit/DataTable/Filter/UrlsFromWebsiteIdTest.php
+++ b/plugins/Referrers/tests/Unit/DataTable/Filter/UrlsFromWebsiteIdTest.php
@@ -13,7 +13,7 @@ use Piwik\Plugins\Referrers\DataTable\Filter\UrlsFromWebsiteId;
require_once PIWIK_INCLUDE_PATH . '/plugins/Referrers/functions.php';
-class UrlsFromWebsiteIdTest extends \PHPUnit_Framework_TestCase
+class UrlsFromWebsiteIdTest extends \PHPUnit\Framework\TestCase
{
public function test_filter_ignoresDomainsPortssAndPortsInRecord()
{
diff --git a/plugins/Referrers/tests/Unit/GroupDifferentSocialWritingsTest.php b/plugins/Referrers/tests/Unit/GroupDifferentSocialWritingsTest.php
index 24a62c144c..eafcd9c4ba 100644
--- a/plugins/Referrers/tests/Unit/GroupDifferentSocialWritingsTest.php
+++ b/plugins/Referrers/tests/Unit/GroupDifferentSocialWritingsTest.php
@@ -18,7 +18,7 @@ use Piwik\Plugins\Referrers\DataTable\Filter\GroupDifferentSocialWritings;
* @group Core
* @group sort
*/
-class GroupDifferentSocialWritingsTest extends \PHPUnit_Framework_TestCase
+class GroupDifferentSocialWritingsTest extends \PHPUnit\Framework\TestCase
{
public function testRowsAreGrouped()
diff --git a/plugins/Referrers/tests/Unit/ReferrersTest.php b/plugins/Referrers/tests/Unit/ReferrersTest.php
index 2790c6fb0f..9a6ae6ae8d 100644
--- a/plugins/Referrers/tests/Unit/ReferrersTest.php
+++ b/plugins/Referrers/tests/Unit/ReferrersTest.php
@@ -17,7 +17,7 @@ require_once PIWIK_INCLUDE_PATH . '/plugins/Referrers/Referrers.php';
/**
* @group Plugin
*/
-class ReferrersTest extends \PHPUnit_Framework_TestCase
+class ReferrersTest extends \PHPUnit\Framework\TestCase
{
public function removeUrlProtocolTestData()
{
diff --git a/plugins/Referrers/tests/Unit/SearchEngineTest.php b/plugins/Referrers/tests/Unit/SearchEngineTest.php
index 0bf4e7e550..d0ef508842 100644
--- a/plugins/Referrers/tests/Unit/SearchEngineTest.php
+++ b/plugins/Referrers/tests/Unit/SearchEngineTest.php
@@ -14,9 +14,9 @@ use Spyc;
/**
* @group SearchEngine
*/
-class SearchEngineTest extends \PHPUnit_Framework_TestCase
+class SearchEngineTest extends \PHPUnit\Framework\TestCase
{
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
// inject definitions to avoid database usage
$yml = file_get_contents(PIWIK_PATH_TEST_TO_ROOT . SearchEngine::DEFINITION_FILE);
@@ -143,6 +143,8 @@ class SearchEngineTest extends \PHPUnit_Framework_TestCase
$this->assertTrue(in_array($name['host'] . '.png', $favicons), $name['host']);
}
+
+ $this->assertTrue(true); // ensure there is an assertion, to prevent warning
}
/**
diff --git a/plugins/Referrers/tests/Unit/SocialTest.php b/plugins/Referrers/tests/Unit/SocialTest.php
index f371a33a12..0c86b24b0f 100644
--- a/plugins/Referrers/tests/Unit/SocialTest.php
+++ b/plugins/Referrers/tests/Unit/SocialTest.php
@@ -15,9 +15,9 @@ use Spyc;
* @group Social
* @group Plugins
*/
-class SocialTest extends \PHPUnit_Framework_TestCase
+class SocialTest extends \PHPUnit\Framework\TestCase
{
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
// inject definitions to avoid database usage
$yml = file_get_contents(PIWIK_PATH_TEST_TO_ROOT . Social::DEFINITION_FILE);
@@ -92,6 +92,6 @@ class SocialTest extends \PHPUnit_Framework_TestCase
*/
public function testGetLogoFromUrl($url, $expected)
{
- $this->assertContains($expected, Social::getInstance()->getLogoFromUrl($url));
+ self::assertStringContainsString($expected, Social::getInstance()->getLogoFromUrl($url));
}
} \ No newline at end of file
diff --git a/plugins/Resolution/Archiver.php b/plugins/Resolution/Archiver.php
index d427a05f58..0866d707df 100644
--- a/plugins/Resolution/Archiver.php
+++ b/plugins/Resolution/Archiver.php
@@ -69,7 +69,7 @@ class Archiver extends \Piwik\Plugin\Archiver
protected function insertTable($recordName, DataTable $table)
{
$report = $table->getSerialized($this->maximumRows, null, Metrics::INDEX_NB_VISITS);
- return $this->getProcessor()->insertBlobRecord($recordName, $report);
+ $this->getProcessor()->insertBlobRecord($recordName, $report);
}
}
diff --git a/plugins/RssWidget/RssRenderer.php b/plugins/RssWidget/RssRenderer.php
index ed3dcd13c7..884f51ccd2 100644
--- a/plugins/RssWidget/RssRenderer.php
+++ b/plugins/RssWidget/RssRenderer.php
@@ -8,7 +8,9 @@
*/
namespace Piwik\Plugins\RssWidget;
+
use Piwik\Cache;
+use Matomo\Cache\Lazy;
use Piwik\Http;
/**
@@ -21,7 +23,7 @@ class RssRenderer
protected $showDescription = false;
protected $showContent = false;
/**
- * @var Cache\Lazy
+ * @var Lazy
*/
private $cache;
diff --git a/plugins/SEO/Metric/ProviderCache.php b/plugins/SEO/Metric/ProviderCache.php
index 6066f6d677..d8f6d44ff9 100644
--- a/plugins/SEO/Metric/ProviderCache.php
+++ b/plugins/SEO/Metric/ProviderCache.php
@@ -9,6 +9,7 @@
namespace Piwik\Plugins\SEO\Metric;
use Piwik\Cache;
+use Matomo\Cache\Lazy;
/**
* Caches another provider.
@@ -21,7 +22,7 @@ class ProviderCache implements MetricsProvider
private $provider;
/**
- * @var Cache\Lazy
+ * @var Lazy
*/
private $cache;
diff --git a/plugins/SEO/tests/Integration/SEOTest.php b/plugins/SEO/tests/Integration/SEOTest.php
index 374923f698..17914d1edf 100644
--- a/plugins/SEO/tests/Integration/SEOTest.php
+++ b/plugins/SEO/tests/Integration/SEOTest.php
@@ -21,7 +21,7 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class SEOTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/ScheduledReports/API.php b/plugins/ScheduledReports/API.php
index 3143bcd294..4288a28f49 100644
--- a/plugins/ScheduledReports/API.php
+++ b/plugins/ScheduledReports/API.php
@@ -30,7 +30,6 @@ use Piwik\Plugins\SitesManager\API as SitesManagerApi;
use Piwik\ReportRenderer;
use Piwik\Scheduler\Schedule\Schedule;
use Piwik\Site;
-use Piwik\Translate;
use Piwik\Translation\Translator;
use Psr\Log\LoggerInterface;
@@ -323,13 +322,14 @@ class API extends \Piwik\Plugin\API
$outputType = self::OUTPUT_DOWNLOAD;
}
+ /** @var Translator $translator */
+ $translator = StaticContainer::get('Piwik\Translation\Translator');
+
// load specified language
if (empty($language)) {
- $language = Translate::getLanguageDefault();
+ $language = $translator->getDefaultLanguage();
}
- /** @var Translator $translator */
- $translator = StaticContainer::get('Piwik\Translation\Translator');
$translator->setCurrentLanguage($language);
$reports = $this->getReports($idSite = false, $_period = false, $idReport);
@@ -503,7 +503,7 @@ class API extends \Piwik\Plugin\API
* handle their new report formats.
*
* @param ReportRenderer &$reportRenderer This variable should be set to an instance that
- * extends {@link Piwik\ReportRenderer} by one of the event
+ * extends {@link \Piwik\ReportRenderer} by one of the event
* subscribers.
* @param string $reportType A string ID describing how the report is sent, eg,
* `'sms'` or `'email'`.
diff --git a/plugins/ScheduledReports/tests/Fixtures/ReportSubscription.php b/plugins/ScheduledReports/tests/Fixtures/ReportSubscription.php
index 81210754eb..d3fe73082c 100644
--- a/plugins/ScheduledReports/tests/Fixtures/ReportSubscription.php
+++ b/plugins/ScheduledReports/tests/Fixtures/ReportSubscription.php
@@ -18,7 +18,7 @@ class ReportSubscription extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
if (!Fixture::siteCreated(1)) {
Fixture::createWebsite('2012-01-01 00:00:00');
diff --git a/plugins/ScheduledReports/tests/Integration/ApiTest.php b/plugins/ScheduledReports/tests/Integration/ApiTest.php
index 5d2a5f0832..893d3172f8 100644
--- a/plugins/ScheduledReports/tests/Integration/ApiTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ApiTest.php
@@ -42,7 +42,7 @@ class ApiTest extends IntegrationTestCase
{
private $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -485,17 +485,16 @@ class ApiTest extends IntegrationTestCase
$language = false, $outputType = APIScheduledReports::OUTPUT_RETURN);
ob_end_clean();
- $this->assertContains('id="VisitsSummary_get"', $result);
- $this->assertContains('id="Referrers_getWebsites"', $result);
- $this->assertNotContains('id="UserCountry_getCountry"', $result);
+ self::assertStringContainsString('id="VisitsSummary_get"', $result);
+ self::assertStringContainsString('id="Referrers_getWebsites"', $result);
+ self::assertStringNotContainsString('id="UserCountry_getCountry"', $result);
}
- /**
- * @expectedException \Piwik\Http\BadRequestException
- * @expectedExceptionMessage This API method does not support multiple periods.
- */
public function test_generateReport_throwsIfMultiplePeriodsRequested()
{
+ $this->expectException(\Piwik\Http\BadRequestException::class);
+ $this->expectExceptionMessage('This API method does not support multiple periods.');
+
$idReport = APIScheduledReports::getInstance()->addReport(
1,
'',
@@ -515,12 +514,11 @@ class ApiTest extends IntegrationTestCase
$language = false, $outputType = APIScheduledReports::OUTPUT_RETURN);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Invalid evolutionPeriodFor value
- */
public function test_addReport_validatesEvolutionPeriodForParam()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Invalid evolutionPeriodFor value');
+
self::setSuperUser();
APIScheduledReports::getInstance()->addReport(
@@ -541,12 +539,11 @@ class ApiTest extends IntegrationTestCase
);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Evolution period amount must be a positive number
- */
public function test_addReport_validatesEvolutionPeriodNParam()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Evolution period amount must be a positive number');
+
self::setSuperUser();
APIScheduledReports::getInstance()->addReport(
@@ -568,12 +565,11 @@ class ApiTest extends IntegrationTestCase
);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The evolutionPeriodN param has no effect when evolutionPeriodFor is "each".
- */
public function test_addReport_throwsIfEvolutionPeriodNParamIsEach_AndLastNSupplied()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The evolutionPeriodN param has no effect when evolutionPeriodFor is "each".');
+
self::setSuperUser();
APIScheduledReports::getInstance()->addReport(
@@ -595,12 +591,11 @@ class ApiTest extends IntegrationTestCase
);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Invalid evolutionPeriodFor value
- */
public function test_updateReport_validatesEvolutionPeriodForParam()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Invalid evolutionPeriodFor value');
+
self::setSuperUser();
$idReport = APIScheduledReports::getInstance()->addReport(
@@ -635,12 +630,11 @@ class ApiTest extends IntegrationTestCase
);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Evolution period amount must be a positive number
- */
public function test_updateReport_validatesEvolutionPeriodNParam()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Evolution period amount must be a positive number');
+
self::setSuperUser();
$idReport = APIScheduledReports::getInstance()->addReport(
@@ -676,12 +670,11 @@ class ApiTest extends IntegrationTestCase
);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The evolutionPeriodN param has no effect when evolutionPeriodFor is "each".
- */
public function test_updateReport_throwsIfEvolutionPeriodNParamIsEach_AndLastNSupplied()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The evolutionPeriodN param has no effect when evolutionPeriodFor is "each".');
+
self::setSuperUser();
$idReport = APIScheduledReports::getInstance()->addReport(
diff --git a/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php b/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php
index 5e7d5225cc..97e448f580 100644
--- a/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php
@@ -24,7 +24,7 @@ class AttachedFileReportEmailGeneratorTest extends IntegrationTestCase
*/
private $testInstance;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -54,8 +54,8 @@ class AttachedFileReportEmailGeneratorTest extends IntegrationTestCase
$this->assertStringStartsWith('<html', $mail->getBodyHtml()->getContent());
$this->assertEquals('General_Report report - pretty date', $mail->getSubject());
- $this->assertContains('ScheduledReports_PleaseFindAttachedFile', $mailContent);
- $this->assertContains('ScheduledReports_SentFromX', $mailContent);
+ self::assertStringContainsString('ScheduledReports_PleaseFindAttachedFile', $mailContent);
+ self::assertStringContainsString('ScheduledReports_SentFromX', $mailContent);
$this->assertEquals('Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
@@ -100,7 +100,7 @@ Content-Disposition: inline; filename="General_Report report - pretty date.thing
$mailContent = $this->getMailContent($mail);
$this->assertStringStartsWith('<html', $mailContent);
- $this->assertContains('ScheduledReports_PleaseFindAttachedFile', $mailContent);
+ self::assertStringContainsString('ScheduledReports_PleaseFindAttachedFile', $mailContent);
$this->assertEquals('Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
@@ -130,9 +130,9 @@ Content-Disposition: inline
$mailContent = $this->getMailContent($mail);
$this->assertStringStartsWith('<html', $mailContent);
- $this->assertContains("ScheduledReports_PleaseFindAttachedFile", $mailContent);
- $this->assertContains('ScheduledReports_SentFromX=', $mailContent);
- $this->assertContains('ScheduledReports_CustomVisitorSegment', $mailContent);
+ self::assertStringContainsString("ScheduledReports_PleaseFindAttachedFile", $mailContent);
+ self::assertStringContainsString('ScheduledReports_SentFromX=', $mailContent);
+ self::assertStringContainsString('ScheduledReports_CustomVisitorSegment', $mailContent);
$this->assertEquals('Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
diff --git a/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php b/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php
index 357306d6d3..15a56e0e0e 100644
--- a/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php
@@ -21,7 +21,7 @@ class HtmlReportEmailGeneratorTest extends IntegrationTestCase
*/
private $testInstance;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->testInstance = new HtmlReportEmailGenerator();
diff --git a/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php b/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php
index d2c3be30d1..510ad74931 100644
--- a/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php
@@ -36,7 +36,7 @@ class ReportEmailGeneratorTest extends IntegrationTestCase
*/
private $testInstance;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/ScheduledReports/tests/Integration/ScheduledReportsTest.php b/plugins/ScheduledReports/tests/Integration/ScheduledReportsTest.php
index ac194e5e36..97217e3f4d 100644
--- a/plugins/ScheduledReports/tests/Integration/ScheduledReportsTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ScheduledReportsTest.php
@@ -29,7 +29,7 @@ class ScheduledReportsTest extends IntegrationTestCase
private $reports;
private $reportIds = array();
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -130,7 +130,7 @@ class ScheduledReportsTest extends IntegrationTestCase
$this->getReport($login, $idSite);
$this->fail("Report for $login, $idSite should not exist but does");
} catch (\Exception $e) {
- $this->assertContains("Requested report couldn't be found", $e->getMessage());
+ self::assertStringContainsString("Requested report couldn't be found", $e->getMessage());
}
}
diff --git a/plugins/SecurityInfo b/plugins/SecurityInfo
-Subproject 2100c4e8cca278cf5fce7dc7d53c7a2a4ee6c7b
+Subproject e115d3cbcd60fab5b33ad8ec8f5af85df6962c4
diff --git a/plugins/SegmentEditor/SegmentEditor.php b/plugins/SegmentEditor/SegmentEditor.php
index b60861427b..aac0e481f8 100644
--- a/plugins/SegmentEditor/SegmentEditor.php
+++ b/plugins/SegmentEditor/SegmentEditor.php
@@ -36,7 +36,7 @@ class SegmentEditor extends \Piwik\Plugin
const NO_DATA_UNPROCESSED_SEGMENT_ID = 'nodata_segment_not_processed';
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/SegmentEditor/Services/StoredSegmentService.php b/plugins/SegmentEditor/Services/StoredSegmentService.php
index a5cee090dd..96a9dcd8ac 100644
--- a/plugins/SegmentEditor/Services/StoredSegmentService.php
+++ b/plugins/SegmentEditor/Services/StoredSegmentService.php
@@ -9,7 +9,7 @@
namespace Piwik\Plugins\SegmentEditor\Services;
use Piwik\Plugins\SegmentEditor\Model;
-use Piwik\Cache\Transient as TransientCache;
+use Matomo\Cache\Transient as TransientCache;
/**
diff --git a/plugins/SegmentEditor/angularjs/segment-generator/segmentgenerator.controller.js b/plugins/SegmentEditor/angularjs/segment-generator/segmentgenerator.controller.js
index 967cd12a52..033fe45124 100644
--- a/plugins/SegmentEditor/angularjs/segment-generator/segmentgenerator.controller.js
+++ b/plugins/SegmentEditor/angularjs/segment-generator/segmentgenerator.controller.js
@@ -149,7 +149,13 @@
orCondition.isLoading = true;
this.updateSegmentDefinition();
-
+
+ var inputElement = $('.orCondId' + orCondition.id + " .metricValueBlock input");
+ inputElement.autocomplete({
+ source: [],
+ minLength: 0
+ });
+
var resolved = false;
var promise = piwikApi.fetch({
diff --git a/plugins/SegmentEditor/templates/_segmentSelector.twig b/plugins/SegmentEditor/templates/_segmentSelector.twig
index f4cbfc8370..9e458c6940 100644
--- a/plugins/SegmentEditor/templates/_segmentSelector.twig
+++ b/plugins/SegmentEditor/templates/_segmentSelector.twig
@@ -43,8 +43,8 @@
{{ 'SegmentEditor_ThisSegmentIsVisibleTo'|translate }} <span class="enable_all_users"><strong>
<select class="enable_all_users_select">
- <option selected="1" value="0">{{ 'SegmentEditor_VisibleToMe'|translate }}</option>
- <option value="1">{{ 'SegmentEditor_VisibleToAllUsers'|translate }}</option>
+ <option value="0">{{ 'SegmentEditor_VisibleToMe'|translate }}</option>
+ <option selected="1" value="1">{{ 'SegmentEditor_VisibleToAllUsers'|translate }}</option>
</select>
</strong></span>
diff --git a/plugins/SegmentEditor/tests/Integration/ApiTest.php b/plugins/SegmentEditor/tests/Integration/ApiTest.php
index a7d8d82a59..4961866f03 100644
--- a/plugins/SegmentEditor/tests/Integration/ApiTest.php
+++ b/plugins/SegmentEditor/tests/Integration/ApiTest.php
@@ -25,7 +25,7 @@ class ApiTest extends IntegrationTestCase
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/SegmentEditor/tests/Integration/ModelTest.php b/plugins/SegmentEditor/tests/Integration/ModelTest.php
index f309221c8f..a3b52beac1 100644
--- a/plugins/SegmentEditor/tests/Integration/ModelTest.php
+++ b/plugins/SegmentEditor/tests/Integration/ModelTest.php
@@ -27,7 +27,7 @@ class ModelTest extends IntegrationTestCase
private $idSegment4;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->model = new Model();
@@ -53,7 +53,7 @@ class ModelTest extends IntegrationTestCase
));
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
// Force a hard delete of segment
diff --git a/plugins/SegmentEditor/tests/Integration/SegmentEditorTest.php b/plugins/SegmentEditor/tests/Integration/SegmentEditorTest.php
index 2054e07610..95ce4a6288 100644
--- a/plugins/SegmentEditor/tests/Integration/SegmentEditorTest.php
+++ b/plugins/SegmentEditor/tests/Integration/SegmentEditorTest.php
@@ -24,7 +24,7 @@ use Exception;
*/
class SegmentEditorTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php b/plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php
index 9d314fd930..a7db9f6666 100644
--- a/plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php
+++ b/plugins/SegmentEditor/tests/Integration/SegmentFormatterTest.php
@@ -12,8 +12,6 @@ use Piwik\Plugins\SegmentEditor\SegmentFormatter;
use Piwik\Plugins\SegmentEditor\SegmentList;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
-use Exception;
/**
* @group SegmentFormatterTest
@@ -30,19 +28,19 @@ class SegmentFormatterTest extends IntegrationTestCase
private $idSite;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->idSite = Fixture::createWebsite('2012-01-01 00:00:00');
$this->formatter = new SegmentFormatter(new SegmentList());
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::reset();
+ Fixture::resetTranslations();
}
public function test_getHumanReadable_noSegmentGiven_ShouldReturnDefaultSegment()
@@ -93,21 +91,19 @@ class SegmentFormatterTest extends IntegrationTestCase
$this->assertSame('Page URL contains "piwik" or Visit ID is not "1"', $readable);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The segment 'noTexisTinG' does not exist
- */
public function test_getHumanReadable_ShouldThrowAnException_IfTheGivenSegmentNameDoesNotExist()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The segment \'noTexisTinG\' does not exist');
+
$this->formatter->getHumanReadable($segment = 'noTexisTinG==1.0', $this->idSite);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The segment condition 'pageUrl=!1.0' is not valid.
- */
public function test_getHumanReadable_ShouldThrowAnException_IfSegmentCannotBeParsedBecauseOfInvalidFormat()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The segment condition \'pageUrl=!1.0\' is not valid.');
+
$invalidOperator = '=!';
$this->formatter->getHumanReadable($segment = 'pageUrl' . $invalidOperator . '1.0', $this->idSite);
}
diff --git a/plugins/SegmentEditor/tests/Integration/SegmentListTest.php b/plugins/SegmentEditor/tests/Integration/SegmentListTest.php
index 575e146e97..3a66a4bd4e 100644
--- a/plugins/SegmentEditor/tests/Integration/SegmentListTest.php
+++ b/plugins/SegmentEditor/tests/Integration/SegmentListTest.php
@@ -29,7 +29,7 @@ class SegmentListTest extends IntegrationTestCase
private $idSite;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -42,7 +42,7 @@ class SegmentListTest extends IntegrationTestCase
$segmentName = 'pageUrl';
$segment = $this->list->findSegment($segmentName, $this->idSite);
- $this->assertInternalType('array', $segment);
+ self::assertIsArray($segment);
$this->assertSame($segmentName, $segment['segment']);
}
@@ -52,12 +52,11 @@ class SegmentListTest extends IntegrationTestCase
$this->assertNull($segment);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasViewAccess
- */
public function test_findSegment_ShouldThrowException_IfNotEnoughPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasViewAccess');
+
FakeAccess::clearAccess($superUser = false, array(1));
$segment = $this->list->findSegment('pageUrl', 999);
diff --git a/plugins/SegmentEditor/tests/Integration/SegmentQueryDecoratorTest.php b/plugins/SegmentEditor/tests/Integration/SegmentQueryDecoratorTest.php
index b3ccb92b7f..095f13b4ea 100644
--- a/plugins/SegmentEditor/tests/Integration/SegmentQueryDecoratorTest.php
+++ b/plugins/SegmentEditor/tests/Integration/SegmentQueryDecoratorTest.php
@@ -25,7 +25,7 @@ class SegmentQueryDecoratorTest extends IntegrationTestCase
*/
private $segmentQueryDecorator;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/SegmentEditor/tests/System/UnprocessedSegmentsTest.php b/plugins/SegmentEditor/tests/System/UnprocessedSegmentsTest.php
index 0d4d9d9971..c54f4d4bed 100644
--- a/plugins/SegmentEditor/tests/System/UnprocessedSegmentsTest.php
+++ b/plugins/SegmentEditor/tests/System/UnprocessedSegmentsTest.php
@@ -37,7 +37,7 @@ class UnprocessedSegmentsTest extends IntegrationTestCase
Rules::setBrowserTriggerArchiving(false);
$segments = Rules::getSegmentsToProcess([self::$fixture->idSite]);
- $this->assertNotContains(self::TEST_SEGMENT, $segments);
+ self::assertTrue(!in_array(self::TEST_SEGMENT, $segments));
$this->runAnyApiTest('VisitsSummary.get', 'customSegmentUnprocessed', [
'idSite' => self::$fixture->idSite,
@@ -57,7 +57,7 @@ class UnprocessedSegmentsTest extends IntegrationTestCase
Rules::setBrowserTriggerArchiving(false);
$segments = Rules::getSegmentsToProcess([self::$fixture->idSite]);
- $this->assertNotContains(self::TEST_SEGMENT, $segments);
+ self::assertTrue(!in_array(self::TEST_SEGMENT, $segments));
$this->runAnyApiTest('VisitsSummary.get', 'realTimeSegmentUnprocessed', [
'idSite' => self::$fixture->idSite,
@@ -77,7 +77,7 @@ class UnprocessedSegmentsTest extends IntegrationTestCase
Rules::setBrowserTriggerArchiving(false);
$segments = Rules::getSegmentsToProcess([self::$fixture->idSite]);
- $this->assertContains(self::TEST_SEGMENT, $segments);
+ self::assertTrue(in_array(self::TEST_SEGMENT, $segments));
$this->runAnyApiTest('VisitsSummary.get', 'autoArchiveSegmentUnprocessed', [
'idSite' => self::$fixture->idSite,
@@ -97,7 +97,7 @@ class UnprocessedSegmentsTest extends IntegrationTestCase
Rules::setBrowserTriggerArchiving(false);
$segments = Rules::getSegmentsToProcess([self::$fixture->idSite]);
- $this->assertContains(self::TEST_SEGMENT, $segments);
+ self::assertTrue(in_array(self::TEST_SEGMENT, $segments));
$this->runAnyApiTest('VisitsSummary.get', 'autoArchiveSegmentUnprocessedEncoded', [
'idSite' => self::$fixture->idSite,
@@ -120,7 +120,7 @@ class UnprocessedSegmentsTest extends IntegrationTestCase
Rules::setBrowserTriggerArchiving(false);
$segments = Rules::getSegmentsToProcess([self::$fixture->idSite]);
- $this->assertContains(self::TEST_SEGMENT, $segments);
+ self::assertTrue(in_array(self::TEST_SEGMENT, $segments));
$this->runAnyApiTest('VisitsSummary.get', 'autoArchiveSegmentPreprocessed', [
'idSite' => self::$fixture->idSite,
@@ -138,7 +138,7 @@ class UnprocessedSegmentsTest extends IntegrationTestCase
Rules::setBrowserTriggerArchiving(false);
$segments = Rules::getSegmentsToProcess([self::$fixture->idSite]);
- $this->assertNotContains(self::TEST_SEGMENT, $segments);
+ self::assertTrue(!in_array(self::TEST_SEGMENT, $segments));
$this->runAnyApiTest('VisitsSummary.get', 'customSegmentPreprocessed', [
'idSite' => self::$fixture->idSite,
@@ -163,7 +163,7 @@ class UnprocessedSegmentsTest extends IntegrationTestCase
Rules::setBrowserTriggerArchiving(false);
$segments = Rules::getSegmentsToProcess([self::$fixture->idSite]);
- $this->assertContains(self::TEST_SEGMENT, $segments);
+ self::assertTrue(in_array(self::TEST_SEGMENT, $segments));
$this->runAnyApiTest('VisitsSummary.get', 'autoArchiveSegmentNoDataPreprocessed', [
'idSite' => self::$fixture->idSite,
@@ -185,7 +185,7 @@ class UnprocessedSegmentsTest extends IntegrationTestCase
Rules::setBrowserTriggerArchiving(false);
$segments = Rules::getSegmentsToProcess([self::$fixture->idSite]);
- $this->assertContains(self::TEST_SEGMENT, $segments);
+ self::assertTrue(in_array(self::TEST_SEGMENT, $segments));
$this->runAnyApiTest('VisitsSummary.get', 'noLogDataSegmentUnprocessed', [
'idSite' => self::$fixture->idSite,
@@ -205,7 +205,7 @@ class UnprocessedSegmentsTest extends IntegrationTestCase
Rules::setBrowserTriggerArchiving(false);
$segments = Rules::getSegmentsToProcess([self::$fixture->idSite]);
- $this->assertContains(self::TEST_SEGMENT, $segments);
+ self::assertTrue(in_array(self::TEST_SEGMENT, $segments));
$this->runAnyApiTest('VisitsSummary.get', 'noLogDataSegmentUnprocessedMultiSite', [
'idSite' => 'all',
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_6_segment_editor_different.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_6_segment_editor_different.png
index 4e1cbcbad6..e89841d583 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_6_segment_editor_different.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_6_segment_editor_different.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6fb36ff60f6216bb1ff5348a165745177d13a8acd30aa01888c0ea4936c3a9a2
-size 33241
+oid sha256:218ad8292d780a2720503cee99102738dc804f723e7ccc0df81fa66e13fe4ae0
+size 33921
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_8_segment_editor_create.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_8_segment_editor_create.png
index 4e1cbcbad6..e89841d583 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_8_segment_editor_create.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_8_segment_editor_create.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6fb36ff60f6216bb1ff5348a165745177d13a8acd30aa01888c0ea4936c3a9a2
-size 33241
+oid sha256:218ad8292d780a2720503cee99102738dc804f723e7ccc0df81fa66e13fe4ae0
+size 33921
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_and_condition.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_and_condition.png
index b24d196fd9..b9222904df 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_and_condition.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_and_condition.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b6d63878bfdbf02615fde5930ea02a44d12978f0711e41361443ce34f85785d5
-size 47570
+oid sha256:5589d3389bec332693adede0b6d513887884ec138d636691bd8a8d7b3982f9f5
+size 48149
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_or_condition.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_or_condition.png
index 2c78bc8173..e6abae4bec 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_or_condition.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_add_new_or_condition.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4522dde4fad233d07c391982250ad38532f2ca10b5460eb7d0039e893ca2778d
-size 37673
+oid sha256:70f5dabecb6a7139fccad8e442e668319c076623d34b5957f33d68a0c1f6eaa7
+size 38301
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_dimension_drag_drop.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_dimension_drag_drop.png
index 0e3ef4149d..2e674f405f 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_dimension_drag_drop.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_dimension_drag_drop.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:44d4fe35ba01f0ef0cfe4c6bcc9332094456a95b30843f355d56168826deb296
-size 32597
+oid sha256:e2b3ea7be028e0b1e4d25668f9bca2d8be883633d936351834166bbb1e85a1a0
+size 33184
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_and_condition.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_and_condition.png
index 742fa48473..28ee641bd0 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_and_condition.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_and_condition.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b48eba25362a33ce7e82a4a7d281af7031ecd1da75e488ff8481baca35cd8a50
-size 47214
+oid sha256:4aea2266712c6172d7b19cf10cc7fc85075801e1113b11da495b10ce17b719fd
+size 47807
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_or_condition.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_or_condition.png
index ef1c7ad74d..6e236b1e5c 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_or_condition.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_drag_or_condition.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2a65726760eade02172d79d8407af3c835ba1fe8f75faa9447a988fbe5d1520e
-size 37317
+oid sha256:946c1cd4e7b39fb0248817c2274303dd635b3dbdaf0b02f49e82b2c2f043a326
+size 37940
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_saved_details.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_saved_details.png
index 0b9015de7d..6523ab25d8 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_saved_details.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_saved_details.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a9e7045c2d59298c501a2a6a77b1ffabffa3a3b8369dcd499ad5ad47406b4cc4
-size 49119
+oid sha256:bc5773fae0274fe1e89799a5bbbc0240c40fe88892d3f1a19e17b11f5c944384
+size 49417
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_suggested_values.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_suggested_values.png
index 83d4d7d1f8..e9f9fa4cbf 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_suggested_values.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_suggested_values.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9348281a91e9fb2a920e07d3559a174185ef4263e277ceed81353e3a3c4eecbd
-size 55424
+oid sha256:86f4ed28e797d155a205d2bee99c6c223fdd3224c07fab181e1ffc3010257372
+size 55985
diff --git a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_updated_details.png b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_updated_details.png
index 505e2646c6..18c050d1e2 100644
--- a/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_updated_details.png
+++ b/plugins/SegmentEditor/tests/UI/expected-screenshots/SegmentSelectorEditorTest_updated_details.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ca4397275d31b33e406ae788ade67418c16ba5931c3a1b775a16b989d4c03056
-size 51253
+oid sha256:20255dcb8037acbf54101e779f4a5b29985ddced29e45c2508db9566440ee95c
+size 51476
diff --git a/plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php b/plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php
index 323dbdb548..848080c2af 100644
--- a/plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php
+++ b/plugins/SegmentEditor/tests/Unit/SegmentQueryDecoratorTest.php
@@ -17,7 +17,7 @@ use Piwik\Tests\Framework\Mock\Plugin\LogTablesProvider;
* @group SegmentEditor
* @group SegmentEditor_Unit
*/
-class SegmentQueryDecoratorTest extends \PHPUnit_Framework_TestCase
+class SegmentQueryDecoratorTest extends \PHPUnit\Framework\TestCase
{
public static $storedSegments = array(
array('definition' => 'countryCode==abc', 'idsegment' => 1),
@@ -31,7 +31,7 @@ class SegmentQueryDecoratorTest extends \PHPUnit_Framework_TestCase
*/
private $decorator;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -83,8 +83,11 @@ class SegmentQueryDecoratorTest extends \PHPUnit_Framework_TestCase
private function getMockSegmentEditorService()
{
- $mock = $this->getMock('Piwik\Plugins\SegmentEditor\Services\StoredSegmentService',
- array('getAllSegmentsAndIgnoreVisibility'), array(), '', $callOriginalConstructor = false);
+ $mock = $this->getMockBuilder('Piwik\Plugins\SegmentEditor\Services\StoredSegmentService')
+ ->setMethods(['getAllSegmentsAndIgnoreVisibility'])
+ ->setConstructorArgs([])
+ ->disableOriginalConstructor()
+ ->getMock();
$mock->expects($this->any())->method('getAllSegmentsAndIgnoreVisibility')->willReturn(self::$storedSegments);
return $mock;
}
diff --git a/plugins/SitesManager/API.php b/plugins/SitesManager/API.php
index 1066aaf258..1230e3e4b6 100644
--- a/plugins/SitesManager/API.php
+++ b/plugins/SitesManager/API.php
@@ -14,7 +14,8 @@ use Piwik\Access;
use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\Date;
-use Piwik\Network\IPUtils;
+use Piwik\Intl\Data\Provider\CurrencyDataProvider;
+use Matomo\Network\IPUtils;
use Piwik\Option;
use Piwik\Piwik;
use Piwik\Plugin\SettingsProvider;
@@ -1371,10 +1372,12 @@ class API extends \Piwik\Plugin\API
*/
public function getCurrencyList()
{
- $currency = Site::getCurrencyList();
+ /** @var CurrencyDataProvider $dataProvider */
+ $dataProvider = StaticContainer::get('Piwik\Intl\Data\Provider\CurrencyDataProvider');
+ $currency = $dataProvider->getCurrencyList();
$return = array();
- foreach (array_keys(Site::getCurrencyList()) as $currencyCode) {
+ foreach (array_keys($currency) as $currencyCode) {
$return[$currencyCode] = Piwik::translate('Intl_Currency_' . $currencyCode) .
' (' . Piwik::translate('Intl_CurrencySymbol_' . $currencyCode) . ')';
}
@@ -1391,7 +1394,10 @@ class API extends \Piwik\Plugin\API
*/
public function getCurrencySymbols()
{
- $currencies = Site::getCurrencyList();
+ /** @var CurrencyDataProvider $dataProvider */
+ $dataProvider = StaticContainer::get('Piwik\Intl\Data\Provider\CurrencyDataProvider');
+ $currencies = $dataProvider->getCurrencyList();
+
return array_map(function ($a) {
return $a[0];
}, $currencies);
diff --git a/plugins/SitesManager/Controller.php b/plugins/SitesManager/Controller.php
index 807757b845..be4ea71120 100644
--- a/plugins/SitesManager/Controller.php
+++ b/plugins/SitesManager/Controller.php
@@ -102,6 +102,8 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
/**
* User will download a file called PiwikTracker.php that is the content of the actual script
+ *
+ * @deprecated seems unused and PiwikTracker is now MatomoTracker
*/
function downloadPiwikTracker()
{
diff --git a/plugins/SitesManager/lang/de.json b/plugins/SitesManager/lang/de.json
index 45adcb3433..ca1ae0312d 100644
--- a/plugins/SitesManager/lang/de.json
+++ b/plugins/SitesManager/lang/de.json
@@ -34,6 +34,7 @@
"GlobalListExcludedUserAgents_Desc": "Falls der übermittelte Browser Agent des Besuchers einen der angegebenen Begriffe enthält, wird der Besucher von Matomo ignoriert.",
"GlobalSettings": "Globale Einstellungen",
"GlobalWebsitesSettings": "Globale Website-Einstellungen",
+ "InstallationGuides": "Installationsanleitungen",
"ExtraInformationNeeded": "Um Matomo auf ihrem System aufzusetzen könnten Sie folgende Informationen benötigen:",
"Integrations": "Integrationen",
"HelpExcludedIpAddresses": "Geben Sie eine Liste von IPs an (eine pro Zeile), die von Matomo beim Erfassen von Besuchen ignoriert werden sollen. Es können die CIDR Schreibweise wie z.B. %1$s oder Wildcards wie z.B. %2$s oder %3$s genutzt werden.",
diff --git a/plugins/SitesManager/lang/pt.json b/plugins/SitesManager/lang/pt.json
index ed99b18eba..40d4db2b75 100644
--- a/plugins/SitesManager/lang/pt.json
+++ b/plugins/SitesManager/lang/pt.json
@@ -34,6 +34,10 @@
"GlobalListExcludedUserAgents_Desc": "Se o identificador de agente de utilizador do visitante contiver qualquer um dos identificadores que especificar, o visitante será excluído do Matomo.",
"GlobalSettings": "Definições globais",
"GlobalWebsitesSettings": "Definições globais de sites",
+ "InstallationGuides": "Guias de instalação",
+ "InstallationGuidesIntro": "Nós fornecemos guias passo-a-passo que explicam como incorporar o código de acompanhamento para alguns dos CMS e construtores de sites mais populares.",
+ "ExtraInformationNeeded": "Para configurar o Matomo no seu sistema, pode necessitar da seguinte informação:",
+ "Integrations": "Integrações",
"HelpExcludedIpAddresses": "Introduza a lista de IPs, um por linha, que gostaria de excluir de serem acompanhados pelo Matomo. Pode utilizar a notação CIDR, por exemplo %1$s, ou pode utilizar carateres genéricos, por exemplo %2$s ou %3$s",
"JsTrackingTagHelp": "Aqui está o código de acompanhamento JavaScript a incluir em todas as suas páginas",
"KeepURLFragments": "Acompanhamento de fragmentos de endereços de páginas",
diff --git a/plugins/SitesManager/tests/Fixtures/ManySites.php b/plugins/SitesManager/tests/Fixtures/ManySites.php
index e80d8fbcc9..e8594d09f4 100644
--- a/plugins/SitesManager/tests/Fixtures/ManySites.php
+++ b/plugins/SitesManager/tests/Fixtures/ManySites.php
@@ -19,7 +19,7 @@ class ManySites extends Fixture
{
public $dateTime = '2010-01-03 11:22:33';
- public function setUp()
+ public function setUp(): void
{
for ($idSite = 1; $idSite < 64; $idSite++) {
if (!self::siteCreated($idSite)) {
diff --git a/plugins/SitesManager/tests/Integration/ApiTest.php b/plugins/SitesManager/tests/Integration/ApiTest.php
index 2f178434fa..1385cef121 100644
--- a/plugins/SitesManager/tests/Integration/ApiTest.php
+++ b/plugins/SitesManager/tests/Integration/ApiTest.php
@@ -18,11 +18,10 @@ use Piwik\Plugins\SitesManager\Model;
use Piwik\Plugins\UsersManager\API as APIUsersManager;
use Piwik\Measurable\Measurable;
use Piwik\Site;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\Mock\FakeAccess;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
use Exception;
-use PHPUnit_Framework_Constraint_IsType;
/**
* Class Plugins_SitesManagerTest
@@ -33,7 +32,7 @@ use PHPUnit_Framework_Constraint_IsType;
*/
class ApiTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -43,19 +42,20 @@ class ApiTest extends IntegrationTestCase
FakeAccess::$superUser = true;
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
- Translate::reset();
+ Fixture::resetTranslations();
}
/**
* empty name -> exception
- * @expectedException \Exception
*/
public function test_addSite_WithEmptyName_ThrowsException()
{
+ $this->expectException(\Exception::class);
+
API::getInstance()->addSite("", array("http://piwik.net"));
}
@@ -77,10 +77,10 @@ class ApiTest extends IntegrationTestCase
* wrong urls -> exception
*
* @dataProvider getInvalidUrlData
- * @expectedException \Exception
*/
public function test_addSite_WithWrongUrls_ThrowsException($url)
{
+ $this->expectException(\Exception::class);
API::getInstance()->addSite("name", $url);
}
@@ -155,10 +155,10 @@ class ApiTest extends IntegrationTestCase
* Test with invalid IPs
*
* @dataProvider getInvalidIPsData
- * @expectedException \Exception
*/
public function test_addSite_WithInvalidExcludedIps_ThrowsException($ip)
{
+ $this->expectException(\Exception::class);
API::getInstance()->addSite("name", "http://piwik.net/", $ecommerce = 0,
$siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, $ip);
}
@@ -171,7 +171,7 @@ class ApiTest extends IntegrationTestCase
$url = "http://piwik.net/";
$urlOK = "http://piwik.net";
$idsite = API::getInstance()->addSite("name", $url);
- $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+ self::assertIsInt($idsite);
$siteInfo = API::getInstance()->getSiteFromId($idsite);
$this->assertEquals($urlOK, $siteInfo['main_url']);
@@ -189,7 +189,7 @@ class ApiTest extends IntegrationTestCase
$urls = array("http://piwik.net/", "http://piwik.com", "https://piwik.net/test/", "piwik.net/another/test");
$urlsOK = array("http://piwik.net", "http://piwik.com", "http://piwik.net/another/test", "https://piwik.net/test");
$idsite = API::getInstance()->addSite("super website", $urls);
- $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+ self::assertIsInt($idsite);
$siteInfo = API::getInstance()->getSiteFromId($idsite);
$this->assertEquals($urlsOK[0], $siteInfo['main_url']);
@@ -205,7 +205,7 @@ class ApiTest extends IntegrationTestCase
{
$name = "supertest(); ~@@()''!£\$'%%^'!£ போ";
$idsite = API::getInstance()->addSite($name, "http://piwik.net");
- $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+ self::assertIsInt($idsite);
$siteInfo = API::getInstance()->getSiteFromId($idsite);
$this->assertEquals($name, $siteInfo['name']);
@@ -213,12 +213,13 @@ class ApiTest extends IntegrationTestCase
}
/**
- * @expectedException \Exception
- * @expectedExceptionMessage SitesManager_OnlyMatchedUrlsAllowed
* @dataProvider getDifferentTypesDataProvider
*/
public function test_addSite_ShouldFailAndNotCreatedASite_IfASettingIsInvalid($type)
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('SitesManager_OnlyMatchedUrlsAllowed');
+
try {
$settings = array('WebsiteMeasurable' => array(array('name' => 'exclude_unknown_urls', 'value' => 'fooBar')));
$this->addSiteWithType($type, $settings);
@@ -263,7 +264,7 @@ class ApiTest extends IntegrationTestCase
{
$name = "website ";
$idsite = API::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/"));
- $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+ self::assertIsInt($idsite);
$siteInfo = API::getInstance()->getSiteFromId($idsite);
$this->assertEquals($name, $siteInfo['name']);
@@ -423,10 +424,11 @@ class ApiTest extends IntegrationTestCase
/**
* wrong format urls => exception
- * @expectedException \Exception
*/
public function test_addSiteAliasUrls_WithIncorrectFormat_ThrowsException_3()
{
+ $this->expectException(\Exception::class);
+
$idsite = $this->_addSite();
$toAdd = array("http:mpigeq");
API::getInstance()->addSiteAliasUrls($idsite, $toAdd);
@@ -434,20 +436,20 @@ class ApiTest extends IntegrationTestCase
/**
* wrong idsite => no exception because simply no access to this resource
- * @expectedException \Exception
*/
public function test_addSiteAliasUrls_WithWrongIdSite_ThrowsException()
{
+ $this->expectException(\Exception::class);
$toAdd = array("http://pigeq.com/test");
API::getInstance()->addSiteAliasUrls(-1, $toAdd);
}
/**
* wrong idsite => exception
- * @expectedException \Exception
*/
public function test_addSiteAliasUrls_WithWrongIdSite_ThrowsException2()
{
+ $this->expectException(\Exception::class);
$toAdd = array("http://pigeq.com/test");
API::getInstance()->addSiteAliasUrls(155, $toAdd);
}
@@ -492,28 +494,28 @@ class ApiTest extends IntegrationTestCase
/**
* wrong id => exception
- * @expectedException \Exception
*/
public function test_getSiteFromId_WithWrongId_ThrowsException1()
{
+ $this->expectException(\Exception::class);
API::getInstance()->getSiteFromId(0);
}
/**
* wrong id => exception
- * @expectedException \Exception
*/
public function test_getSiteFromId_WithWrongId_ThrowsException2()
{
+ $this->expectException(\Exception::class);
API::getInstance()->getSiteFromId("x1");
}
/**
* wrong id : no access => exception
- * @expectedException \Exception
*/
public function test_getSiteFromId_ThrowsException_WhenTheUserDoesNotHavaAcessToTheSite()
{
+ $this->expectException(\Exception::class);
$idsite = API::getInstance()->addSite("site", array("http://piwik.net", "http://piwik.com/test/"));
$this->assertEquals(1, $idsite);
@@ -531,7 +533,7 @@ class ApiTest extends IntegrationTestCase
{
$name = "website ''";
$idsite = API::getInstance()->addSite($name, array("http://piwik.net", "http://piwik.com/test/"));
- $this->assertInternalType(PHPUnit_Framework_Constraint_IsType::TYPE_INT, $idsite);
+ self::assertIsInt($idsite);
$siteInfo = API::getInstance()->getSiteFromId($idsite);
$this->assertEquals($name, $siteInfo['name']);
@@ -558,7 +560,7 @@ class ApiTest extends IntegrationTestCase
API::getInstance()->addSite("site2", array("http://piwik.com/test/"));
API::getInstance()->addSite("site3", array("http://piwik.org"), null, null, null, null, null, null, 'Asia/Tokyo');
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$resultWanted = array(
0 => array("idsite" => 1, "name" => "site1", "main_url" => "http://piwik.net", "ecommerce" => 0, "excluded_ips" => "", 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'UTC', 'timezone_name' => 'UTC', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website', 'exclude_unknown_urls' => 0, 'currency_name' => 'US Dollar'),
@@ -757,10 +759,10 @@ class ApiTest extends IntegrationTestCase
/**
* wrongId => exception
- * @expectedException \Exception
*/
public function test_getSiteUrlsFromId_ThrowsException_WhenSiteIdIsIncorrect()
{
+ $this->expectException(\Exception::class);
FakeAccess::setIdSitesView(array(3));
FakeAccess::setIdSitesAdmin(array());
API::getInstance()->getSiteUrlsFromId(1);
@@ -881,12 +883,11 @@ class ApiTest extends IntegrationTestCase
$this->assertEquals($newurls, $allUrls);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage SitesManager_OnlyMatchedUrlsAllowed
- */
public function test_updateSite_ShouldFailAndNotUpdateSite_IfASettingIsInvalid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('SitesManager_OnlyMatchedUrlsAllowed');
+
$type = MobileAppMeasurable\Type::ID;
$idSite = $this->addSiteWithType($type, array());
@@ -970,12 +971,11 @@ class ApiTest extends IntegrationTestCase
);
}
- /**
- * @expectedException Exception
- * @expectedExceptionMessage SitesManager_ExceptionDeleteSite
- */
public function test_delete_ShouldNotDeleteASiteInCaseThereIsOnlyOneSite()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('SitesManager_ExceptionDeleteSite');
+
$siteId1 = $this->_addSite();
$this->assertHasSite($siteId1);
@@ -989,12 +989,11 @@ class ApiTest extends IntegrationTestCase
}
}
- /**
- * @expectedException Exception
- * @expectedExceptionMessage website id = 99999498 not found
- */
public function test_delete_ShouldTriggerException_IfGivenSiteDoesNotExist()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('website id = 99999498 not found');
+
API::getInstance()->deleteSite(99999498);
}
@@ -1068,19 +1067,19 @@ class ApiTest extends IntegrationTestCase
/**
*
* @dataProvider getInvalidTimezoneData
- * @expectedException \Exception
*/
public function test_addSite_WithInvalidTimezone_ThrowsException($timezone)
{
+ $this->expectException(\Exception::class);
+
API::getInstance()->addSite("site1", array('http://example.org'), $ecommerce = 0,
$siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, $ip = '', $params = '', $timezone);
}
- /**
- * @expectedException \Exception
- */
public function test_addSite_WithInvalidCurrency_ThrowsException()
{
+ $this->expectException(\Exception::class);
+
$invalidCurrency = '€';
API::getInstance()->addSite("site1", array('http://example.org'), $ecommerce = 0,
$siteSearch = 1, $searchKeywordParameters = null, $searchCategoryParameters = null, '', 'UTC', $invalidCurrency);
diff --git a/plugins/SitesManager/tests/Integration/ModelTest.php b/plugins/SitesManager/tests/Integration/ModelTest.php
index 9333fb9cd9..1b2f182055 100644
--- a/plugins/SitesManager/tests/Integration/ModelTest.php
+++ b/plugins/SitesManager/tests/Integration/ModelTest.php
@@ -24,7 +24,7 @@ class ModelTest extends IntegrationTestCase
*/
private $model;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/SitesManager/tests/Integration/SiteUrlsTest.php b/plugins/SitesManager/tests/Integration/SiteUrlsTest.php
index 3c8739d878..eb5182a1f7 100644
--- a/plugins/SitesManager/tests/Integration/SiteUrlsTest.php
+++ b/plugins/SitesManager/tests/Integration/SiteUrlsTest.php
@@ -29,7 +29,7 @@ class SiteUrlsTest extends IntegrationTestCase
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/SitesManager/tests/Integration/SitesManagerTest.php b/plugins/SitesManager/tests/Integration/SitesManagerTest.php
index b90699b13a..51f07cdc2f 100644
--- a/plugins/SitesManager/tests/Integration/SitesManagerTest.php
+++ b/plugins/SitesManager/tests/Integration/SitesManagerTest.php
@@ -35,7 +35,7 @@ class SitesManagerTest extends IntegrationTestCase
private $siteId;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/SitesManager/tests/Unit/APITest.php b/plugins/SitesManager/tests/Unit/APITest.php
index cb5523700d..79f7017e61 100644
--- a/plugins/SitesManager/tests/Unit/APITest.php
+++ b/plugins/SitesManager/tests/Unit/APITest.php
@@ -11,21 +11,21 @@ namespace Piwik\Plugins\SitesManager\tests\Unit;
use Piwik\Container\StaticContainer;
use Piwik\Plugins\SitesManager\API;
use Piwik\SettingsServer;
-use Piwik\Translate;
+use Piwik\Tests\Framework\Fixture;
/**
* @group SitesManaager
* @group APITest
* @group Plugins
*/
-class APITest extends \PHPUnit_Framework_TestCase
+class APITest extends \PHPUnit\Framework\TestCase
{
/**
* @var Api
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -33,16 +33,16 @@ class APITest extends \PHPUnit_Framework_TestCase
$this->markTestSkipped('timezones needs to be supported');
}
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$this->api = API::getInstance();
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
- Translate::reset();
+ Fixture::resetTranslations();
}
public function getTimezoneNameTestData()
diff --git a/plugins/TagManager b/plugins/TagManager
-Subproject 32eca75b7a5d9f5ac2cabd9278ab726f2be41c0
+Subproject 7460e1c3060b1449220b1bf6e59ec1817715529
diff --git a/plugins/TasksTimetable b/plugins/TasksTimetable
-Subproject 06d7d0c5f39e01f41917f6842a9efe693ce9257
+Subproject 45b13817582ff1fd2d0162a530923baf105af5f
diff --git a/plugins/TestRunner/Aws/config.ini.php b/plugins/TestRunner/Aws/config.ini.php
index cf8d69890b..c83e0aafd1 100644
--- a/plugins/TestRunner/Aws/config.ini.php
+++ b/plugins/TestRunner/Aws/config.ini.php
@@ -17,7 +17,6 @@ password = "secure"
tables_prefix = ""
[General]
-session_save_handler = "dbtable"
salt = "ad40b992685bd402cdddaa46bdff537e"
enable_update_communication = 0
trusted_hosts[] = "amazonaws.com"
diff --git a/plugins/TestRunner/Commands/TestsRun.php b/plugins/TestRunner/Commands/TestsRun.php
index cd04ab945c..128e7bace8 100644
--- a/plugins/TestRunner/Commands/TestsRun.php
+++ b/plugins/TestRunner/Commands/TestsRun.php
@@ -43,8 +43,7 @@ class TestsRun extends ConsoleCommand
$options = $input->getOption('options');
$groups = $input->getOption('group');
$magics = $input->getArgument('variables');
- // @todo remove piwik-domain fallback in Matomo 4
- $matomoDomain = $input->getOption('matomo-domain') ?: $input->getOption('piwik-domain');
+ $matomoDomain = $input->getOption('matomo-domain');
$enableLogging = $input->getOption('enable-logging');
$groups = $this->getGroupsFromString($groups);
diff --git a/plugins/TestRunner/Commands/TestsRunUI.php b/plugins/TestRunner/Commands/TestsRunUI.php
index 7efe119d01..d19ecda0b7 100644
--- a/plugins/TestRunner/Commands/TestsRunUI.php
+++ b/plugins/TestRunner/Commands/TestsRunUI.php
@@ -58,8 +58,7 @@ class TestsRunUI extends ConsoleCommand
$storeInUiTestsRepo = $input->getOption('store-in-ui-tests-repo');
$screenshotRepo = $input->getOption('screenshot-repo');
$debug = $input->getOption('debug');
- // @todo remove piwik-domain fallback in Matomo 4
- $matomoDomain = $input->getOption('matomo-domain') ?: $input->getOption('piwik-domain');
+ $matomoDomain = $input->getOption('matomo-domain');
$enableLogging = $input->getOption('enable-logging');
$timeout = $input->getOption('timeout');
diff --git a/plugins/TestRunner/Commands/TestsSetupFixture.php b/plugins/TestRunner/Commands/TestsSetupFixture.php
index 1df6f47bb7..f44e7f301d 100644
--- a/plugins/TestRunner/Commands/TestsSetupFixture.php
+++ b/plugins/TestRunner/Commands/TestsSetupFixture.php
@@ -256,8 +256,6 @@ class TestsSetupFixture extends ConsoleCommand
private function requireFixtureFiles(InputInterface $input)
{
- require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php';
-
$file = $input->getOption('file');
if ($file) {
if (is_file($file)) {
diff --git a/plugins/Tour/lang/zh-cn.json b/plugins/Tour/lang/zh-cn.json
index 0db9900041..62dcb4af4c 100644
--- a/plugins/Tour/lang/zh-cn.json
+++ b/plugins/Tour/lang/zh-cn.json
@@ -2,6 +2,7 @@
"Tour": {
"PluginDescription": "通过完成使您熟悉Matomo的挑战,立即成为Matomo专家。",
"Engagement": "忠诚度",
+ "BrowseMarketplace": "浏览市场",
"CompletionTitle": "干的不错,加油!"
}
} \ No newline at end of file
diff --git a/plugins/Tour/tests/Fixtures/SimpleFixtureTrackFewVisits.php b/plugins/Tour/tests/Fixtures/SimpleFixtureTrackFewVisits.php
index 7bbdf8cb4c..196d307263 100644
--- a/plugins/Tour/tests/Fixtures/SimpleFixtureTrackFewVisits.php
+++ b/plugins/Tour/tests/Fixtures/SimpleFixtureTrackFewVisits.php
@@ -21,13 +21,13 @@ class SimpleFixtureTrackFewVisits extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
$this->trackFirstVisit();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/Tour/tests/Integration/ChallengeTest.php b/plugins/Tour/tests/Integration/ChallengeTest.php
index 58d49dbd0d..0b57ca62bb 100644
--- a/plugins/Tour/tests/Integration/ChallengeTest.php
+++ b/plugins/Tour/tests/Integration/ChallengeTest.php
@@ -50,7 +50,7 @@ class ChallengeTest extends IntegrationTestCase
*/
private $challenge2;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -58,7 +58,7 @@ class ChallengeTest extends IntegrationTestCase
$this->challenge2 = new CustomTest2Challenge();
}
- public function tearDown()
+ public function tearDown(): void
{
Challenge::clearCache();
parent::tearDown();
diff --git a/plugins/Tour/tests/System/APITest.php b/plugins/Tour/tests/System/APITest.php
index 0287f417b3..c790eb62d2 100644
--- a/plugins/Tour/tests/System/APITest.php
+++ b/plugins/Tour/tests/System/APITest.php
@@ -61,21 +61,19 @@ class APITest extends SystemTestCase
$this->assertTrue($steps[1]['isSkipped']);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Challenge already completed
- */
public function test_skipStep_alreadyCompleted()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Challenge already completed');
+
Request::processRequest('Tour.skipChallenge', array('id' => 'track_data'));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Challenge not found
- */
public function test_skipStep_invalid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Challenge not found');
+
Request::processRequest('Tour.skipChallenge', array('id' => 'foobarbaz'));
}
diff --git a/plugins/Tour/tests/System/DataFinderTest.php b/plugins/Tour/tests/System/DataFinderTest.php
index 4345ada15f..48374e60c6 100644
--- a/plugins/Tour/tests/System/DataFinderTest.php
+++ b/plugins/Tour/tests/System/DataFinderTest.php
@@ -32,7 +32,7 @@ class DataFinderTest extends SystemTestCase
*/
private $dataFinder;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->dataFinder = new DataFinder();
diff --git a/plugins/Tour/tests/System/TourTest.php b/plugins/Tour/tests/System/TourTest.php
index 4163192670..d09fd0c5a1 100644
--- a/plugins/Tour/tests/System/TourTest.php
+++ b/plugins/Tour/tests/System/TourTest.php
@@ -29,7 +29,7 @@ class TourTest extends SystemTestCase
*/
public static $fixture = null; // initialized below class definition
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
}
diff --git a/plugins/TreemapVisualization b/plugins/TreemapVisualization
-Subproject 9bcf17033ca4da490a3f459cdc52bb76c8eee5d
+Subproject 7beca7d8ba5484864acc84982d891cddc5dd5f9
diff --git a/plugins/TwoFactorAuth/TwoFactorAuth.php b/plugins/TwoFactorAuth/TwoFactorAuth.php
index fe1c3f465f..9b86925b36 100644
--- a/plugins/TwoFactorAuth/TwoFactorAuth.php
+++ b/plugins/TwoFactorAuth/TwoFactorAuth.php
@@ -109,7 +109,7 @@ class TwoFactorAuth extends \Piwik\Plugin
public function onApiGetTokenAuth($returnedValue, $params)
{
- if (!SettingsPiwik::isPiwikInstalled()) {
+ if (!SettingsPiwik::isMatomoInstalled()) {
return;
}
diff --git a/plugins/TwoFactorAuth/Validator.php b/plugins/TwoFactorAuth/Validator.php
index 77b4bb2714..382ad5f99c 100644
--- a/plugins/TwoFactorAuth/Validator.php
+++ b/plugins/TwoFactorAuth/Validator.php
@@ -34,7 +34,7 @@ class Validator
return false;
}
- if (!SettingsPiwik::isPiwikInstalled()) {
+ if (!SettingsPiwik::isMatomoInstalled()) {
return false;
}
@@ -45,7 +45,7 @@ class Validator
{
Piwik::checkUserIsNotAnonymous();
- if (!SettingsPiwik::isPiwikInstalled()) {
+ if (!SettingsPiwik::isMatomoInstalled()) {
throw new NotYetInstalledException('Matomo is not set up yet');
}
}
diff --git a/plugins/TwoFactorAuth/config/test.php b/plugins/TwoFactorAuth/config/test.php
index 7023790fe4..617eb132cd 100644
--- a/plugins/TwoFactorAuth/config/test.php
+++ b/plugins/TwoFactorAuth/config/test.php
@@ -6,7 +6,7 @@ return array(
'Piwik\Plugins\TwoFactorAuth\TwoFactorAuthentication' => DI\decorate(function ($previous) {
/** @var Piwik\Plugins\TwoFactorAuth\TwoFactorAuthentication $previous */
- if (!\Piwik\SettingsPiwik::isPiwikInstalled()) {
+ if (!\Piwik\SettingsPiwik::isMatomoInstalled()) {
return $previous;
}
@@ -30,7 +30,7 @@ return array(
'Piwik\Plugins\TwoFactorAuth\Dao\RecoveryCodeDao' => DI\decorate(function ($previous) {
/** @var Piwik\Plugins\TwoFactorAuth\Dao\RecoveryCodeDao $previous */
- if (!\Piwik\SettingsPiwik::isPiwikInstalled()) {
+ if (!\Piwik\SettingsPiwik::isMatomoInstalled()) {
return $previous;
}
@@ -47,7 +47,7 @@ return array(
}),
'Piwik\Plugins\TwoFactorAuth\SystemSettings' => DI\decorate(function ($previous) {
/** @var Piwik\Plugins\TwoFactorAuth\SystemSettings $previous */
- if (!\Piwik\SettingsPiwik::isPiwikInstalled()) {
+ if (!\Piwik\SettingsPiwik::isMatomoInstalled()) {
return $previous;
}
diff --git a/plugins/TwoFactorAuth/tests/Fixtures/SimpleFixtureTrackFewVisits.php b/plugins/TwoFactorAuth/tests/Fixtures/SimpleFixtureTrackFewVisits.php
index b8b4468407..882f165747 100644
--- a/plugins/TwoFactorAuth/tests/Fixtures/SimpleFixtureTrackFewVisits.php
+++ b/plugins/TwoFactorAuth/tests/Fixtures/SimpleFixtureTrackFewVisits.php
@@ -20,14 +20,14 @@ class SimpleFixtureTrackFewVisits extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
Fixture::createSuperUser(true);
$this->createSuperUser = true;
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/TwoFactorAuth/tests/Fixtures/TwoFactorFixture.php b/plugins/TwoFactorAuth/tests/Fixtures/TwoFactorFixture.php
index 3b71c0eba7..f5b047ced5 100644
--- a/plugins/TwoFactorAuth/tests/Fixtures/TwoFactorFixture.php
+++ b/plugins/TwoFactorAuth/tests/Fixtures/TwoFactorFixture.php
@@ -42,7 +42,7 @@ class TwoFactorFixture extends Fixture
*/
private $twoFa;
- public function setUp()
+ public function setUp(): void
{
$this->dao = StaticContainer::get(RecoveryCodeDao::class);
$this->twoFa = StaticContainer::get(TwoFactorAuthentication::class);
@@ -52,7 +52,7 @@ class TwoFactorFixture extends Fixture
$this->trackFirstVisit();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/TwoFactorAuth/tests/Integration/APITest.php b/plugins/TwoFactorAuth/tests/Integration/APITest.php
index 4f8b738138..500076d246 100644
--- a/plugins/TwoFactorAuth/tests/Integration/APITest.php
+++ b/plugins/TwoFactorAuth/tests/Integration/APITest.php
@@ -39,7 +39,7 @@ class APITest extends IntegrationTestCase
*/
private $twoFa;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -56,12 +56,11 @@ class APITest extends IntegrationTestCase
$this->twoFa = StaticContainer::get(TwoFactorAuthentication::class);
}
- /**
- * @expectedExceptionMessage checkUserHasSuperUserAccess Fake exception
- * @expectedException \Exception
- */
public function test_resetTwoFactorAuth_failsWhenNotPermissions()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasSuperUserAccess Fake exception');
+
$this->setAdminUser();
$this->api->resetTwoFactorAuth('login');
}
diff --git a/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeDaoTest.php b/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeDaoTest.php
index 9eda0e9531..b084c85080 100644
--- a/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeDaoTest.php
+++ b/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeDaoTest.php
@@ -25,7 +25,7 @@ class RecoveryCodeDaoTest extends IntegrationTestCase
*/
private $dao;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeRandomGeneratorTest.php b/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeRandomGeneratorTest.php
index e3449386c1..cc51316e33 100644
--- a/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeRandomGeneratorTest.php
+++ b/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeRandomGeneratorTest.php
@@ -24,7 +24,7 @@ class RecoveryCodeRandomGeneratorTest extends IntegrationTestCase
*/
private $generator;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeStaticGeneratorTest.php b/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeStaticGeneratorTest.php
index 3ffc97b7a9..1d5193208d 100644
--- a/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeStaticGeneratorTest.php
+++ b/plugins/TwoFactorAuth/tests/Integration/Dao/RecoveryCodeStaticGeneratorTest.php
@@ -24,7 +24,7 @@ class RecoveryCodeStaticGeneratorTest extends IntegrationTestCase
*/
private $generator;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretRandomGeneratorTest.php b/plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretRandomGeneratorTest.php
index 2a0cf55384..bdd847205e 100644
--- a/plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretRandomGeneratorTest.php
+++ b/plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretRandomGeneratorTest.php
@@ -24,7 +24,7 @@ class TwoFaSecretRandomGeneratorTest extends IntegrationTestCase
*/
private $generator;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretStaticGeneratorTest.php b/plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretStaticGeneratorTest.php
index e5fa4883c4..84d1e9116a 100644
--- a/plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretStaticGeneratorTest.php
+++ b/plugins/TwoFactorAuth/tests/Integration/Dao/TwoFaSecretStaticGeneratorTest.php
@@ -23,7 +23,7 @@ class TwoFaSecretStaticGeneratorTest extends IntegrationTestCase
*/
private $generator;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/TwoFactorAuth/tests/Integration/SystemSettingsTest.php b/plugins/TwoFactorAuth/tests/Integration/SystemSettingsTest.php
index fb9d507e26..ad043450d1 100644
--- a/plugins/TwoFactorAuth/tests/Integration/SystemSettingsTest.php
+++ b/plugins/TwoFactorAuth/tests/Integration/SystemSettingsTest.php
@@ -24,7 +24,7 @@ class SystemSettingsTest extends IntegrationTestCase
*/
private $settings;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthTest.php b/plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthTest.php
index 07429e2916..797620443c 100644
--- a/plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthTest.php
+++ b/plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthTest.php
@@ -44,7 +44,7 @@ class TwoFactorAuthTest extends IntegrationTestCase
private $userPassword = '123abcDk3_l3';
private $user2faSecret = '123456';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -64,7 +64,7 @@ class TwoFactorAuthTest extends IntegrationTestCase
unset($_GET['authCode']);
}
- public function tearDown()
+ public function tearDown(): void
{
unset($_GET['authCode']);
}
@@ -87,24 +87,22 @@ class TwoFactorAuthTest extends IntegrationTestCase
$this->assertEquals(32, strlen($token));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage TwoFactorAuth_MissingAuthCodeAPI
- */
public function test_onApiGetTokenAuth_throwsErrorWhenMissingTokenWhenUsing2FaAndAuthenticatedCorrectly()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('TwoFactorAuth_MissingAuthCodeAPI');
+
Request::processRequest('UsersManager.getTokenAuth', array(
'userLogin' => $this->userWith2Fa,
'md5Password' => md5($this->userPassword)
));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage TwoFactorAuth_InvalidAuthCode
- */
public function test_onApiGetTokenAuth_throwsErrorWhenInvalidTokenWhenUsing2FaAndAuthenticatedCorrectly()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('TwoFactorAuth_InvalidAuthCode');
+
$_GET['authCode'] = '111222';
Request::processRequest('UsersManager.getTokenAuth', array(
'userLogin' => $this->userWith2Fa,
diff --git a/plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthenticationTest.php b/plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthenticationTest.php
index 154e343cce..d70bc8010e 100644
--- a/plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthenticationTest.php
+++ b/plugins/TwoFactorAuth/tests/Integration/TwoFactorAuthenticationTest.php
@@ -39,7 +39,7 @@ class TwoFactorAuthenticationTest extends IntegrationTestCase
*/
private $twoFa;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -92,21 +92,19 @@ class TwoFactorAuthenticationTest extends IntegrationTestCase
$this->assertEquals([], $this->dao->getAllRecoveryCodesForLogin('mylogin'));
}
- /**
- * @expectedExceptionMessage Anonymous cannot use
- * @expectedException \Exception
- */
public function test_saveSecret_neverWorksForAnonymous()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Anonymous cannot use');
+
$this->twoFa->saveSecret('anonymous', '123456');
}
- /**
- * @expectedExceptionMessage no recovery codes have been created
- * @expectedException \Exception
- */
public function test_saveSecret_notWorksWhenNoRecoveryCodesCreated()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('no recovery codes have been created');
+
$this->twoFa->saveSecret('not', '123456');
}
diff --git a/plugins/TwoFactorAuth/tests/System/TwoFactorAuthTest.php b/plugins/TwoFactorAuth/tests/System/TwoFactorAuthTest.php
index 4f32be9264..129f1c4275 100644
--- a/plugins/TwoFactorAuth/tests/System/TwoFactorAuthTest.php
+++ b/plugins/TwoFactorAuth/tests/System/TwoFactorAuthTest.php
@@ -47,7 +47,7 @@ class TwoFactorAuthTest extends SystemTestCase
*/
private $twoFa;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/TwoFactorAuth/tests/UI/TwoFactorAuth_spec.js b/plugins/TwoFactorAuth/tests/UI/TwoFactorAuth_spec.js
index adda4a9dc6..368ec0632f 100644
--- a/plugins/TwoFactorAuth/tests/UI/TwoFactorAuth_spec.js
+++ b/plugins/TwoFactorAuth/tests/UI/TwoFactorAuth_spec.js
@@ -20,6 +20,7 @@ describe("TwoFactorAuth", function () {
async function selectModalButton(button)
{
await (await page.jQuery('.modal.open .modal-footer a:contains('+button+')')).click();
+ await page.waitForNetworkIdle();
}
async function loginUser(username, doAuth)
@@ -27,6 +28,11 @@ describe("TwoFactorAuth", function () {
// make sure to log out previous session
await page.goto(logoutUrl);
+ var cookies = await page.cookies();
+ cookies.forEach(cookie => {
+ page.deleteCookie(cookie);
+ });
+
if (typeof doAuth === 'undefined') {
doAuth = true;
}
@@ -148,6 +154,7 @@ describe("TwoFactorAuth", function () {
it('should be possible to disable two factor step 2 confirmed', async function () {
await selectModalButton('Yes');
+ await page.waitFor(150);
expect(await page.screenshotSelector('.loginSection')).to.matchImage('usersettings_twofa_disable_step2');
});
diff --git a/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_logme_verified.png b/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_logme_verified.png
index 8f6b109c3e..b23762e59e 100644
--- a/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_logme_verified.png
+++ b/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_logme_verified.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5208b9f5357685bee38a8c97544368bcfeb4c7b9c0ebe0c2a61e3a85d791c01a
-size 183858
+oid sha256:0eed847c873304a25e3adee98c9ce43c28f8efc1928616e918a6f7b0e707af8f
+size 184906
diff --git a/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_twofa_forced_step4.png b/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_twofa_forced_step4.png
index 395edfff42..76568db089 100644
--- a/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_twofa_forced_step4.png
+++ b/plugins/TwoFactorAuth/tests/UI/expected-screenshots/TwoFactorAuth_twofa_forced_step4.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:703af3646babff2759ce67616d462b155b49c99b2b3b71247d3a45d6c5042380
-size 182971
+oid sha256:8e576f1b42887837fe1b9b30436ccd1c9e9088e8db46459c62acd0829f6d3ec9
+size 183745
diff --git a/plugins/UserCountry/Archiver.php b/plugins/UserCountry/Archiver.php
index 16eca3bd26..1a15be4e54 100644
--- a/plugins/UserCountry/Archiver.php
+++ b/plugins/UserCountry/Archiver.php
@@ -9,11 +9,9 @@
namespace Piwik\Plugins\UserCountry;
-use Piwik\ArchiveProcessor;
use Piwik\DataArray;
use Piwik\DataTable;
use Piwik\Metrics;
-use Piwik\Plugins\UserCountry\LocationProvider;
class Archiver extends \Piwik\Plugin\Archiver
{
diff --git a/plugins/UserCountry/Columns/Base.php b/plugins/UserCountry/Columns/Base.php
index 1ee6ea9d18..fb9468f68d 100644
--- a/plugins/UserCountry/Columns/Base.php
+++ b/plugins/UserCountry/Columns/Base.php
@@ -10,7 +10,7 @@ namespace Piwik\Plugins\UserCountry\Columns;
use Piwik\Common;
use Piwik\Exception\InvalidRequestParameterException;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugins\UserCountry\VisitorGeolocator;
use Piwik\Plugins\PrivacyManager\Config as PrivacyManagerConfig;
diff --git a/plugins/UserCountry/Columns/Country.php b/plugins/UserCountry/Columns/Country.php
index 6138c0278d..608be68e6b 100644
--- a/plugins/UserCountry/Columns/Country.php
+++ b/plugins/UserCountry/Columns/Country.php
@@ -13,7 +13,7 @@ use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Intl\Data\Provider\RegionDataProvider;
use Piwik\Metrics\Formatter;
-use Piwik\Network\IP;
+use Matomo\Network\IP;
use Piwik\Piwik;
use Piwik\Plugin\Manager;
use Piwik\Plugin\Segment;
diff --git a/plugins/UserCountry/Columns/Region.php b/plugins/UserCountry/Columns/Region.php
index 21587dc4f2..71af217b53 100644
--- a/plugins/UserCountry/Columns/Region.php
+++ b/plugins/UserCountry/Columns/Region.php
@@ -16,6 +16,7 @@ use Piwik\Tracker\Action;
class Region extends Base
{
protected $columnName = 'location_region';
+ protected $columnType = 'char(3) DEFAULT NULL';
protected $type = self::TYPE_TEXT;
protected $category = 'UserCountry_VisitLocation';
protected $segmentName = 'regionCode';
diff --git a/plugins/UserCountry/Controller.php b/plugins/UserCountry/Controller.php
index 97b5eadf92..5a980f5702 100644
--- a/plugins/UserCountry/Controller.php
+++ b/plugins/UserCountry/Controller.php
@@ -10,14 +10,9 @@ namespace Piwik\Plugins\UserCountry;
use Exception;
use Piwik\Common;
-use Piwik\DataTable\Renderer\Json;
-use Piwik\Http;
-use Piwik\Date;
use Piwik\IP;
use Piwik\Piwik;
use Piwik\Plugin\Manager;
-use Piwik\Plugins\GeoIp2\GeoIP2AutoUpdater;
-use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
use Piwik\Plugins\UserCountry\LocationProvider\DefaultProvider;
use Piwik\SettingsPiwik;
@@ -48,15 +43,7 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
$view->locationProviders = $allProviderInfo;
$view->currentProviderId = LocationProvider::getCurrentProviderId();
$view->thisIP = IP::getIpFromHeader();
-
- if ($this->isGeoIp2Enabled()) {
- $geoIPDatabasesInstalled = GeoIp2::isDatabaseInstalled();
- } else {
- $geoIPDatabasesInstalled = GeoIp::isDatabaseInstalled();
- }
-
- $view->geoIPDatabasesInstalled = $geoIPDatabasesInstalled;
- $view->updatePeriodOptions = $this->getPeriodUpdateOptions();
+ $view->hasGeoIp2Provider = Manager::getInstance()->isPluginActivated('GeoIp2');
// check if there is a working provider (that isn't the default one)
$isThereWorkingProvider = false;
@@ -70,26 +57,14 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
}
$view->isThereWorkingProvider = $isThereWorkingProvider;
- $view->notUsingGeoIpPlugin = !Manager::getInstance()->isPluginActivated('GeoIp2')
- && !Manager::getInstance()->isPluginActivated('GeoIp');
-
- // if using either the Apache, Nginx or PECL module, they are working and there are no databases
- // in misc, then the databases are located outside of Piwik, so we cannot update them
- $view->showGeoIPUpdateSection = true;
- $currentProviderId = LocationProvider::getCurrentProviderId();
- if (!$geoIPDatabasesInstalled
- && in_array($currentProviderId, [GeoIp2\ServerModule::ID, GeoIp\ServerBased::ID, GeoIp\Pecl::ID])
- && $allProviderInfo[$currentProviderId]['status'] == LocationProvider::INSTALLED
- ) {
- $view->showGeoIPUpdateSection = false;
+ $configurations = $setUpGuides = '';
+ foreach (LocationProvider::getAllProviders() as $provider) {
+ $configurations .= $provider->renderConfiguration();
+ $setUpGuides .= $provider->renderSetUpGuide();
}
- if ($view->notUsingGeoIpPlugin) {
- $view->showGeoIPUpdateSection = false;
- }
-
- $view->isInternetEnabled = SettingsPiwik::isInternetEnabled();
- $this->setUpdaterManageVars($view);
+ $view->configurations = $configurations;
+ $view->setUpGuides = $setUpGuides;
$this->setBasicVariablesView($view);
$this->setBasicVariablesAdminView($view);
@@ -97,301 +72,6 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
}
/**
- * Starts or continues download of GeoLiteCity.dat.
- *
- * To avoid a server/PHP timeout & to show progress of the download to the user, we
- * use the HTTP Range header to download one chunk of the file at a time. After each
- * chunk, it is the browser's responsibility to call the method again to continue the download.
- *
- * Input:
- * 'continue' query param - if set to 1, will assume we are currently downloading & use
- * Range: HTTP header to get another chunk of the file.
- *
- * Output (in JSON):
- * 'current_size' - Current size of the partially downloaded file on disk.
- * 'expected_file_size' - The expected finished file size as returned by the HTTP server.
- * 'next_screen' - When the download finishes, this is the next screen that should be shown.
- * 'error' - When an error occurs, the message is returned in this property.
- */
- public function downloadFreeGeoIPDB()
- {
- $this->dieIfGeolocationAdminIsDisabled();
- Piwik::checkUserHasSuperUserAccess();
-
- if ($this->isGeoIp2Enabled()) {
- return $this->downloadFreeDBIPLiteDB();
- }
-
- if ($_SERVER["REQUEST_METHOD"] == "POST") {
- $this->checkTokenInUrl();
- Json::sendHeaderJSON();
- $outputPath = GeoIp::getPathForGeoIpDatabase('GeoIPCity.dat') . '.gz';
- try {
- $result = Http::downloadChunk(
- $url = GeoIp::GEO_LITE_URL,
- $outputPath,
- $continue = Common::getRequestVar('continue', true, 'int')
- );
-
- // if the file is done
- if ($result['current_size'] >= $result['expected_file_size']) {
- GeoIPAutoUpdater::unzipDownloadedFile($outputPath, $unlink = true);
-
- // setup the auto updater
- GeoIPAutoUpdater::setUpdaterOptions(array(
- 'loc' => GeoIp::GEO_LITE_URL,
- 'period' => GeoIPAutoUpdater::SCHEDULE_PERIOD_MONTHLY,
- ));
-
- // make sure to echo out the geoip updater management screen
- $result['settings'] = GeoIPAutoUpdater::getConfiguredUrls();
- }
-
- return json_encode($result);
- } catch (Exception $ex) {
- return json_encode(array('error' => $ex->getMessage()));
- }
- }
- }
-
- /**
- * Starts or continues download of DBIP-City.mmdb.
- *
- * To avoid a server/PHP timeout & to show progress of the download to the user, we
- * use the HTTP Range header to download one chunk of the file at a time. After each
- * chunk, it is the browser's responsibility to call the method again to continue the download.
- *
- * Input:
- * 'continue' query param - if set to 1, will assume we are currently downloading & use
- * Range: HTTP header to get another chunk of the file.
- *
- * Output (in JSON):
- * 'current_size' - Current size of the partially downloaded file on disk.
- * 'expected_file_size' - The expected finished file size as returned by the HTTP server.
- * 'next_screen' - When the download finishes, this is the next screen that should be shown.
- * 'error' - When an error occurs, the message is returned in this property.
- */
- public function downloadFreeDBIPLiteDB()
- {
- $this->dieIfGeolocationAdminIsDisabled();
- Piwik::checkUserHasSuperUserAccess();
- if ($_SERVER["REQUEST_METHOD"] == "POST") {
- $this->checkTokenInUrl();
- Json::sendHeaderJSON();
- $outputPath = GeoIp2::getPathForGeoIpDatabase('DBIP-City.mmdb') . '.gz';
- try {
- $result = Http::downloadChunk(
- $url = GeoIp2::getDbIpLiteUrl(),
- $outputPath,
- $continue = Common::getRequestVar('continue', true, 'int')
- );
-
- // if the file is done
- if ($result['current_size'] >= $result['expected_file_size']) {
- try {
- GeoIP2AutoUpdater::unzipDownloadedFile($outputPath, 'loc', $url, $unlink = true);
- } catch (\Exception $e) {
- // remove downloaded file on error
- unlink($outputPath);
- throw $e;
- }
-
- // setup the auto updater
- GeoIP2AutoUpdater::setUpdaterOptions(array(
- 'loc' => GeoIp2::getDbIpLiteUrl(),
- 'period' => GeoIP2AutoUpdater::SCHEDULE_PERIOD_MONTHLY,
- ));
-
- $result['settings'] = GeoIP2AutoUpdater::getConfiguredUrls();
- }
-
- return json_encode($result);
- } catch (Exception $ex) {
- return json_encode(array('error' => $ex->getMessage()));
- }
- }
- }
-
- private function getPeriodUpdateOptions()
- {
- return array(
- 'month' => Piwik::translate('Intl_PeriodMonth'),
- 'week' => Piwik::translate('Intl_PeriodWeek')
- );
- }
-
- /**
- * Sets some variables needed by the _updaterManage.twig template.
- *
- * @param View $view
- */
- private function setUpdaterManageVars($view)
- {
- $view->isGeoIp2Available = $this->isGeoIp2Enabled();
-
- if ($this->isGeoIp2Enabled()) {
- // Get GeoIPLegacy Update information to show them
- $urls = GeoIPAutoUpdater::getConfiguredUrls();
- $today = Date::today();
-
- $view->geoIPLegacyLocUrl = $urls['loc'];
- $view->geoIPLegacyIspUrl = $urls['isp'];
- $view->geoIPLegacyOrgUrl = $urls['org'];
- $view->geoIPLegacyUpdatePeriod = GeoIPAutoUpdater::getSchedulePeriod();
-
- $urls = GeoIP2AutoUpdater::getConfiguredUrls();
-
- $view->geoIPLocUrl = $urls['loc'];
- $view->geoIPIspUrl = $urls['isp'];
- $view->geoIPUpdatePeriod = GeoIP2AutoUpdater::getSchedulePeriod();
-
- $view->dbipLiteUrl = GeoIp2::getDbIpLiteUrl();
- $view->dbipLiteFilename = "dbip-city-lite-{$today->toString('Y-m')}.mmdb";
- $view->dbipLiteDesiredFilename = "DBIP-City.mmdb";
- $view->nextRunTime = GeoIP2AutoUpdater::getNextRunTime();
-
- $lastRunTime = GeoIP2AutoUpdater::getLastRunTime();
- } else {
- $urls = GeoIPAutoUpdater::getConfiguredUrls();
-
- $view->geoIPLocUrl = $urls['loc'];
- $view->geoIPIspUrl = $urls['isp'];
- $view->geoIPOrgUrl = $urls['org'];
- $view->geoIPUpdatePeriod = GeoIPAutoUpdater::getSchedulePeriod();
-
- $view->geoLiteUrl = GeoIp::GEO_LITE_URL;
- $view->geoLiteFilename = 'GeoLiteCity.dat';
- $view->nextRunTime = GeoIPAutoUpdater::getNextRunTime();
-
- $lastRunTime = GeoIPAutoUpdater::getLastRunTime();
- }
-
- if ($lastRunTime !== false) {
- $view->lastTimeUpdaterRun = '<strong>' . $lastRunTime->toString() . '</strong>';
- }
- }
-
- /**
- * Sets the URLs used to download new versions of the installed GeoIP databases.
- *
- * Input (query params):
- * 'loc_db' - URL for a GeoIP location database.
- * 'isp_db' - URL for a GeoIP ISP database (optional).
- * 'org_db' - URL for a GeoIP Org database (optional).
- * 'period' - 'weekly' or 'monthly'. Determines how often update is run.
- *
- * Output (json):
- * 'error' - if an error occurs its message is set as the resulting JSON object's
- * 'error' property.
- */
- public function updateGeoIPLinks()
- {
- $this->dieIfGeolocationAdminIsDisabled();
- Piwik::checkUserHasSuperUserAccess();
- if ($_SERVER["REQUEST_METHOD"] == "POST") {
- Json::sendHeaderJSON();
- try {
- $this->checkTokenInUrl();
-
- if ($this->isGeoIp2Enabled()) {
- GeoIP2AutoUpdater::setUpdaterOptionsFromUrl();
- } else {
- GeoIPAutoUpdater::setUpdaterOptionsFromUrl();
- }
-
- // if there is a updater URL for a database, but its missing from the misc dir, tell
- // the browser so it can download it next
- $info = $this->getNextMissingDbUrlInfo();
- if ($info !== false) {
- return json_encode($info);
- } else {
- $view = new View("@UserCountry/_updaterNextRunTime");
- if ($this->isGeoIp2Enabled()) {
- $view->nextRunTime = GeoIP2AutoUpdater::getNextRunTime();
- } else {
- $view->nextRunTime = GeoIPAutoUpdater::getNextRunTime();
- }
- $nextRunTimeHtml = $view->render();
- return json_encode(array('nextRunTime' => $nextRunTimeHtml));
- }
- } catch (Exception $ex) {
- return json_encode(array('error' => $ex->getMessage()));
- }
- }
- }
-
- /**
- * Starts or continues a download for a missing GeoIP database. A database is missing if
- * it has an update URL configured, but the actual database is not available in the misc
- * directory.
- *
- * Input:
- * 'url' - The URL to download the database from.
- * 'continue' - 1 if we're continuing a download, 0 if we're starting one.
- *
- * Output:
- * 'error' - If an error occurs this describes the error.
- * 'to_download' - The URL of a missing database that should be downloaded next (if any).
- * 'to_download_label' - The label to use w/ the progress bar that describes what we're
- * downloading.
- * 'current_size' - Size of the current file on disk.
- * 'expected_file_size' - Size of the completely downloaded file.
- */
- public function downloadMissingGeoIpDb()
- {
- $this->dieIfGeolocationAdminIsDisabled();
- Piwik::checkUserHasSuperUserAccess();
- if ($_SERVER["REQUEST_METHOD"] == "POST") {
- try {
- $this->checkTokenInUrl();
-
- Json::sendHeaderJSON();
-
- // based on the database type (provided by the 'key' query param) determine the
- // url & output file name
- $key = Common::getRequestVar('key', null, 'string');
-
- if ($this->isGeoIp2Enabled()) {
- $url = GeoIP2AutoUpdater::getConfiguredUrl($key);
- $filename = GeoIP2AutoUpdater::getZippedFilenameToDownloadTo($url, $key, GeoIP2AutoUpdater::getGeoIPUrlExtension($url));
- $outputPath = GeoIp2::getPathForGeoIpDatabase($filename);
- } else {
- $url = GeoIPAutoUpdater::getConfiguredUrl($key);
- $ext = GeoIPAutoUpdater::getGeoIPUrlExtension($url);
- $filename = GeoIp::$dbNames[$key][0] . '.' . $ext;
-
- if (substr($filename, 0, 15) == 'GeoLiteCity.dat') {
- $filename = 'GeoIPCity.dat' . substr($filename, 15);
- }
- $outputPath = GeoIp::getPathForGeoIpDatabase($filename);
- }
-
- // download part of the file
- $result = Http::downloadChunk(
- $url, $outputPath, Common::getRequestVar('continue', true, 'int'));
-
- // if the file is done
- if ($result['current_size'] >= $result['expected_file_size']) {
- if ($this->isGeoIp2Enabled()) {
- GeoIP2AutoUpdater::unzipDownloadedFile($outputPath, $key, $url, $unlink = true);
- } else {
- GeoIPAutoUpdater::unzipDownloadedFile($outputPath, $unlink = true);
- }
-
- $info = $this->getNextMissingDbUrlInfo();
- if ($info !== false) {
- return json_encode($info);
- }
- }
-
- return json_encode($result);
- } catch (Exception $ex) {
- return json_encode(array('error' => $ex->getMessage()));
- }
- }
- }
-
- /**
* Echo's a pretty formatted location using a specific LocationProvider.
*
* Input:
@@ -402,6 +82,9 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
*/
public function getLocationUsingProvider()
{
+ $this->dieIfGeolocationAdminIsDisabled();
+ Piwik::checkUserHasSuperUserAccess();
+
$providerId = Common::getRequestVar('id');
$provider = LocationProvider::getProviderById($providerId);
if (empty($provider)) {
@@ -429,63 +112,10 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
return $this->renderView($view);
}
- /**
- * Gets information for the first missing GeoIP database (if any).
- *
- * @return array|bool
- */
- private function getNextMissingDbUrlInfo()
- {
- if ($this->isGeoIp2Enabled()) {
- return $this->getNextMissingDbUrlInfoGeoIp2();
- }
-
- $missingDbs = GeoIPAutoUpdater::getMissingDatabases();
- if (!empty($missingDbs)) {
- $missingDbKey = $missingDbs[0];
- $url = GeoIPAutoUpdater::getConfiguredUrl($missingDbKey);
-
- $link = '<a href="' . $url . '">' . $url . '</a>';
-
- return array(
- 'to_download' => $missingDbKey,
- 'to_download_label' => Piwik::translate('UserCountry_DownloadingDb', $link) . '...',
- );
- }
- return false;
- }
-
- /**
- * Gets information for the first missing GeoIP2 database (if any).
- *
- * @return array|bool
- */
- private function getNextMissingDbUrlInfoGeoIp2()
- {
- $missingDbs = GeoIP2AutoUpdater::getMissingDatabases();
- if (!empty($missingDbs)) {
- $missingDbKey = $missingDbs[0];
- $url = GeoIP2AutoUpdater::getConfiguredUrl($missingDbKey);
-
- $link = '<a href="' . $url . '">' . $url . '</a>';
-
- return array(
- 'to_download' => $missingDbKey,
- 'to_download_label' => Piwik::translate('UserCountry_DownloadingDb', $link) . '...',
- );
- }
- return false;
- }
-
private function dieIfGeolocationAdminIsDisabled()
{
if (!UserCountry::isGeoLocationAdminEnabled()) {
throw new \Exception('Geo location setting page has been disabled.');
}
}
-
- private function isGeoIp2Enabled()
- {
- return Manager::getInstance()->isPluginActivated('GeoIp2');
- }
}
diff --git a/plugins/UserCountry/Diagnostic/GeolocationDiagnostic.php b/plugins/UserCountry/Diagnostic/GeolocationDiagnostic.php
index 15e502dfa9..18fe451100 100644
--- a/plugins/UserCountry/Diagnostic/GeolocationDiagnostic.php
+++ b/plugins/UserCountry/Diagnostic/GeolocationDiagnostic.php
@@ -44,7 +44,6 @@ class GeolocationDiagnostic implements Diagnostic
$allProviders = LocationProvider::getAllProviderInfo();
$isNotRecommendedProvider = in_array($currentProviderId, array(
LocationProvider\DefaultProvider::ID,
- LocationProvider\GeoIp\ServerBased::ID,
GeoIp2\ServerModule::ID));
$isProviderInstalled = (isset($allProviders[$currentProviderId]['status']) && $allProviders[$currentProviderId]['status'] == LocationProvider::INSTALLED);
@@ -53,8 +52,8 @@ class GeolocationDiagnostic implements Diagnostic
}
if ($isProviderInstalled) {
- $comment = $this->translator->translate('UserCountry_GeoIpLocationProviderNotRecomnended') . ' ';
- $message = Manager::getInstance()->isPluginActivated('GeoIp2') ? 'GeoIp2_LocationProviderDesc_ServerModule2' : 'UserCountry_GeoIpLocationProviderDesc_ServerBased2';
+ $comment = $this->translator->translate('GeoIp2_GeoIPLocationProviderNotRecommended') . ' ';
+ $message = 'GeoIp2_LocationProviderDesc_ServerModule2';
$comment .= $this->translator->translate($message, array(
'<a href="https://matomo.org/docs/geo-locate/" rel="noreferrer noopener" target="_blank">', '', '', '</a>'
));
diff --git a/plugins/UserCountry/GeoIPAutoUpdater.php b/plugins/UserCountry/GeoIPAutoUpdater.php
deleted file mode 100644
index bee89ac8fd..0000000000
--- a/plugins/UserCountry/GeoIPAutoUpdater.php
+++ /dev/null
@@ -1,731 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\UserCountry;
-
-require_once PIWIK_INCLUDE_PATH . "/core/ScheduledTask.php"; // for the tracker which doesn't include this file
-
-use Exception;
-use Piwik\Common;
-use Piwik\Container\StaticContainer;
-use Piwik\Date;
-use Piwik\Http;
-use Piwik\Log;
-use Piwik\Option;
-use Piwik\Piwik;
-use Piwik\Plugins\UserCountry\LocationProvider\GeoIp\Php;
-use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
-use Piwik\Plugins\UserCountry\LocationProvider;
-use Piwik\Scheduler\Scheduler;
-use Piwik\Scheduler\Task;
-use Piwik\Scheduler\Timetable;
-use Piwik\Scheduler\Schedule\Monthly;
-use Piwik\Scheduler\Schedule\Weekly;
-use Piwik\SettingsPiwik;
-use Piwik\Unzip;
-use Psr\Log\LoggerInterface;
-
-/**
- * Used to automatically update installed GeoIP databases, and manages the updater's
- * scheduled task.
- */
-class GeoIPAutoUpdater extends Task
-{
- const SCHEDULE_PERIOD_MONTHLY = 'month';
- const SCHEDULE_PERIOD_WEEKLY = 'week';
-
- const SCHEDULE_PERIOD_OPTION_NAME = 'geoip.updater_period';
- const LOC_URL_OPTION_NAME = 'geoip.loc_db_url';
- const ISP_URL_OPTION_NAME = 'geoip.isp_db_url';
- const ORG_URL_OPTION_NAME = 'geoip.org_db_url';
-
- const LAST_RUN_TIME_OPTION_NAME = 'geoip.updater_last_run_time';
-
- private static $urlOptions = array(
- 'loc' => self::LOC_URL_OPTION_NAME,
- 'isp' => self::ISP_URL_OPTION_NAME,
- 'org' => self::ORG_URL_OPTION_NAME,
- );
-
- /**
- * PHP Error caught through a custom error handler while trying to use a downloaded
- * GeoIP database. See catchGeoIPError for more info.
- *
- * @var array
- */
- private static $unzipPhpError = null;
-
- /**
- * Constructor.
- */
- public function __construct()
- {
- if (!SettingsPiwik::isInternetEnabled()) {
- // no automatic updates possible if no internet available
- return;
- }
-
- $schedulePeriodStr = self::getSchedulePeriod();
-
- // created the scheduledtime instance, also, since GeoIP updates are done on tuesdays,
- // get new DBs on Wednesday
- switch ($schedulePeriodStr) {
- case self::SCHEDULE_PERIOD_WEEKLY:
- $schedulePeriod = new Weekly();
- $schedulePeriod->setDay(3);
- break;
- case self::SCHEDULE_PERIOD_MONTHLY:
- default:
- $schedulePeriod = new Monthly();
- $schedulePeriod->setDayOfWeek(3, 0);
- break;
- }
-
- parent::__construct($this, 'update', null, $schedulePeriod, Task::LOWEST_PRIORITY);
- }
-
- /**
- * Attempts to download new location, ISP & organization GeoIP databases and
- * replace the existing ones w/ them.
- */
- public function update()
- {
- try {
- Option::set(self::LAST_RUN_TIME_OPTION_NAME, Date::factory('today')->getTimestamp());
-
- $locUrl = Option::get(self::LOC_URL_OPTION_NAME);
- if (!empty($locUrl)) {
- $this->downloadFile('loc', $locUrl);
- }
-
- $ispUrl = Option::get(self::ISP_URL_OPTION_NAME);
- if (!empty($ispUrl)) {
- $this->downloadFile('isp', $ispUrl);
- }
-
- $orgUrl = Option::get(self::ORG_URL_OPTION_NAME);
- if (!empty($orgUrl)) {
- $this->downloadFile('org', $orgUrl);
- }
- } catch (Exception $ex) {
- // message will already be prefixed w/ 'GeoIPAutoUpdater: '
- StaticContainer::get(LoggerInterface::class)->error('Auto-update failed: {exception}', [
- 'exception' => $ex,
- 'ignoreInScreenWriter' => true,
- ]);
- $this->performRedundantDbChecks();
- throw $ex;
- }
-
- $this->performRedundantDbChecks();
- }
-
- /**
- * Downloads a GeoIP database archive, extracts the .dat file and overwrites the existing
- * old database.
- *
- * If something happens that causes the download to fail, no exception is thrown, but
- * an error is logged.
- *
- * @param string $dbType
- * @param string $url URL to the database to download. The type of database is determined
- * from this URL.
- * @throws Exception
- */
- protected function downloadFile($dbType, $url)
- {
- $url = trim($url);
-
- if (strpos($url, 'GeoLite')) {
- Log::info('GeoLite databases have been discontinued. Skipping download of '.$url.'. Consider switching to GeoIP 2.');
- return;
- }
-
- $ext = GeoIPAutoUpdater::getGeoIPUrlExtension($url);
-
- // NOTE: using the first item in $dbNames[$dbType] makes sure GeoLiteCity will be renamed to GeoIPCity
- $zippedFilename = GeoIp::$dbNames[$dbType][0] . '.' . $ext;
-
- $zippedOutputPath = GeoIp::getPathForGeoIpDatabase($zippedFilename);
-
- $url = self::removeDateFromUrl($url);
-
- // download zipped file to misc dir
- try {
- $success = Http::sendHttpRequest($url, $timeout = 3600, $userAgent = null, $zippedOutputPath);
- } catch (Exception $ex) {
- throw new Exception("GeoIPAutoUpdater: failed to download '$url' to "
- . "'$zippedOutputPath': " . $ex->getMessage());
- }
-
- if ($success !== true) {
- throw new Exception("GeoIPAutoUpdater: failed to download '$url' to "
- . "'$zippedOutputPath'! (Unknown error)");
- }
-
- Log::info("GeoIPAutoUpdater: successfully downloaded '%s'", $url);
-
- try {
- self::unzipDownloadedFile($zippedOutputPath, $unlink = true);
- } catch (Exception $ex) {
- throw new Exception("GeoIPAutoUpdater: failed to unzip '$zippedOutputPath' after "
- . "downloading " . "'$url': " . $ex->getMessage());
- }
-
- Log::info("GeoIPAutoUpdater: successfully updated GeoIP database '%s'", $url);
- }
-
- /**
- * Unzips a downloaded GeoIP database. Only unzips .gz & .tar.gz files.
- *
- * @param string $path Path to zipped file.
- * @param bool $unlink Whether to unlink archive or not.
- * @throws Exception
- */
- public static function unzipDownloadedFile($path, $unlink = false)
- {
- $parts = explode('.', basename($path));
- $filenameStart = $parts[0];
-
- $dbFilename = $filenameStart . '.dat';
- $tempFilename = $filenameStart . '.dat.new';
- $outputPath = GeoIp::getPathForGeoIpDatabase($tempFilename);
-
- // extract file
- if (substr($path, -7, 7) == '.tar.gz') {
- // find the .dat file in the tar archive
- $unzip = Unzip::factory('tar.gz', $path);
- $content = $unzip->listContent();
-
- if (empty($content)) {
- throw new Exception(Piwik::translate('UserCountry_CannotListContent',
- array("'$path'", $unzip->errorInfo())));
- }
-
- $datFile = null;
- foreach ($content as $info) {
- $archivedPath = $info['filename'];
- if (basename($archivedPath) === $dbFilename) {
- $datFile = $archivedPath;
- }
- }
-
- if ($datFile === null) {
- throw new Exception(Piwik::translate('UserCountry_CannotFindGeoIPDatabaseInArchive',
- array($dbFilename, "'$path'")));
- }
-
- // extract JUST the .dat file
- $unzipped = $unzip->extractInString($datFile);
-
- if (empty($unzipped)) {
- throw new Exception(Piwik::translate('UserCountry_CannotUnzipDatFile',
- array("'$path'", $unzip->errorInfo())));
- }
-
- // write unzipped to file
- $fd = fopen($outputPath, 'wb');
- fwrite($fd, $unzipped);
- fclose($fd);
- } else if (substr($path, -3, 3) == '.gz') {
- $unzip = Unzip::factory('gz', $path);
- $success = $unzip->extract($outputPath);
-
- if ($success !== true) {
- throw new Exception(Piwik::translate('UserCountry_CannotUnzipDatFile',
- array("'$path'", $unzip->errorInfo())));
- }
- } else {
- $ext = end(explode(basename($path), '.', 2));
- throw new Exception(Piwik::translate('UserCountry_UnsupportedArchiveType', "'$ext'"));
- }
-
- try {
- // test that the new archive is a valid GeoIP database
- $dbType = GeoIp::getGeoIPDatabaseTypeFromFilename($dbFilename);
- if ($dbType === false) // sanity check
- {
- throw new Exception("Unexpected GeoIP archive file name '$path'.");
- }
-
- $customDbNames = array(
- 'loc' => array(),
- 'isp' => array(),
- 'org' => array()
- );
- $customDbNames[$dbType] = array($tempFilename);
-
- $phpProvider = new Php($customDbNames);
-
- $location = self::getTestLocationCatchPhpErrors($phpProvider);
-
- if (empty($location)
- || self::$unzipPhpError !== null
- ) {
- if (self::$unzipPhpError !== null) {
- list($errno, $errstr, $errfile, $errline) = self::$unzipPhpError;
- Log::info("GeoIPAutoUpdater: Encountered PHP error when testing newly downloaded" .
- " GeoIP database: %s: %s on line %s of %s.", $errno, $errstr, $errline, $errfile);
- }
-
- throw new Exception(Piwik::translate('UserCountry_ThisUrlIsNotAValidGeoIPDB'));
- }
-
- // delete the existing GeoIP database (if any) and rename the downloaded file
- $oldDbFile = GeoIp::getPathForGeoIpDatabase($dbFilename);
- if (file_exists($oldDbFile)) {
- unlink($oldDbFile);
- }
-
- $tempFile = GeoIp::getPathForGeoIpDatabase($tempFilename);
- if (@rename($tempFile, $oldDbFile) !== true) {
- //In case the $tempfile cannot be renamed, we copy the file.
- copy($tempFile, $oldDbFile);
- unlink($tempFile);
- }
-
- // delete original archive
- if ($unlink) {
- unlink($path);
- }
- } catch (Exception $ex) {
- // remove downloaded files
- if (file_exists($outputPath)) {
- unlink($outputPath);
- }
- unlink($path);
-
- throw $ex;
- }
- }
-
- /**
- * Sets the options used by this class based on query parameter values.
- *
- * See setUpdaterOptions for query params used.
- */
- public static function setUpdaterOptionsFromUrl()
- {
- $options = array(
- 'loc' => Common::getRequestVar('loc_db', false, 'string'),
- 'isp' => Common::getRequestVar('isp_db', false, 'string'),
- 'org' => Common::getRequestVar('org_db', false, 'string'),
- 'period' => Common::getRequestVar('period', false, 'string'),
- );
-
- foreach (self::$urlOptions as $optionKey => $optionName) {
- $options[$optionKey] = Common::unsanitizeInputValue($options[$optionKey]); // URLs should not be sanitized
- }
-
- self::setUpdaterOptions($options);
- }
-
- /**
- * Sets the options used by this class based on the elements in $options.
- *
- * The following elements of $options are used:
- * 'loc' - URL for location database.
- * 'isp' - URL for ISP database.
- * 'org' - URL for Organization database.
- * 'period' - 'weekly' or 'monthly'. When to run the updates.
- *
- * @param array $options
- * @throws Exception
- */
- public static function setUpdaterOptions($options)
- {
- // set url options
- foreach (self::$urlOptions as $optionKey => $optionName) {
- if (!isset($options[$optionKey])) {
- continue;
- }
-
- $url = $options[$optionKey];
- $url = self::removeDateFromUrl($url);
-
- Option::set($optionName, $url);
- }
-
- // set period option
- if (!empty($options['period'])) {
- $period = $options['period'];
-
- if ($period != self::SCHEDULE_PERIOD_MONTHLY
- && $period != self::SCHEDULE_PERIOD_WEEKLY
- ) {
- throw new Exception(Piwik::translate(
- 'UserCountry_InvalidGeoIPUpdatePeriod',
- array("'$period'", "'" . self::SCHEDULE_PERIOD_MONTHLY . "', '" . self::SCHEDULE_PERIOD_WEEKLY . "'")
- ));
- }
-
- Option::set(self::SCHEDULE_PERIOD_OPTION_NAME, $period);
-
- /** @var Scheduler $scheduler */
- $scheduler = StaticContainer::getContainer()->get('Piwik\Scheduler\Scheduler');
-
- $scheduler->rescheduleTaskAndRunTomorrow(new GeoIPAutoUpdater());
- }
- }
-
- /**
- * Removes all options to disable any configured automatic updates
- */
- public static function clearOptions()
- {
- foreach (self::$urlOptions as $optionKey => $optionName) {
- Option::delete($optionName);
- }
- Option::delete(self::SCHEDULE_PERIOD_OPTION_NAME);
- }
-
- /**
- * Returns true if the auto-updater is setup to update at least one type of
- * database. False if otherwise.
- *
- * @return bool
- */
- public static function isUpdaterSetup()
- {
- if (Option::get(self::LOC_URL_OPTION_NAME) !== false
- || Option::get(self::ISP_URL_OPTION_NAME) !== false
- || Option::get(self::ORG_URL_OPTION_NAME) !== false
- ) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Retrieves the URLs used to update various GeoIP database files.
- *
- * @return array
- */
- public static function getConfiguredUrls()
- {
- $result = array();
- foreach (self::$urlOptions as $key => $optionName) {
- $result[$key] = Option::get($optionName);
- }
- return $result;
- }
-
- /**
- * Returns the confiured URL (if any) for a type of database.
- *
- * @param string $key 'loc', 'isp' or 'org'
- * @throws Exception
- * @return string|false
- */
- public static function getConfiguredUrl($key)
- {
- if (empty(self::$urlOptions[$key])) {
- throw new Exception("Invalid key $key");
- }
- $url = Option::get(self::$urlOptions[$key]);
- return $url;
- }
-
- /**
- * Performs a GeoIP database update.
- */
- public static function performUpdate()
- {
- $instance = new GeoIPAutoUpdater();
- $instance->update();
- }
-
- /**
- * Returns the configured update period, either 'week' or 'month'. Defaults to
- * 'month'.
- *
- * @return string
- */
- public static function getSchedulePeriod()
- {
- $period = Option::get(self::SCHEDULE_PERIOD_OPTION_NAME);
- if ($period === false) {
- $period = self::SCHEDULE_PERIOD_MONTHLY;
- }
- return $period;
- }
-
- /**
- * Returns an array of strings for GeoIP databases that have update URLs configured, but
- * are not present in the misc directory. Each string is a key describing the type of
- * database (ie, 'loc', 'isp' or 'org').
- *
- * @return array
- */
- public static function getMissingDatabases()
- {
- $result = array();
- foreach (self::getConfiguredUrls() as $key => $url) {
- if (!empty($url)) {
- // if a database of the type does not exist, but there's a url to update, then
- // a database is missing
- $path = GeoIp::getPathToGeoIpDatabase(
- GeoIp::$dbNames[$key]);
- if ($path === false) {
- $result[] = $key;
- }
- }
- }
- return $result;
- }
-
- /**
- * Returns the extension of a URL used to update a GeoIP database, if it can be found.
- */
- public static function getGeoIPUrlExtension($url)
- {
- // check for &suffix= query param that is special to MaxMind URLs
- if (preg_match('/suffix=([^&]+)/', $url, $matches)) {
- $ext = $matches[1];
- } else {
- // use basename of url
- $filenameParts = explode('.', basename($url), 2);
- if (count($filenameParts) > 1) {
- $ext = end($filenameParts);
- } else {
- $ext = reset($filenameParts);
- }
- }
-
- self::checkForSupportedArchiveType($ext);
-
- return $ext;
- }
-
- /**
- * Avoid downloading archive types we don't support. No point in downloading it,
- * if we can't unzip it...
- *
- * @param string $ext The URL file's extension.
- * @throws \Exception
- */
- private static function checkForSupportedArchiveType($ext)
- {
- if ($ext != 'tar.gz'
- && $ext != 'gz'
- && $ext != 'dat.gz'
- && $ext != 'mmdb.gz'
- ) {
- throw new \Exception(Piwik::translate('UserCountry_UnsupportedArchiveType', "'$ext'"));
- }
- }
-
- /**
- * Tests a location provider using a test IP address and catches PHP errors
- * (ie, notices) if they occur. PHP error information is held in self::$unzipPhpError.
- *
- * @param LocationProvider $provider The provider to test.
- * @return array|false $location The result of geolocation. False if no location
- * can be found.
- */
- private static function getTestLocationCatchPhpErrors($provider)
- {
- // note: in most cases where this will fail, the error will usually be a PHP fatal error/notice.
- // in order to delete the files in such a case (which can be caused by a man-in-the-middle attack)
- // we need to catch them, so we set a new error handler.
- self::$unzipPhpError = null;
- set_error_handler(array('Piwik\Plugins\UserCountry\GeoIPAutoUpdater', 'catchGeoIPError'));
-
- $location = $provider->getLocation(array('ip' => GeoIp::TEST_IP));
-
- restore_error_handler();
-
- return $location;
- }
-
- /**
- * Utility function that checks if geolocation works with each installed database,
- * and if one or more doesn't, they are renamed to make sure tracking will work.
- * This is a safety measure used to make sure tracking isn't affected if strange
- * update errors occur.
- *
- * Databases are renamed to ${original}.broken .
- *
- * Note: method is protected for testability.
- *
- * @param $logErrors - only used to hide error logs during tests
- */
- protected function performRedundantDbChecks($logErrors = true)
- {
- $databaseTypes = array_keys(GeoIp::$dbNames);
-
- foreach ($databaseTypes as $type) {
- $customNames = array(
- 'loc' => array(),
- 'isp' => array(),
- 'org' => array()
- );
- $customNames[$type] = GeoIp::$dbNames[$type];
-
- // create provider that only uses the DB type we're testing
- $provider = new Php($customNames);
-
- // test the provider. on error, we rename the broken DB.
- self::getTestLocationCatchPhpErrors($provider);
- if (self::$unzipPhpError !== null) {
- list($errno, $errstr, $errfile, $errline) = self::$unzipPhpError;
-
- if ($logErrors) {
- StaticContainer::get(LoggerInterface::class)->error("GeoIPAutoUpdater: Encountered PHP error when performing redundant tests on GeoIP "
- . "{type} database: {errno}: {errstr} on line {errline} of {errfile}.", [
- 'ignoreInScreenWriter' => true,
- 'type' => $type,
- 'errno' => $errno,
- 'errstr' => $errstr,
- 'errline' => $errline,
- 'errfile' => $errfile,
- ]);
- }
-
- // get the current filename for the DB and an available new one to rename it to
- list($oldPath, $newPath) = $this->getOldAndNewPathsForBrokenDb($customNames[$type]);
-
- // rename the DB so tracking will not fail
- if ($oldPath !== false
- && $newPath !== false
- ) {
- if (file_exists($newPath)) {
- unlink($newPath);
- }
-
- rename($oldPath, $newPath);
- }
- }
- }
- }
-
- /**
- * Returns the path to a GeoIP database and a path to rename it to if it's broken.
- *
- * @param array $possibleDbNames The possible names of the database.
- * @return array Array with two elements, the path to the existing database, and
- * the path to rename it to if it is broken. The second will end
- * with something like .broken .
- */
- private function getOldAndNewPathsForBrokenDb($possibleDbNames)
- {
- $pathToDb = GeoIp::getPathToGeoIpDatabase($possibleDbNames);
- $newPath = false;
-
- if ($pathToDb !== false) {
- $newPath = $pathToDb . ".broken";
- }
-
- return array($pathToDb, $newPath);
- }
-
- /**
- * Custom PHP error handler used to catch any PHP errors that occur when
- * testing a downloaded GeoIP file.
- *
- * If we download a file that is supposed to be a GeoIP database, we need to make
- * sure it is one. This is done simply by attempting to use it. If this fails, it
- * will most of the time fail as a PHP error, which we catch w/ this function
- * after it is passed to set_error_handler.
- *
- * The PHP error is stored in self::$unzipPhpError.
- *
- * @param int $errno
- * @param string $errstr
- * @param string $errfile
- * @param int $errline
- */
- public static function catchGeoIPError($errno, $errstr, $errfile, $errline)
- {
- self::$unzipPhpError = array($errno, $errstr, $errfile, $errline);
- }
-
- /**
- * Returns the time the auto updater was last run.
- *
- * @return Date|false
- */
- public static function getLastRunTime()
- {
- $timestamp = Option::get(self::LAST_RUN_TIME_OPTION_NAME);
- return $timestamp === false ? false : Date::factory((int)$timestamp);
- }
-
- /**
- * Removes the &date=... query parameter if present in the URL. This query parameter
- * is in MaxMind URLs by default and will force the download of an old database.
- *
- * @param string $url
- * @return string
- */
- private static function removeDateFromUrl($url)
- {
- return preg_replace("/&date=[^&#]*/", '', $url);
- }
-
- /**
- * Returns the next scheduled time for the auto updater.
- *
- * @return Date|false
- */
- public static function getNextRunTime()
- {
- $task = new GeoIPAutoUpdater();
-
- $timetable = new Timetable();
- return $timetable->getScheduledTaskTime($task->getName());
- }
-
- /**
- * See {@link Piwik\Scheduler\Schedule\Schedule::getRescheduledTime()}.
- */
- public function getRescheduledTime()
- {
- $nextScheduledTime = parent::getRescheduledTime();
-
- // if a geoip database is out of date, run the updater as soon as possible
- if ($this->isAtLeastOneGeoIpDbOutOfDate($nextScheduledTime)) {
- return time();
- }
-
- return $nextScheduledTime;
- }
-
- private function isAtLeastOneGeoIpDbOutOfDate($rescheduledTime)
- {
- $previousScheduledRuntime = $this->getPreviousScheduledTime($rescheduledTime)->setTime("00:00:00")->getTimestamp();
-
- foreach (GeoIp::$dbNames as $type => $dbNames) {
- $dbUrl = Option::get(self::$urlOptions[$type]);
- $dbPath = GeoIp::getPathToGeoIpDatabase($dbNames);
-
- // if there is a URL for this DB type and the GeoIP DB file's last modified time is before
- // the time the updater should have been previously run, then **the file is out of date**
- if (!empty($dbUrl)
- && filemtime($dbPath) < $previousScheduledRuntime
- ) {
- return true;
- }
- }
-
- return false;
- }
-
- private function getPreviousScheduledTime($rescheduledTime)
- {
- $updaterPeriod = self::getSchedulePeriod();
-
- if ($updaterPeriod == self::SCHEDULE_PERIOD_WEEKLY) {
- return Date::factory($rescheduledTime)->subWeek(1);
- } else if ($updaterPeriod == self::SCHEDULE_PERIOD_MONTHLY) {
- return Date::factory($rescheduledTime)->subMonth(1);
- }
- throw new Exception("Unknown GeoIP updater period found in database: %s", $updaterPeriod);
- }
-}
diff --git a/plugins/UserCountry/LocationProvider.php b/plugins/UserCountry/LocationProvider.php
index bd0ca86ff6..106ec0afed 100644
--- a/plugins/UserCountry/LocationProvider.php
+++ b/plugins/UserCountry/LocationProvider.php
@@ -144,6 +144,26 @@ abstract class LocationProvider
abstract public function getSupportedLocationInfo();
/**
+ * Renders Configuration or Setup View to be attached to the provider list
+ *
+ * @return string
+ */
+ public function renderConfiguration()
+ {
+ return '';
+ }
+
+ /**
+ * Renders SetUp Guide, which will be shown above Geolocation admin, if there is no working provider
+ *
+ * @return string
+ */
+ public function renderSetUpGuide()
+ {
+ return '';
+ }
+
+ /**
* Method called when a provider gets activated.
*/
public function activate()
@@ -498,9 +518,9 @@ abstract class LocationProvider
*/
protected function getIpFromInfo($info)
{
- $ip = \Piwik\Network\IP::fromStringIP($info['ip']);
+ $ip = \Matomo\Network\IP::fromStringIP($info['ip']);
- if ($ip instanceof \Piwik\Network\IPv6 && $ip->isMappedIPv4()) {
+ if ($ip instanceof \Matomo\Network\IPv6 && $ip->isMappedIPv4()) {
return $ip->toIPv4String();
} else {
return $ip->toString();
diff --git a/plugins/UserCountry/LocationProvider/GeoIp.php b/plugins/UserCountry/LocationProvider/GeoIp.php
deleted file mode 100644
index 44d0567634..0000000000
--- a/plugins/UserCountry/LocationProvider/GeoIp.php
+++ /dev/null
@@ -1,254 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\UserCountry\LocationProvider;
-
-use Exception;
-use Piwik\Piwik;
-use Piwik\Plugin\Manager;
-use Piwik\Plugins\UserCountry\LocationProvider;
-
-/**
- * Base type for all GeoIP LocationProviders.
- *
- */
-abstract class GeoIp extends LocationProvider
-{
- /* For testing, use: 'http://piwik-team.s3.amazonaws.com/GeoLiteCity.dat.gz' */
- const GEO_LITE_URL = 'http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz';
- const TEST_IP = '194.57.91.215';
-
- public static $geoIPDatabaseDir = 'misc';
-
- /**
- * Stores possible database file names categorized by the type of information
- * GeoIP databases hold.
- *
- * @var array
- */
- public static $dbNames = array(
- 'loc' => array('GeoIPCity.dat', 'GeoLiteCity.dat', 'GeoIP.dat'),
- 'isp' => array('GeoIPISP.dat'),
- 'org' => array('GeoIPOrg.dat'),
- );
-
- /**
- * Cached region name array. Data is from geoipregionvars.php.
- *
- * @var array
- */
- private static $regionNames = null;
-
- /**
- * Attempts to fill in some missing information in a GeoIP location.
- *
- * This method will call LocationProvider::completeLocationResult and then
- * try to set the region name of the location if the country code & region
- * code are set.
- *
- * @param array $location The location information to modify.
- */
- public function completeLocationResult(&$location)
- {
- parent::completeLocationResult($location);
-
- // set region name if region code is set
- if (empty($location[self::REGION_NAME_KEY])
- && !empty($location[self::REGION_CODE_KEY])
- && !empty($location[self::COUNTRY_CODE_KEY])
- ) {
- $countryCode = $location[self::COUNTRY_CODE_KEY];
- $regionCode = (string)$location[self::REGION_CODE_KEY];
- $location[self::REGION_NAME_KEY] = self::getRegionNameFromCodes($countryCode, $regionCode);
- }
- }
-
- public function isVisible()
- {
- return !Manager::getInstance()->isPluginActivated('GeoIp2') || self::getCurrentProvider() instanceof GeoIp;
- }
-
- /**
- * Returns true if this provider has been setup correctly, the error message if
- * otherwise.
- *
- * @return bool|string
- */
- public function isWorking()
- {
- // test with an example IP to make sure the provider is working
- // NOTE: At the moment only country, region & city info is tested.
- try {
- $supportedInfo = $this->getSupportedLocationInfo();
-
- list($testIp, $expectedResult) = self::getTestIpAndResult();
-
- // get location using test IP
- $location = $this->getLocation(array('ip' => $testIp));
-
- // check that result is the same as expected
- $isResultCorrect = true;
- foreach ($expectedResult as $key => $value) {
- // if this provider is not configured to support this information type, skip it
- if (empty($supportedInfo[$key])) {
- continue;
- }
-
- if (empty($location[$key])
- || $location[$key] != $value
- ) {
- $isResultCorrect = false;
- }
- }
-
- if (!$isResultCorrect) {
- $unknown = Piwik::translate('General_Unknown');
-
- $location = "'"
- . (empty($location[self::CITY_NAME_KEY]) ? $unknown : $location[self::CITY_NAME_KEY])
- . ", "
- . (empty($location[self::REGION_CODE_KEY]) ? $unknown : $location[self::REGION_CODE_KEY])
- . ", "
- . (empty($location[self::COUNTRY_CODE_KEY]) ? $unknown : $location[self::COUNTRY_CODE_KEY])
- . "'";
-
- $expectedLocation = "'" . $expectedResult[self::CITY_NAME_KEY] . ", "
- . $expectedResult[self::REGION_CODE_KEY] . ", "
- . $expectedResult[self::COUNTRY_CODE_KEY] . "'";
-
- $bind = array($testIp, $location, $expectedLocation);
- return Piwik::translate('UserCountry_TestIPLocatorFailed', $bind);
- }
-
- return true;
- } catch (Exception $ex) {
- return $ex->getMessage();
- }
- }
-
- /**
- * Returns a region name for a country code + region code.
- *
- * @param string $countryCode
- * @param string $regionCode
- * @return string The region name or 'Unknown' (translated).
- */
- public static function getRegionNameFromCodes($countryCode, $regionCode)
- {
- $regionNames = self::getRegionNames();
-
- $countryCode = strtoupper($countryCode);
- $regionCode = strtoupper($regionCode);
-
- // ensure tibet is shown as region of china
- if ($countryCode == 'TI' && $regionCode == '1') {
- $regionCode = '14';
- $countryCode = 'CN';
- }
-
- if (isset($regionNames[$countryCode][$regionCode])) {
- return $regionNames[$countryCode][$regionCode];
- } else {
- return Piwik::translate('General_Unknown');
- }
- }
-
- /**
- * Returns an array of region names mapped by country code & region code.
- *
- * @return array
- */
- public static function getRegionNames()
- {
- if (is_null(self::$regionNames)) {
- $GEOIP_REGION_NAME = array();
- require_once PIWIK_INCLUDE_PATH . '/libs/MaxMindGeoIP/geoipregionvars.php';
- self::$regionNames = $GEOIP_REGION_NAME;
- }
-
- return self::$regionNames;
- }
-
- /**
- * Returns the path of an existing GeoIP database or false if none can be found.
- *
- * @param array $possibleFileNames The list of possible file names for the GeoIP database.
- * @return string|false
- */
- public static function getPathToGeoIpDatabase($possibleFileNames)
- {
- foreach ($possibleFileNames as $filename) {
- $path = self::getPathForGeoIpDatabase($filename);
- if (file_exists($path)) {
- return $path;
- }
- }
- return false;
- }
-
- /**
- * Returns full path for a GeoIP database managed by Piwik.
- *
- * @param string $filename Name of the .dat file.
- * @return string
- */
- public static function getPathForGeoIpDatabase($filename)
- {
- return PIWIK_INCLUDE_PATH . '/' . self::$geoIPDatabaseDir . '/' . $filename;
- }
-
- /**
- * Returns test IP used by isWorking and expected result.
- *
- * @return array eg. array('1.2.3.4', array(self::COUNTRY_CODE_KEY => ...))
- */
- private static function getTestIpAndResult()
- {
- static $result = null;
- if (is_null($result)) {
- // TODO: what happens when IP changes? should we get this information from piwik.org?
- $expected = array(self::COUNTRY_CODE_KEY => 'FR',
- self::REGION_CODE_KEY => 'A6',
- self::CITY_NAME_KEY => 'Besançon');
- $result = array(self::TEST_IP, $expected);
- }
- return $result;
- }
-
- /**
- * Returns true if there is a GeoIP database in the 'misc' directory.
- *
- * @return bool
- */
- public static function isDatabaseInstalled()
- {
- return self::getPathToGeoIpDatabase(self::$dbNames['loc'])
- || self::getPathToGeoIpDatabase(self::$dbNames['isp'])
- || self::getPathToGeoIpDatabase(self::$dbNames['org']);
- }
-
- /**
- * Returns the type of GeoIP database ('loc', 'isp' or 'org') based on the
- * filename (eg, 'GeoLiteCity.dat', 'GeoIPISP.dat', etc).
- *
- * @param string $filename
- * @return string|false 'loc', 'isp', 'org', or false if cannot find a database
- * type.
- */
- public static function getGeoIPDatabaseTypeFromFilename($filename)
- {
- foreach (self::$dbNames as $key => $names) {
- foreach ($names as $name) {
- if ($name === $filename) {
- return $key;
- }
- }
- }
- return false;
- }
-} \ No newline at end of file
diff --git a/plugins/UserCountry/LocationProvider/GeoIp/Pecl.php b/plugins/UserCountry/LocationProvider/GeoIp/Pecl.php
deleted file mode 100644
index 26f1591cf3..0000000000
--- a/plugins/UserCountry/LocationProvider/GeoIp/Pecl.php
+++ /dev/null
@@ -1,328 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
-
-use Piwik\Piwik;
-use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
-
-/**
- * A LocationProvider that uses the PECL implementation of GeoIP.
- *
- * FIXME: For some reason, if the PECL module is loaded & an organization DB is available, the PHP
- * module won't return organization info. If the PECL module is not loaded, organization info is returned.
- *
- */
-class Pecl extends GeoIp
-{
- const ID = 'geoip_pecl';
- const TITLE = 'GeoIP Legacy (PECL)';
-
- /**
- * For tests.
- */
- public static $forceDisable = false;
-
- /**
- * Uses the GeoIP PECL module to get a visitor's location based on their IP address.
- *
- * This function will return different results based on the data available. If a city
- * database can be detected by the PECL module, it may return the country code,
- * region code, city name, area code, latitude, longitude and postal code of the visitor.
- *
- * Alternatively, if only the country database can be detected, only the country code
- * will be returned.
- *
- * The GeoIP PECL module will detect the following filenames:
- * - GeoIP.dat
- * - GeoIPCity.dat
- * - GeoIPISP.dat
- * - GeoIPOrg.dat
- *
- * Note how GeoLiteCity.dat, the name for the GeoLite city database, is not detected
- * by the PECL module.
- *
- * @param array $info Must have an 'ip' field.
- * @return array
- */
- public function getLocation($info)
- {
- $ip = $this->getIpFromInfo($info);
-
- $result = array();
-
- // get location data
- if (self::isCityDatabaseAvailable()) {
- // Must hide errors because missing IPV6:
- $location = @geoip_record_by_name($ip);
- if (!empty($location)) {
- $result[self::COUNTRY_CODE_KEY] = $location['country_code'];
- $result[self::REGION_CODE_KEY] = $location['region'];
- $result[self::CITY_NAME_KEY] = utf8_encode($location['city']);
- $result[self::AREA_CODE_KEY] = $location['area_code'];
- $result[self::LATITUDE_KEY] = $location['latitude'];
- $result[self::LONGITUDE_KEY] = $location['longitude'];
- $result[self::POSTAL_CODE_KEY] = $location['postal_code'];
- }
- } else if (self::isRegionDatabaseAvailable()) {
- $location = @geoip_region_by_name($ip);
- if (!empty($location)) {
- $result[self::REGION_CODE_KEY] = $location['region'];
- $result[self::COUNTRY_CODE_KEY] = $location['country_code'];
- }
- } else {
- $result[self::COUNTRY_CODE_KEY] = @geoip_country_code_by_name($ip);
- }
-
- // get organization data if the org database is available
- if (self::isOrgDatabaseAvailable()) {
- $org = @geoip_org_by_name($ip);
- if ($org !== false) {
- $result[self::ORG_KEY] = utf8_encode($org);
- }
- }
-
- // get isp data if the isp database is available
- if (self::isISPDatabaseAvailable()) {
- $isp = @geoip_isp_by_name($ip);
- if ($isp !== false) {
- $result[self::ISP_KEY] = utf8_encode($isp);
- }
- }
-
- if (empty($result)) {
- return false;
- }
-
- $this->completeLocationResult($result);
- return $result;
- }
-
- /**
- * Returns true if the PECL module is installed and loaded, false if otherwise.
- *
- * @return bool
- */
- public function isAvailable()
- {
- return !self::$forceDisable && function_exists('geoip_db_avail');
- }
-
- /**
- * Returns true if the PECL module that is installed can be successfully used
- * to get the location of an IP address.
- *
- * @return bool
- */
- public function isWorking()
- {
- // if no no location database is available, this implementation is not setup correctly
- if (!self::isLocationDatabaseAvailable()) {
- $dbDir = dirname(geoip_db_filename(GEOIP_COUNTRY_EDITION)) . '/';
- $quotedDir = "'$dbDir'";
-
- // check if the directory the PECL module is looking for exists
- if (!is_dir($dbDir)) {
- return Piwik::translate('UserCountry_PeclGeoIPNoDBDir', array($quotedDir, "'geoip.custom_directory'"));
- }
-
- // check if the user named the city database GeoLiteCity.dat
- if (file_exists($dbDir . 'GeoLiteCity.dat')) {
- return Piwik::translate('UserCountry_PeclGeoLiteError',
- array($quotedDir, "'GeoLiteCity.dat'", "'GeoIPCity.dat'"));
- }
-
- return Piwik::translate('UserCountry_CannotFindPeclGeoIPDb',
- array($quotedDir, "'GeoIP.dat'", "'GeoIPCity.dat'"));
- }
-
- return parent::isWorking();
- }
-
- /**
- * Returns an array describing the types of location information this provider will
- * return.
- *
- * The location info this provider supports depends on what GeoIP databases it can
- * find.
- *
- * This provider will always support country & continent information.
- *
- * If a region database is found, then region code & name information will be
- * supported.
- *
- * If a city database is found, then region code, region name, city name,
- * area code, latitude, longitude & postal code are all supported.
- *
- * If an organization database is found, organization information is
- * supported.
- *
- * If an ISP database is found, ISP information is supported.
- *
- * @return array
- */
- public function getSupportedLocationInfo()
- {
- $result = array();
-
- // country & continent info always available
- $result[self::CONTINENT_CODE_KEY] = true;
- $result[self::CONTINENT_NAME_KEY] = true;
- $result[self::COUNTRY_CODE_KEY] = true;
- $result[self::COUNTRY_NAME_KEY] = true;
-
- if (self::isCityDatabaseAvailable()) {
- $result[self::REGION_CODE_KEY] = true;
- $result[self::REGION_NAME_KEY] = true;
- $result[self::CITY_NAME_KEY] = true;
- $result[self::AREA_CODE_KEY] = true;
- $result[self::LATITUDE_KEY] = true;
- $result[self::LONGITUDE_KEY] = true;
- $result[self::POSTAL_CODE_KEY] = true;
- } else if (self::isRegionDatabaseAvailable()) {
- $result[self::REGION_CODE_KEY] = true;
- $result[self::REGION_NAME_KEY] = true;
- }
-
- // check if organization info is available
- if (self::isOrgDatabaseAvailable()) {
- $result[self::ORG_KEY] = true;
- }
-
- // check if ISP info is available
- if (self::isISPDatabaseAvailable()) {
- $result[self::ISP_KEY] = true;
- }
-
- return $result;
- }
-
- /**
- * Returns information about this location provider. Contains an id, title & description:
- *
- * array(
- * 'id' => 'geoip_pecl',
- * 'title' => '...',
- * 'description' => '...'
- * );
- *
- * @return array
- */
- public function getInfo()
- {
- $desc = Piwik::translate('UserCountry_GeoIpLocationProviderDesc_Pecl1') . '<br/><br/>'
- . Piwik::translate('UserCountry_GeoIpLocationProviderDesc_Pecl2');
- $installDocs = '<a rel="noreferrer noopener" target="_blank" href="https://matomo.org/faq/how-to/#faq_164">'
- . Piwik::translate('UserCountry_HowToInstallGeoIpPecl')
- . '</a>';
-
- $extraMessage = false;
- if ($this->isAvailable()) {
- $peclDir = ini_get('geoip.custom_directory');
- if ($peclDir === false) {
- $extraMessage = Piwik::translate('UserCountry_GeoIPPeclCustomDirNotSet', "'geoip.custom_directory'");
- } else {
- $extraMessage = 'The \'geoip.custom_directory\' PHP ini option is set to \'' . $peclDir . '\'.';
- }
-
- $availableDatabaseTypes = array();
- if (self::isCityDatabaseAvailable()) {
- $availableDatabaseTypes[] = Piwik::translate('UserCountry_City');
- }
- if (self::isRegionDatabaseAvailable()) {
- $availableDatabaseTypes[] = Piwik::translate('UserCountry_Region');
- }
- if (self::isCountryDatabaseAvailable()) {
- $availableDatabaseTypes[] = Piwik::translate('UserCountry_Country');
- }
- if (self::isISPDatabaseAvailable()) {
- $availableDatabaseTypes[] = 'ISP';
- }
- if (self::isOrgDatabaseAvailable()) {
- $availableDatabaseTypes[] = Piwik::translate('UserCountry_Organization');
- }
-
- $extraMessage .= '<br/><br/>' . Piwik::translate('UserCountry_GeoIPImplHasAccessTo') . ':&nbsp;<strong>'
- . implode(', ', $availableDatabaseTypes) . '</strong>.';
-
- $extraMessage = '<strong>' . Piwik::translate('General_Note') . ':&nbsp;</strong>' . $extraMessage;
- }
-
- return array('id' => self::ID,
- 'title' => self::TITLE,
- 'description' => $desc,
- 'install_docs' => $installDocs,
- 'extra_message' => $extraMessage,
- 'order' => 13);
- }
-
- /**
- * Returns true if the PECL module can detect a location database (either a country,
- * region or city will do).
- *
- * @return bool
- */
- public static function isLocationDatabaseAvailable()
- {
- return self::isCityDatabaseAvailable()
- || self::isRegionDatabaseAvailable()
- || self::isCountryDatabaseAvailable();
- }
-
- /**
- * Returns true if the PECL module can detect a city database.
- *
- * @return bool
- */
- public static function isCityDatabaseAvailable()
- {
- return geoip_db_avail(GEOIP_CITY_EDITION_REV0)
- || geoip_db_avail(GEOIP_CITY_EDITION_REV1);
- }
-
- /**
- * Returns true if the PECL module can detect a region database.
- *
- * @return bool
- */
- public static function isRegionDatabaseAvailable()
- {
- return geoip_db_avail(GEOIP_REGION_EDITION_REV0)
- || geoip_db_avail(GEOIP_REGION_EDITION_REV1);
- }
-
- /**
- * Returns true if the PECL module can detect a country database.
- *
- * @return bool
- */
- public static function isCountryDatabaseAvailable()
- {
- return geoip_db_avail(GEOIP_COUNTRY_EDITION);
- }
-
- /**
- * Returns true if the PECL module can detect an organization database.
- *
- * @return bool
- */
- public static function isOrgDatabaseAvailable()
- {
- return geoip_db_avail(GEOIP_ORG_EDITION);
- }
-
- /**
- * Returns true if the PECL module can detect an ISP database.
- *
- * @return bool
- */
- public static function isISPDatabaseAvailable()
- {
- return geoip_db_avail(GEOIP_ISP_EDITION);
- }
-}
diff --git a/plugins/UserCountry/LocationProvider/GeoIp/Php.php b/plugins/UserCountry/LocationProvider/GeoIp/Php.php
deleted file mode 100644
index 56cf7ce171..0000000000
--- a/plugins/UserCountry/LocationProvider/GeoIp/Php.php
+++ /dev/null
@@ -1,388 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
-
-use Piwik\Log;
-use Piwik\Piwik;
-use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
-
-/**
- * A LocationProvider that uses the PHP implementation of GeoIP.
- *
- */
-class Php extends GeoIp
-{
- const ID = 'geoip_php';
- const TITLE = 'GeoIP Legacy (Php)';
-
- /**
- * The GeoIP database instances used. This array will contain at most three
- * of them: one for location info, one for ISP info and another for organization
- * info.
- *
- * Each instance is mapped w/ one of the following keys: 'loc', 'isp', 'org'
- *
- * @var array of GeoIP instances
- */
- private $geoIpCache = array();
-
- /**
- * Possible filenames for each type of GeoIP database. When looking for a database
- * file in the 'misc' subdirectory, files with these names will be looked for.
- *
- * This variable is an array mapping either the 'loc', 'isp' or 'org' strings with
- * an array of filenames.
- *
- * By default, this will be set to Php::$dbNames.
- *
- * @var array
- */
- private $customDbNames;
-
- /**
- * Constructor.
- *
- * @param array|bool $customDbNames The possible filenames for each type of GeoIP database.
- * eg array(
- * 'loc' => array('GeoLiteCity.dat'),
- * 'isp' => array('GeoIP.dat', 'GeoIPISP.dat')
- * 'org' => array('GeoIPOrg.dat')
- * )
- * If a key is missing (or the parameter not supplied), then the
- * default database names are used.
- */
- public function __construct($customDbNames = false)
- {
- $this->customDbNames = parent::$dbNames;
- if ($customDbNames !== false) {
- foreach ($this->customDbNames as $key => $names) {
- if (isset($customDbNames[$key])) {
- $this->customDbNames[$key] = $customDbNames[$key];
- }
- }
- }
- }
-
- /**
- * Closes all open geoip instances.
- */
- public function __destruct()
- {
- foreach ($this->geoIpCache as $instance) {
- geoip_close($instance);
- }
- }
-
- /**
- * Uses a GeoIP database to get a visitor's location based on their IP address.
- *
- * This function will return different results based on the data used. If a city
- * database is used, it may return the country code, region code, city name, area
- * code, latitude, longitude and postal code of the visitor.
- *
- * Alternatively, if used with a country database, only the country code will be
- * returned.
- *
- * @param array $info Must have an 'ip' field.
- * @return array
- */
- public function getLocation($info)
- {
- $ip = $this->getIpFromInfo($info);
- $isIPv6 = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
-
- $result = array();
-
- $locationGeoIp = $this->getGeoIpInstance($key = 'loc');
- if ($locationGeoIp) {
- switch ($locationGeoIp->databaseType) {
- case GEOIP_CITY_EDITION_REV0: // city database type
- case GEOIP_CITY_EDITION_REV1:
- case GEOIP_CITYCOMBINED_EDITION:
- if ($isIPv6) {
- $location = geoip_record_by_addr_v6($locationGeoIp, $ip);
- } else {
- $location = geoip_record_by_addr($locationGeoIp, $ip);
- }
- if (!empty($location)) {
- $result[self::COUNTRY_CODE_KEY] = $location->country_code;
- $result[self::REGION_CODE_KEY] = $location->region;
- $result[self::CITY_NAME_KEY] = utf8_encode($location->city);
- $result[self::AREA_CODE_KEY] = $location->area_code;
- $result[self::LATITUDE_KEY] = $location->latitude;
- $result[self::LONGITUDE_KEY] = $location->longitude;
- $result[self::POSTAL_CODE_KEY] = $location->postal_code;
- }
- break;
- case GEOIP_REGION_EDITION_REV0: // region database type
- case GEOIP_REGION_EDITION_REV1:
- if ($isIPv6) {
- // NOTE: geoip_region_by_addr_v6 does not exist (yet?), so we
- // return the country code and an empty region code
- $location = array(geoip_country_code_by_addr_v6($locationGeoIp, $ip), '');
- } else {
- $location = geoip_region_by_addr($locationGeoIp, $ip);
- }
- if (!empty($location)) {
- $result[self::COUNTRY_CODE_KEY] = $location[0];
- $result[self::REGION_CODE_KEY] = $location[1];
- }
- break;
- case GEOIP_COUNTRY_EDITION: // country database type
- if ($isIPv6) {
- $result[self::COUNTRY_CODE_KEY] = geoip_country_code_by_addr_v6($locationGeoIp, $ip);
- } else {
- $result[self::COUNTRY_CODE_KEY] = geoip_country_code_by_addr($locationGeoIp, $ip);
- }
- break;
- default: // unknown database type, log warning and fallback to country edition
- Log::warning("Found unrecognized database type: %s", $locationGeoIp->databaseType);
-
- if ($isIPv6) {
- $result[self::COUNTRY_CODE_KEY] = geoip_country_code_by_addr_v6($locationGeoIp, $ip);
- } else {
- $result[self::COUNTRY_CODE_KEY] = geoip_country_code_by_addr($locationGeoIp, $ip);
- }
- break;
- }
- }
-
- // NOTE: ISP & ORG require commercial dbs to test. The code has been tested manually,
- // but not by system tests.
- $ispGeoIp = $this->getGeoIpInstance($key = 'isp');
- if ($ispGeoIp) {
- if ($isIPv6) {
- $isp = geoip_name_by_addr_v6($ispGeoIp, $ip);
- } else {
- $isp = geoip_org_by_addr($ispGeoIp, $ip);
- }
- if (!empty($isp)) {
- $result[self::ISP_KEY] = utf8_encode($isp);
- }
- }
-
- $orgGeoIp = $this->getGeoIpInstance($key = 'org');
- if ($orgGeoIp) {
- if ($isIPv6) {
- $org = geoip_name_by_addr_v6($orgGeoIp, $ip);
- } else {
- $org = geoip_org_by_addr($orgGeoIp, $ip);
- }
- if (!empty($org)) {
- $result[self::ORG_KEY] = utf8_encode($org);
- }
- }
-
- if (empty($result)) {
- return false;
- }
-
- $this->completeLocationResult($result);
- return $result;
- }
-
- /**
- * Returns true if this location provider is available. Piwik ships w/ the MaxMind
- * PHP library, so this provider is available if a location GeoIP database can be found.
- *
- * @return bool
- */
- public function isAvailable()
- {
- $path = self::getPathToGeoIpDatabase($this->customDbNames['loc']);
- return $path !== false;
- }
-
- /**
- * Returns true if this provider has been setup correctly, the error message if
- * otherwise.
- *
- * @return bool|string
- */
- public function isWorking()
- {
- if (!function_exists('mb_internal_encoding')) {
- return Piwik::translate('UserCountry_GeoIPCannotFindMbstringExtension',
- array('mb_internal_encoding', 'mbstring'));
- }
-
- $geoIpError = false;
- $catchGeoIpError = function ($errno, $errstr, $errfile, $errline) use (&$geoIpError) {
- $filename = basename($errfile);
- if ($filename == 'geoip.inc'
- || $filename == 'geoipcity.inc'
- ) {
- $geoIpError = array($errno, $errstr, $errfile, $errline);
- } else {
- throw new \Exception("Error in PHP GeoIP provider: $errstr on line $errline of $errfile"); // unexpected
- }
- };
-
- // catch GeoIP errors
- set_error_handler($catchGeoIpError);
- $result = parent::isWorking();
- restore_error_handler();
-
- if ($geoIpError) {
- list($errno, $errstr, $errfile, $errline) = $geoIpError;
- Log::warning("Got GeoIP error when testing PHP GeoIP location provider: %s(%s): %s", $errfile, $errline, $errstr);
-
- return Piwik::translate('UserCountry_GeoIPIncorrectDatabaseFormat');
- }
-
- return $result;
- }
-
- /**
- * Returns an array describing the types of location information this provider will
- * return.
- *
- * The location info this provider supports depends on what GeoIP databases it can
- * find.
- *
- * This provider will always support country & continent information.
- *
- * If a region database is found, then region code & name information will be
- * supported.
- *
- * If a city database is found, then region code, region name, city name,
- * area code, latitude, longitude & postal code are all supported.
- *
- * If an organization database is found, organization information is
- * supported.
- *
- * If an ISP database is found, ISP information is supported.
- *
- * @return array
- */
- public function getSupportedLocationInfo()
- {
- $result = array();
-
- // country & continent info always available
- $result[self::CONTINENT_CODE_KEY] = true;
- $result[self::CONTINENT_NAME_KEY] = true;
- $result[self::COUNTRY_CODE_KEY] = true;
- $result[self::COUNTRY_NAME_KEY] = true;
-
- $locationGeoIp = $this->getGeoIpInstance($key = 'loc');
- if ($locationGeoIp) {
- switch ($locationGeoIp->databaseType) {
- case GEOIP_CITY_EDITION_REV0: // city database type
- case GEOIP_CITY_EDITION_REV1:
- case GEOIP_CITYCOMBINED_EDITION:
- $result[self::REGION_CODE_KEY] = true;
- $result[self::REGION_NAME_KEY] = true;
- $result[self::CITY_NAME_KEY] = true;
- $result[self::AREA_CODE_KEY] = true;
- $result[self::LATITUDE_KEY] = true;
- $result[self::LONGITUDE_KEY] = true;
- $result[self::POSTAL_CODE_KEY] = true;
- break;
- case GEOIP_REGION_EDITION_REV0: // region database type
- case GEOIP_REGION_EDITION_REV1:
- $result[self::REGION_CODE_KEY] = true;
- $result[self::REGION_NAME_KEY] = true;
- break;
- default: // country or unknown database type
- break;
- }
- }
-
- // check if isp info is available
- if ($this->getGeoIpInstance($key = 'isp')) {
- $result[self::ISP_KEY] = true;
- }
-
- // check of org info is available
- if ($this->getGeoIpInstance($key = 'org')) {
- $result[self::ORG_KEY] = true;
- }
-
- return $result;
- }
-
- /**
- * Returns information about this location provider. Contains an id, title & description:
- *
- * array(
- * 'id' => 'geoip_php',
- * 'title' => '...',
- * 'description' => '...'
- * );
- *
- * @return array
- */
- public function getInfo()
- {
- $desc = Piwik::translate('UserCountry_GeoIpLocationProviderDesc_Php1') . '<br/><br/>'
- . Piwik::translate('UserCountry_GeoIpLocationProviderDesc_Php2',
- array('<strong>', '</strong>', '<strong>', '</strong>'));
- $installDocs = '<a rel="noreferrer noopener" target="_blank" href="https://matomo.org/faq/how-to/#faq_163">'
- . Piwik::translate('UserCountry_HowToInstallGeoIPDatabases')
- . '</a>';
-
- $availableDatabaseTypes = array();
- if (self::getPathToGeoIpDatabase(array('GeoIPCity.dat', 'GeoLiteCity.dat')) !== false) {
- $availableDatabaseTypes[] = Piwik::translate('UserCountry_City');
- }
- if (self::getPathToGeoIpDatabase(array('GeoIPRegion.dat')) !== false) {
- $availableDatabaseTypes[] = Piwik::translate('UserCountry_Region');
- }
- if (self::getPathToGeoIpDatabase(array('GeoIPCountry.dat')) !== false) {
- $availableDatabaseTypes[] = Piwik::translate('UserCountry_Country');
- }
- if (self::getPathToGeoIpDatabase(array('GeoIPISP.dat')) !== false) {
- $availableDatabaseTypes[] = 'ISP';
- }
- if (self::getPathToGeoIpDatabase(array('GeoIPOrg.dat')) !== false) {
- $availableDatabaseTypes[] = Piwik::translate('UserCountry_Organization');
- }
-
- if (!empty($availableDatabaseTypes)) {
- $extraMessage = '<strong>' . Piwik::translate('General_Note') . '</strong>:&nbsp;'
- . Piwik::translate('UserCountry_GeoIPImplHasAccessTo') . ':&nbsp;<strong>'
- . implode(', ', $availableDatabaseTypes) . '</strong>.';
- } else {
- $extraMessage = '<strong>' . Piwik::translate('General_Note') . '</strong>:&nbsp;'
- . Piwik::translate('UserCountry_GeoIPNoDatabaseFound') . '<strong>';
- }
-
- return array('id' => self::ID,
- 'title' => self::TITLE,
- 'description' => $desc,
- 'install_docs' => $installDocs,
- 'extra_message' => $extraMessage,
- 'order' => 12);
- }
-
- /**
- * Returns a GeoIP instance. Creates it if necessary.
- *
- * @param string $key 'loc', 'isp' or 'org'. Determines the type of GeoIP database
- * to load.
- * @return object|false
- */
- private function getGeoIpInstance($key)
- {
- if (empty($this->geoIpCache[$key])) {
- // make sure region names are loaded & saved first
- parent::getRegionNames();
- require_once PIWIK_INCLUDE_PATH . '/libs/MaxMindGeoIP/geoipcity.inc';
-
- $pathToDb = self::getPathToGeoIpDatabase($this->customDbNames[$key]);
- if ($pathToDb !== false) {
- $this->geoIpCache[$key] = geoip_open($pathToDb, GEOIP_STANDARD); // TODO support shared memory
- }
- }
-
- return empty($this->geoIpCache[$key]) ? false : $this->geoIpCache[$key];
- }
-}
-
diff --git a/plugins/UserCountry/LocationProvider/GeoIp/ServerBased.php b/plugins/UserCountry/LocationProvider/GeoIp/ServerBased.php
deleted file mode 100644
index 43c2356b46..0000000000
--- a/plugins/UserCountry/LocationProvider/GeoIp/ServerBased.php
+++ /dev/null
@@ -1,291 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-
-namespace Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
-
-use Piwik\Common;
-use Piwik\IP;
-use Piwik\Piwik;
-use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
-use Piwik\Plugins\UserCountry\LocationProvider;
-
-/**
- * A LocationProvider that uses an GeoIP module installed in an HTTP Server.
- *
- * To make this provider available, make sure the GEOIP_ADDR server
- * variable is set.
- *
- */
-class ServerBased extends GeoIp
-{
- const ID = 'geoip_serverbased';
- const TITLE = 'GeoIP Legacy (%s)';
- const TEST_SERVER_VAR = 'GEOIP_ADDR';
- const TEST_SERVER_VAR_ALT = 'GEOIP_COUNTRY_CODE';
- const TEST_SERVER_VAR_ALT_IPV6 = 'GEOIP_COUNTRY_CODE_V6';
-
- private static $geoIpServerVars = array(
- parent::COUNTRY_CODE_KEY => 'GEOIP_COUNTRY_CODE',
- parent::COUNTRY_NAME_KEY => 'GEOIP_COUNTRY_NAME',
- parent::REGION_CODE_KEY => 'GEOIP_REGION',
- parent::REGION_NAME_KEY => 'GEOIP_REGION_NAME',
- parent::AREA_CODE_KEY => 'GEOIP_AREA_CODE',
- parent::LATITUDE_KEY => 'GEOIP_LATITUDE',
- parent::LONGITUDE_KEY => 'GEOIP_LONGITUDE',
- parent::POSTAL_CODE_KEY => 'GEOIP_POSTAL_CODE',
- );
-
- private static $geoIpUtfServerVars = array(
- parent::CITY_NAME_KEY => 'GEOIP_CITY',
- parent::ISP_KEY => 'GEOIP_ISP',
- parent::ORG_KEY => 'GEOIP_ORGANIZATION',
- );
-
- /**
- * Uses a GeoIP database to get a visitor's location based on their IP address.
- *
- * This function will return different results based on the data used and based
- * on how the GeoIP module is configured.
- *
- * If a region database is used, it may return the country code, region code,
- * city name, area code, latitude, longitude and postal code of the visitor.
- *
- * Alternatively, only the country code may be returned for another database.
- *
- * If your HTTP server is not configured to include all GeoIP information, some
- * information will not be available to Piwik.
- *
- * @param array $info Must have an 'ip' field.
- * @return array
- */
- public function getLocation($info)
- {
- $ip = $this->getIpFromInfo($info);
-
- // geoip modules that are built into servers can't use a forced IP. in this case we try
- // to fallback to another version.
- $myIP = IP::getIpFromHeader();
- if (!self::isSameOrAnonymizedIp($ip, $myIP)
- && (!isset($info['disable_fallbacks'])
- || !$info['disable_fallbacks'])
- ) {
- Common::printDebug("The request is for IP address: " . $info['ip'] . " but your IP is: $myIP. GeoIP Server Module (apache/nginx) does not support this use case... ");
- $fallbacks = array(
- Pecl::ID,
- Php::ID
- );
- foreach ($fallbacks as $fallbackProviderId) {
- $otherProvider = LocationProvider::getProviderById($fallbackProviderId);
- if ($otherProvider) {
- Common::printDebug("Used $fallbackProviderId to detect this visitor IP");
- return $otherProvider->getLocation($info);
- }
- }
- Common::printDebug("FAILED to lookup the geo location of this IP address, as no fallback location providers is configured. We recommend to configure Geolocation PECL module to fix this error.");
-
- return false;
- }
-
- $result = array();
- foreach (self::$geoIpServerVars as $resultKey => $geoipVarName) {
- if (!empty($_SERVER[$geoipVarName])) {
- $result[$resultKey] = $_SERVER[$geoipVarName];
- }
-
- $geoipVarNameV6 = $geoipVarName . '_V6';
- if (!empty($_SERVER[$geoipVarNameV6])) {
- $result[$resultKey] = $_SERVER[$geoipVarNameV6];
- }
- }
- foreach (self::$geoIpUtfServerVars as $resultKey => $geoipVarName) {
- if (!empty($_SERVER[$geoipVarName])) {
- $result[$resultKey] = utf8_encode($_SERVER[$geoipVarName]);
- }
- }
- $this->completeLocationResult($result);
- return $result;
- }
-
- /**
- * Returns an array describing the types of location information this provider will
- * return.
- *
- * There's no way to tell exactly what database the HTTP server is using, so we just
- * assume country and continent information is available. This can make diagnostics
- * a bit more difficult, unfortunately.
- *
- * @return array
- */
- public function getSupportedLocationInfo()
- {
- $result = array();
-
- // assume country info is always available. it's an error if it's not.
- $result[self::COUNTRY_CODE_KEY] = true;
- $result[self::COUNTRY_NAME_KEY] = true;
- $result[self::CONTINENT_CODE_KEY] = true;
- $result[self::CONTINENT_NAME_KEY] = true;
-
- return $result;
- }
-
- /**
- * Checks if an HTTP server module has been installed. It checks by looking for
- * the GEOIP_ADDR server variable.
- *
- * There's a special check for the Apache module, but we can't check specifically
- * for anything else.
- *
- * @return bool|string
- */
- public function isAvailable()
- {
- // check if apache module is installed
- if (function_exists('apache_get_modules')) {
- foreach (apache_get_modules() as $name) {
- if (strpos($name, 'geoip') !== false) {
- return true;
- }
- }
- }
-
- $available = !empty($_SERVER[self::TEST_SERVER_VAR])
- || !empty($_SERVER[self::TEST_SERVER_VAR_ALT])
- || !empty($_SERVER[self::TEST_SERVER_VAR_ALT_IPV6])
- ;
-
- if ($available) {
- return true;
- }
-
- // if not available return message w/ extra info
- if (!function_exists('apache_get_modules')) {
- return Piwik::translate('General_Note') . ':&nbsp;' . Piwik::translate('UserCountry_AssumingNonApache');
- }
-
- $message = "<strong>" . Piwik::translate('General_Note') . ':&nbsp;'
- . Piwik::translate('UserCountry_FoundApacheModules')
- . "</strong>:<br/><br/>\n<ul style=\"list-style:disc;margin-left:24px\">\n";
- foreach (apache_get_modules() as $name) {
- $message .= "<li>$name</li>\n";
- }
- $message .= "</ul>";
- return $message;
- }
-
- /**
- * Returns true if the GEOIP_ADDR server variable is defined.
- *
- * @return bool
- */
- public function isWorking()
- {
- if (empty($_SERVER[self::TEST_SERVER_VAR])
- && empty($_SERVER[self::TEST_SERVER_VAR_ALT])
- && empty($_SERVER[self::TEST_SERVER_VAR_ALT_IPV6])
- ) {
- return Piwik::translate("UserCountry_CannotFindGeoIPServerVar", self::TEST_SERVER_VAR . ' $_SERVER');
- }
-
- return true; // can't check for another IP
- }
-
- /**
- * Returns information about this location provider. Contains an id, title & description:
- *
- * array(
- * 'id' => 'geoip_serverbased',
- * 'title' => '...',
- * 'description' => '...'
- * );
- *
- * @return array
- */
- public function getInfo()
- {
- if (function_exists('apache_note')) {
- $serverDesc = 'Apache';
- } else {
- $serverDesc = Piwik::translate('UserCountry_HttpServerModule');
- }
-
- $title = sprintf(self::TITLE, $serverDesc);
- $desc = Piwik::translate('UserCountry_GeoIpLocationProviderDesc_ServerBased1', array('<strong>', '</strong>'))
- . '<br/><br/>'
- . Piwik::translate('UserCountry_GeoIpLocationProviderDesc_ServerBasedAnonWarn')
- . '<br/><br/>'
- . Piwik::translate('UserCountry_GeoIpLocationProviderDesc_ServerBased2',
- array('<strong>', '</strong>', '<strong>', '</strong>'));
- $installDocs =
- '<a rel="noreferrer noopener" target="_blank" href="https://matomo.org/faq/how-to/#faq_165">'
- . Piwik::translate('UserCountry_HowToInstallApacheModule')
- . '</a><br/>'
- . '<a rel="noreferrer noopener" target="_blank" href="https://matomo.org/faq/how-to/#faq_166">'
- . Piwik::translate('UserCountry_HowToInstallNginxModule')
- . '</a>';
-
- $geoipServerVars = array();
- foreach ($_SERVER as $key => $value) {
- if (strpos($key, 'GEOIP') === 0) {
- $geoipServerVars[] = $key;
- }
- }
-
- if (empty($geoipServerVars)) {
- $extraMessage = '<strong>' . Piwik::translate('UserCountry_GeoIPNoServerVars', '$_SERVER') . '</strong>';
- } else {
- $extraMessage = '<strong>' . Piwik::translate('UserCountry_GeoIPServerVarsFound', '$_SERVER')
- . ":</strong><br/><br/>\n<ul style=\"list-style:disc;margin-left:24px\">\n";
- foreach ($geoipServerVars as $key) {
- $extraMessage .= '<li>' . $key . "</li>\n";
- }
- $extraMessage .= '</ul>';
- }
-
- return array('id' => self::ID,
- 'title' => $title,
- 'description' => $desc,
- 'order' => 14,
- 'install_docs' => $installDocs,
- 'extra_message' => $extraMessage);
- }
-
- /**
- * Checks if two IP addresses are the same or if the first is the anonymized
- * version of the other.
- *
- * @param string $ip
- * @param string $currentIp This IP should not be anonymized.
- * @return bool
- */
- public static function isSameOrAnonymizedIp($ip, $currentIp)
- {
- $ip = array_reverse(explode('.', $ip));
- $currentIp = array_reverse(explode('.', $currentIp));
-
- if (count($ip) != count($currentIp)) {
- return false;
- }
-
- foreach ($ip as $i => $byte) {
- if ($byte == 0) {
- $currentIp[$i] = 0;
- } else {
- break;
- }
- }
-
- foreach ($ip as $i => $byte) {
- if ($byte != $currentIp[$i]) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/plugins/UserCountry/Reports/Base.php b/plugins/UserCountry/Reports/Base.php
index 15a3890633..c25c1b71f8 100644
--- a/plugins/UserCountry/Reports/Base.php
+++ b/plugins/UserCountry/Reports/Base.php
@@ -50,7 +50,7 @@ abstract class Base extends \Piwik\Plugin\Report
$footerMessage .= ' ' . Piwik::translate('UserCountry_NoDataForGeoIPReport2',
array('<a target="_blank" href="' . Url::getCurrentQueryStringWithParametersModified($params) . '">',
'</a>',
- '<a rel="noreferrer noopener" target="_blank" href="http://dev.maxmind.com/geoip/geolite?rId=piwik">',
+ '<a rel="noreferrer noopener" target="_blank" href="https://db-ip.com/?refid=mtm">',
'</a>'));
} else {
$footerMessage .= ' ' . Piwik::translate('UserCountry_ToGeolocateOldVisits',
diff --git a/plugins/UserCountry/Reports/GetContinent.php b/plugins/UserCountry/Reports/GetContinent.php
index 51f6fbc370..abd8d32707 100644
--- a/plugins/UserCountry/Reports/GetContinent.php
+++ b/plugins/UserCountry/Reports/GetContinent.php
@@ -12,7 +12,6 @@ use Piwik\Piwik;
use Piwik\Plugin\ViewDataTable;
use Piwik\Plugins\UserCountry\Columns\Continent;
use Piwik\Report\ReportWidgetFactory;
-use Piwik\Widget\WidgetContainerConfig;
use Piwik\Widget\WidgetsList;
class GetContinent extends Base
diff --git a/plugins/UserCountry/Tasks.php b/plugins/UserCountry/Tasks.php
deleted file mode 100644
index 73618b91be..0000000000
--- a/plugins/UserCountry/Tasks.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link https://matomo.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- */
-namespace Piwik\Plugins\UserCountry;
-
-use Piwik\SettingsPiwik;
-class Tasks extends \Piwik\Plugin\Tasks
-{
- public function schedule()
- {
- // add the auto updater task if GeoIP admin is enabled
- if (UserCountry::isGeoLocationAdminEnabled() && SettingsPiwik::isInternetEnabled() === true) {
- $this->scheduleTask(new GeoIPAutoUpdater());
- }
- }
-} \ No newline at end of file
diff --git a/plugins/UserCountry/UserCountry.php b/plugins/UserCountry/UserCountry.php
index 2d8c0bfce1..5e629bf39a 100644
--- a/plugins/UserCountry/UserCountry.php
+++ b/plugins/UserCountry/UserCountry.php
@@ -8,18 +8,10 @@
*/
namespace Piwik\Plugins\UserCountry;
-use Piwik\ArchiveProcessor;
use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Intl\Data\Provider\RegionDataProvider;
-use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
-use Piwik\Plugins\UserCountry\LocationProvider;
-use Piwik\Url;
-
-/**
- * @see plugins/UserCountry/GeoIPAutoUpdater.php
- */
-require_once PIWIK_INCLUDE_PATH . '/plugins/UserCountry/GeoIPAutoUpdater.php';
+use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
/**
*
@@ -27,14 +19,13 @@ require_once PIWIK_INCLUDE_PATH . '/plugins/UserCountry/GeoIPAutoUpdater.php';
class UserCountry extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
return array(
'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
'AssetManager.getJavaScriptFiles' => 'getJsFiles',
- 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
'Tracker.setTrackerCacheGeneral' => 'setTrackerCacheGeneral',
'Insights.addReportToOverview' => 'addReportToInsightsOverview',
);
@@ -59,8 +50,6 @@ class UserCountry extends \Piwik\Plugin
{
$jsFiles[] = "plugins/UserCountry/angularjs/location-provider-selection/location-provider-selection.controller.js";
$jsFiles[] = "plugins/UserCountry/angularjs/location-provider-selection/location-provider-selection.directive.js";
- $jsFiles[] = "plugins/UserCountry/angularjs/location-provider-updater/location-provider-updater.controller.js";
- $jsFiles[] = "plugins/UserCountry/angularjs/location-provider-updater/location-provider-updater.directive.js";
}
/**
@@ -93,20 +82,11 @@ class UserCountry extends \Piwik\Plugin
public function isGeoIPWorking()
{
$provider = LocationProvider::getCurrentProvider();
- return $provider instanceof GeoIp
+ return $provider instanceof GeoIp2
&& $provider->isAvailable() === true
&& $provider->isWorking() === true;
}
- public function getClientSideTranslationKeys(&$translationKeys)
- {
- $translationKeys[] = "UserCountry_FatalErrorDuringDownload";
- $translationKeys[] = "UserCountry_SetupAutomaticUpdatesOfGeoIP";
- $translationKeys[] = "General_Done";
- $translationKeys[] = "General_Save";
- $translationKeys[] = "General_Continue";
- }
-
public static function isGeoLocationAdminEnabled()
{
return (bool) Config::getInstance()->General['enable_geolocation_admin'];
diff --git a/plugins/UserCountry/VisitorGeolocator.php b/plugins/UserCountry/VisitorGeolocator.php
index 5f992af396..ba2b884e80 100644
--- a/plugins/UserCountry/VisitorGeolocator.php
+++ b/plugins/UserCountry/VisitorGeolocator.php
@@ -8,12 +8,12 @@
*/
namespace Piwik\Plugins\UserCountry;
-use Piwik\Cache\Cache;
-use Piwik\Cache\Transient;
+use Matomo\Cache\Cache;
+use Matomo\Cache\Transient;
use Piwik\Common;
use Piwik\Container\StaticContainer;
use Piwik\DataAccess\RawLogDao;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Plugins\UserCountry\LocationProvider\DefaultProvider;
use Piwik\Tracker\Visit;
use Psr\Log\LoggerInterface;
diff --git a/plugins/UserCountry/functions.php b/plugins/UserCountry/functions.php
index 6c24afb44c..0061a4e518 100644
--- a/plugins/UserCountry/functions.php
+++ b/plugins/UserCountry/functions.php
@@ -10,11 +10,9 @@
namespace Piwik\Plugins\UserCountry;
use Piwik\DataTable;
-use Piwik\Option;
use Piwik\Piwik;
use Piwik\Plugin\Manager;
use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
-use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
use Piwik\Tracker\Visit;
/**
@@ -118,21 +116,63 @@ function getElementFromStringArray($label, $separator, $index, $emptyValue = fal
*/
function getRegionNameFromCodes($countryCode, $regionCode)
{
- if (!Manager::getInstance()->isPluginActivated('GeoIp2') ||
- LocationProvider::getCurrentProvider() instanceof GeoIp) {
- return GeoIp::getRegionNameFromCodes($countryCode, $regionCode);
- }
-
$name = GeoIp2::getRegionNameFromCodes($countryCode, $regionCode);
- // fallback if no translation for with GeoIP2
+ // fallback if no translation with GeoIP2
if ($name == Piwik::translate('General_Unknown')) {
- $name = GeoIp::getRegionNameFromCodes($countryCode, $regionCode);
+ $name = getLegacyRegionNameFromCodes($countryCode, $regionCode);
}
return $name;
}
+
+/**
+ * Returns a region name for a country code + region code.
+ *
+ * @param string $countryCode
+ * @param string $regionCode
+ * @return string The region name or 'Unknown' (translated).
+ */
+function getLegacyRegionNameFromCodes($countryCode, $regionCode)
+{
+ $regionNames = getRegionNames();
+
+ $countryCode = strtoupper($countryCode);
+ $regionCode = strtoupper($regionCode);
+
+ // ensure tibet is shown as region of china
+ if ($countryCode == 'TI' && $regionCode == '1') {
+ $regionCode = '14';
+ $countryCode = 'CN';
+ }
+
+ if (isset($regionNames[$countryCode][$regionCode])) {
+ return $regionNames[$countryCode][$regionCode];
+ } else {
+ return Piwik::translate('General_Unknown');
+ }
+}
+
+/**
+ * Returns an array of region names mapped by country code & region code.
+ *
+ * @return array
+ */
+function getRegionNames()
+{
+ static $regionNames;
+
+ if (is_null($regionNames)) {
+ $GEOIP_REGION_NAME = array();
+ require_once PIWIK_INCLUDE_PATH . '/libs/MaxMindGeoIP/geoipregionvars.php';
+ $regionNames = $GEOIP_REGION_NAME;
+ }
+
+ return $regionNames;
+}
+
+
/**
* Returns the region name using the label of a Visits by Region report.
*
diff --git a/plugins/UserCountry/lang/ar.json b/plugins/UserCountry/lang/ar.json
index 9cc58ad173..0c2c4f2802 100644
--- a/plugins/UserCountry/lang/ar.json
+++ b/plugins/UserCountry/lang/ar.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "لم أجد دالة apache_get_modules ، أفترض أن خادم ويب ليس Apache.",
- "CannotFindGeoIPDatabaseInArchive": "لم أجد ملف %1$s في الملف المضغوط %2$s الذي صيغته tar !",
- "CannotFindGeoIPServerVar": "لم يتم وضع قيمة للمتغير %s . يبدو أن الخادوم لديك ضبطه غير صحيح .",
- "CannotListContent": "لم أتمكن من سرد محتويات %1$s: %2$s",
"CannotLocalizeLocalIP": "عنوان IP %s هو عنوان محلي لايمكن تحديد موقعه الجغرافي.",
- "CannotUnzipDatFile": "لم أتمكن من فك ضغط ملف dat في %1$s : %2$s",
"City": "المدينة",
"CityAndCountry": "%1$s ، %2$s",
"Continent": "القارة",
@@ -17,13 +12,7 @@
"CurrentLocationIntro": "طبقاً لهذا المزوّد فإن مكانك الحالي هو",
"DefaultLocationProviderDesc1": "مقدم معلومات الأماكن الافتراضي يخمّن بلد الزائر بناءاً على اللغة التي يستخدمها.",
"DistinctCountries": "%s دولة بارزة",
- "DownloadingDb": "سحب %s",
- "DownloadNewDatabasesEvery": "تحديث قاعدة البيانات كلّ",
- "FoundApacheModules": "وجد Matomo بريمجات Apache التالية",
"FromDifferentCities": "مدن مختلفة",
- "GeoIPCannotFindMbstringExtension": "لم أجد دالة %1$s . فضلاً تأكد من أن إضافة %2$s مثبتة ومحمّلة في الذاكرة.",
- "GeoIPDatabases": "قواعد بيانات GeoIP",
- "GeoIPImplHasAccessTo": "إصدار GeoIP هذا يمكنه الوصول إلى الأنواع التالية من قواعد البيانات",
"Location": "المكان",
"SubmenuLocations": "الأماكن"
}
diff --git a/plugins/UserCountry/lang/bg.json b/plugins/UserCountry/lang/bg.json
index 871eaab878..1636a4b775 100644
--- a/plugins/UserCountry/lang/bg.json
+++ b/plugins/UserCountry/lang/bg.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Не може да бъде намерена apache_get_modules функцията, което предполага, че това не е Apache сървър.",
- "CannotFindGeoIPDatabaseInArchive": "Файл %1$s не може да бъде намерен в tar архив %2$s!",
- "CannotFindGeoIPServerVar": "Променливата %s не е зададена. Възможно е сървърът да не е настроен правилно.",
- "CannotListContent": "Съдържанието за %1$s: %2$s не може да бъде заредено",
"CannotLocalizeLocalIP": "IP адрес %s е вътрешен (частен) адрес и не може да бъде определено местоположението му.",
- "CannotUnzipDatFile": "Не може да се разархивира dat файл в %1$s: %2$s",
"City": "Град",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Континент",
@@ -18,50 +13,22 @@
"DefaultLocationProviderDesc1": "Доставчикът по подразбиране, определящ местоположението, отгатва държавата, от която е посетителят, на базата на използвания език.",
"DefaultLocationProviderExplanation": "Използва се доставчикът по подразбиране, което означава, че Matomo ще определя местоположението на посетителите спрямо езика, който те използват. %1$sПрочетете това%2$s, за да научите как се настройва по-точен метод за определяне на местоположението.",
"DistinctCountries": "%s отделни държави",
- "DownloadingDb": "Сваляне %s",
- "DownloadNewDatabasesEvery": "Обновяване на базата от данни на всеки",
- "FoundApacheModules": "Matomo откри следните Apache модули",
"FromDifferentCities": "различни градове",
- "GeoIPCannotFindMbstringExtension": "Не може да бъде намерена %1$s функция. Уверете се, че разширение %2$s е инсталирано и заредено.",
- "GeoIPDatabases": "GeoIP база данни",
- "GeoIPImplHasAccessTo": "Тази реализация на GeoIP има достъп до следните типове бази данни",
- "GeoIpLocationProviderDesc_Pecl2": "Няма ограничения с този доставчик. Поради тази причина, това е вариантът, който е препоръчително да бъде използван.",
- "GeoIpLocationProviderDesc_Php2": "В случай, че през вашия сайт преминава голямо количество трафик, може да се окаже, че този доставчик е твърде бавен. В този случай е най-добре да се инсталира %1$sPECL разширение%2$s или %3$sсървърен модул%4$s.",
- "GeoIPNoServerVars": "Matomo не може да намери GeoIP %s променливи.",
- "GeoIPPeclCustomDirNotSet": "Опцията %s PHP ini не е зададена.",
- "GeoIPServerVarsFound": "Matomo засече следните GeoIP %s променливи",
"Geolocation": "Геолокация",
"GeolocationPageDesc": "В тази страница може да се промени начинът, по който Matomo определя местоположението на посетителите.",
"getCityDocumentation": "Този отчет показва в кои градове са се намирали вашите посетители, при достъпването на сайта.",
"getContinentDocumentation": "Този отчет показва кое съдържание са разглеждали вашите посетители, при достъпването на сайта.",
"getCountryDocumentation": "Този отчет показва в коя държава са се намирали вашите посетители, при достъпването на сайта.",
"getRegionDocumentation": "Този отчет показва къде са се намирали вашите посетители, при достъпването на сайта.",
- "HowToInstallApacheModule": "Как да инсталирам GeoIP модул за Apache?",
- "HowToInstallGeoIpPecl": "Как се инсталира GeoIP PECL разширение?",
- "HowToInstallNginxModule": "Как се инсталира GeoIP модул за Nginx?",
- "HowToSetupGeoIPIntro": "Изглежда, че настройката, за определяне на местоположението, не е направена. Това е полезна функция и без нея няма да се вижда точна и пълна информация за местоположението на посетителите. Ето и начин, по който може бързо да започнете да го използвате:",
- "HttpServerModule": "HTTP сървърен модул",
- "InvalidGeoIPUpdatePeriod": "Невалиден период за обновяването на GeoIP: %1$s. Валидните стойности са %2$s.",
- "ISPDatabase": "ISP база данни",
"Latitude": "Географска ширина",
"Location": "Място",
- "LocationDatabase": "Местоположение база данни",
- "LocationDatabaseHint": "Базата от данни указваща местоположение е или за държава, регион или град.",
"LocationProvider": "Местоположение на доставчика",
"Longitude": "Географска дължина",
"NoDataForGeoIPReport1": "Няма данни за този доклад, защото или няма информация за местоположението, или IP адресът на посетителя не може да бъде определен къде се намира.",
"NoDataForGeoIPReport2": "За да бъде активирано по-точно определяне на местоположението е нужно да се променят настройките %1$sтук%2$s и да се използва %3$sбази данни на ниво град%4$s.",
- "Organization": "Организация",
- "OrgDatabase": "Организация на базата данни",
"Region": "Регион",
"SubmenuLocations": "Местонахождение",
"ToGeolocateOldVisits": "За да получите информация за предишни посещения, използвайте скриптът описан %1$sтук%2$s.",
- "UnsupportedArchiveType": "Типът архив %1$s не се поддържа.",
- "UpdaterHasNotBeenRun": "Не е пускана до момента задача за обновяване.",
- "UpdaterIsNotScheduledToRun": "Не е планирано да се изпълнява в бъдеще.",
- "UpdaterScheduledForNextRun": "Ще бъде пуснато при следващото изпълнение на archive.php cron.",
- "UpdaterWasLastRun": "Задача за проверка за обновления е стартирана последно на %s.",
- "UpdaterWillRunNext": "Следващото пускане е планирано за %s.",
"WidgetLocation": "Местонахождение на посетителя"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/ca.json b/plugins/UserCountry/lang/ca.json
index 38ca4a0810..d6d7a24205 100644
--- a/plugins/UserCountry/lang/ca.json
+++ b/plugins/UserCountry/lang/ca.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "No s'ha pogut trobar la funció apache_get_modules, s'asumeix que s'utilitza un servidor web diferent del Apache.",
- "CannotFindGeoIPDatabaseInArchive": "No s'ha pogut trobar el fitxer %1$s al fitxer tar %2$s!",
- "CannotFindGeoIPServerVar": "La variable %s no està definida. Pot ser que el vostre servidor web no estigui configurat correctament.",
- "CannotListContent": "No s'ha pogut llistar el contingut de %1$s: %2$s",
"CannotLocalizeLocalIP": "L'adreça IP %s és una adreça local i no pot ser Geolocalitzada.",
- "CannotUnzipDatFile": "No s'ha pogut descomprimir el fitxer dat de %1$s: %2$s",
"City": "Ciutat",
"Continent": "Continent",
"Country": "País",
@@ -16,48 +11,22 @@
"CurrentLocationIntro": "Segons el proveïdor, la vostra localització actual és",
"DefaultLocationProviderDesc1": "El proveïdor de localització per defecte suposa el país del visitant en funció del llenguatge que fan servir.",
"DistinctCountries": "Hi ha %s països diferents",
- "DownloadingDb": "Descarregant %s",
- "DownloadNewDatabasesEvery": "Actualitza la base de dades cada",
- "FoundApacheModules": "El Matomo ha trobat els següents mòduls d'Apache",
- "GeoIPCannotFindMbstringExtension": "No s'ha pogut trobar la funció %1$s. Assegureu-vos que l'extensió %2$s està instal·lada i carregada.",
- "GeoIPDatabases": "Base de dades GeoIP",
"GeoIPDocumentationSuffix": "Per a veure informació d'aquest informe, heu de configurar la GeoIP a la pestanya Geolocalització. Les bases de dades comercials de %1$sMaxmind%2$s són més acurades que les gratuïtes. Podeu veure com són d'acurades fent click %3$saquí%4$s.",
- "GeoIPImplHasAccessTo": "Aquesta implementació de GeoIP té accés als següents tipus de bases de dades",
- "GeoIpLocationProviderDesc_Pecl2": "No hi ha cap limitació amb aquest proveïdor, per tant és el que recomanem que utilzeu.",
- "GeoIpLocationProviderDesc_Php2": "Si el vostre lloc web té molt tràfic trobareu que aquest proveïdor de localització és massa lent. En aquest cas podeu instalar la %1$s Extensió PECL %2$s o un %3$s mòdul del serviro %4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Aquest proveïdor de localització utiltiza el modul GeoIP que ha estat instal·lat al vostre servidor HTTP. Aquest proveïdor es ràpid i acurat, però %1$s només es pot fer servir l'escaneig amb el rastreig de webs normal .%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Si heu d'importar els fitxers de Log o alguna altra cosa que requereixi utilizar addreces IP, utilitzeu la %1$sImplementació GeoIP PECL (recomanada)%2$s o la %3$s implementació GeoIP PHP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Nota: L'anonimització IP no té cap efecte amb les localitzacions reportades per aquest proveïdor. Abans d'utilitzar amb l'anonimització IP, assegureu-vos que no viola cap llei de privacitat a la que podeu estar subjectes.",
- "GeoIPNoServerVars": "El Matomo no ho pogut trobar cap variable GeoIP a %s",
- "GeoIPPeclCustomDirNotSet": "L'opció %s del PHP ini no està definida",
- "GeoIPServerVarsFound": "El Matomo detecta les següents variables GeoIP a %s",
"Geolocation": "Geolocalització",
"GeolocationPageDesc": "En aquesta pàgina podeu canviar com el Matomo determina la localització dels vostres visitants.",
"getCityDocumentation": "Aquest informe mostra les ciutats on estaven els vostres visitants quan van accedir el vostre lloc web.",
"getContinentDocumentation": "Aquest informe mostra el continent on eren els vostres visitants quan van accedir al vostre lloc web.",
"getCountryDocumentation": "Aquest informe mostra el país on estaven els vostres visitants quan van accedir al vostre lloc web.",
"getRegionDocumentation": "Aquest informe mostra la regió on estaven els vostres visitants quan van accedir al vostre lloc web.",
- "HowToInstallApacheModule": "Com instal·lo el módul GeoIP per l'Apache?",
- "HowToInstallGeoIpPecl": "Com instal·lo l'extensió GeoIP PECL?",
- "HowToInstallNginxModule": "Com instal·lo el modul GeoIP per Nginx?",
- "HowToSetupGeoIPIntro": "Sembla que no teniu configurada la Geolocalització. Es tracta d'una característica molt útil, i sense ella no podreu veure de forma acurada la localització completa dels vostres visitants. Tot seguit us expliquem com podeu començar a fer-la servir:",
- "HttpServerModule": "Mòdul del Servidor HTTP",
- "InvalidGeoIPUpdatePeriod": "Període invàlid de l'actualització GeoIP: %1$s. Els valors vàlids són %2$s.",
- "ISPDatabase": "Base de dades de ISP",
"Latitude": "Latitud",
"Location": "Ubicació",
- "LocationDatabase": "Base de dades de Localització",
- "LocationDatabaseHint": "Una base de dades de localització és una base de dades de països, regions o ciutats.",
"LocationProvider": "Proveïdor de localitzacions",
"Longitude": "Longitud",
"NoDataForGeoIPReport1": "No hi ha informació per aquest informe perquè la informació de localització no esta disponible o l'adreça IP del visitant no pot ser geolocalitzada.",
"NoDataForGeoIPReport2": "Per activar la geolocalització acurada, canvieu les preferències %1$saquí%2$s i utilitzeu una %3$sbase de dades a nivell de ciutat%4$s.",
- "Organization": "Organització",
- "OrgDatabase": "Base de dades d'Organització",
"Region": "Regió",
"SubmenuLocations": "Localització",
"ToGeolocateOldVisits": "Per obtenir la localització de les visites anteriors, utilitzeu el script descrit %1$saquí%2$s.",
- "UnsupportedArchiveType": "S'ha trobat un tipus de fitxer no soportat %1$s.",
"WidgetLocation": "Ubicació del visitant"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/cs.json b/plugins/UserCountry/lang/cs.json
index 8e73dab2ed..baef84fa85 100644
--- a/plugins/UserCountry/lang/cs.json
+++ b/plugins/UserCountry/lang/cs.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Nelze nalézt funkci apache_get_modules,př edpokládám jiný server než Apache.",
- "CannotFindGeoIPDatabaseInArchive": "V tar archivu %2$s se nepodařilo najít soubor %1$s!",
- "CannotFindGeoIPServerVar": "Proměnná %s není nastavena. Váš webový server nemusí být správně nakonfigurován.",
- "CannotListContent": "Nepodařilo se vypsat obsah pro %1$s: %2$s",
"CannotLocalizeLocalIP": "IP adresa %s je místní a enemůže být geolokována.",
- "CannotUnzipDatFile": "Nepodařilo se rozbalit dat soubor v %1$s: %2$s",
"City": "Město",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontinent",
@@ -20,58 +15,26 @@
"DefaultLocationProviderDesc1": "Výchozí poskytovatel umístění odhaduje zemi návštěvníka na základě použitého jazyka.",
"DefaultLocationProviderExplanation": "Používáte výchozího poskytovatele umístění, což znamená, že se Matomo pokusí odhadnout zemi návštěvníka na základě použitého jazyka. %1$sPřečtěte si%2$s, jak nastavit přesnější geolokaci.",
"DistinctCountries": "%s jedinečných států",
- "DownloadingDb": "Stahování %s",
- "DownloadNewDatabasesEvery": "Aktualizovat databáze každých",
- "FoundApacheModules": "Matomo našel tyto Apache moduly",
"FromDifferentCities": "různá města",
- "GeoIPCannotFindMbstringExtension": "Nelze najít funkci %1$s. Ujistěte se, že je modul %2$s nainstalován a povolen.",
- "GeoIPDatabases": "Databáze GeoIP",
"GeoIPDocumentationSuffix": "Pokud chcete vidět toto hlášení, musíte nastavit GEOIP v administraci na záložce geolokace. Komerční %1$sMaxmind%2$s GeoIP databáze mají větší přesnost než volně šiřitelné. Pokud chcete vidět, jak přesné jsou, klikněte %3$szde%4$s.",
- "GeoIPImplHasAccessTo": "Tato implementace GeoIP má přístup kn následujícím typům databází.",
- "GeoIpLocationProviderDesc_Pecl2": "Tento poskytovatel nemá žádná omezení, takže to je ten, kterého doporučujeme používat.",
- "GeoIpLocationProviderDesc_Php2": "Pokud má váš web velký provoz, můžete zjistit, že je tento poskytovatel polohy pomalý. V takovém případě nainstalujte %1$srozšíření PECl%2$s nebo %3$sserverový modul%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Tento poskytovatel umístění využívá GeoIP modul, který byl instalován ve vašem HTTP serveru. Tento poskytovatel je přesný a rychlý, ale může být použit pouze s %1$snormálním sledování prohlížečů.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Pokud musíte importovat logy nebo dělat něco jiného, co vyžaduje nastavování IP adres, použijte %1$sPECl implementaci GeoIP (doporučeno%2$s nebo %3$sPHP implementaci GeoIP.%4$s",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Poznámka: Anonimizace IP adres nemá vliv na umístění hlášené tímto poskytovatelem. Před jeho používáním ověřte, že to neodporuje žádným zákonům.",
- "GeoIpLocationProviderNotRecomnended": "Geolokace funguje, ale nepoužíváte doporučeného poskytovatele umístění.",
- "GeoIPNoServerVars": "Matomo nemůže najít žádné GeoIP %s proměnné",
- "GeoIPPeclCustomDirNotSet": "PHP ini možnost %s není nastavena.",
- "GeoIPServerVarsFound": "Matomo detekuje následující GeoIP %s proměnné",
"Geolocation": "Geolokace",
"GeolocationPageDesc": "Na této stránce můžete změnit, jak Matomo určuje umístění návštěvníků.",
"getCityDocumentation": "Toto hlášení zobrazuje města návštěvníků, když přistoupili k vašim stránkám.",
"getContinentDocumentation": "Toto hlášení zobrazuje, na kterém kontinentu byli návštěvníci při přístupu k vašim stránkám.",
"getCountryDocumentation": "Toto hlášení zobrazuje zemi, ve které byli návštěvníci, když přistoupili k vašim stránkám.",
"getRegionDocumentation": "Toto hlášení zobrazuje region, ve kterém byli návštěvníci, když přistupovali k vašim stránkám.",
- "HowToInstallApacheModule": "Jak nainstalovat GeoIP modul na Apache?",
- "HowToInstallGeoIpPecl": "Jak nainstalovat GeoIP PECL rozšíření?",
- "HowToInstallNginxModule": "Jak nainstalovat GeoIP modul pro Nginx?",
- "HowToSetupGeoIPIntro": "Vypadá to, že nemáte nastavenou přesnou geolokaci. Je to užitečná vlastnost a bez ní neuvidíte přesné a kompletní informace o umístění vašich návštěvníků. Zde je, jak s ní můžete rychle začít:",
- "HttpServerModule": "Modul HTTP serveru",
- "InvalidGeoIPUpdatePeriod": "Neplatná doba pro aktualizovač GeoIP databáze: %1$s. Platné hodnoty jsou %2$s.",
- "ISPDatabase": "Databáze ISP",
"Latitude": "Zeměpisná šířka",
"Latitudes": "Zeměpisné šířky",
"Location": "Umístění",
- "LocationDatabase": "Databáze umístění",
- "LocationDatabaseHint": "Databáze umístění je databáze zemí, regionů, nebo měst.",
"LocationProvider": "Poskytovatel umístění",
"Longitude": "Zeměpisná délka",
"Longitudes": "Zeměpisné délky",
"NoDataForGeoIPReport1": "Pro toto hlášení nejsou k dispozici žádná data, protože buď nejsou k dispozici GeoIP data, nebo nemohly být geolokovány IP adresy návštěvníků.",
"NoDataForGeoIPReport2": "Pokud chcete umožnit přesnou geolokaci, změňte nastavení %1$szde%2$s a použijte %3$sdatabázi na úrovni měst%4$s.",
- "Organization": "Společnost",
- "OrgDatabase": "Databáze organizací",
"PluginDescription": "Hlásí umístění vašich návštěvníků: zemi, oblast, město a geografické koordináty (šířku\/délku).",
"Region": "Region",
"SubmenuLocations": "Umístění",
"ToGeolocateOldVisits": "Pokud chcete získat data o umístění pro staré návštěvy, použijte skript popisovaný %1$szde%2$s.",
- "UnsupportedArchiveType": "Nalezen nepodporovaný typ archivu %1$s.",
- "UpdaterHasNotBeenRun": "Aktualizátor nebyl nikdy spuštěn.",
- "UpdaterIsNotScheduledToRun": "Není plánováno, že v budoucnu poběží.",
- "UpdaterScheduledForNextRun": "Je plánováno, že poběží při příštím provedení cron příkazu core:archive.",
- "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"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/da.json b/plugins/UserCountry/lang/da.json
index 7fa1c7847d..49019fd39e 100644
--- a/plugins/UserCountry/lang/da.json
+++ b/plugins/UserCountry/lang/da.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Kan ikke finde apache_get_modules funktion, antager ikke-Apache webserver.",
- "CannotFindGeoIPDatabaseInArchive": "Kan ikke finde %1$s filen i tar-arkivet %2$s!",
- "CannotFindGeoIPServerVar": "%s variablen er ikke sat. Din server er måske ikke konfigureret korrekt.",
- "CannotListContent": "Kunne ikke vise indholdet af %1$s: %2$s",
"CannotLocalizeLocalIP": "IP-adressen %s er en lokal adresse uden geografisk tilknytning.",
- "CannotUnzipDatFile": "Kunne ikke udpakke dat fil i %1$s: %2$s",
"City": "By",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontinent",
@@ -21,59 +16,26 @@
"DefaultLocationProviderDesc1": "Standardlokationstjenesten gætter en besøgendes land baseret på det sprog de bruger.",
"DefaultLocationProviderExplanation": "Du bruger standardlokaliseringstjenesten, hvilket betyder, at Matomo vil gætte på den besøgendes placering ud fra det sprog, de anvender. %1$sLæs dette%2$s for at se, hvordan du opsætter mere nøjagtig geolokalisering.",
"DistinctCountries": "%s distinkte lande",
- "DownloadingDb": "Henter %s",
- "DownloadNewDatabasesEvery": "Opdater databaser hver",
- "FoundApacheModules": "Matomo fandt følgende Apache moduler",
"FromDifferentCities": "forskellige byer",
- "GeoIPCannotFindMbstringExtension": "Kan ikke finde %1$s funktionen. Sørg for at %2$s udvidelsen er installeret og indlæst.",
- "GeoIPDatabases": "GeoIP databaser",
"GeoIPDocumentationSuffix": "For at se data for rapporten, skal du opsætte GeoIP i Geolokaliseringsfanen. Den kommercielle %1$sMaxmind%2$s GeoIP-database er mere præcise end den gratis er. For at se hvor nøjagtig den er, skal du klikke %3$sher%4$s.",
- "GeoIPNoDatabaseFound": "Denne GeoIP implementering kunne ikke finde nogen database.",
- "GeoIPImplHasAccessTo": "GeoIP implementering har adgang til følgende typer af databaser",
- "GeoIpLocationProviderDesc_Pecl2": "Der er ingen begrænsninger med denne tjeneste, så det er den vi anbefaler du bruger.",
- "GeoIpLocationProviderDesc_Php2": "Hvis hjemmesiden får en masse trafik, kan du opleve, at denne lokationstjeneste er for langsom. I så fald skal du installere %1$sPECL-udvidelsen%2$s eller et %3$sservermodul%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Lokasationstjenesten bruger det GeoIP-modul, der er installeret i din HTTP-server. Tjenesten er hurtig og præcis, men %1$skan kun bruges med normal browser tracking.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Hvis du skal importere logfiler eller gøre noget andet, der kræver indstilling af IP-adresser, skal du bruge %1$sPECL GeoIP implementering (anbefales)%2$s eller %3$sPHP GeoIP implementering%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Bemærk: IP anonymisering har ingen effekt på de lokationer som rapporteres af denne tjeneste. Før du bruger den på IP anonymisering, så vær sikker på, at det ikke strider mod de gældende regler for privatliv.",
- "GeoIpLocationProviderNotRecomnended": "Geolocation virker, men du bruger ikke en af ​​de anbefalede udbydere.",
- "GeoIPNoServerVars": "Matomo kan ikke finde nogen GeoIP %s variable.",
- "GeoIPPeclCustomDirNotSet": "%s PHP ini indstillingen er ikke sat.",
- "GeoIPServerVarsFound": "Matomo registrerer følgende GeoIP %s variabler",
"Geolocation": "Geolokation",
"GeolocationPageDesc": "På denne side kan du ændre hvordan Matomo bestemmer de besøgendes lokation.",
"getCityDocumentation": "Denne rapport viser hvilke byer dine besøgende var i da de besøgte dhjemmesiden.",
"getContinentDocumentation": "Denne rapport viser hvilke kontinenter dine besøgende var i da de besøgte hjemmesiden.",
"getCountryDocumentation": "Denne rapport viser hvilke lande dine besøgende var i da de besøgte hjemmesiden.",
"getRegionDocumentation": "Denne rapport viser hvilke regioner dine besøgende var i da de besøgte hjemmesiden.",
- "HowToInstallApacheModule": "Hvordan installerer jeg GeoIP-modulet til Apache?",
- "HowToInstallGeoIpPecl": "Hvordan installerer jeg GeoIP-udvidelsen til PECL?",
- "HowToInstallNginxModule": "Hvordan installerer jeg GeoIP-modulet til Nginx?",
- "HowToSetupGeoIPIntro": "Det lader ikke til at du har geolokalisering til at være nøjagtig. Det er en nyttig funktion, og uden den vil du ikke se nøjagtige og fuldstændige lokaliseringsoplysninger om dine besøgende. Sådan kan du hurtigt begynde at bruge det:",
- "HttpServerModule": "HTTP servermodul",
- "InvalidGeoIPUpdatePeriod": "Ugyldig periode for GeoIP opdateringen: %1$s. Gyldige værdier er %2$s.",
- "ISPDatabase": "Internetudbyder (ISP) database",
"Latitude": "Breddegrad",
"Latitudes": "Breddegrader",
"Location": "Sted",
- "LocationDatabase": "Lokationsdatabase",
- "LocationDatabaseHint": "En lokationsdatabase er enten en land-, region- eller by-database.",
"LocationProvider": "Lokationstjeneste",
"Longitude": "Længdegrad",
"Longitudes": "Længdegrader",
"NoDataForGeoIPReport1": "Der er ingen data for rapporten, fordi der enten ikke er lokaliseringsdata til rådighed, eller besøgendes IP-adresser ikke kan geografisk placeres.",
"NoDataForGeoIPReport2": "For at aktivere nøjagtig geolokalisering skal indstillingerne ændres %1$sher%2$s og bruge en %3$sbyniveaudatabase%4$s.",
- "Organization": "Organisation",
- "OrgDatabase": "Organisationsdatabase",
"PluginDescription": "Rapporter placeringen af besøgende: land, region, by og geografiske koordinater (længde\/bredde).",
"Region": "Region",
"SubmenuLocations": "Steder",
"ToGeolocateOldVisits": "For at få lokaliseringsdata for gamle besøg, brug scriptet beskrevet %1$sher%2$s.",
- "UnsupportedArchiveType": "Ikke understøttet arkivtype %1$s fundet.",
- "UpdaterHasNotBeenRun": "Opdateringsprogrammet har aldrig været kørt.",
- "UpdaterIsNotScheduledToRun": "Det er ikke planlagt til at køre i fremtiden.",
- "UpdaterScheduledForNextRun": "Planlagt til at køre i løbet af den næste archive.php cron udførelse.",
- "UpdaterWasLastRun": "Opdateringen blev sidst blev kørt den %s.",
- "UpdaterWillRunNext": "Næste planlagte kørsel %s.",
"WidgetLocation": "Besøgendes lokation"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/de.json b/plugins/UserCountry/lang/de.json
index b4abee83ad..6a30917a44 100644
--- a/plugins/UserCountry/lang/de.json
+++ b/plugins/UserCountry/lang/de.json
@@ -1,13 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Die apache_get_modules Funktion wurde nicht gefunden. Es wird daher von einem Nicht-Apache Webserver ausgegangen.",
- "CannotFindGeoIPDatabaseInArchive": "Die Datei %1$s konnte im TAR-Archiv %2$s nicht gefunden werden!",
- "CannotFindGeoIPServerVar": "Die %s Variable ist nicht gesetzt. Ihr Server ist möglicherweise nicht korrekt konfiguriert.",
- "CannotFindPeclGeoIPDb": "Es konnten keine Länder, Regionen oder Städte Datenbank für das GeoIP PECL Modul gefunden werden. Stellen Sie sicher, dass sich die Geolocation-Datenbank im Ordner %1$s befindet und den Dateinamen %2$s oder %3$s trägt. Andernfalls wird diese vom PECL Modul nicht erkannt.",
- "CannotListContent": "Kann keinen Inhalt auflisten für %1$s: %2$s",
"CannotLocalizeLocalIP": "Die IP-Adresse %s ist eine lokale Adresse. Der Standort kann daher nicht ermittelt werden.",
- "CannotSetupGeoIPAutoUpdating": "Ihre Geolocation-Datenbanken scheinen außerhalb von Matomo gespeichert zu sein (es konnten keine Datenbanken innerhalb des 'misc'-Unterordners gefunden werden, dennoch funktioniert die Standorterkennung). Matomo kann in diesem Fall keine automatischen Aktualisierungen vornehmen.",
- "CannotUnzipDatFile": "Konnte dat-Datei in %1$s nicht entpacken: %2$s",
"City": "Stadt",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontinent",
@@ -24,80 +17,28 @@
"DefaultLocationProviderDesc2": "Dies ist nicht sehr genau, daher %1$swird empfohlen %2$sGeolocation-Datenbank%3$s zu installieren und zu nutzen.%4$s",
"DefaultLocationProviderExplanation": "Sie benutzen den standardmäßigen Standortanbieter. Das bedeutet, dass Matomo den Standort durch die Sprache des Besuchers erahnen wird. %1$sLesen sie dies%2$s, um zu erfahren, wie Sie eine genauere Standorterkennung einrichten.",
"DistinctCountries": "%s unterschiedliche Länder",
- "DownloadingDb": "%s wird heruntergeladen",
- "DownloadNewDatabasesEvery": "Aktualisiere Datenbanken alle",
- "FatalErrorDuringDownload": "Ein fataler Fehler trat während dem Herunterladen der Datei auf. Es könnte ein Fehler mit Ihrer Internet Verbindung, der Geolocation-Datenbank die Sie herunterladen wollten oder Matomo vorliegen. Führen Sie den Download und die Installation der Datei manuell durch.",
- "FoundApacheModules": "Matomo hat folgende Apache-Module erkannt",
"FromDifferentCities": "Unterschiedliche Städte",
- "GeoIPCannotFindMbstringExtension": "Konnte die Funktion %1$s nicht finden. Bitte stellen Sie sicher, dass die %2$s Erweiterung installiert und geladen ist.",
- "GeoIPDatabases": "GeoIP Datenbanken",
"GeoIPDocumentationSuffix": "Um Daten für diesen Bericht sehen zu können, müssen Sie GeoIP im Standorterkennung Administrations-Reiter konfigurieren. Die kommerziellen %1$sMaxmind%2$s GeoIP Datenbanken sind weit genauer als die kostenlosen. Um zu sehen, wie genau sie sind, klicken Sie %3$shier%4$s.",
- "GeoIPNoDatabaseFound": "Die GeoIP Implementierung konnte keine Datenbank finden.",
- "GeoIPImplHasAccessTo": "Die GeoIP Implementierung hat Zugriff auf die folgenden Datenbanktypen",
- "GeoIPIncorrectDatabaseFormat": "Ihre Geolocation-Datenbank scheint nicht das korrekte Format zu haben. Möglicherweise ist diese beschädigt. Stellen Sie sicher, dass Sie die binäre Version verwenden und versuchen Sie diese durch eine andere Kopie zu ersetzen.",
- "GeoIpLocationProviderDesc_Pecl1": "Diese Standorterkennung verwendet eine Geolocation-Datenbank sowie ein PECL-Modul um den Standort der Besucher effizient und genau zu bestimmen.",
- "GeoIpLocationProviderDesc_Pecl2": "Diese Art der Standortbestimmung hat keine Einschränkungen, daher wird empfohlen diese zu verwenden.",
- "GeoIpLocationProviderDesc_Php1": "Diese Art der Standortbestimmung ist die am einfachsten zu installierende, da Sie keine Serverkonfiguration benötigt (Ideal für Shared Hosting!). Sie verwendet eine Geolocation-Datenbank und die PHP-API von MaxMind um den Standort eines Besuchers genau zu bestimmen.",
- "GeoIpLocationProviderDesc_Php2": "Falls Ihre Website viel Traffic hat, könnte Ihnen diese Standorterkennung zu langsam sein. In diesem Fall sollten Sie die %1$sPECL-Erweiterung%2$s oder ein %3$sServer-Modul%4$s installieren.",
- "GeoIpLocationProviderDesc_ServerBased1": "Diese Art der Standortbestimmung verwendet das GeoIP-Modul das auf ihrem HTTP-Server installiert ist. Diese ist am schnellsten und genauesten, aber %1$skann nur bei normalem Browser-Tracking benutzt werden%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Falls Sie Protokolldateien oder andere Dinge importieren, welche IP-Adressen enthalten, können Sie die %1$sPECL GeoIP Implementierung (empfohlen)%2$s oder die %3$sPHP GeoIP Implementierung%4$s wählen.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Hinweis: IP-Anonymisierung hat keinen Einfluss auf diese Art der Standortbestimmung. Stellen Sie sicher, dass die Benutzung mit IP-Anonymisierung nicht im Widerspruch zu Privatsphärebestimmungen steht, die für Sie gelten.",
- "GeoIpLocationProviderNotRecomnended": "Standorterkennung funktioniert, aber Sie nutzen keinen der empfohlenen Anbieter.",
- "GeoIPNoServerVars": "Matomo konnte keine GeoIP %s Variablen finden.",
- "GeoIPPeclCustomDirNotSet": "Die php.ini Einstellung für %s ist nicht gesetzt.",
- "GeoIPServerVarsFound": "Matomo hat folgende GeoIP %s Variablen erkannt",
- "GeoIPUpdaterInstructions": "Bitte geben Sie unten die Downloadlinks für Ihre Datenbank an. Falls Sie Ihre Datenbank von %3$sDBIP%4$s oder %1$sMaxMind%2$s beziehen können Sie diese Links in ihrem DBIP oder Maxmind Benutzerkonto finden. Falls Sie Probleme haben auf diese zuzugreifen, kontaktieren Sie bitte den Anbieter ihrer Geolocation-Datenbank.",
- "GeoIPUpdaterIntro": "Matomo verwaltet derzeit die Aktualisierungen für folgende Datenbanken",
- "GeoLiteCityLink": "Falls Sie die DBIP City Lite Datenbank verwenden, benutzen Sie diesen Link: %1$s%2$s%3$s.",
"Geolocation": "Standorterkennung",
"GeolocationPageDesc": "Auf dieser Seite können Sie einstellen auf welche Weise Matomo die Herkunft eines Besuchers ermittelt.",
"getCityDocumentation": "Dieser Bericht enthält die Städte, in denen sich Ihre Besucher befanden, als sie Ihre Website besuchten.",
"getContinentDocumentation": "Dieser Bericht enthält die Kontinente, auf denen sich Ihre Besucher befanden, als sie Ihre Website besuchten.",
"getCountryDocumentation": "Dieser Bericht enthält die Länder, in denen sich Ihre Besucher befanden, als sie Ihre Website besuchten.",
"getRegionDocumentation": "Dieser Bericht enthält die Regionen, in denen sich Ihre Besucher befanden, als sie Ihre Website besuchten.",
- "HowToInstallApacheModule": "Wie wird das GeoIP-Modul für Apache installiert?",
"HowToInstallGeoIPDatabases": "Woher bekommt man die Geolocation-Datenbanken?",
- "HowToInstallGeoIpPecl": "Wie wird die GeoIP PECL Erweiterung installiert?",
- "HowToInstallNginxModule": "Wie wird das GeoIP Modul für Nginx installiert?",
- "HowToSetupGeoIP": "Wie richtet man eine genaue Standorterkennung mit DBIP ein",
- "HowToSetupGeoIP_Step1": "Die DBIP City Lite Datenbank von %3$sDBIP%4$s %1$sherunterladen%2$s.",
- "HowToSetupGeoIP_Step2": "Entpacken Sie die Datei und kopieren den Inhalt %1$s in das %2$smisc%3$s Matomo Unterverzeichnis und benennen Sie diesen in %4$s um (dies ist z.B. mit FTP oder SSH möglich).",
- "HowToSetupGeoIP_Step3": "Laden Sie diese Ansicht neu. Der %1$sDBIP \/ GeoIP (PHP)%2$s Provider wird nun %3$sinstalliert%4$s. Wählen Sie ihn aus.",
- "HowToSetupGeoIP_Step4": "Und fertig! Sie haben gerade Matomo konfiguriert DBIP zu verwenden. Dies bedeutet, dass Sie nun in der Lage sind die Regionen und Städte zusammen mit einer sehr genauen Angabe der Länder ihrer Besucher zu sehen.",
- "HowToSetupGeoIPIntro": "Anscheinend wurde die Standorterkennung noch nicht vollständig konfiguriert. Dies ist ein nützliches Feature und ohne es ist es nicht möglich, komplett vollständige und umfangreiche Informationen über die Besucher zu erhalten. Nachfolgend alle Informationen, um schnell damit zu beginnen:",
- "HttpServerModule": "HTTP-Server-Modul",
- "InvalidGeoIPUpdatePeriod": "Ungültiger Zeitraum für die GeoIP-Aktualisierung: %1$s. Gültige Werte sind %2$s.",
- "IPurchasedGeoIPDBs": "Ich habe genauere Datenbanken von %3$sDBIP%4$s oder %1$sMaxMind%2$s erworben und möchte automatische Aktualisierungen einrichten.",
- "ISPDatabase": "Internet Anbieter Datenbank",
- "IWantToDownloadFreeGeoIP": "Ich möchte die kostenlose DBIP Datenbank herunterladen...",
"Latitude": "Breitengrad",
"Latitudes": "Breitengrade",
"Location": "Ort",
- "LocationDatabase": "Standortdatenbank",
- "LocationDatabaseHint": "Eine Standortdatenbank ist entweder eine Datenbank mit Ländern, Regionen oder Städten",
"LocationProvider": "Standorterkennungsdienst",
"Longitude": "Längengrad",
"Longitudes": "Längengrade",
"NoDataForGeoIPReport1": "Es sind keine Daten für diesen Bericht vorhanden, da entweder keine Lokalisierungsdaten vorhanden sind oder die Besucher IP-Adresse nicht geortet werden kann.",
"NoDataForGeoIPReport2": "Um die vollständige Standorterkennung zu aktivieren, ändern Sie bitte %1$shier%2$s die Einstellungen und benutzen eine %3$sStädtebasierte Datenbank%4$s.",
- "Organization": "Organisation",
- "OrgDatabase": "Organisationsdatenbank",
- "PeclGeoIPNoDBDir": "Das PECL Modul hat im Verzeichnis %1$s keine Datenbank gefunden. Bitte erstellen Sie das Verzeichnis und fügen die Geolocation-Datenbanken hinzu. Alternativ ist es möglich %2$s auf das richtige Verzeichnis in der php.ini zu konfigurieren.",
- "PeclGeoLiteError": "Ihre Geolocation-Datenbank in %1$s lautet %2$s. Allerdings kann das PECL Modul die Datenbank mit diesem Namen nicht erkennen. Bitte benennen Sie sie um in %3$s.",
- "PiwikNotManagingGeoIPDBs": "Matomo verwaltet derzeit keine DBIP oder Maxmind Datenbanken.",
"PluginDescription": "Bericht über den Standort Ihrer Besucher: Land, Region, Stadt und geographische Koordinaten (geographische Breite und geographische Länge).",
"Region": "Region",
- "SetupAutomaticUpdatesOfGeoIP": "Automatische Aktualisierungen für Geolocation-Datenbanken einrichten",
"SubmenuLocations": "Orte",
"TestIPLocatorFailed": "Matomo hat die Überprüfung einer bekannten IP-Adresse (%1$s) durchgeführt, aber Ihr Server hat keine Informationen zurückgegeben. Diese Provider ist möglicherweise nicht korrekt konfiguriert (z.B. könnte die Geolocation-Datenbank falsch benannt sein oder im falschen Ordner liegen).",
- "ThisUrlIsNotAValidGeoIPDB": "Die heruntergeladene Datei ist keine gültige Geolocation-Datenbank. Bitte überprüfen Sie die URL oder laden Sie die Datei manuell herunter.",
"ToGeolocateOldVisits": "Für Standortdaten für vergangene Besuche verwenden Sie bitte das %1$shier beschriebene Skript%2$s.",
- "UnsupportedArchiveType": "Nicht unterstützter Archivtyp erkannt: %1$s",
- "UpdaterHasNotBeenRun": "Es hat noch keine Aktualisierung stattgefunden.",
- "UpdaterIsNotScheduledToRun": "Keine zukünftige Ausführung geplant.",
- "UpdaterScheduledForNextRun": "Ausführung für den nächsten archive.php cron Durchlauf geplant.",
- "UpdaterWasLastRun": "Die Aktualisierung wurde zuletzt ausgeführt am %s.",
- "UpdaterWillRunNext": "Nächste Ausführung geplant für %s.",
"WidgetLocation": "Besucherstandort"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/el.json b/plugins/UserCountry/lang/el.json
index e23f0f9a9d..f6739b81b4 100644
--- a/plugins/UserCountry/lang/el.json
+++ b/plugins/UserCountry/lang/el.json
@@ -1,13 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Αδύνατη η εύρεση της συνάρτησης apache_get_modules, υποθέτουμε ότι ο διακομιστής δεν είναι Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Αδύνατη η εύρεση του αρχείου %1$s στο συμπιεσμένο tar %2$s!",
- "CannotFindGeoIPServerVar": "Η μεταβλητή %s δεν έχει οριστεί. Ο διακομιστής σας μπορεί να μην έχει ρυθμιστεί σωστά.",
- "CannotFindPeclGeoIPDb": "Δεν ήταν δυνατή η εύρεση μιας βάσης δεδομένων χώρας, περιοχής ή πόλης για το πρόσθετο GeoIP PECL. Βεβαιωθείτε ότι GeoIP βάση δεδομένων σας βρίσκεται στο %1$s και έχει το όνομα %2$s ή %3$s, διαφορετικά το πρόσθετο PECL δεν θα το λάβει υπόψη.",
- "CannotListContent": "Αδύνατη η δημιουργία λίστας του περιεχομένου για %1$s: %2$s",
"CannotLocalizeLocalIP": "Η IP διεύθυνση %s είναι μια τοπική διεύθυνση και δεν μπορεί να προσδιοριστεί γεωγραφικά.",
- "CannotSetupGeoIPAutoUpdating": "Φαίνεται ότι αποθηκεύετε τις GeoIP βάσεις δεδομένων σας εκτός της εγκατάστασης του Matomo (αφού δεν υπάρχουν βάσεις δεδομένων στο misc υποκατάλογο, αλλά το GeoIP λειτουργεί). Το Matomo δεν μπορεί να ενημερώσει αυτόματα τις GeoIP βάσεις δεδομένων σας αν βρίσκονται εκτός του καταλόγου misc.",
- "CannotUnzipDatFile": "Αδύνατη η αποσυμπίεση αρχείου dat στο %1$s: %2$s",
"City": "Πόλη",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Ήπειρος",
@@ -24,81 +17,29 @@
"DefaultLocationProviderDesc2": "Αυτό δεν είναι πολύ ακριβές, έτσι %1$sπροτείνουμε την εγκατάσταση και τη χρήση %2$sμιας βάσης γεωτοποθεσίας%3$s.%4$s",
"DefaultLocationProviderExplanation": "Χρησιμοποιείτε τον προκαθορισμένο πάροχο τοποθεσίας, που σημαίνει ότι το Matomo θα μαντεύει την τοποθεσία του επισκέπτη βάσει της γλώσσας που χρησιμοποιεί. %1$sΔιαβάστε αυτό%2$s για να μάθετε πως να ορίζετε πιο ακριβή μέθοδο γεωτοποθεσίας.",
"DistinctCountries": "%s διακεκριμένες χώρες",
- "DownloadingDb": "Λήψη %s",
- "DownloadNewDatabasesEvery": "Ενημέρωση βάσεων δεδομένων κάθε",
- "FatalErrorDuringDownload": "Παρουσιάστηκε ανεπανόρθωτο σφάλμα κατά την λήψη αυτού του αρχείου. Μπορεί να υπάρχει κάποιο λάθος με τη σύνδεσή σας με το διαδίκτυο, με τη βάση δεδομένων GeoIP που έχετε κατεβάσει ή με το Matomo. Προσπαθήστε να κάνετε λήψη και να το εγκαταστήσετε με χειροκίνητο τρόπο.",
- "FoundApacheModules": "Το Matomo βρήκε τα ακόλουθα πρόσθετα Apache",
"FromDifferentCities": "διαφορετικές πόλεις",
- "GeoIPCannotFindMbstringExtension": "Δεν μπορείτε να βρείτε τη λειτουργία του %1$s. Παρακαλώ βεβαιωθείτε ότι η επέκταση %2$s είναι εγκατεστημένη και έχει φορτωθεί.",
- "GeoIPDatabases": "Βάσεις δεδομένων GeoIP",
"GeoIPDocumentationSuffix": "Για για να δείτε τα δεδομένα για αυτή την αναφορά, θα πρέπει να ρυθμίσετε το GeoIP στην καρτέλα διαχειριστή Geolocation. Οι εμπορικές %1$sMaxmind%2$s βάσεις δεδομένων GeoIP είναι πιο ακριβείς από τις ελεύθερες. Για να δείτε πόσο ακριβείς είναι, κάντε κλικ στο %3$shere%4$s.",
- "GeoIPNoDatabaseFound": "Η υλοποίηση της GeoIP δεν μπόρεσε να βρει κάποια βάση δεδομένων.",
- "GeoIPImplHasAccessTo": "Αυτή η υλοποίηση GeoIP έχει πρόσβαση στους ακόλουθους τύπους βάσεων δεδομένων",
- "GeoIPIncorrectDatabaseFormat": "Η βάση δεδομένων της γεωτοποθεσίας σας φαίνεται να έχει λάθος μορφή. Ενδέχεται να είναι κατεστραμμένη. Βεβαιωθείτε ότι χρησιμοποιείτε τη δυαδική μορφή και δοκιμάστε να την ξανααντιγράψετε από πάνω με ένα σωστό αντίγραφο.",
- "GeoIpLocationProviderDesc_Pecl1": "Αυτός ο πάροχος τοποθεσίας χρησιμοποιεί μια βάση δεδομένων γεωτοποθεσίας και μια λειτουργική μονάδα PECL για να καθορίζει με ακρίβεια και αποτελεσματικά την τοποθεσία των επισκεπτών σας.",
- "GeoIpLocationProviderDesc_Pecl2": "Δεν υπάρχουν περιορισμοί με αυτό τον Πάροχο, έτσι είναι αυτός που σας συνιστούμε να χρησιμοποιήσετε.",
- "GeoIpLocationProviderDesc_Php1": "Αυτός ο πάροχος τοποθεσίας είναι ο απλούστερος στην εγκατάσταση καθώς δεν απαιτεί παραμετροποίηση στο διακομιστή (ιδανικός για διαμοιραζόμενη φιλοξενία!). Χρησιμοποιεί μια βάση δεδομένων γεωτοποθεσίας και το PHP API της MaxMind για τον ακριβή καθορισμό της τοποθεσίας των επισκεπτών σας.",
- "GeoIpLocationProviderDesc_Php2": "Εάν η ιστοσελίδα σας έχει πολλή κίνηση, μπορείτε να διαπιστώσετε ότι αυτός ο Πάροχος τοποθεσιών είναι πολύ αργός. Σε αυτή την περίπτωση, θα πρέπει να εγκαταστήσετε την %1$sεπέκταση PECL%2$s ή ένα %3$sπρόσθετο στον διακομιστή σας%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Αυτός ο πάροχος χρησιμοποιεί τη λειτουργία τοποθεσιών GeoIP που έχει εγκατασταθεί στον HTTP διακομιστή σας. Αυτός ο πάροχος είναι γρήγορος και ακριβής, αλλά %1$sμπορεί να χρησιμοποιηθεί μόνο με την κανονική παρακολούθηση του προγράμματος περιήγησης.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Αν έχετε να εισάγετε αρχεία καταγραφής ή να κάνετε κάτι άλλο που απαιτεί τον καθορισμό διευθύνσεων IP, χρησιμοποιήστε την %1$sPECL υλοποίηση του GeoIP (συνιστάται)%2$s ή την %3$sPHP υλοποίηση του GeoIP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Σημείωση: Η ανωνυμοποίηση IP διευθύνσεων δεν έχει καμία επίδραση στις τοποθεσίες που αναφέρονται από αυτόν τον πάροχο. Πριν το χρησιμοποιήσετε μαζί με την ανωνυμοποίηση IP, βεβαιωθείτε ότι αυτό δεν παραβιάζει κανένα νόμο περί προσωπικών δεδομένων που ενδέχεται να ισχύει στη χώρα σας.",
- "GeoIpLocationProviderNotRecomnended": "Η Γεωτοποθεσία δουλεύει, αλλά δεν χρησιμοποιείτε κάποιον από τους προτεινόμενους παρόχους.",
- "GeoIPNoServerVars": "Το Matomo δεν μπορεί να βρει καμιά μεταβλητή %s GeoIP.",
- "GeoIPPeclCustomDirNotSet": "Η ρύθμιση ini %s της PHP δεν έχει οριστεί.",
- "GeoIPServerVarsFound": "Το Matomo ανίχνευσε τις ακόλουθες μεταβλητές GeoIP %s",
- "GeoIPUpdaterInstructions": "Εισάγετε παρακάτω τους συνδέσμους λήψης για τις βάσεις δεδομένων σας. Αν έχετε αγοράσει βάσεις δεδομένων από το %3$sdbip%4$s ή το %1$sMaxMind%2$s, μπορείτε να βρείτε τους συνδέσμους λήψης στο λογαριασμό σας στο dbip ή στο MaxMind. Παρακαλούμε επικοινωνήστε με τον πάροχο γεωτοποθεσίας σας αν έχετε πρόβλημα με την πρόσβαση στους συνδέσμους.",
- "GeoIPUpdaterIntro": "Το Matomo επί του παρόντος διαχειρίζεται τις ενημερώσεις για τις ακόλουθες βάσεις δεδομένων",
- "GeoLiteCityLink": "Αν χρησιμοποιείτε τη βάση δεδομένων πόλεων του dbip, χρησιμοποιήστε τον παρακάτω σύνδεσμο: %1$s%2$s%3$s",
"Geolocation": "Γεωτοποθεσία",
"GeolocationPageDesc": "Σε αυτή τη σελίδα μπορείτε να αλλάξετε τον τρόπο που το Matomo καθορίζει τις τοποθεσίες των επισκεπτών.",
"getCityDocumentation": "Η παρούσα αναφορά παρουσιάζει τις πόλεις στις οποίες οι επισκέπτες σας βρίσκονταν όταν επισκεύθηκαν την ιστοσελίδα σας.",
"getContinentDocumentation": "Η παρούσα αναφορά δείχνει σε ποια ήπειρο βρίσκονταν οι επισκέπτες σας ήταν όταν επισκεύθηκαν την ιστοσελίδα σας.",
"getCountryDocumentation": "Αυτή η αναφορά δείχνει σε ποιά χώρα ήταν οι επισκέπτες σας όταν επισκεύθηκαν την ιστοσελίδα σας.",
"getRegionDocumentation": "Η παρούσα αναφορά δείχνει σε ποιά περιοχή ήταν οι επισκέπτες σας όταν επισκεύθηκαν την ιστοσελίδα σας.",
- "HowToInstallApacheModule": "Πως εγκαθιστώ την επέκταση GeoIP για τον Apache;",
"HowToInstallGeoIPDatabases": "Πως παίρνω τις βάσεις δεδομένων γεωτοποθεσίας;",
- "HowToInstallGeoIpPecl": "Πως εγκαθιστώ την επέκταση PECL του GeoIP;",
- "HowToInstallNginxModule": "Πως εγκαθιστώ την επέκταση GeoIP για το Nginx;",
- "HowToSetupGeoIP": "Πως εγκαθιστώ ακριβή γεωτοποθέτηση με το dbip",
- "HowToSetupGeoIP_Step1": "%1$sΛήψη%2$s της βάσης δεδομένων πόλεων του DBIP από %3$sdbip%4$s.",
- "HowToSetupGeoIP_Step2": "Αποσυμπιέστε το αρχείο και αντιγράψτε το αποτέλεσμα, %1$s μέσα στον υποκατάλογο %2$smisc%3$s του Matomo και μετονομάστε το σε %4$s (μπορείτε να το κάνετε αυτό μέσω FTP ή SSH).",
- "HowToSetupGeoIP_Step3": "Επαναφόρτωση της οθόνης. Ο πάροχος %1$sDBIP \/ GeoIP (PHP)%2$s θα %3$sεγκατασταθεί%4$s. Επιλέξτε τον.",
- "HowToSetupGeoIP_Step4": "Και είστε έτοιμοι! Μόλις εγκαταστήσατε το Matomo να χρησιμοποιεί το DBIP που σημαίνει ότι θα μπορείτε να βλέπετε τις περιοχές και τις πόλεις των επισκεπτών σας μαζί με αρκετά έγκυρη πληροφορία σχετικά με τις χώρες.",
- "HowToSetupGeoIPIntro": "Δεν φαίνεται να έχετε εγκατεστημένη τη Γεωτοποθεσία. Αποτελεί ένα χρήσιμο χαρακτηριστικό και χωρίς αυτό δε θα βλέπετε έγκυρες και πλήρης πληροφορίες για τις τοποθεσίες των επισκεπτών σας. Δείτε πως μπορείτε γρήγορα να αρχίσετε να τη χρησιμοποιείτε:",
- "HttpServerModule": "Επέκταση Διακομιστή HTTP",
- "InvalidGeoIPUpdatePeriod": "Μη έγκυρη περίοδος για την ενημέρωση του GeoIP: %1$s. Έγκυρες τιμές είναι %2$s.",
- "IPurchasedGeoIPDBs": "Αγόρασα βάσεις δεδομένων με μεγαλύτερη ακρίβεια από το %3$sdbip%4$s ή το %1$sMaxMind%2$s και θέλω να εγκαταστήσω τις αυτόματες ενημερώσεις.",
- "ISPDatabase": "Βάση δεδομένων Παρόχων",
- "IWantToDownloadFreeGeoIP": "Θέλω να λάβω τη δωρεάν βάση δεδομένων DBIP...",
"Latitude": "Γεωγραφικό Πλάτος",
"Latitudes": "Γεωγραφικά πλάτη",
"Location": "Τοποθεσία",
- "LocationDatabase": "Βάση δεδομένων τοποθεσιών",
- "LocationDatabaseHint": "Μια βάση δεδομένων τοποθεσιών είναι μια βάση δεδομένων χωρών, περιοχών ή πόλεων.",
"LocationProvider": "Πάροχος Τοποθεσίας",
"Longitude": "Γεωγραφικό μήκος",
"Longitudes": "Γεωγραφικά μήκη",
"NoDataForGeoIPReport1": "Δεν υπάρχουν δεδομένα για αυτή την αναφορά επειδή είτε δεν υπάρχουν δεδομένα τοποθεσίας διαθέσιμα είτε επειδή για τις διευθύνσεις IP των επισκεπτών δεν ήταν δυνατός ο εντοπισμός της τοποθεσίας τους.",
"NoDataForGeoIPReport2": "Για να ενεργοποιήστε ακριβή Γεωτοποθεσία, αλλάξτε τις ρυθμίσεις %1$sεδώ%2$s και χρησιμοποιήστε μια %3$sβάση δεδομένων πόλεων%4$s.",
- "Organization": "Οργανισμός",
- "OrgDatabase": "Βάση δεδομένων Οργανισμών",
- "PeclGeoIPNoDBDir": "Η μονάδα PECL ψάχνει για βάσεις δεδομένων στο %1$s, αλλά αυτός ο κατάλογος δεν υπάρχει. Παρακαλούμε δημιουργήστε τον και προσθέστε μέσα τις βάσεις δεδομένων γεωτοποθεσίας. Εναλλακτικά, μπορείτε να ορίσετε το %2$s στο σωστό κατάλογο στο αρχείο σας php.ini.",
- "PeclGeoLiteError": "Η βάση δεδομένων σας με γεωτοποθεσία στο %1$s ονομάζεται %2$s. Δυστυχώς, η μονάδα PECL δε θα την αναγνωρίσει με αυτό το όνομα. Παρακαλούμε μετονομάστε την σε %3$s.",
- "PiwikNotManagingGeoIPDBs": "Το Matomo δεν διαχειρίζεται αυτή τη στιγμή κάποια βάση δεδομένων DBIP ή βάσεις της MaxMind.",
+ "NoProviders": "Δεν υπάρχουν αυτή τη στιγμή πρόσθετοι πάροχοι γεωτοποθεσίας. Το Matomo συνιστά τη χρήση των βάσεων %1$sdbip%2$s, αλλά αυτό απαιτεί την ενεργοποίηση του πρόσθετου GeoIp2. (Εναλλακτικά μπορείτε ένα εγκαταστήσετε από την αγορά ένα πρόσθετο από κάποιον τρίτο που παρέχει τη δική του λειτουργικότητα για γεωτοποθεσία.)",
"PluginDescription": "Αναφέρει τον τοποθεσία των επισκεπτών σας: χώρα, περιοχή, πόλη και γεωγραφικές συντεταγμένες (πλάτος\/μήκος).",
"Region": "Περιοχή",
- "SetupAutomaticUpdatesOfGeoIP": "Εγκατάσταση αυτόματων ενημερώσεων των βάσεων δεδομένων γεωτοποθεσίας",
"SubmenuLocations": "Τοποθεσίες",
"TestIPLocatorFailed": "Το Matomo προσπάθησε να ελέγξει την τοποθεσία μιας γνωστής διεύθυνσης IP (%1$s), αλλά ο διακομιστής σας δεν επέστρεψε πληροφορία. Ο πάροχος ενδέχεται να μην παραμετροποιήθηκε σωστά (η βάση δεδομένων γεωτοποθεσίας μπορεί να έχει λάθος όνομα ή να είναι σε λάθος κατάλογο, για παράδειγμα).",
- "ThisUrlIsNotAValidGeoIPDB": "Το κατεβασμένο αρχείο δεν είναι έγκυρη βάση δεδομένων γεωτοποθεσίας. Παρακαλούμε διπλοελέγξτε τη διεύθυνση URL ή κατεβάστε το αρχείο χειροκίνητα.",
"ToGeolocateOldVisits": "Για να κάνετε λήψη των δεδομένων γεωτοποθεσίας από τις παλιές σας επισκέψεις, χρησιμοποιήστε το σενάριο που περιγράφεται %1$sεδώ%2$s.",
- "UnsupportedArchiveType": "Παρουσιάστηκε μη υποστηριζόμενος τύπος συμπιεσμένου αρχείου %1$s.",
- "UpdaterHasNotBeenRun": "Το πρόγραμμα ενημέρωσης δεν εκτελέστηκε ποτέ.",
- "UpdaterIsNotScheduledToRun": "Δεν είναι προγραμματισμένο να εκτελεστεί στο μέλλον.",
- "UpdaterScheduledForNextRun": "Είναι προγραμματισμένο για εκτέλεση κατά την εκτέλεση του επόμενου archive.php από το cron.",
- "UpdaterWasLastRun": "Το πρόγραμμα ενημέρωσης εκτελέστηκε τελευταία στις %s.",
- "UpdaterWillRunNext": "Είναι προγραμματισμένο για εκτέλεση στις %s.",
- "WidgetLocation": "Τοποθεσία Επισκέπτη",
- "InstallGeoIp2": "Το Matomo προτείνει τη χρήση των βάσεων %1$sdbip%2$s, αλλά αυτό απαιτεί τη χρήση του πρόσθετου GeoIp2. Αν το εγκαταστήσετε και το ενεργοποιήσετε (που ενδεχομένως να χρειαστεί μια μακρόχρονη διαδικασία), θα μπορέσετε να ξεκινήσετε τη χρήση των βάσεων %1$sdbip%2$s. (Αγνοήστε το παρόν αν χρησιμοποιείτε ήδη τρίτο πρόσθετο που παρέχει τη δική του λειτουργικότητα για γεωτοποθεσία.)"
+ "WidgetLocation": "Τοποθεσία Επισκέπτη"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/en.json b/plugins/UserCountry/lang/en.json
index 852293b84d..fc74a8a402 100644
--- a/plugins/UserCountry/lang/en.json
+++ b/plugins/UserCountry/lang/en.json
@@ -1,13 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Cannot find apache_get_modules function, assuming non-Apache webserver.",
- "CannotFindGeoIPDatabaseInArchive": "Cannot find %1$s file in tar archive %2$s!",
- "CannotFindGeoIPServerVar": "The %s variable is not set. Your server may not be configured correctly.",
- "CannotFindPeclGeoIPDb": "Could not find a country, region or city database for the GeoIP PECL module. Make sure your geolocation database is located in %1$s and is named %2$s or %3$s otherwise the PECL module will not notice it.",
- "CannotListContent": "Couldn't list content for %1$s: %2$s",
"CannotLocalizeLocalIP": "IP address %s is a local address and cannot be geolocated.",
- "CannotSetupGeoIPAutoUpdating": "It seems like you're storing your geolocation databases outside of Matomo (we can tell since there are no databases in the misc subdirectory, but your GeoIP is working). Matomo cannot automatically update your geolocation databases if they are located outside of the misc directory.",
- "CannotUnzipDatFile": "Could not unzip dat file in %1$s: %2$s",
"City": "City",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Continent",
@@ -24,81 +17,29 @@
"DefaultLocationProviderDesc2": "This is not very accurate, so %1$swe recommend installing and using %2$sa geolocation database%3$s.%4$s",
"DefaultLocationProviderExplanation": "You are using the default location provider, which means Matomo will guess the visitor's location based on the language they use. %1$sRead this%2$s to learn how to setup more accurate geolocation.",
"DistinctCountries": "%s distinct countries",
- "DownloadingDb": "Downloading %s",
- "DownloadNewDatabasesEvery": "Update databases every",
- "FatalErrorDuringDownload": "A fatal error occurred while downloading this file. There might be something wrong with your internet connection, with the geolocation database you downloaded or Matomo. Try downloading and installing it manually.",
- "FoundApacheModules": "Matomo found the following Apache modules",
"FromDifferentCities": "different cities",
- "GeoIPCannotFindMbstringExtension": "Cannot find the %1$s function. Please make sure the %2$s extension is installed and loaded.",
- "GeoIPDatabases": "GeoIP Databases",
"GeoIPDocumentationSuffix": "In order to see data for this report, you must setup GeoIP in the Geolocation admin tab. The commercial %1$sMaxmind%2$s GeoIP databases are more accurate than the free ones. To see how accurate they are, click %3$shere%4$s.",
- "GeoIPNoDatabaseFound": "This GeoIP implementation was not able to find any database.",
- "GeoIPImplHasAccessTo": "This GeoIP implementation has access to the following types of databases",
- "GeoIPIncorrectDatabaseFormat": "Your geolocation database does not seem to have the correct format. It may be corrupt. Make sure you are using the binary version and try replacing it with another copy.",
- "GeoIpLocationProviderDesc_Pecl1": "This location provider uses a geolocation database and a PECL module to accurately and efficiently determine the location of your visitors.",
- "GeoIpLocationProviderDesc_Pecl2": "There are no limitations with this provider, so it is the one we recommend using.",
- "GeoIpLocationProviderDesc_Php1": "This location provider is the simplest to install as it does not require server configuration (ideal for shared hosting!). It uses a geolocation database and MaxMind's PHP API to accurately determine the location of your visitors.",
- "GeoIpLocationProviderDesc_Php2": "If your website gets a lot of traffic, you may find that this location provider is too slow. In this case, you should install the %1$sPECL extension%2$s or a %3$sserver module%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "This location provider uses the GeoIP module that has been installed in your HTTP server. This provider is fast and accurate, but %1$scan only be used with normal browser tracking.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "If you have to import log files or do something else that requires setting IP addresses, use the %1$sPECL GeoIP implementation (recommended)%2$s or the %3$sPHP GeoIP implementation%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Note: IP anonymization has no effect on the locations reported by this provider. Before using it with IP anonymization, make sure this does not violate any privacy laws you may be subject to.",
- "GeoIpLocationProviderNotRecomnended": "Geolocation works, but you are not using one of the recommended providers.",
- "GeoIPNoServerVars": "Matomo cannot find any GeoIP %s variables.",
- "GeoIPPeclCustomDirNotSet": "The %s PHP ini option is not set.",
- "GeoIPServerVarsFound": "Matomo detects the following GeoIP %s variables",
- "GeoIPUpdaterInstructions": "Enter the download links for your databases below. If you've purchased databases from %3$sdbip%4$s or %1$sMaxMind%2$s, you can find these links in your dbip or MaxMind account. Please contact your geolocation database provider if you have trouble accessing them.",
- "GeoIPUpdaterIntro": "Matomo is currently managing updates for the following databases",
- "GeoLiteCityLink": "If you're using the dbip city lite database, use this link: %1$s%2$s%3$s",
"Geolocation": "Geolocation",
"GeolocationPageDesc": "On this page you can change how Matomo determines visitor locations.",
"getCityDocumentation": "This report shows the cities your visitors were in when they accessed your website.",
"getContinentDocumentation": "This report shows which continent your visitors were in when they accessed your website.",
"getCountryDocumentation": "This report shows which country your visitors were in when they accessed your website.",
"getRegionDocumentation": "This report shows which region your visitors were in when they accessed your website.",
- "HowToInstallApacheModule": "How do I install the GeoIP module for Apache?",
"HowToInstallGeoIPDatabases": "How do I get geolocation databases?",
- "HowToInstallGeoIpPecl": "How do I install the GeoIP PECL extension?",
- "HowToInstallNginxModule": "How do I install the GeoIP module for Nginx?",
- "HowToSetupGeoIP": "How to setup accurate geolocation with dbip",
- "HowToSetupGeoIP_Step1": "%1$sDownload%2$s the DBIP City Lite database from %3$sdbip%4$s.",
- "HowToSetupGeoIP_Step2": "Extract this file and copy the result, %1$s into the %2$smisc%3$s Matomo subdirectory and rename it to %4$s (you can do this either by FTP or SSH).",
- "HowToSetupGeoIP_Step3": "Reload this screen. The %1$sDBIP / GeoIP (PHP)%2$s provider will now be %3$sInstalled%4$s. Select it.",
- "HowToSetupGeoIP_Step4": "And you're done! You've just setup Matomo to use DBIP which means you'll be able to see the regions and cities of your visitors along with very accurate country information.",
- "HowToSetupGeoIPIntro": "You do not appear to have accurate Geolocation setup. This is a useful feature and without it you will not see accurate and complete location information for your visitors. Here's how you can quickly start using it:",
- "HttpServerModule": "HTTP Server Module",
- "InvalidGeoIPUpdatePeriod": "Invalid period for the GeoIP updater: %1$s. Valid values are %2$s.",
- "IPurchasedGeoIPDBs": "I purchased more accurate databases from %3$sdbip%4$s or %1$sMaxMind%2$s and want to setup automatic updates.",
- "ISPDatabase": "ISP Database",
- "IWantToDownloadFreeGeoIP": "I want to download the free DBIP database...",
"Latitude": "Latitude",
"Latitudes": "Latitudes",
"Location": "Location",
- "LocationDatabase": "Location Database",
- "LocationDatabaseHint": "A location database is either a country, region or city database.",
"LocationProvider": "Location Provider",
"Longitude": "Longitude",
"Longitudes": "Longitudes",
"NoDataForGeoIPReport1": "There is no data for this report because there is either no location data available or visitor IP addresses cannot be geolocated.",
"NoDataForGeoIPReport2": "To enable accurate geolocation, change the settings %1$shere%2$s and use a %3$scity level database%4$s.",
- "Organization": "Organization",
- "OrgDatabase": "Organization Database",
- "PeclGeoIPNoDBDir": "The PECL module is looking for databases in %1$s, but this directory does not exist. Please create it and add the geolocation databases to it. Alternatively, you can set %2$s to the correct directory in your php.ini file.",
- "PeclGeoLiteError": "Your geolocation database in %1$s is named %2$s. Unfortunately, the PECL module will not recognize it with this name. Please rename it to %3$s.",
- "PiwikNotManagingGeoIPDBs": "Matomo is not currently managing any DBIP or MaxMind databases.",
+ "NoProviders": "There are currently no additional geolocation providers available. Matomo recommends using the %1$sdbip%2$s databases, but this requires activating the GeoIp2 plugin. (Alternatively you can install a third party plugin that provides it's own geolocation functionality from the marketplace.)",
"PluginDescription": "Reports the location of your visitors: country, region, city and geographic coordinates (latitude\/longitude).",
"Region": "Region",
- "SetupAutomaticUpdatesOfGeoIP": "Setup automatic updates of geolocation databases",
"SubmenuLocations": "Locations",
"TestIPLocatorFailed": "Matomo tried checking the location of a known IP address (%1$s), but your server returned no information. This provider may not be configured correctly (the geolocation database may be named incorrectly or located in the wrong directory, for instance).",
- "ThisUrlIsNotAValidGeoIPDB": "The downloaded file is not a valid geolocation database. Please re-check the URL or download the file manually.",
"ToGeolocateOldVisits": "To get location data for your old visits, use the script described %1$shere%2$s.",
- "UnsupportedArchiveType": "Encountered unsupported archive type %1$s.",
- "UpdaterHasNotBeenRun": "The updater has never been run.",
- "UpdaterIsNotScheduledToRun": "It is not scheduled to run in the future.",
- "UpdaterScheduledForNextRun": "It is scheduled to run during the next cron core:archive command execution.",
- "UpdaterWasLastRun": "The updater was last run on %s.",
- "UpdaterWillRunNext": "It is next scheduled to run on %s.",
- "WidgetLocation": "Visitor Location",
- "InstallGeoIp2": "Matomo recommends using the %1$sdbip%2$s databases, but this requires using the GeoIp2 plugin. If you install and activate it (which will require a possibly long running update), you will be able to get started using %1$sdbip%2$s databases. (Ignore this if you are using a third party plugin that provides it's own geolocation functionality.)"
+ "WidgetLocation": "Visitor Location"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/es-ar.json b/plugins/UserCountry/lang/es-ar.json
index d2f268ea3b..565661b02e 100644
--- a/plugins/UserCountry/lang/es-ar.json
+++ b/plugins/UserCountry/lang/es-ar.json
@@ -1,13 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "No se puede encontrar la función \"apache_get_modules\", asumiendo que se posee un servidor de internet no-Apache.",
- "CannotFindGeoIPDatabaseInArchive": "¡No se encuentra el archivo %1$s en el archivo tar %2$s!",
- "CannotFindGeoIPServerVar": "La variable %s no está especificada. Tu servidor puede no estar configurado correctamente.",
- "CannotFindPeclGeoIPDb": "No se pudo encontrar una base de datos de país, región o ciudad en el módulo GeoIP PECL. Asegurate de que tu base de datos esté ubicada en %1$s y que se llame %2$s o %3$s; de lo contrario, el módulo PECL no la reconocerá.",
- "CannotListContent": "No se pudo enumerar el contenido de %1$s: %2$s",
"CannotLocalizeLocalIP": "La dirección IP %s es una dirección local y no puede ser geolocalizada.",
- "CannotSetupGeoIPAutoUpdating": "Parece que estás guardando tus bases de datos de geolocalización por fuera de Matomo (nos damos cuenta porque no hay base de datos en el subdirectorio \"misc\", pero tu GeoIP está funcionando). Matomo no puede actualizar automáticamente tus bases de datos de geolocalización si están ubicadas fuera del directorio \"misc\".",
- "CannotUnzipDatFile": "No se pudo descomprimir el archivo dat en %1$s: %2$s",
"City": "Ciudad",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Continente",
@@ -24,81 +17,28 @@
"DefaultLocationProviderDesc2": "Esto no es muy preciso, por lo tanto %1$srecomendamos instalar y utilizar %2$suna base de datos de geolocalización%3$s.%4$s",
"DefaultLocationProviderExplanation": "Estás usando el proveedor de ubicación predeterminado, lo que significa que Matomo intentará adivinar la ubicación del visitante basándose en el idioma que usa. %1$sLeé esto%2$s para aprender cómo configurar una geolocalización más precisa.",
"DistinctCountries": "%s países distintos",
- "DownloadingDb": "Descargando %s",
- "DownloadNewDatabasesEvery": "Actualizar bases de datos cada",
- "FatalErrorDuringDownload": "Ocurrió un error fatal al descargar este archivo. Puede ser que haya algo malo con tu conexión de Internet, con la base de datos de geolocalización que descargaste o con Matomo. Intentá descargarla e instalarla manualmente.",
- "FoundApacheModules": "Matomo encontró los siguientes módulos Apache",
"FromDifferentCities": "ciudades diferentes",
- "GeoIPCannotFindMbstringExtension": "No se encuentra la función %1$s. Por favor, asegurate que la extensión %2$s esté instalada y cargada.",
- "GeoIPDatabases": "Bases de datos GeoIP",
"GeoIPDocumentationSuffix": "Para ver la información de este informe, tenés que configurar GeoIP en la sección \"Geolocalización\" en la pestaña del administrador. Las bases de datos GeoIP comerciales %1$sMaxmind%2$s son más fiables que las gratuitas. Para ver cuán precisas son, hacé clic %3$sacá%4$s.",
- "GeoIPNoDatabaseFound": "Esta implementación GeoIP no pudo encontrar ninguna base de datos.",
- "GeoIPImplHasAccessTo": "Esta implementación GeoIP tiene acceso a los siguientes tipos de bases de datos",
- "GeoIPIncorrectDatabaseFormat": "Tu base de datos de geolocalización no parece tener el formato correcto. Podría estar corrompida. Asegurate de estar usando la versión binaria y tratá de reemplazarla con otra copia.",
- "GeoIpLocationProviderDesc_Pecl1": "Este proveedor de ubicación utiliza una base de datos de geolocalización y un módulo PECL para precisamente y eficientemente determinar la ubicación de tus visitantes.",
- "GeoIpLocationProviderDesc_Pecl2": "No existen limitaciones con este proveedor, es el que recomendamos utilizar.",
- "GeoIpLocationProviderDesc_Php1": "El proveedor de ubicación es el más sencillo de instalar ya que no requiere de configuración del servidor (¡es ideal para el hospedaje compartido!). Usa una base de datos de geolocalización y la API PHP de MaxMind para determinar con precisión la ubicación de tus visitantes.",
- "GeoIpLocationProviderDesc_Php2": "Si tu sitio web tiene mucho tráfico, entonces podrías encontrar que este proveedor de ubicación es demasiado lento. En este caso, deberías instalar la %1$sextensión PECL%2$s o un %3$smódulo de servidor%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Este proveedor de ubicación utiliza el módulo GeoIP que se ha instalado en su servidor HTTP. Este proveedor es fiable y rápido, pero %1$ssólo puede ser usado con el rastreo común de los navegadores web.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Si tenés que importar archivos de registro o cualquier otra acción que requiera configurar direcciones IP, usá la %1$simplementación GeoIP PECL (recomendada)%2$s o la %3$simplementación GeoIP PHP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Nota: La anonimización de las direcciónes IP no tiene efecto en las ubicaciones informadas por este proveedor. Antes de utilizarlo con anonimización de IP, asegurate de que no viola leyes de privacidad a las que podés estar sujeto.",
- "GeoIpLocationProviderNotRecomnended": "La geolocalización funciona, pero no estás usando uno de nuestros proveedores recomendados.",
- "GeoIPNoServerVars": "Matomo no puede encontrar ninguna variable GeoIP de %s.",
- "GeoIPPeclCustomDirNotSet": "La opción %s PHP ini no se ha establecido.",
- "GeoIPServerVarsFound": "Matomo detecta las siguientes variables GeoIP de %s",
- "GeoIPUpdaterInstructions": "Ingresá abajo los enlaces de descarga de tus base de datos. Si compraste bases de datos a %3$sdbip%4$s o %1$sMaxMind%2$s, podés encontrar esos enlaces en tu cuenta de dbip o MaxMind. Por favor, contactá con tu proveedor de geolocalización si tenés problemas para acceder a ellos.",
- "GeoIPUpdaterIntro": "Matomo actualmente está administrando actualizaciones para las siguientes bases de datos",
- "GeoLiteCityLink": "Si estás usando la base de datos liviana de ciudades de dbip, usá este enlace: %1$s%2$s%3$s.",
"Geolocation": "Geolocalización",
"GeolocationPageDesc": "En esta página podés cambiar cómo Matomo determina las ubicaciones de los visitantes.",
"getCityDocumentation": "Este informe muestra las ciudades desde las cuales tus visitantes accedieron a tu sitio web.",
"getContinentDocumentation": "Este informe muestra en qué continente estaban tus visitantes cuando visitaron tu sitio web.",
"getCountryDocumentation": "Este informe muestra en qué país estaban tus visitantes cuando visitaron tu sitio web.",
"getRegionDocumentation": "Este informe muestra en qué región estaban tus visitantes cuando visitaron tu sitio web.",
- "HowToInstallApacheModule": "¿Cómo instalo el módulo GeoIP en Apache?",
"HowToInstallGeoIPDatabases": "¿Cómo obtengo las bases de datos de geolocalización?",
- "HowToInstallGeoIpPecl": "¿Cómo instalo la extensión GeoIP PECL?",
- "HowToInstallNginxModule": "¿Cómo instalo el módulo GeoIP en Nginx?",
- "HowToSetupGeoIP": "Cómo configurar una geolocalización precisa con dbip",
- "HowToSetupGeoIP_Step1": "%1$sDescargá%2$s la base de datos liviana de ciudades de DBIP desde %3$sdbip%4$s.",
- "HowToSetupGeoIP_Step2": "Extraé este archivo y copiá el resultado, %1$s en el subdirectorio %2$smisc%3$s de Matomo y renombralo a %4$s (podés hacerlo por FTP o SSH).",
- "HowToSetupGeoIP_Step3": "Refrescar esta pantalla. El proveedor %1$sDBIP \/ GeoIP (PHP)%2$s ahora será %3$sinstalado%4$s. Seleccionalo.",
- "HowToSetupGeoIP_Step4": "¡Listo! Acabás de configurar Matomo para que use DBIP, lo que significa que vas a poder ver las regiones y ciudades de tus visitantes con información muy precisa por país.",
- "HowToSetupGeoIPIntro": "Parece ser que la configuración de la geolocalización no es confiable. Esta es una función útil y sin ella no verás una información precisa y completa de la ubicación de tus visitantes. Aquí un rápido vistazo de cómo utilizarla:",
- "HttpServerModule": "Módulo servidor HTTP",
- "InvalidGeoIPUpdatePeriod": "Período no válido para el actualizador GeoIP: %1$s. Los valores correctos son %2$s.",
- "IPurchasedGeoIPDBs": "Compré más base de datos precisas de %3$sdbip%4$s o %1$sMaxMind%2$s y quiero configurar las actualizaciones automáticas.",
- "ISPDatabase": "Base de datos de ISP",
- "IWantToDownloadFreeGeoIP": "Quiero descargar la base de datos gratuita de DBIP…",
"Latitude": "Latitud",
"Latitudes": "Latitudes",
"Location": "Ubicación",
- "LocationDatabase": "Base de datos de ubicaciones",
- "LocationDatabaseHint": "Una base de datos de ubicación es una base de datos, ya sea de país, región o ciudad.",
"LocationProvider": "Proveedor de ubicación",
"Longitude": "Longitud",
"Longitudes": "Longitudes",
"NoDataForGeoIPReport1": "No hay datos para este informe debido a que no existe información o las direcciones IP de los visitantes no pueden ser geolocalizadas.",
"NoDataForGeoIPReport2": "Para habilitar una geolocalización precisa, cambiá la configuración %1$sacá%2$s y usá una %3$sbase de datos a nivel ciudad%4$s.",
- "Organization": "Organización",
- "OrgDatabase": "Base de datos de la organización",
- "PeclGeoIPNoDBDir": "El módulo PECL está buscando base de datos en %1$s, pero esta carpeta no existe. Por favor, creala y agregale una base de datos de geolocalización a la misma. Alternativamente, podés establecer %2$s a una determinada carpeta en tu archivo \"php.ini\".",
- "PeclGeoLiteError": "Tu base de datos de geolocalización en %1$s tiene como nombre \"%2$s\". Desafortunadamente, el módulo PECL no la reconocerá con dicho nombre. Por favor, renombrala a \"%3$s\".",
- "PiwikNotManagingGeoIPDBs": "Matomo actualmente no está administrando ninguna base de datos de DBIP o MaxMind.",
"PluginDescription": "Informa la ubicación de tus visitantes: país, región, ciudad y coordenadas geográficas (latitud y longitud).",
"Region": "Región",
- "SetupAutomaticUpdatesOfGeoIP": "Configurar actualizaciones automáticas de tus base de datos de geolocalización",
"SubmenuLocations": "Ubicaciones",
"TestIPLocatorFailed": "Matomo intentó revisar la ubicación de una dirección IP conocida (%1$s), pero el servidor no devolvió ninguna información. Este proveedor puede no estar configurado correctamente (por ejemplo, la base de datos de geolocalización puede tener un nombre incorrecto o estar ubicada en un directorio incorrecto).",
- "ThisUrlIsNotAValidGeoIPDB": "El archivo descargado no es una base de datos válida de geolocalizació. Por favor, verificá la dirección web o descargá el archivo manualmente.",
"ToGeolocateOldVisits": "Para obtener información de ubicación de tus antiguas visitas, usá el script descripto %1$sacá%2$s.",
- "UnsupportedArchiveType": "Se encontró un tipo de archivo %1$s no soportado.",
- "UpdaterHasNotBeenRun": "Nunca se ejecutó el actualizador.",
- "UpdaterIsNotScheduledToRun": "No está programado para ejecutarse en el futuro.",
- "UpdaterScheduledForNextRun": "Está programado para ejecutarse durante la próxima ejecución de comando cron \"core:archive\".",
- "UpdaterWasLastRun": "El actualizador se ejecutó por última vez: %s.",
- "UpdaterWillRunNext": "Está programado para ejecutarse: %s.",
- "WidgetLocation": "Ubicación del visitante",
- "InstallGeoIp2": "Matomo recomienda usar las bases de datos de %1$sdbip%2$s, pero requiere usar el plugin GeoIP2. Si lo instalás y activás (el cual probablemente requiera una larga actualización), vas a poder usar las bases de datos de %1$sdbip%2$s (ignorá esto si ya estás usando un plugin de terceros que ofrece su propia función de geolocalización)."
+ "WidgetLocation": "Ubicación del visitante"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/es.json b/plugins/UserCountry/lang/es.json
index 4d6d5b4697..f0ad54b3f6 100644
--- a/plugins/UserCountry/lang/es.json
+++ b/plugins/UserCountry/lang/es.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "No se puede encontrar la función apache_get_modules, asumiendo que posee un servidor de internet no-Apache.",
- "CannotFindGeoIPDatabaseInArchive": "No se encuentra %1$s en el archivo tar %2$s!",
- "CannotFindGeoIPServerVar": "La variable %s no está especificada. Su servidor puede no estar configurado correctamente.",
- "CannotListContent": "No se pudo enumerar el contenido de %1$s: %2$s",
"CannotLocalizeLocalIP": "La dirección IP %s es una dirección local y no puede ser geolocalizada.",
- "CannotUnzipDatFile": "No se puede descomprimir el archivo dat en %1$s: %2$s",
"City": "Ciudad",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Continente",
@@ -21,59 +16,26 @@
"DefaultLocationProviderDesc1": "La ubicación predeterminada del proveedor asume que el país del visitante es por el lenguaje que el mismo utiliza.",
"DefaultLocationProviderExplanation": "Está utilizando el proveedor de ubicación predeterminado, lo cual significa que Matomo estimará la ubicación de los visitantes basado en el idioma que utilizan. %1$sLea esto%2$s para ver cómo puede configurar una geolocalización más precisa.",
"DistinctCountries": "%s países distintos",
- "DownloadingDb": "Descargando %s",
- "DownloadNewDatabasesEvery": "Actualizar bases de datos cada",
- "FoundApacheModules": "Matomo ha encontrado los siguientes módulos Apache",
"FromDifferentCities": "ciudades distintas",
- "GeoIPCannotFindMbstringExtension": "No se encuentra la función %1$s. Por favor, asegúrese que la extensión %2$s esté instalada y cargada.",
- "GeoIPDatabases": "Bases de datos GeoIP",
"GeoIPDocumentationSuffix": "Para observar la información de este informe, debe configurar GeoIP en la sección Geolocalización en la lengüeta del administrador. Las bases de datos GeoIP comerciales %1$sMaxmind%2$s son más fiables que las gratuitas. Para ver cuan seguras son, clic %3$saquí%4$s.",
- "GeoIPNoDatabaseFound": "Esta implementación GeoIP no pudo encontrar ninguna base de datos.",
- "GeoIPImplHasAccessTo": "Esta implementación GeoIP tiene acceso a los siguientes tipos de bases de datos",
- "GeoIpLocationProviderDesc_Pecl2": "No existen limitaciones con este proveedor, es el que recomendamos utilizar.",
- "GeoIpLocationProviderDesc_Php2": "Si su sitio de internet tiene un montón de tráfico, puede encontrar que este proveedor es demasiado lento. En este caso, debe instalar la extensión%2$s %1$sPECL o el %3$smódulo servidor%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Este proveedor de ubicación utiliza el módulo GeoIP que se ha instalado en su servidor HTTP. Este proveedor es fiable y rápido, pero %1$solo puede ser utilizado con el rastreo de navegadores de internet normales.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Si tiene que importar archivos de registro o cualquier otra acción que requiera configurar direcciones IP, utilice la implementación GeoIP %1$sPECL (recomendada)%2$s o la %3$simplementación GeoIP PHP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Nota: La anonimización de las direcciónes IP no tiene efecto en las ubicaciones suministradas por este proveedor. Antes de utilizarlo con anonimización de IP, asegúrese que no viola leyes de privacidad al que puede estar sujeto.",
- "GeoIpLocationProviderNotRecomnended": "La geolocalización funciona pero no está utilizando uno de los proveedores recomendados.",
- "GeoIPNoServerVars": "Matomo no puede encontrar ninguna de las variables GeoIp %s.",
- "GeoIPPeclCustomDirNotSet": "La opción %s PHP ini no se ha configurado.",
- "GeoIPServerVarsFound": "Matomo detecta las siguientes variables GeoIP %s",
"Geolocation": "Geolocalización",
"GeolocationPageDesc": "En esta página puede cambiar como Matomo determina las ubicaciones de un visitante.",
"getCityDocumentation": "Este informe muestra las ciudades desde las cuales sus visitantes accedieron a su sitio de internet.",
"getContinentDocumentation": "Este informe muestra en qué continente están sus visitantes cuando acceden a su sitio de internet.",
"getCountryDocumentation": "Este informe muestra desde qué país accedieron sus visitantes a su sitio de internet.",
"getRegionDocumentation": "Este informe muestra en que región están sus visitantes en el momento que accedieron a su sitio de internet.",
- "HowToInstallApacheModule": "¿Cómo instalar el módulo GeoIP en Apache?",
- "HowToInstallGeoIpPecl": "¿Cómo instalar la extensión GeoIP PECL?",
- "HowToInstallNginxModule": "¿Cómo instalo el módulo GeoIP en Nginx?",
- "HowToSetupGeoIPIntro": "Parece ser que la configuración de la Geolocalización no es confiable. Esta es una función útil y sin ella no verá una información precisa y completa de la ubicación de sus visitantes. Aquí un rápido vistazo de como utilizarla:",
- "HttpServerModule": "Módulo servidor HTTP",
- "InvalidGeoIPUpdatePeriod": "Período inválido para el actualizador GeoIP: %1$s. Los valores correctos son %2$s.",
- "ISPDatabase": "Base de dato ISP",
"Latitude": "Latitud",
"Latitudes": "Latitudes",
"Location": "Ubicación",
- "LocationDatabase": "Base de datos de ubicaciones",
- "LocationDatabaseHint": "Una base de datos de ubicación es una base de datos sea un país, región o ciudad.",
"LocationProvider": "Proveedor de ubicación",
"Longitude": "Longitud",
"Longitudes": "Longitudes",
"NoDataForGeoIPReport1": "No hay datos para este informe debido a que no existe información o las direcciones IP de los visitantes no puede ser geolocalizada.",
"NoDataForGeoIPReport2": "Para habilitar una geolocalización precisa, cambie la opción %1$saquí%2$s y utilice una %3$sbase de datos a nivel ciudad%4$s.",
- "Organization": "Organización",
- "OrgDatabase": "Base de datos de la organización",
"PluginDescription": "Informa la ubicación de sus visitantes: país, región, ciudad y coordenadas geográficas (latitud\/longitud).",
"Region": "Región",
"SubmenuLocations": "Ubicaciones",
"ToGeolocateOldVisits": "Para obtener información de ubicación de sus antiguos visitantes, utilice este script descripto %1$saquí%2$s.",
- "UnsupportedArchiveType": "Se encontró un tipo de archivo %1$s no respaldado.",
- "UpdaterHasNotBeenRun": "El actualizador nunca se ha ejecutado.",
- "UpdaterIsNotScheduledToRun": "No está programada la ejecución en el futuro.",
- "UpdaterScheduledForNextRun": "Está previsto ser activado durante la próxima ejecución del comando cron core:archive.",
- "UpdaterWasLastRun": "El actualizador se ejecutó por última vez en %s.",
- "UpdaterWillRunNext": "Está programada la ejecución para el %s.",
"WidgetLocation": "Ubicación del visitante"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/et.json b/plugins/UserCountry/lang/et.json
index c4fbbe6654..2493692aa3 100644
--- a/plugins/UserCountry/lang/et.json
+++ b/plugins/UserCountry/lang/et.json
@@ -10,24 +10,16 @@
"country_o1": "Muu riik",
"CurrentLocationIntro": "Antud pakkuja andmete alusel on sinu praegune asukoht",
"DistinctCountries": "%s eri riigist",
- "DownloadingDb": "Laen alla %s",
- "DownloadNewDatabasesEvery": "Uuenda andmebaasi iga",
"FromDifferentCities": "erinevad linnad",
- "GeoIPDatabases": "GeoIP andmebaas",
"Geolocation": "Geolokatsioon",
"GeolocationPageDesc": "Sellel lehel saad muuta, kuidas Matomo tuvastab külastajate asukoha infot.",
- "ISPDatabase": "ISP andmebaas",
"Latitude": "Laiuskraad",
"Location": "Asukoht",
- "LocationDatabase": "Asukoha andmebaas",
"LocationProvider": "Asukohainfo pakkuja",
"Longitude": "Pikkuskraad",
"NoDataForGeoIPReport1": "Antud raporti jaoks puuduvad andmed, kuna Matomo asukoha andmebaas on tühi või külastajate IP aadresse ei ole olnud võimalik kaardil tuvastada.",
- "Organization": "Organisatsioon",
- "OrgDatabase": "Organisatsiooni andmebaas",
"Region": "Regioon",
"SubmenuLocations": "Asukohad",
- "UpdaterWasLastRun": "Uuendaja käivitus viimati %s.",
"WidgetLocation": "Külastajate asukohad"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/fa.json b/plugins/UserCountry/lang/fa.json
index 250860d6fe..508f0fbd7f 100644
--- a/plugins/UserCountry/lang/fa.json
+++ b/plugins/UserCountry/lang/fa.json
@@ -1,9 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "نمی توان فانکشن apache_get_modules را پیدا نمود, فرض کنید روی وبسرور غیر آپاچی است.",
- "CannotListContent": "مطالب قابل فهرست شدن نمی باشد برای %1$s:%2$s",
"CannotLocalizeLocalIP": "آدرس آیپی (IP) %s یک آدرس محلی است و قابل به مکان یابی نیست.",
- "CannotUnzipDatFile": "نمی توان غیر فشرده نمود dat فایل را در %1$s: %2$s",
"City": "شهر",
"Continent": "قاره",
"Country": "کشور",
@@ -14,36 +11,21 @@
"CurrentLocationIntro": "بر اساس این ارائه دهنده خدمات , محل شما اینجاست",
"DefaultLocationProviderDesc1": "ارائه دهنده خدمات پیشفرض , کشور یک بازدیدکننده را بر اساس زبانی که استفاده میکند , مشخص می کند.",
"DistinctCountries": "%s کشورهای قابل تشخیص",
- "DownloadingDb": "در حال بارگزاری %s",
- "DownloadNewDatabasesEvery": "پایگاه های داده را بروزرسانی کن در هر",
- "FoundApacheModules": "پیویک ماژول های آپاچی زیر را یافت",
"FromDifferentCities": "شهرهای مختلف",
- "GeoIPDatabases": "پایگاه های داده GeoIP",
- "GeoIpLocationProviderDesc_Pecl2": "هیچ محدودیتی برای این ارائه دهنده وجود ندارد , بنابراین این چیزی است که ما توصیه می کنیم استفاده کنید.",
- "GeoIPPeclCustomDirNotSet": "%s از تنظیمات PHP ini روشن نیست.",
"Geolocation": "منطقه جغرافیایی",
"GeolocationPageDesc": "در این صفحه شما می توانید نحوه تشخیص منطقه بازدیدکنندگان توسط پیویک را تغییر دهید.",
"getCityDocumentation": "ن گزارش نشان میدهد که بازدیدکنندگان هنگام ورود به وبسایت شما در کدام شهر بوده اند.",
"getContinentDocumentation": "ن گزارش نشان میدهد که بازدیدکنندگان هنگام ورود به وبسایت شما در کدام قاره بوده اند.",
"getCountryDocumentation": "این گزارش نشان میدهد که بازدیدکنندگان هنگام ورود به وبسایت شما در کدام کشور بوده اند.",
"getRegionDocumentation": "این گزارش نشان میدهد که بازدیدکنندگان هنگام ورود به وبسایت شما در کدام منطقه بوده اند.",
- "HowToInstallApacheModule": "چگونه ماژول GeoIP را برای آپاچی نصب کنم؟",
- "HttpServerModule": "ماژول HTTP سرور",
- "ISPDatabase": "پایگاه داده ISP",
"Latitude": "عرض جغرافیایی",
"Location": "موقعیت",
- "LocationDatabase": "پایگاه داده محلی",
- "LocationDatabaseHint": "منظور از یک پایگاه داده محلی ، یک پایگاه داده ی کشوری ، منطقه ای یا شهری است.",
"LocationProvider": "ارائه دهنده خدمات محلی",
"Longitude": "طول جغرافیایی",
"NoDataForGeoIPReport1": "هیچ اطلاعاتی ای برای این گزارش وجود ندارد زیرا اطلاعاتی درباره مکان بازدید کننده ها یا آی پی آن ها نمی توان بدست آورد.",
- "Organization": "سازمان",
- "OrgDatabase": "پایگاه داده ی سازمان",
"Region": "منطقه",
"SubmenuLocations": "موقعیت ها",
"ToGeolocateOldVisits": "برای اینکه اطلاعات مکان بازدیدهای پیشین تان را بدست آورید ، اسکریپتی که %1$s اینجا %2$s توضیح داده شده را به کار ببرید.",
- "UpdaterHasNotBeenRun": "به روز رسانی شده است هرگز اجرا شده است.",
- "UpdaterWasLastRun": "آخرین بار بروزکننده در %s اجرا شده است.",
"WidgetLocation": "مکان بازدیدکننده"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/fi.json b/plugins/UserCountry/lang/fi.json
index d543da9222..ff5167a243 100644
--- a/plugins/UserCountry/lang/fi.json
+++ b/plugins/UserCountry/lang/fi.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "apache_get_modules-toimintoa ei löydy, oletettavasti verkkopalvelin on muu kuin Apache-ohjelmisto.",
- "CannotFindGeoIPDatabaseInArchive": "Tiedostoa %1$s ei löytynyt tar-arkistosta %2$s!",
- "CannotFindGeoIPServerVar": "Muuttujaa %s ei ole asetettu. Palvelimesi ei ehkä ole oikein konfiguroitu.",
- "CannotListContent": "Sisältöä %1$s: %2$s ei voitu listata",
"CannotLocalizeLocalIP": "%s IP-osoite on paikallinen osoite, eikä sitä voida geolokalisoida.",
- "CannotUnzipDatFile": "Dat-tiedostoa %1$s: %2$s ei voitu purkaa",
"City": "Kaupunki",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Maanosa",
@@ -21,59 +16,26 @@
"DefaultLocationProviderDesc1": "Oletustoteutus arvaa käyttäjien maan kielen perusteella.",
"DefaultLocationProviderExplanation": "Käytät sijainnin oletuspalvelua, mikä tarkoittaa sitä, että Matomo päättelee kävijän sijainnin hänen käyttämän kielen perusteella. %1$sLue tämä%2$s saadaksesi tietoa tarkemman geopaikannuksen käyttöönottamisesta.",
"DistinctCountries": "%s uniikkia maata",
- "DownloadingDb": "Ladataan %s",
- "DownloadNewDatabasesEvery": "Päivitä tietokanta joka",
- "FoundApacheModules": "Matomo löysi seuraavat Apache-moduulit",
"FromDifferentCities": "eri kaupunkeja",
- "GeoIPCannotFindMbstringExtension": "Toimintoa %1$s ei löydy. Varmista, että laajennus %2$s on asennettu ja ladattu.",
- "GeoIPDatabases": "GeoIP-tietokannat",
"GeoIPDocumentationSuffix": "Nähdäksesi tietoja tässä raportissa, sinun täytää asettaa GeoIP geopaikannuksen admin-välilehdessä. Kaupalliset %1$sMaxmind%2$s GeoIP tietokannat ovat tarkempia kuin ilmaiset. Klikkaa %3$stästä%4$s nähdäksesi miten tarkkoja ne ovat.",
- "GeoIPNoDatabaseFound": "GeoIP-toteutus ei löytänyt yhtäkään tietokantaa.",
- "GeoIPImplHasAccessTo": "Tällä GeoIP-sovelluksella on pääsy seuraavanlaisiin tietokantoihin",
- "GeoIpLocationProviderDesc_Pecl2": "Suosittelemme tätä palvelua, sillä tällä ei ole rajoituksia.",
- "GeoIpLocationProviderDesc_Php2": "Jos verkkosivullasi on paljon liikennettä, tämä palvelu saattaa olla mielestäsi liian hidas. Asenna siinä tapauksessa %1$sPECL-laajennus%2$s tai %3$spalvelinmoduuli%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Tämä toteutus käyttää GeoIP-moduulia HTTP-palvelimesta. Tämä toteutus on nopea ja tarkka, mutta %1$stoimii vain normaalin selainseurannan kanssa.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Jos olet ladannut lokitiedostoja, käytä %1$sPECL:n GeoIP-toteutusta (suositeltu)%2$s tai %3$sPHP:n GeoIP-toteutusta%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Huom: IP-osoitteen piilottamisella ei ole vaikutusta tämän palvelun raportoimaan sijaintiin. Varmista, ettet riko yksityisyyden suojaa ennen kuin käytät sitä piilotetun IP-osoitteen kanssa.",
- "GeoIpLocationProviderNotRecomnended": "Geopaikannus toimii, mutta et käytä suositeltua tuottajaa.",
- "GeoIPNoServerVars": "Matomo ei löydä yhtään GeoIP %s -muuttujaa.",
- "GeoIPPeclCustomDirNotSet": "PHP ini -valintaa %s ei ole asetettu.",
- "GeoIPServerVarsFound": "Matomo on löytänyt seuraavat GeoIP %s -muuttujat",
"Geolocation": "Geopaikannus",
"GeolocationPageDesc": "Tällä sivulla voit säätää, miten Matomo päättelee kävijöiden sijainnin, ja tarkastella eri vaihtoehtojen asetuksia.",
"getCityDocumentation": "Tämä raportti näyttää missä kaupungeissa käyttäjät olivat käydessään verkkosivullasi.",
"getContinentDocumentation": "Tämä raportti näyttää missä maanosassa käyttäjät olivat käydessään verkkosivullasi.",
"getCountryDocumentation": "Tämä raportti näyttää missä maassa käyttäjät olivat käydessään verkkosivullasi.",
"getRegionDocumentation": "Tämä raportti näyttää millä alueella käyttäjät olivat käydessään verkkosivullasi.",
- "HowToInstallApacheModule": "Miten asennan GeoIP-moduulin Apachelle?",
- "HowToInstallGeoIpPecl": "Miten asennan GeoIP PECL -laajennuksen?",
- "HowToInstallNginxModule": "Miten asennan GeoIP-moduulin Nginx:lle?",
- "HowToSetupGeoIPIntro": "Vaikuttaa, ettei sinulla ole tarkkaa Geopaikannus asennusta. Ilman tätä hyödyllistä toimintoa et näe tarkkoja tietoja kävijöidesi sijannista. Näin voit aloittaa Geopaikannuksen käytön nopeasti:",
- "HttpServerModule": "HTTP-palvelimen moduuli",
- "InvalidGeoIPUpdatePeriod": "Virheellinen ajanjakso GeoIP-päivityksille: %1$s. Kelvolliset arvot ovat %2$s.",
- "ISPDatabase": "ISP:n tietokanta",
"Latitude": "Leveysaste",
"Latitudes": "Leveyspiirit",
"Location": "Sijainti",
- "LocationDatabase": "Sijantitietokanta",
- "LocationDatabaseHint": "Sijaintietokanta on joko maa-, alue- tai kaupunkitietokanta.",
"LocationProvider": "Sijaintipalvelu",
"Longitude": "Pituusaste",
"Longitudes": "Pituuspiirit",
"NoDataForGeoIPReport1": "Tämä raportti ei sisällä tietoja, koska sijantitietoja ei ole saatavilla tai kävijöiden IP-osoitteita ei voida geopaikantaa.",
"NoDataForGeoIPReport2": "Aktivoidaksesi tarkan geopaikannuksen, muuta asetukset %1$stäällä%2$s ja käytä %3$skaupaunkitason tietokantaa%4$s.",
- "Organization": "Organisaatio",
- "OrgDatabase": "Organisaatiotietokanta",
"PluginDescription": "Kertoo kävijöiden sijainnin: Maa, alue, kaupunki ja maantieteelliset koordinaatit (pohjoinen leveys\/itäinen pituus).",
"Region": "Alue",
"SubmenuLocations": "Sijainnit",
"ToGeolocateOldVisits": "Saadaksesi vanhojen käyntien sijaintitietoja, käytä %1$stäällä%2$s kuvailtua skriptiä.",
- "UnsupportedArchiveType": "Havaittiin tiedostomuoto %1$s, jota ei ole tuettu.",
- "UpdaterHasNotBeenRun": "Päivitystä ei ole ajettu koskaan.",
- "UpdaterIsNotScheduledToRun": "Ei ole asetettu ajettavaksi tulevaisuudessa.",
- "UpdaterScheduledForNextRun": "Ajastettu suoritettavaksi seuraavan cron core:archive -komennon suorituksen aikana.",
- "UpdaterWasLastRun": "Päivitys ajettiin viimeksi %s.",
- "UpdaterWillRunNext": "Asetettu ajettavaksi seuraavan kerran %s.",
"WidgetLocation": "Kävijän sijainti"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/fr.json b/plugins/UserCountry/lang/fr.json
index 70ca44fd88..06793ca38a 100644
--- a/plugins/UserCountry/lang/fr.json
+++ b/plugins/UserCountry/lang/fr.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Impossible de trouver la fonction apache_get_modules, nous supposons que le serveur web n'est pas Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Impossible de trouver le fichier %1$s dans l'archive tar %2$s !",
- "CannotFindGeoIPServerVar": "La variable %s n'est pas définie. Votre serveur peut ne pas être configuré correctement.",
- "CannotListContent": "Impossible d'afficher le contenu de %1$s: %2$s",
"CannotLocalizeLocalIP": "L'adresse IP %s est locale et ne peut être géo-localisée.",
- "CannotUnzipDatFile": "Impossible de dézipper le fichier dat dans %1$s: %2$s",
"City": "Ville",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Continent",
@@ -21,59 +16,26 @@
"DefaultLocationProviderDesc1": "Le fournisseur de localisation par défaut devine le pays d'un visiteur en se basant sur le langage de son navigateur.",
"DefaultLocationProviderExplanation": "Vous utilisez le fournisseur de localisation par défaut, ce qui signifie que Matomo va tenter de déterminer la localisation du visiteur en se basant sur la langue qu'ils utilisent. %1$sConsultez ceci%2$s pour apprendre comment configurer une localisation plus précise.",
"DistinctCountries": "%s pays différents",
- "DownloadingDb": "Téléchargement de %s",
- "DownloadNewDatabasesEvery": "Mettre à jour les bases de données tous (toutes) les",
- "FoundApacheModules": "Matomo a trouvé les modules Apache suivants",
"FromDifferentCities": "villes différentes",
- "GeoIPCannotFindMbstringExtension": "Impossible de trouver la fonction %1$s. Veuillez vous assurer que l'extension %2$s est installée et chargée.",
- "GeoIPDatabases": "Base de donnéees GeoIP",
"GeoIPDocumentationSuffix": "Afin de visualiser les données de ce rapport, vous devez installer GeoIP depuis l'onglet d'administration Géolocalisation. Les bases de données commerciales %1$sMaxmind%2$s sont plus précises que les gratuites. Pour voir à quelles points elles sont précises, cliquez %3$sici%4$s.",
- "GeoIPNoDatabaseFound": "Cette implémentation de GeoIP n'a trouvé aucune base de données.",
- "GeoIPImplHasAccessTo": "Cette implémentation GeoIP a accès aux types de bases de données suivants",
- "GeoIpLocationProviderDesc_Pecl2": "Il n'y a aucune limitation avec ce fournisseur, c'est donc celui que nous recommandons à l'utilisation.",
- "GeoIpLocationProviderDesc_Php2": "Si votre site web a beaucoup de trafic, vous pourriez trouver que ce fournisseur de localisation est trop lent. Dans ce cas, vous devriez installer %1$sl'extension PECL%2$s ou un %3$smodule serveur%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Ce fournisseur de localisation utilise le module GeoIP qui a été installé sur votre serveur HTTP. Ce fournisseur est rapide et précis, mais peut être %1$suniquement utilisé avec le suivi de navigateur classique.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Si vous devez importer des fichiers de logs ou bien autre chose qui requiert de définir des adresses IP, utilisez %1$sl'implémentation PECL GeoIP(recommandé)%2$s ou %3$sl'implémentation GeoIP PHP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Note : L'anonymisation de l'adresse IP n'a aucun effet sur les localisations communiquées par ce fournisseur. Avant de l'utiliser avec l'anonymisation d'IP, assurez-vous que cela ne transgresse aucune loi sur la vie privées à laquelle vous pourriez être assujetti.",
- "GeoIpLocationProviderNotRecomnended": "La géolocalisation fonctionne, mais vous n'utilisez pas un des fournisseurs recommandés.",
- "GeoIPNoServerVars": "Matomo ne parvient à trouver aucune variable GeoIP %s.",
- "GeoIPPeclCustomDirNotSet": "L'option %s du PHP ini n'est pas définie.",
- "GeoIPServerVarsFound": "Matomo a détecté les variables de GeoIP suivantes %s",
"Geolocation": "Géolocalisation",
"GeolocationPageDesc": "Sur cette page vous pouvez changer la manière dont Matomo détermine la localisation des visiteurs.",
"getCityDocumentation": "Ce rapport montre dans quelle ville vos visiteurs étaient quand ils ont accédé à votre site web.",
"getContinentDocumentation": "Ce rapport montre dans quel continent vos visiteurs étaient quand ils ont accédé à votre site web.",
"getCountryDocumentation": "Ce rapport montre dans quel pays vos visiteurs étaient quand ils ont accédé à votre site web.",
"getRegionDocumentation": "Ce rapport montre dans quelle région vos visiteurs étaient quand ils ont accédé à votre site web.",
- "HowToInstallApacheModule": "Comment puis-je récupérer le module GeoIP pour Apache ?",
- "HowToInstallGeoIpPecl": "Comment puis-je installer l'extension Geoip via PECL ?",
- "HowToInstallNginxModule": "Comment puis-je installer le module GeoIP pour Nginx ?",
- "HowToSetupGeoIPIntro": "Il ne semble pas que vous ayez une configuration de géolocalisation très précise. C'est une fonctionnalité utile et sans elle vous ne verrez pas de manière précise et complète les informations de localisation de vos visiteurs. Voici comment vous pouvez rapidement commencer à l'utiliser :",
- "HttpServerModule": "Module du serveur HTTP",
- "InvalidGeoIPUpdatePeriod": "Période invalide pour la mise à jour de GeoIP: %1$s. Les valeurs valides sont %2$s.",
- "ISPDatabase": "Base de données ISP",
"Latitude": "Latitude",
"Latitudes": "Lattitudes",
"Location": "Localisation",
- "LocationDatabase": "Base de données de localisation",
- "LocationDatabaseHint": "Une base de données de localisation est une base de données de pays, villes ou régions.",
"LocationProvider": "Fournisseur de localisation",
"Longitude": "Longitude",
"Longitudes": "Longitudes",
"NoDataForGeoIPReport1": "Il n'y a aucune données pour ce rapport parce qu'il n'y a pas de base de données de localisation de disponible ou bien l'adresse IP du visiteur ne peut être géolocalisée.",
"NoDataForGeoIPReport2": "Pour activer une géolocalisation précise, modifiez les paramètres %1$sici%2$s et utilisez une %3$sbase de données de niveau ville%4$s.",
- "Organization": "Organisation",
- "OrgDatabase": "Base de données des Organisation",
"PluginDescription": "Rapports sur l'emplacement de vos visiteurs: pays, région, ville et coordonnées géographiques (latitude\/longitude).",
"Region": "Région",
"SubmenuLocations": "Provenances géographiques",
"ToGeolocateOldVisits": "Pour obtenir les données de localisation de vos anciennes visites, utilisez le script décrit %1$sici%2$s.",
- "UnsupportedArchiveType": "Type d'archive non supporté %1$s.",
- "UpdaterHasNotBeenRun": "L'outil de mise a jour n'a jamais été exécuté.",
- "UpdaterIsNotScheduledToRun": "N'est pas planifié pour une exécution future.",
- "UpdaterScheduledForNextRun": "Est planifié pour un traitement durant la prochaine exécution du cron de archive.php.",
- "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"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/gl.json b/plugins/UserCountry/lang/gl.json
index 6f61031de1..4bc84696dc 100644
--- a/plugins/UserCountry/lang/gl.json
+++ b/plugins/UserCountry/lang/gl.json
@@ -4,14 +4,7 @@
"Country": "País",
"country_o1": "Outro país",
"DistinctCountries": "%s continentes distintos",
- "DownloadingDb": "A descargar %s",
- "DownloadNewDatabasesEvery": "Actualizar as bases de datos cada",
"Region": "Rexión",
- "SubmenuLocations": "Lugares",
- "UpdaterHasNotBeenRun": "O actualizador non foi executado nunca.",
- "UpdaterIsNotScheduledToRun": "Non está planificado para ser executado no futuro.",
- "UpdaterScheduledForNextRun": "Está planificado para ser executado durante a próxima execución da orde core:archive de cron.",
- "UpdaterWasLastRun": "O actualizador foi executado por última vez o %s.",
- "UpdaterWillRunNext": "Está planificado para ser executado o %s."
+ "SubmenuLocations": "Lugares"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/he.json b/plugins/UserCountry/lang/he.json
index 12a3f32552..1b4fbb9271 100644
--- a/plugins/UserCountry/lang/he.json
+++ b/plugins/UserCountry/lang/he.json
@@ -8,7 +8,6 @@
"country_a2": "ספק לוויני",
"country_cat": "קהילות דוברות קטלאנית",
"country_o1": "מדינה אחרת",
- "GeoIPDatabases": "מסד נתונים GeoIP",
"Geolocation": "מיקום גאוגרפי",
"Location": "מיקום"
}
diff --git a/plugins/UserCountry/lang/hi.json b/plugins/UserCountry/lang/hi.json
index 1c460ad394..7dfb6cc657 100644
--- a/plugins/UserCountry/lang/hi.json
+++ b/plugins/UserCountry/lang/hi.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "गैर अपाचे वेबसर्वर मानते हुए, apache_get_modules फ़ंक्शन नहीं मिल सकता है.",
- "CannotFindGeoIPDatabaseInArchive": "टार अभिलेख %2$s में %1$s फाइल नहीं मिल सकता है!",
- "CannotFindGeoIPServerVar": "%s के चर स्थापित नहीं है. आपका सर्वर ठीक से कॉन्फ़िगर नहीं किया जा सकता है.",
- "CannotListContent": "%1$s के लिए सामग्री की सूची नहीं कर सका: %2$s",
"CannotLocalizeLocalIP": "आईपी ​​पते %s में एक स्थानीय पता है और भू स्थित नहीं किया जा सकता.",
- "CannotUnzipDatFile": "%1$s में .dat फ़ाइल खोली नहीं जा सकी: %2$s",
"City": "शहर",
"Continent": "महाद्वीप",
"Country": "देश",
@@ -16,52 +11,22 @@
"CurrentLocationIntro": "इस प्रदाता के अनुसार, आपका वर्तमान स्थान है",
"DefaultLocationProviderDesc1": "एक आगंतुक का देश डिफ़ॉल्ट स्थान प्रदाता के अनुमान का इस्तेमाल वे भाषा के आधार पर करते है.",
"DistinctCountries": "%s विशिष्ट देशों",
- "DownloadingDb": "अधीभारण %s",
- "DownloadNewDatabasesEvery": "हर डेटाबेस का अद्यतन",
- "FoundApacheModules": "Matomo को निम्नलिखित अपाचे मॉड्यूल ने पाया",
- "GeoIPCannotFindMbstringExtension": "फ़ंक्शन %1$s नहीं मिल सकता है. विस्तार स्थापित और लोड किया जाता है%2$s सुनिश्चित करें.",
- "GeoIPDatabases": "GeoIP डेटाबेस",
"GeoIPDocumentationSuffix": "इस रिपोर्ट के लिए डेटा को देखने के लिए, आप जियोलोकेशन व्यवस्थापक टैब में GeoIP सेटअप चाहिए. वाणिज्यिक %1$sMaxmind%2$s GeoIP डेटाबेस मुक्त वालों की तुलना में अधिक सटीक हैं. वे कितने सटीक है देखने के लिए यहां %3$sक्लिक%4$s करें.",
- "GeoIPImplHasAccessTo": "इस GeoIP कार्यान्वयन का डेटाबेस के निम्नलिखित प्रकार के लिए उपयोग किया है",
- "GeoIpLocationProviderDesc_Pecl2": "इस प्रदाता के साथ कोई सीमा नहीं है, तो यह हम उपयोग करने की सिफारिश करते है.",
- "GeoIpLocationProviderDesc_Php2": "आपकी वेबसाइट पर यातायात बहुत हो जाता है, तो आप पाएंगे की यह स्थान प्रदाता धीमा है इस मामले में, आप %1$s PECL एक्सटेंशन %2$s या %3$s सर्वर मॉड्यूल %4$s को स्थापित करना चाहिए.",
- "GeoIpLocationProviderDesc_ServerBased1": "यह स्थान प्रदाता अपने HTTP सर्वर में स्थापित किया गया है जो GeoIP मॉड्यूल का उपयोग करता है. यह प्रदाता तेज और सटीक है, लेकिन %1$s स्कैन केवल सामान्य ब्राउज़र ट्रैकिंग के साथ इस्तेमाल किया जा सकता है .%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "आप लॉग इन फ़ाइलों को आयात या कुछ और करना है कि आईपी पतों को स्थापित करने की आवश्यकता हो, तो %1$s PECL GeoIP कार्यान्वयन (अनुशंसित) %2$s या %3$s PHP GeoIP कार्यान्वयन %4$s का उपयोग करें.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "नोट: आईपी अनोंय्मिज़ इस प्रदाता द्वारा रिपोर्ट किए गए स्थानों पर कोई प्रभाव नहीं है. आईपी ​​अनोंय्मिज़ के साथ प्रयोग करने से पहले,आप के लिए विषय हो सकता है यह किसी भी गोपनीयता कानून का उल्लंघन नहीं करता है सुनिश्चित करें",
- "GeoIPPeclCustomDirNotSet": "PHP ini %s विकल्प सेट नहीं है.",
- "GeoIPServerVarsFound": "Matomo निम्नलिखित GeoIP चर %s का पता लगाता है",
"Geolocation": "भौगोलिक स्थान",
"GeolocationPageDesc": "इस पेज पर आप को बदल सकते हैं कि कैसे Matomo आगंतुक स्थानों को निर्धारित करता है.",
"getCityDocumentation": "इस रिपोर्ट से पता चलता है अपने दर्शकों के शहरों, वे कब आपकी वेबसाइट पे पहुचे",
"getContinentDocumentation": "इस रिपोर्ट से पता चलता है आपके आगंतुकों के महाद्वीप का ,वे कब आपकी वेबसाइट पे पहुचे.",
"getCountryDocumentation": "इस रिपोर्ट से पता चलता है आपके आगंतुकों के देश का,वे कब आपकी वेबसाइट पे पहुचे",
"getRegionDocumentation": "इस रिपोर्ट से पता चलता है आपके आगंतुकों के क्षेत्र का वे कब आपकी वेबसाइट पे पहुचे",
- "HowToInstallApacheModule": "कैसे मैं अपाचे के लिए GeoIP मॉड्यूल स्थापित करूँ?",
- "HowToInstallGeoIpPecl": "कैसे मैं GeoIP PECL एक्सटेंशन स्थापित करूँ?",
- "HowToInstallNginxModule": "कैसे मैं nginx के लिए GeoIP मॉड्यूल स्थापित करूँ?",
- "HowToSetupGeoIPIntro": "आप सही जियोलोकेशन सेटअप प्रकट नहीं करते हैं. यह एक उपयोगी सुविधा है और इसके बिना आप अपने दर्शकों के लिए सही और पूरी स्थान की जानकारी नहीं देख सकेंगे. यहाँ है कैसे आपको जल्दी से यह प्रयोग शुरू कर सकते हैं:",
- "HttpServerModule": "HTTP सर्वर मॉड्यूल",
- "InvalidGeoIPUpdatePeriod": "GeoIP updater के लिए अमान्य अवधि:%1$s. मान्य %2$s मान रहे हैं.",
- "ISPDatabase": "आईएसपी डाटाबेस",
"Latitude": "अक्षांश",
"Location": "स्थान",
- "LocationDatabase": "स्थान डाटाबेस",
- "LocationDatabaseHint": "एक स्थान डेटाबेस या तो एक देश, क्षेत्र या शहर डेटाबेस है.",
"LocationProvider": "स्थान प्रदाता",
"Longitude": "देशान्तर",
"NoDataForGeoIPReport1": "इस रिपोर्ट के लिए कोई डेटा नहीं है क्योंकि कोई स्थान डेटा उपलब्ध तो नहीं है या आगंतुक आईपी पते geolocated नहीं किया जा सकता.",
"NoDataForGeoIPReport2": "सटीक जियोलोकेशन सक्षम करने के लिए %1$sयहाँ%2$s सेटिंग में बदलाव और एक %3$sशहर के स्तर पर डेटाबेस%4$s का उपयोग करें.",
- "Organization": "संगठन",
- "OrgDatabase": "संगठन डाटाबेस",
"Region": "क्षेत्र",
"SubmenuLocations": "स्थान",
"ToGeolocateOldVisits": "अपने पुराने यात्राओं के लिए स्थान डेटा प्राप्त करने के लिए, %1$sयहाँ%2$s वर्णित स्क्रिप्ट का उपयोग करें.",
- "UnsupportedArchiveType": "असमर्थित संग्रह प्रकार का सामना करना पड़ा %1$s.",
- "UpdaterHasNotBeenRun": "updater कभी नहीं चलाया गया",
- "UpdaterIsNotScheduledToRun": "यह भविष्य में चलाने के लिए निर्धारित नहीं है।",
- "UpdaterScheduledForNextRun": "संग्रह आदेश निष्पादन: यह अगले क्रॉन कोर के दौरान चलाने के लिए निर्धारित है।",
- "UpdaterWasLastRun": "Updater %s पर अंतिम रन था.",
- "UpdaterWillRunNext": "यह अगले %s पर चलने के लिए निर्धारित किया गया है।",
"WidgetLocation": "आगंतुक स्थान"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/id.json b/plugins/UserCountry/lang/id.json
index 6c1566a96d..ab7b2d8f65 100644
--- a/plugins/UserCountry/lang/id.json
+++ b/plugins/UserCountry/lang/id.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Tidak dapat menemukan fungsi apache_get_modules, sehingga diduga sebagai peladen non-Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Tidak dapat menemukan berkas %1$s dalam arsip tar %2$s!",
- "CannotFindGeoIPServerVar": "Variabel %s tidak diatur. Peladen Anda mungkin tidak diatur secara benar.",
- "CannotListContent": "Tidak dapat menemukan isi untuk %1$s: %2$s",
"CannotLocalizeLocalIP": "Alamat IP %s merupakan alamat lokal dan tidak dapat diperiksa oleh lokasi-geo.",
- "CannotUnzipDatFile": "Tidak dapat melakukan unzip berkas dat di %1$s: %2$s",
"City": "Kota",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Benua",
@@ -17,51 +12,23 @@
"CurrentLocationIntro": "Berdasar penyedia ini, lokasi Anda adalah",
"DefaultLocationProviderDesc1": "Lokasi penyedia asali menebak negara pengunjung dari bahasa yang digunakan.",
"DistinctCountries": "%s negara berbeda",
- "DownloadingDb": "Mengunduh %s",
- "DownloadNewDatabasesEvery": "Perbarui basisdata setiap",
- "FoundApacheModules": "Matomo menemukan modul Apache berikut",
"FromDifferentCities": "kota berbeda",
- "GeoIPCannotFindMbstringExtension": "Tidak dapat menemukan fungsi %1$s. Harap pastikan bahwa ekstensi %2$s telah terpasang dan termuat.",
- "GeoIPDatabases": "Basisdata GeoIP",
"GeoIPDocumentationSuffix": "Agar dapat melihat data untuk laporan ini, Anda harus memasang GeoIP di tab pengelola Lokasi-Geo. Basisdata GeoIP %1$sMaxmind%2$s komersial lebih teliti daripada yang gratis. Untuk melihat seberapa teliti mereka, klik %3$sdi sini%4$s.",
- "GeoIPImplHasAccessTo": "Penerapan GeoIP ini memiliki akses terhadap jenis-jenis basisdata berikut",
- "GeoIpLocationProviderDesc_Pecl2": "Tidak ada batasan untuk penyedia ini, jadi ini adalah salah satu yang kami sarankan untuk digunakan.",
- "GeoIpLocationProviderDesc_Php2": "Bila situs Anda memperoleh lalu lintas besar, Anda akan mendapati penyedia lokasi tersebut terlalu lambat. Dalam hal ini, Anda harus memasang %1$sekstensi PECL%2$s atau sebuah %3$smodul peladen%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Lokasi penyedia ini menggunakan modul GeoIP yang telah terpasnag di peladen HTTP Anda. Penyedia ini cepat dan cermat, tapi %1$shanya dapat digunakan dengan pelacakan peramban normal.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Bila Anda mengimpor berkas catatan atau hal lain yang membutuhkan pengaturan alamat IP, gunakan %1$spenerapan GeoIP PECL (disarankan)%2$s atau %3$spenerapan GeoIP PHP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Catatan: anonimasi IP tidak berdampak dalam laporan berdasar penyedia ini. Sebelum menggunakan ini dengan anonimasi IP, pastikan bahwa Anda tidak melanggar peraturan privasi yang mungkin dikenakan kepada Anda.",
- "GeoIPNoServerVars": "Matomo tidak dapat menemukan variabel GeoIP %s apapun.",
- "GeoIPPeclCustomDirNotSet": "Opsi %s ini PHP tidak diatur.",
- "GeoIPServerVarsFound": "Matomo mendeteksi variabel GeoIP berikut %s",
"Geolocation": "Lokasi-Geo",
"GeolocationPageDesc": "Dalam halaman ini Anda dapat mengganti bagaimana Matomo menentukan lokasi pengunjung.",
"getCityDocumentation": "Laporan ini menunjukkan kota pengunjung Anda berada saat mengunjungi situs Anda.",
"getContinentDocumentation": "Laporan ini menunjukkan benua pengunjung Anda berada saat mengunjungi situs Anda.",
"getCountryDocumentation": "Laporan ini menujukkan negara pengunjung Anda berada saat mengunjungi sutus Anda.",
"getRegionDocumentation": "Laporan ini menunjukkan wilayah pengunjung Anda berada saat mengunjungi situs Anda.",
- "HowToInstallApacheModule": "Bagaimana saya memasang modul GeoIP untuk Apache?",
- "HowToInstallGeoIpPecl": "Bagaimana saya memasang ekstensi PECL GeoIP?",
- "HowToInstallNginxModule": "Bagaimana saya memasang modul GeoIP untuk Nginx?",
- "HowToSetupGeoIPIntro": "Anda tidak tampak memiliki pemasangan Lokasi-geo yang teliti. Fitur ini sangat berguna dan tanpa ini Anda tidak akan melihat lokasi lengkap dan akurat untuk pengunjung Anda. Di sini bagaimana Anda dapat dengan mudah memulai ini:",
- "HttpServerModule": "Modul Peladen HTTP",
- "InvalidGeoIPUpdatePeriod": "Periode tak sahih untuk pembaruan GeoIP: %1$s. Nilai sahih adalah %2$s.",
- "ISPDatabase": "Basisdata Penyedia Layanan Internet",
"Latitude": "Lintang",
"Location": "Lokasi",
- "LocationDatabase": "Basisdata Lokasi",
- "LocationDatabaseHint": "Sebuah basisdata lokasi merupakan salah satu basisdata suatu negara, wilayah, atau kota.",
"LocationProvider": "Penyedia Lokasi",
"Longitude": "Bujur",
"NoDataForGeoIPReport1": "Tidak ada data untuk laporan ini sebab tidak ada data lokasi yang tersedia atau alamat IP tidak dikenali lokasi-geo.",
"NoDataForGeoIPReport2": "Untuk mengaktifkan lokasi-geo teliti, ganti pengaturan %1$sdi sini%2$s dan gunakan sebuah %3$sbasisdata tingkat kota%4$s.",
- "Organization": "Organisasi",
- "OrgDatabase": "Basisdata Organisasi",
"Region": "Wilayah",
"SubmenuLocations": "Lokasi",
"ToGeolocateOldVisits": "Untuk mendapatkan data untuk kunjungan lama Anda, gunakan sekrip yang dijelaskan %1$sdi sini%2$s.",
- "UnsupportedArchiveType": "Mengandung arsip tak didukung jenis %1$s.",
- "UpdaterHasNotBeenRun": "Pembaruan belum pernah berjalan.",
- "UpdaterWasLastRun": "Pembaruan terakhir berjalan dalam %s.",
"WidgetLocation": "Lokasi Pengunjung"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/it.json b/plugins/UserCountry/lang/it.json
index dc6db77067..76ada16367 100644
--- a/plugins/UserCountry/lang/it.json
+++ b/plugins/UserCountry/lang/it.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Impossibile trovare la funzione apache_get_modules, si suppone che sia un server non-Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Impossibile trovare il file %1$s nell'archivio tar %2$s!",
- "CannotFindGeoIPServerVar": "La variabile %s non è impostata. Il tuo server potrebbe non essere correttamente configurato.",
- "CannotListContent": "Impossibile elencare il contenuto per %1$s: %2$s",
"CannotLocalizeLocalIP": "L'indirizzo IP %s è un indirizzo locale e non può essere geolocalizzato.",
- "CannotUnzipDatFile": "Impossibile decomprimere il file dat in %1$s: %2$s",
"City": "Città",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Continente",
@@ -21,59 +16,26 @@
"DefaultLocationProviderDesc1": "L'individuatore di posizione predefinito desume il paese di un visitatore dalla lingua utilizzata.",
"DefaultLocationProviderExplanation": "Stai utilizzando il provier di posizione predefinito ciò significa che Matomo, presumibilmente, individuerà la posizione dei visitatori in base lingua che utilizzano. %1$sLeggi qui%2$s per capire come impostare una geolocalizzazione più accurata",
"DistinctCountries": "%s continenti differenti",
- "DownloadingDb": "Sto scaricando %s",
- "DownloadNewDatabasesEvery": "Aggiorna il database ogni",
- "FoundApacheModules": "Matomo ha trovato i seguenti moduli Apache",
"FromDifferentCities": "città diverse",
- "GeoIPCannotFindMbstringExtension": "Impossibile trovare la funzione %1$s. Assicurati che l'estensione %2$s sia installata e caricata.",
- "GeoIPDatabases": "Database GeoIP",
"GeoIPDocumentationSuffix": "Per vedere i dati di questo report è necessario impostare GeoIP nella scheda Amministrazione Geolocation. I database GeoIP commerciali%1$sMaxmind%2$s sono più accurati di quelli gratuiti. Per vedere come sono precisi, clicca %3$squi%4$s.",
- "GeoIPNoDatabaseFound": "Questa implementazione GeoIP non ha potuto trovare un database.",
- "GeoIPImplHasAccessTo": "Questa implementazione GeoIP ha accesso ai seguenti tipi di database",
- "GeoIpLocationProviderDesc_Pecl2": "Non ci sono limitazioni con questo provider, dunque è uno di cui raccomandiamo l'uso.",
- "GeoIpLocationProviderDesc_Php2": "Se il tuo sito riceve parecchio traffico, è possibile che questo individuatore di posizione sia troppo lento. In questo caso, è necessario installare l'%1$sestensione PECL%2$s o un %3$smodulo server%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Questo individuatore di posizione utilizza il modulo GeoIP che è stato installato nel vostro server HTTP. È veloce e preciso, ma %1$spuò essere utilizzato solo con il normale monitoraggio browser.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Se si devono importare i file di log o fare qualcos'altro che richiede l'impostazione degli indirizzi IP, utilizza l'%1$simplementazione PECL GeoIP (consigliata)%2$s oppure l'%3$simplementazione PHP GeoIP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Nota: l'anonimizzazione IP non ha alcun effetto sui luoghi segnalati da questo fornitore. Prima di utilizzarlo con la trasformazione in forma anonima degli IP, assicurati che questo non violi alcuna legge sulla privacy a cui puoi essere soggetto.",
- "GeoIpLocationProviderNotRecomnended": "La geolocalizzazione sta funzionando ma tu non stai utilizzando uno dei provider raccomandati.",
- "GeoIPNoServerVars": "Matomo non riesce a trovare nessuna delle variabili %s GeoIP.",
- "GeoIPPeclCustomDirNotSet": "L'opzione %s PHP ini non è impostata.",
- "GeoIPServerVarsFound": "Matomo rileva le seguenti %s variabili GeoIP.",
"Geolocation": "Geolocalizzazione",
"GeolocationPageDesc": "In questa pagina puoi cambiare le impostazioni di come Matomo determina la località dei visitatori.",
"getCityDocumentation": "Questo report mostra le città in cui si trovavano i tuoi visitatori quando sono entrati nel tuo sito.",
"getContinentDocumentation": "Questo report mostra in quale continente si trovavano i tuoi visitatori quando sono entrati nel tuo sito.",
"getCountryDocumentation": "Questo report mostra in quale nazione si trovavano i tuoi visitatori quando sono entrati nel tuo sito.",
"getRegionDocumentation": "Questo report mostra in quale regione si trovavano i tuoi visitatori quando sono entrati nel tuo sito.",
- "HowToInstallApacheModule": "Come posso installare il modulo GeoIP per Apache?",
- "HowToInstallGeoIpPecl": "Come posso installare le estensioni GeoIP PECL?",
- "HowToInstallNginxModule": "Come posso installare il modulo GeoIP per Nginx?",
- "HowToSetupGeoIPIntro": "Sembra che tu non abbia una configurazione di Geolocalizzazione accurata. Questa è una funzionalità utile, e senza di essa non si avranno informazioni accurate e complete sulla localizzazione dei tuoi visitatori. Ecco come puoi iniziare a usarla rapidamente:",
- "HttpServerModule": "Modulo Server HTTP",
- "InvalidGeoIPUpdatePeriod": "Periodo non valido per l'updater GeoIP: %1$s. I valori validi sono: %2$s.",
- "ISPDatabase": "Database ISP",
"Latitude": "Latitudine",
"Latitudes": "Latitudini",
"Location": "Posizione",
- "LocationDatabase": "Database Località",
- "LocationDatabaseHint": "Un database località è un database di nazioni, regioni o città.",
"LocationProvider": "Localizzatore di Posizione",
"Longitude": "Longitudine",
"Longitudes": "Longitudini",
"NoDataForGeoIPReport1": "Non vi sono dati per questo report perché non vi sono dati di localizzazione disponibili o gli indirizzi IP dei visitatori non possono essere geolocalizzati.",
"NoDataForGeoIPReport2": "Per abilitare la geolocalizzazione accurata cambia le impostazioni %1$squi%2$s e usa un %3$sdatabase a livello città%4$s.",
- "Organization": "Organizzazione",
- "OrgDatabase": "Database Organizzazioni",
"PluginDescription": "Restituisce la provenienza dei tuoi visitatori: nazione, regione, città e coordinate geografiche (latitudine\/longitudine).",
"Region": "Regione",
"SubmenuLocations": "Località",
"ToGeolocateOldVisits": "Per avere i dati di localizzazione delle tue vecchie visite, usa lo script descritto %1$squi%2$s.",
- "UnsupportedArchiveType": "Si è incontrato un archivio di tipo non supportato %1$s.",
- "UpdaterHasNotBeenRun": "Il programma di aggiornamento non è mai stato eseguito.",
- "UpdaterIsNotScheduledToRun": "Non è pianificato un suo futuro avvio.",
- "UpdaterScheduledForNextRun": "È programmato un suo avvio durante l'esecuzione del prossimo cron.job core:archive.",
- "UpdaterWasLastRun": "Il programma di aggiornamento è stato eseguito per l'ultima volta il %s.",
- "UpdaterWillRunNext": "È programmato per essere eseguito il %s.",
"WidgetLocation": "Posizione Visitatore"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/ja.json b/plugins/UserCountry/lang/ja.json
index 6cfc569a97..0d96fbaf9d 100644
--- a/plugins/UserCountry/lang/ja.json
+++ b/plugins/UserCountry/lang/ja.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "非 Apache ウェブサーバーを想定して apache_get_modules ファンクションを見つける事ができません。",
- "CannotFindGeoIPDatabaseInArchive": "%1$s file in tar archive %2$s を見つける事ができません!",
- "CannotFindGeoIPServerVar": "%s 変数が設定されていません。お使いのサーバーは、正しく構成されていない可能性があります。",
- "CannotListContent": "%1$s の内容が一覧表示できません。%2$s",
"CannotLocalizeLocalIP": "IP アドレス %s はローカルアドレスです。位置情報を探索することはできません。",
- "CannotUnzipDatFile": "%1$s の dat ファイルを解凍できません: %2$s",
"City": "都市",
"CityAndCountry": "%1$s、 %2$s",
"Continent": "大陸",
@@ -21,59 +16,26 @@
"DefaultLocationProviderDesc1": "デフォルトロケーションプロバイダーでは、ビジターの国は使用言語に基づいて推測されます。",
"DefaultLocationProviderExplanation": "デフォルトロケーションプロバイダーを使用しています。Matomo はビジターの位置情報を使用言語に基づいて推測します。より正確なジオロケーションを設定する方法については、%1$sこちらをご覧ください。%2$s",
"DistinctCountries": "%s 個別の国々",
- "DownloadingDb": "ダウンロード中 %s",
- "DownloadNewDatabasesEvery": "各データベースをアップデート",
- "FoundApacheModules": "Matomo は次の Apache モジュールを見つけました",
"FromDifferentCities": "異なる都市",
- "GeoIPCannotFindMbstringExtension": "%1$s ファンクションが見つかりません。 %2$s 拡張モジュールがインストールされロードされている事をご確認ください。",
- "GeoIPDatabases": "GeoIP データベース",
"GeoIPDocumentationSuffix": "このレポートのデータを確認するために、位置情報探索 (ジオロケーション) 管理タブの GeoIP をセットアップする必要があります。商用 %1$sMaxmind%2$s GeoIP データベースは、無償のデータベースより正確です。その精度を確認するには、 %3$shere%4$s をクリックしてください。",
- "GeoIPNoDatabaseFound": "この GeoIP 実装は、データベースを見つけることができませんでした。",
- "GeoIPImplHasAccessTo": "この GeoIP 実装は、次の種類のデータベースへのアクセスを含みます。",
- "GeoIpLocationProviderDesc_Pecl2": "このプロバイダーは 制限がないため、Matomo が推奨するプロバイダーの一つです。",
- "GeoIpLocationProviderDesc_Php2": "ウェブサイトのトラフィックが多い場合、位置情報プロバイダーの動作が非常に重く感じられるかもしれません。そのような場合は、%1$sPECL 拡張モジュール%2$s または %3$sサーバーモジュール %4$sをインストールすることをお勧めします。",
- "GeoIpLocationProviderDesc_ServerBased1": "このロケーションプロバイダーは、HTTP サーバーにインストールされている GeoIP モジュールを使用します。 このプロバイダは高速で正確ですが、%1$s通常のブラウザトラッキングでのみ使用できます。%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "ログファイルをインポートする必要がある場合やIPアドレスの設定が必要な場合は、%1$sPECL GeoIP 実装 ( 推奨 ) %2$sまたは%3$sPHP GeoIP 実装%4$sを使用してください。",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "注)このプロバイダーにより報告された位置情報は、IP の匿名化による影響を受けません。IP 匿名化をご利用になる前に、必ず利用者が遵守すべきあらゆるプライバシーに関する法律に違反しないことをご確認ください。",
- "GeoIpLocationProviderNotRecomnended": "位置情報探索機能は作動していますが、ご利用中のプロバイダーは推奨プロバイダーではありません。",
- "GeoIPNoServerVars": "任意の GeoIP %s 変数を見つける事ができません。",
- "GeoIPPeclCustomDirNotSet": "%s PHP の ini オプションが設定されていません。",
- "GeoIPServerVarsFound": "Matomo は、次の GeoIP %s 変数を検知します。",
"Geolocation": "ジオロケーション",
"GeolocationPageDesc": "このページでは、ビジターの位置情報を決める方法を変更することができます。",
"getCityDocumentation": "このレポートは、あなたのウェブサイトにアクセスした際、ビジターがどの都市にいたかを表示します。",
"getContinentDocumentation": "このレポートは、あなたのウェブサイトにアクセスした際、ビジターがどの大陸にいたかを表示します。",
"getCountryDocumentation": "このレポートは、あなたのウェブサイトにアクセスした際、ビジターがどの国にいたかを表示します。",
"getRegionDocumentation": "このレポートは、あなたのウェブサイトにアクセスした際、ビジターがどの地域にいたかを表示します。",
- "HowToInstallApacheModule": "GeoIP モジュールを Apache にインストールする方法は?",
- "HowToInstallGeoIpPecl": "GeoIP PECL の拡張モジュールをインストールする方法は?",
- "HowToInstallNginxModule": "GeoIP モジュールを Nginx にインストールする方法は?",
- "HowToSetupGeoIPIntro": "正確な位置情報のセットアップが完了していないようです。位置情報探索機能は、役立つ機能です。セットアップを完了させることで、サイト訪問者についての正確で完全な位置情報を確認することができるようになります。それをすぐに使い始めることができる方法はこれです。",
- "HttpServerModule": "HTTP サーバーモジュール",
- "InvalidGeoIPUpdatePeriod": "GeoIP アップデーターに対する無効な期間は、%1$s です。有効な値は、%2$s です。",
- "ISPDatabase": "ISP データベース",
"Latitude": "緯度",
"Latitudes": "緯度",
"Location": "位置情報",
- "LocationDatabase": "位置情報データベース",
- "LocationDatabaseHint": "位置情報データベースは、国、地域、都市データベースのいづれかです。",
"LocationProvider": "位置情報プロバイダ",
"Longitude": "経度",
"Longitudes": "経度",
"NoDataForGeoIPReport1": "利用可能な位置データが存在しないか、位置情報を探索できないビジター IP アドレスが含まれているため、このレポートのデータが存在しません。",
"NoDataForGeoIPReport2": "正確な位置情報を有効にするには、設定を %1$sここから%2$s 変更し、%3$s都市レベルのデータベース%4$s をご利用ください。",
- "Organization": "組織",
- "OrgDatabase": "組織のデータベース",
"PluginDescription": "ビジターの場所のレポート: 国、地域、都市および地理的な座標 ( 緯度・経度 ) など",
"Region": "地域",
"SubmenuLocations": "場所",
"ToGeolocateOldVisits": "古いビジットの位置データを取得するには、%1$sここ%2$sで説明するスクリプトを使用します。",
- "UnsupportedArchiveType": "サポートされていないアーカイブタイプ %1$s が見つかりました。",
- "UpdaterHasNotBeenRun": "アップデーターは実行されませんでした。",
- "UpdaterIsNotScheduledToRun": "これは、将来実行されるようにスケジュールされていません。",
- "UpdaterScheduledForNextRun": "これは、次のクーロン core:archive コマンド実行の間に実行するようスケジュールされています。",
- "UpdaterWasLastRun": "アップデーターは、%s の最後に実行されました。",
- "UpdaterWillRunNext": "それは次に %s で実行されるようスケジュールされています。",
"WidgetLocation": "ビジターの位置"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/ko.json b/plugins/UserCountry/lang/ko.json
index ff28338d0b..e57e2d5ddc 100644
--- a/plugins/UserCountry/lang/ko.json
+++ b/plugins/UserCountry/lang/ko.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "아파치 웹서버가 아니어서 apache_get_modules을 찾을 수 없습니다.",
- "CannotFindGeoIPDatabaseInArchive": "%2$s tar 압축파일에서 %1$s 파일을 찾을 수 없습니다!",
- "CannotFindGeoIPServerVar": "%s에 변수가 설정되어 있지 않습니다. 서버가 올바르게 구성되지 않았을 수 있습니다.",
- "CannotListContent": "%1$s에 대한 내용을 나열 할 수 없습니다: %2$s",
"CannotLocalizeLocalIP": "IP 주소 %s는 로컬 주소이기 때문에 위치를 추적할 수 없습니다.",
- "CannotUnzipDatFile": "%1$s의 DAT 파일 압축을 풀 수 없습니다: %2$s",
"City": "도시",
"CityAndCountry": "%1$s, %2$s",
"Continent": "대륙",
@@ -18,56 +13,24 @@
"DefaultLocationProviderDesc1": "방문자의 국가에 기반하는 언어에서 추측하는 기본 위치 공급자입니다.",
"DefaultLocationProviderExplanation": "당신은 현재 기본 위치 공급자를 사용하고 있어, Matomo는 방문자의 위치를 그들이 사용하는 언어에 기반하여 추측하고 있습니다. %1$s이 문서%2$s에서 어떻게 더 정확한 위치를 얻어낼 수 있는지 얘기하고 있습니다.",
"DistinctCountries": "%s개 국가",
- "DownloadingDb": "다운로드 중 %s",
- "DownloadNewDatabasesEvery": "모든 데이터베이스 업데이트",
- "FoundApacheModules": "Matomo은 다음의 아파치 모듈을 찾을 수 없음",
"FromDifferentCities": "다른 도시",
- "GeoIPCannotFindMbstringExtension": "%1$s 함수를 찾을 수 없습니다. %2$s 확장이 설치 및 로드되었는지 확인하세요.",
- "GeoIPDatabases": "GeoIP 데이터베이스",
"GeoIPDocumentationSuffix": "이 보고서에 대한 데이터를 볼 수 있도록 당신은 위치 정보관리 탭에서 GeoIP를 설정해야합니다. 상업용 %1$sMaxmind%2$s GeoIP 데이터베이스는 무료로 버전보다 더 정확합니다. 정확도를 높이려면 %3$s공유%4$s를 클릭하세요.",
- "GeoIPImplHasAccessTo": "이 GeoIP 구현에서 접근하는 데이터베이스 유형은",
- "GeoIpLocationProviderDesc_Pecl2": "제한이 없는 공급자입니다. 그래서 우리는 이를 사용하는 것을 추천합니다.",
- "GeoIpLocationProviderDesc_Php2": "웹사이트 트래픽이 높은 경우에 이 위치 공급자는 너무 느립니다. 이 경우는 %1$sPECL 확장%2$s이나 %3$s서버 모듈%4$s을 설치하는 것이 좋습니다.",
- "GeoIpLocationProviderDesc_ServerBased1": "이 위치 공급자는 HTTP 서버에 설치되는 GeoIP 모듈을 사용합니다. 이 것은 빠르고 정확하지만, %1$s일반 브라우저의 추적만 사용할 수 있습니다.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "로그 파일을 가져오거나 IP 주소 설정을 필요로하는 경우 %1$sPECL GeoIP 구현 (권장)%2$s 또는 %3$sPHP GeoIP 구현%4$s을 사용합니다.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "참고: IP를 익명화하면 공급자가 보고있는 위치에 아무런 영향을 미치지 않습니다. IP를 익명화 하지 않으면, 개인 정보 보호법을 위반이 될수 있으므로 주의하세요.",
- "GeoIpLocationProviderNotRecomnended": "지리적 위치 플러그인은 동작하지만, 현재 당신은 추천하는 공급자를 사용하고 있지 않습니다.",
- "GeoIPNoServerVars": "Matomo은 GeoIP %s 변수를 찾을 수 없습니다.",
- "GeoIPPeclCustomDirNotSet": "%s PHP ini 옵션이 설정되어 있지 않습니다.",
- "GeoIPServerVarsFound": "Matomo은 다음의 GeoIP %s 변수를 감지함",
"Geolocation": "지리적 위치",
"GeolocationPageDesc": "이 페이지에서 Matomo 방문자 위치를 결정하는 방법을 변경할 수 있습니다.",
"getCityDocumentation": "이 보고서는 방문자가 웹사이트를 어느 도시에서 접근했는지 보여줍니다.",
"getContinentDocumentation": "이 보고서는 방문자가 웹사이트로 접속한 대륙을 보여줍니다.",
"getCountryDocumentation": "이 보고서는 웹사이트로 접근한 방문자가 어느 국가에 있었는지 보여줍니다.",
"getRegionDocumentation": "이 보고서는 방문자가 웹사이트에 접속할 때의 지역이 표시됩니다.",
- "HowToInstallApacheModule": "아파치의 GeoIP 모듈을 설치하려면 어떻게해야합니까?",
- "HowToInstallGeoIpPecl": "GeoIP PECL 확장을 설치하려면 어떻게해야합니까?",
- "HowToInstallNginxModule": "Nginx에 GeoIP 모듈을 설치하려면 어떻게해야합니까?",
- "HowToSetupGeoIPIntro": "위치 정보를 정확하게 설정하지 않으면 방문자의 위치 정보 및 이와 관련한 유용한 기능이 표시되지 않습니다. 다음 방법을 참고하여 어서 이 기능을 사용하세요:",
- "HttpServerModule": "HTTP 서버 모듈",
- "InvalidGeoIPUpdatePeriod": "GeoIP 업데이터의 잘못된 기간: %1$s. 유효한 값은 %2$s 입니다.",
- "ISPDatabase": "ISP 데이터베이스",
"Latitude": "위도",
"Location": "위치",
- "LocationDatabase": "위치 데이터베이스",
- "LocationDatabaseHint": "위치 데이터베이스는 국가, 지역 또는 도시 데이터베이스를 말합니다.",
"LocationProvider": "위치 공급자",
"Longitude": "경도",
"NoDataForGeoIPReport1": "이 보고서에 대한 데이터가 없습니다. 어떠한 위치 데이터도 사용할 수 없거나, 방문자의 IP 주소에서 지역정보를 찾을 수 없기 때문입니다.",
"NoDataForGeoIPReport2": "더 정확한 위치 정보를 활성화시키려면 %1$s이 곳%2$s의 설정을 %3$s도시 수준의 데이터베이스%4$s로 사용해야 합니다.",
- "Organization": "조직",
- "OrgDatabase": "조직 데이터베이스",
"PluginDescription": "방문자 위치 보고서: 국가, 지역, 도시, 지리적 좌표(위도\/경도)",
"Region": "지역",
"SubmenuLocations": "위치",
"ToGeolocateOldVisits": "기존의 방문의 위치 데이터를 얻으려면 %1$s이 곳%2$s에 있는 스크립트 설명을 사용하세요.",
- "UnsupportedArchiveType": "지원되지 않는 압축 형식 %1$s 입니다.",
- "UpdaterHasNotBeenRun": "업데이터가 한 번도 실행되지 않았습니다.",
- "UpdaterIsNotScheduledToRun": "향후 실행할 계획이 없습니다.",
- "UpdaterScheduledForNextRun": "다음 cron core:archive 명령 수행시 실행됩니다.",
- "UpdaterWasLastRun": "%s에 마지막 업데이트 확인",
- "UpdaterWillRunNext": "%s에 실행이 계획되어 있습니다.",
"WidgetLocation": "방문자 위치"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/lt.json b/plugins/UserCountry/lang/lt.json
index 7fe5faabc7..cbe2c2681a 100644
--- a/plugins/UserCountry/lang/lt.json
+++ b/plugins/UserCountry/lang/lt.json
@@ -1,6 +1,5 @@
{
"UserCountry": {
- "AssumingNonApache": "Nepavyksta rasti apache_get_modules funkcijos, numanoma, kad tai ne Apache saityno serveris.",
"City": "Miestas",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontinentas",
@@ -12,20 +11,13 @@
"country_cat": "Kataloniškai kalbančios bendruomenės",
"country_o1": "Kita šalis",
"DistinctCountries": "%s atskirti šalis",
- "DownloadingDb": "Atsiunčiama %s",
- "FoundApacheModules": "Matomo rado šiuos Apache modulius",
- "GeoIPDatabases": "GeoIP duomenų bazės",
- "GeoIPNoServerVars": "Matomo nepavyko rasti jokių GeoIP %s kintamųjų.",
- "GeoIPServerVarsFound": "Matomo aptinka šiuos GeoIP %s kintamuosius",
"GeolocationPageDesc": "Šiame puslapyje galite keisti kaip Matomo nustato lankytojų geografines vietas.",
- "HowToInstallApacheModule": "Kaip man įdiegti Apache skirtą GeoIP modulį?",
"Latitude": "Platuma",
"Latitudes": "Platumos",
"Location": "Vietovė",
"Longitude": "Ilguma",
"Longitudes": "Ilgumos",
"Region": "Regionas",
- "SubmenuLocations": "Vietovės",
- "UnsupportedArchiveType": "Susidurta su nepalaikomu archyvo tipu %1$s."
+ "SubmenuLocations": "Vietovės"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/nb.json b/plugins/UserCountry/lang/nb.json
index 04b7931989..f308785e20 100644
--- a/plugins/UserCountry/lang/nb.json
+++ b/plugins/UserCountry/lang/nb.json
@@ -1,10 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Kan ikke finne apache_get_modules-funksjonen. Antar at det ikke er en Apache webserver.",
- "CannotFindGeoIPDatabaseInArchive": "Kan ikke finne filen %1$s i tar-arkivet %2$s!",
- "CannotListContent": "Kunne ikke vise innhold for %1$s: %2$s",
"CannotLocalizeLocalIP": "IP-adressen %s er en lokal adresse og kan ikke lokaliseres.",
- "CannotUnzipDatFile": "Kunne ikke pakke ut dat-fil i %1$s: %2$s",
"City": "By",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontinent",
@@ -13,23 +9,11 @@
"country_o1": "Annet land",
"CurrentLocationIntro": "Ifølge denne leverandøren, er din nåværende posisjon",
"DistinctCountries": "%s bestemte land",
- "DownloadingDb": "Laster ned %s",
- "DownloadNewDatabasesEvery": "Oppdater databasene hver",
- "FoundApacheModules": "Matomo fant følgende Apache-moduler",
"FromDifferentCities": "forskjellige byer",
- "GeoIPDatabases": "GeoIP-databaser",
- "GeoIPNoServerVars": "Matomo kan ikke finne noen GeoIP %s variabler.",
"Geolocation": "Geoposisjonering",
- "HowToInstallApacheModule": "Hvordan installerer jeg GeoIP-modulen for Apache?",
- "HowToInstallGeoIpPecl": "Hvordan installerer jeg GeoIP PECL-utvidelsen?",
- "HowToInstallNginxModule": "Hvordan installerer jeg GeoIP-modulen for Nginx?",
- "HttpServerModule": "HTTP Server-modul",
- "ISPDatabase": "ISP-database",
"Latitude": "Breddegrad",
"Location": "Sted",
- "LocationDatabase": "Lokasjonsdatabase",
"Longitude": "Lengdegrad",
- "Organization": "Organisasjon",
"Region": "Region",
"SubmenuLocations": "Lokasjoner",
"WidgetLocation": "Besøkendes lokasjon"
diff --git a/plugins/UserCountry/lang/nl.json b/plugins/UserCountry/lang/nl.json
index d37c8e10ae..9ac2860b59 100644
--- a/plugins/UserCountry/lang/nl.json
+++ b/plugins/UserCountry/lang/nl.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Kan de functie apache_get_modules niet vinden, uitgegaan van non-Apache webserver.",
- "CannotFindGeoIPDatabaseInArchive": "Kan bestand %1$s niet vinden in tar-archief %2$s!",
- "CannotFindGeoIPServerVar": "De %s variabele is niet ingesteld. Je server is waarschijnlijk niet correct geconfigureerd",
- "CannotListContent": "Kon geen lijst maken van de inhoud voor %1$s: %2$s",
"CannotLocalizeLocalIP": "IP-adres %s is een lokaal adres en kan geen geolocatie op toegepast worden.",
- "CannotUnzipDatFile": "Kan dat bestand niet uitpakken in %1$s: %2$s",
"City": "Stad",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Continent",
@@ -20,54 +15,26 @@
"DefaultLocationProviderDesc1": "De standaard locatie provider gokt een bezoekers land gebaseerd op de taal die ze gebruiken.",
"DefaultLocationProviderExplanation": "Je maakt gebruik van de standaard locatie provider, dat betekend dat Matomo de locatie van je bezoeker zal gokken op basis van de taalinstelling die men gebruikt. %1$sLees dit%2$s om te ontdekken hoe je geolocatie nauwkeuriger kunt inregelen.",
"DistinctCountries": "%s opvallende landen",
- "DownloadingDb": "%s aan het downloaden",
- "DownloadNewDatabasesEvery": "Update databases elke",
- "FoundApacheModules": "Matomo vond de volgende Apache-modules",
"FromDifferentCities": "verschillende steden",
- "GeoIPCannotFindMbstringExtension": "Kan de functie %1$s niet vinden. Zorg ervoor dat de extensie %2$s geïnstalleerd en geladen is.",
- "GeoIPDatabases": "GeoIP Databases",
"GeoIPDocumentationSuffix": "Om data in dit rapport te kunnen weergeven, moet je GeoIP inregelen in de beheer tab. De commerciële %1$sMaxmind%2$s GeoIP databases zijn nauwkeuriger dan de gratis versies. Om te zien hoe nauwkeurig ze zijn, klik %3$shier%4$s.",
- "GeoIPImplHasAccessTo": "Deze GeoIP implementatie heeft toegang tot de volgende database types",
- "GeoIpLocationProviderDesc_Pecl2": "We raden deze provider aan omdat deze geen limieten hanteert.",
- "GeoIpLocationProviderDesc_Php2": "Als uw website veel verkeer ontvangt, kunt u deze locatieprovider misschien te traag vinden. In dat geval, moet u de %1$sPECL-extensie%2$s of een %3$sservermodule%4$s installeren.",
- "GeoIpLocationProviderNotRecomnended": "Geografische locatie bepaling werkt, maar je gebruikt niet één van de aanbevolen leveranciers.",
- "GeoIPNoServerVars": "Matomo kan geen GeoIP %s variabelen vinden.",
- "GeoIPPeclCustomDirNotSet": "De %s PHP ini optie is niet ingesteld.",
- "GeoIPServerVarsFound": "Matomo detecteert de volgende GeoIP %s variabelen",
"Geolocation": "Geolocatie",
"GeolocationPageDesc": "Op deze pagina kunt u instellen hoe Matomo bezoekerlocaties bepaald.",
"getCityDocumentation": "Dit rapport laat zien in welke stad uw bezoekers waren toen ze uw website bezochten.",
"getContinentDocumentation": "Dit rapport laat zien in welk continent uw bezoekers waren toen ze uw website bezochten.",
"getCountryDocumentation": "Dit rapport laat zien in welk land uw bezoekers waren toen ze uw website bezochten.",
"getRegionDocumentation": "Dit rapport laat zien in welke regio uw bezoekers waren toen ze uw website bezochten.",
- "HowToInstallApacheModule": "Hoe installeer ik de GeoIP module voor Apache?",
- "HowToInstallGeoIpPecl": "Hoe installeer ik de GeoIP PECL-extensie?",
- "HowToInstallNginxModule": "Hoe installeer ik de GeoIP-module voor Nginx?",
- "HttpServerModule": "HTTP Server Module",
- "InvalidGeoIPUpdatePeriod": "Ongeldige periode voor de GeoIP updater: %1$s. Geldige waardes zijn %2$s.",
- "ISPDatabase": "ISP-database",
"Latitude": "Latitude",
"Latitudes": "Latitudes",
"Location": "Locatie",
- "LocationDatabase": "Locatiedatabase",
- "LocationDatabaseHint": "Een locatie database is of een land of een regio of een stad database.",
"LocationProvider": "Locatie Provider",
"Longitude": "Longitude",
"Longitudes": "Longitudes",
"NoDataForGeoIPReport1": "Er zijn geen gegevens voor dit rapport omdat er geen lokatie informatie beschikbaar is of omdat het bezoekers IP adres niet geografisch bepaald kan worden.",
"NoDataForGeoIPReport2": "Om accurate geolocatie te activeren, pas de instellingen %1$shier%2$s gebruik een %3$sstads level database%4$s.",
- "Organization": "Organisatie",
- "OrgDatabase": "Organisatiedatabase",
"PluginDescription": "Rapporteert de locatie van je bezoekers: Land, regio, stad en coördinaten (lengte- en breedtegraad)",
"Region": "Regio",
"SubmenuLocations": "Locaties",
"ToGeolocateOldVisits": "Om locatie data voor oude bezoeken te krijgen, gebruik het %1$shier%2$s beschreven script.",
- "UnsupportedArchiveType": "Niet ondersteund archieftype aangetroffen %1$s.",
- "UpdaterHasNotBeenRun": "De updater is nog niet eerder uitgevoerd.",
- "UpdaterIsNotScheduledToRun": "Het is niet gepland om te worden uitgevoerd in de toekomst.",
- "UpdaterScheduledForNextRun": "Het is ingepland om uitgevoerd te worden tijdens de volgende commando core:archive.",
- "UpdaterWasLastRun": "De updater is voor het laatst uitgevoerd op %s.",
- "UpdaterWillRunNext": "De volgende run is gepland om %s",
"WidgetLocation": "Bezoekerlocatie"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/pl.json b/plugins/UserCountry/lang/pl.json
index bf9642ed80..81e564bbc7 100644
--- a/plugins/UserCountry/lang/pl.json
+++ b/plugins/UserCountry/lang/pl.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Nie można znaleźć funkcji apache_get_modules co oznacza, że zainstalowano serwer inny niż Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Nie udało się odnaleźć pliku %1$s w archiwum tar %2$s!",
- "CannotFindGeoIPServerVar": "Zmienna %s nie została ustawiona. Twój serwer mógł zostać niepoprawnie skonfigurowany.",
- "CannotListContent": "Błąd wyświetlenia zawartości %1$s: %2$s",
"CannotLocalizeLocalIP": "Adres IP %s jest adresem lokalnym i nie można go poddać geolokacji.",
- "CannotUnzipDatFile": "Nie udało się rozpakować plików dat w %1$s: %2$s",
"City": "Miasto",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontynent",
@@ -20,59 +15,26 @@
"DefaultLocationProviderDesc1": "Domyślny dostawca usług geolokacyjnych zgaduje państwo odwiedzającego na podstawie języka używanego w przeglądarce.",
"DefaultLocationProviderExplanation": "Korzystasz z domyślnego dostawcy usług geolokalizacyjnych, co oznacza, że Matomo zgaduje lokalizację odwiedzającego na podstawie języka jego przeglądarki. %1$sPrzeczytaj%2$s aby dowiedzieć się jak skonfigurować dokładniejszą geolokalizację.",
"DistinctCountries": "%s różnych krajów",
- "DownloadingDb": "Pobieranie %s",
- "DownloadNewDatabasesEvery": "Zaktualizuj bazę danych co",
- "FoundApacheModules": "Matomo znalazł następujące moduły Apache",
"FromDifferentCities": "różne miasta",
- "GeoIPCannotFindMbstringExtension": "Nie udało się odnaleźć funkcji %1$s. Proszę upewnij się, że rozszerzenie %2$s jest zainstalowane i załadowane.",
- "GeoIPDatabases": "Bazy danych GeoIP",
"GeoIPDocumentationSuffix": "W celu wyświetlenia danych tego raportu konieczna jest konfiguracja GeoIP w zakładce Geolokalizacja panelu administracyjnego. Płatne bazy GeoIP dostarczane przez %1$sMaxmind%2$s cechuje wyższa dokładność od baz bezpłatnych. Aby porównać ich dokładność kliknij %3$stutaj%4$s.",
- "GeoIPNoDatabaseFound": "Ta implementacja GeoIP nie znalazła bazy danych geolokalizacyjnych.",
- "GeoIPImplHasAccessTo": "Ta implementacja GeoIP ma dostęp do następujących typów baz danych",
- "GeoIpLocationProviderDesc_Pecl2": "Ten dostawca nie podlega żadnym ograniczeniom w działaniu, dlatego polecamy jego używanie.",
- "GeoIpLocationProviderDesc_Php2": "Jeżeli twoja strona ma bardzo dużo ruchu, ten dostawca usług lokacyjnych może okazać się za wolny. W takim wypadku zaleca się instalację %1$srozszerzenia PECL%2$s lub %3$smoduło serverowego%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Ten dostawca usług geolokalizacyjnych korzysta z modułu GeoIP zainstalowanego w Twoim serwerze HTTP.Ten dostawca jest szybki i dokładny, jednak %1$smoże być wykorzystywany wyłącznie do normalnego śledzenia.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Gdy importujesz pliki logów lub robisz coś innego, co może wymagać ustawienia adresu IP, użyj %1$simplementacji GeoIP PECL (rekomendowana)%2$s lub %3$simplementacji GeoIP PHP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "NOTKA: Anonimizacja IP nie wywiera żadnego efektu gdy jest używana z tym dostawcą. Przed użyciem anonimizacji adresów IP, upewnij się, iż nie narusza ono żadnych praw do prywatności, który może podlegać.",
- "GeoIpLocationProviderNotRecomnended": "Geolokacja działa, ale nie używasz rekomendowanego dostawcy.",
- "GeoIPNoServerVars": "Matomo nie może znaleźć żadnych zmiennych %s GeoIP",
- "GeoIPPeclCustomDirNotSet": "Opcja %s w pliku PHP ini nie została ustawiona.",
- "GeoIPServerVarsFound": "Matomo wykrył następujące zmienne GeoIP %s",
"Geolocation": "Geolokalizacja",
"GeolocationPageDesc": "Na tej stronie można zmienić sposób wykrywania lokalizacji odwiedzających stosowany przez Matomo'a.",
"getCityDocumentation": "Raport ten pokazuje miasta, w których przebywali odwiedzający gdy whcodzili na stronę.",
"getContinentDocumentation": "Raport then pokazuje kraje, w których byli odwiedzający gdzy oglądali strony.",
"getCountryDocumentation": "Ten raport pokazuje, w którym kraju był odwiedzający kiedy wchodził na twoją stronę.",
"getRegionDocumentation": "Ten raport pokazuje,w którym regionie był odwiedzający kiedy wchodził na twoją stronę.",
- "HowToInstallApacheModule": "W jaki sposób zainstaluję moduł GeoIP dla Apache?",
- "HowToInstallGeoIpPecl": "W jaki sposób zainstaluję rozszerzenie GeoIP PECL?",
- "HowToInstallNginxModule": "W jaki sposób zainstaluję moduł GeoIP dla Nginx?",
- "HowToSetupGeoIPIntro": "Wygląda na to, że nie skonfigurowałeś dokładnej Geolokalizacji. To przydatna funkcjonalność, bez której nie zobaczysz dokładnych i kompletnych informacji o swoich odwiedzających. Zobacz, jak szybko rozpocząć korzystanie z niej:",
- "HttpServerModule": "Moduł Serwera HTTP",
- "InvalidGeoIPUpdatePeriod": "Błędny przedział dla aktualizatora GeoIP: %1$s. Prawidłowe wartości to %2$s.",
- "ISPDatabase": "Baza dostawców internetowych",
"Latitude": "Szerokość",
"Latitudes": "Szerokości",
"Location": "Lokalizacja",
- "LocationDatabase": "Baza lokalizacji",
- "LocationDatabaseHint": "Baza lokalizacji to baza krajów, regionów lub miast.",
"LocationProvider": "Dostawca Lokalizacji",
"Longitude": "Długość",
"Longitudes": "Długości",
"NoDataForGeoIPReport1": "Brak danych dla tego raportu ponieważ albo dane lokalizacyjne nie są dostępne albo adres IP odwiedzającego nie może zostać zlokalizowany",
"NoDataForGeoIPReport2": "Aby włączyć dokładną geolokalizację, zmień %1$ste ustawienia%2$s i użyj %3$sbazy lokalizacji o dokładności miasta%4$s.",
- "Organization": "Organizacja",
- "OrgDatabase": "Baza Danych Organizacji",
"PluginDescription": "Informuje o położeniu Twoich odwiedzających: kraju, regionie, mieście i koordynatach geograficznych (szerokość \/ długość geograficzna).",
"Region": "Region",
"SubmenuLocations": "Lokalizacje",
"ToGeolocateOldVisits": "Aby ustalić lokalizację archiwalnych wizyt użyj skryptu opisanego %1$stutaj%2$s.",
- "UnsupportedArchiveType": "Napotkano nieobsługiwany typ archiwum %1$s.",
- "UpdaterHasNotBeenRun": "Aktualizacja nie była jeszcze uruchamiana.",
- "UpdaterIsNotScheduledToRun": "Nie zaplanowano kolejnego przebiegu.",
- "UpdaterScheduledForNextRun": "Zostało zaplanowane kolejne wykonanie skryptu podczas najbliższego wykonania polecenia core:archive.",
- "UpdaterWasLastRun": "Ostatnia aktualizacja odbyła się %s.",
- "UpdaterWillRunNext": "Następna aktualizacja zaplanowana na %s.",
"WidgetLocation": "Lokalizacja odwiedzającego"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/pt-br.json b/plugins/UserCountry/lang/pt-br.json
index 3927a68629..03ab04ac57 100644
--- a/plugins/UserCountry/lang/pt-br.json
+++ b/plugins/UserCountry/lang/pt-br.json
@@ -1,13 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Não é possível encontrar a função apache_get_modules, assumindo servidor web não-Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Não pode localizar o arquivo %1$s dentro do arquivo tar %2$s!",
- "CannotFindGeoIPServerVar": "A variável %s não está definida. O servidor pode não estar configurado corretamente.",
- "CannotFindPeclGeoIPDb": "Não foi possível encontrar uma base de dados de países, regiões ou cidades para o módulo PECL do GeoIP. Certifique-se de que a sua base de dados de geolocalização está localizada em %1$s e tem o nome %2$s ou %3$s, caso contrário o módulo PECL não irá notá-la.",
- "CannotListContent": "Não foi possível listar o conteúdo para %1$s: %2$s",
"CannotLocalizeLocalIP": "O endereço IP %s é um endereço local e não pode ser geolocalizado.",
- "CannotSetupGeoIPAutoUpdating": "Parece que você está armazenando suas bases de dados de geolocalização fora do Matomo (nós percebemos pois não há bases de dados no subdiretório misc, mas o seu GeoIP está funcionando). O Matomo não pode atualizar automaticamente suas bases de dados de geolocalização se elas estiverem localizadas fora do diretório misc.",
- "CannotUnzipDatFile": "Não pôde descompactar o arquivo dat em %1$s: %2$s",
"City": "Cidade",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Continente",
@@ -24,81 +17,29 @@
"DefaultLocationProviderDesc2": "Isto não é muito preciso, então %1$srecomendamos instalar e usar %2$suma base de dados de geolocalização%3$s.%4$s",
"DefaultLocationProviderExplanation": "Você está usando o provedor de localização padrão, que significa que o Matomo irá supor a localização do visitante, baseado no idioma que eles usam. %1$sLeia isso%2$s para aprender como configurar uma geolocalização mais precisa.",
"DistinctCountries": "%s países distintos",
- "DownloadingDb": "Baixando %s",
- "DownloadNewDatabasesEvery": "Atualizar o banco de dados a cada",
- "FatalErrorDuringDownload": "Um erro fatal ocorreu ao baixar este arquivo. Pode haver algo errado com a sua conexão Internet, com a base de dados de geolocalização que você baixou, ou com o Matomo. Tente baixá-la e instalá-la manualmente.",
- "FoundApacheModules": "Matomo encontrou os seguintes módulos do Apache",
"FromDifferentCities": "cidades diferentes",
- "GeoIPCannotFindMbstringExtension": "Não é possível encontrar a função %1$s. Por favor, certifique-se que a extensão %2$s está instalada e carregada.",
- "GeoIPDatabases": "Bases de dados GeoIP",
"GeoIPDocumentationSuffix": "Para ver os dados para este relatório, você deve configurar GeoIP na guia de administração de Geolocalização. Os %1$s banco de dados GeoIP Maxmind comerciais %2$s são mais precisos que os livres. Para ver como são precisos, clique %3$saqui%4$s.",
- "GeoIPNoDatabaseFound": "Esta implementação GeoIP não encontrou nenhuma base de dados.",
- "GeoIPImplHasAccessTo": "Esta implementação GeoIP tem acesso aos seguintes tipos de bancos de dados",
- "GeoIPIncorrectDatabaseFormat": "Sua base de dados de geolocalização parece não ter o formato correto. Pode estar corrompida. Certifique-se de estar usando a versão binária e tente substituí-la por outra cópia.",
- "GeoIpLocationProviderDesc_Pecl1": "Este provedor de localização usa uma base de dados de geolocalização e um módulo PECL para determinar de forma precisa e eficiente a localização de seus visitantes.",
- "GeoIpLocationProviderDesc_Pecl2": "Não existem limitações com este fornecedor, por isso é o que nós recomendamos usar.",
- "GeoIpLocationProviderDesc_Php1": "Este provedor de localização é o mais simples de instalar pois ele não requer configuração do servidor (ideal para hospedagem compartilhada!). Ele usa uma base de dados de geolocalização e a API PHP da MaxMind para determinar com precisão a localização de seus visitantes.",
- "GeoIpLocationProviderDesc_Php2": "Se o seu site recebe uma grande quantidade de tráfego, você pode achar que o provedor de localização está muito lento. Neste caso, você deve instalar a extensão %1$s PECL %2$s ou o %3$s módulo do servidor %4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Este provedor de localização utiliza o módulo GeoIP que foi instalado em seu servidor HTTP. Este provedor é rápido e preciso, mas %1$s só pode ser usado com acompanhamento browser normal. %2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Se você tiver que importar arquivos de log ou fazer outra coisa que requer o estabelecimento de endereços IP, use a %1$s implementação PECL GeoIP (recomendado) %2$s ou %3$s PHP implementação GeoIP %4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Nota: anonimização IP não tem efeito sobre os locais relatados por este fornecedor. Antes de usá-lo com anonimização IP, certifique-se isso não viole as leis de privacidade que você pode estar sujeito.",
- "GeoIpLocationProviderNotRecomnended": "Geolocalização funciona, mas você não está usando um dos provedores recomendados.",
- "GeoIPNoServerVars": "Matomo não pode encontrar nenhuma variável GeoIP %s.",
- "GeoIPPeclCustomDirNotSet": "A opção %s do PHP.ini não está definido.",
- "GeoIPServerVarsFound": "Matomo detecta as seguintes variáveis GeoIP %s",
- "GeoIPUpdaterInstructions": "Insira abaixo os links de download para as suas bases de dados. Se você adquiriu bases de dados da %3$sdbip%4$s ou da %1$sMaxMind%2$s, você pode encontrar estes links em sua conta dbip ou MaxMind. Por favor entre em contato com o seu provedor de base de dados de geolocalização se você tiver dificuldade em encontrá-los.",
- "GeoIPUpdaterIntro": "O Matomo está atualmente gerenciando atualizações para as seguintes bases de dados",
- "GeoLiteCityLink": "Se você está usando a base de dados dbip city lite, use este link: %1$s%2$s%3$s",
"Geolocation": "Geolocalização",
"GeolocationPageDesc": "Nesta página você pode mudar a forma como Matomo determina localização dos visitantes.",
"getCityDocumentation": "Este relatório mostra as cidades que seus visitantes estavam quando acessou seu site.",
"getContinentDocumentation": "Este relatório mostra qual continente seus visitantes estavam quando acessaram o site.",
"getCountryDocumentation": "Este relatório mostra qual país seus visitantes estavam quando acessaram o site.",
"getRegionDocumentation": "Este relatório mostra que região os visitantes estavam quando acessaram seu site.",
- "HowToInstallApacheModule": "Como faço para instalar o módulo GeoIP para o Apache?",
"HowToInstallGeoIPDatabases": "Como eu consigo bases de dados de geolocalização?",
- "HowToInstallGeoIpPecl": "Como faço para instalar a extensão GeoIP PECL?",
- "HowToInstallNginxModule": "Como faço para instalar o módulo GeoIP para Nginx?",
- "HowToSetupGeoIP": "Como configurar geolocalização precisa com dbip",
- "HowToSetupGeoIP_Step1": "%1$sBaixar%2$s a base de dados DBIP City Lite da %3$sdbip%4$s.",
- "HowToSetupGeoIP_Step2": "Extraia este arquivo e copie o resultado %1$s para dentro do subdiretório %2$smisc%3$s do Matomo e renomeie-o para %4$s (você pode fazer isto por FTP ou SSH).",
- "HowToSetupGeoIP_Step3": "Recarregue esta tela. O provedor %1$sDBIP \/ GeoIP (PHP)%2$s será %3$sinstalado%4$s agora. Selecione-o.",
- "HowToSetupGeoIP_Step4": "E tudo pronto! Você acabou de configurar o Matomo para usar DBIP, o que significa que você poderá ver as regiões e as cidades dos seus visitantes junto com informações bem precisas dos países.",
- "HowToSetupGeoIPIntro": "Aparentemente você não possui configurações precisas de geolocalização. Este é um recurso útil e sem ele você não verá as informações de localização precisas e completas para os seus visitantes. Veja como você pode rapidamente começar a usá-lo:",
- "HttpServerModule": "Módulo do servidor HTTP",
- "InvalidGeoIPUpdatePeriod": "Período inválido para o atualizador GeoIP: %1$s. Os valores válidos são %2$s.",
- "IPurchasedGeoIPDBs": "Eu adquiri bases de dados mais precisas da %3$sdbip%4$s ou da %1$sMaxMind%2$s e quero configurar atualizações automáticas.",
- "ISPDatabase": "Base de dados de provedores de Internet",
- "IWantToDownloadFreeGeoIP": "Quero baixar a base de dados DBIP grátis...",
"Latitude": "Latitude",
"Latitudes": "Latitudes",
"Location": "Localização",
- "LocationDatabase": "Base de dados de localização",
- "LocationDatabaseHint": "Uma base de dados de localização é uma base de dados de país, região ou cidade.",
"LocationProvider": "Provedor de localização",
"Longitude": "Longitude",
"Longitudes": "Longitudes",
"NoDataForGeoIPReport1": "Não há dados para este relatório porque não há nenhum dado de localização disponível ou o endereço IP do visitante não pode ser geolocalizado.",
"NoDataForGeoIPReport2": "Para ativar a geolocalização mais precisa, mude a configuração %1$s aqui%2$s e use uma %3$s base de dados no nível de cidade %4$s.",
- "Organization": "Organização",
- "OrgDatabase": "Base de dados da organização",
- "PeclGeoIPNoDBDir": "O módulo PECL está procurando bases de dados em %1$s, mas este diretório não existe. Por favor, crie o diretório e adicione as bases de dados de geolocalização nele. Alternativamente, você pode definir %2$s no diretório correto em seu arquivo php.ini.",
- "PeclGeoLiteError": "Sua base de dados de geolocalização em %1$s está com o nome %2$s. Infelizmente, o módulo PECL não irá reconhecê-la com este nome. Por favor renomeie-a para %3$s.",
- "PiwikNotManagingGeoIPDBs": "O Matomo não está atualmente gerenciando nenhuma base de dado DBIP ou MaxMind.",
+ "NoProviders": "No momento não há outros provedores de geolocalização disponíveis. O Matomo recomenda o uso das bases de dados %1$sdbip%2$s, mas isso requer ativar o plugin GeoIp2. (Como alternativa, você pode instalar do Marketplace um plugin de terceiros que tenha sua própria funcionalidade de geolocalização.)",
"PluginDescription": "Informa a localização de seus visitantes: país, região, cidade e coordenadas geográficas (latitude \/ longitude).",
"Region": "Região",
- "SetupAutomaticUpdatesOfGeoIP": "Configurar atualizações automáticas das bases de dados de geolocalização",
"SubmenuLocations": "Locais",
"TestIPLocatorFailed": "O Matomo tentou verificar a localização de um endereço IP conhecido (%1$s), mas o seu servidor retornou nenhuma informação. Este provedor pode não estar configurado corretamente (a base de dados de geolocalização pode estar nomeada incorretamente ou localizada em diretório incorreto, por exemplo).",
- "ThisUrlIsNotAValidGeoIPDB": "O arquivo baixado não é uma base de dados de geolocalização válida. Por favor verifique novamente a URL ou baixe o arquivo manualmente.",
"ToGeolocateOldVisits": "Para obter os dados de localização para as suas visitas antigas, use o script descrito %1$s aqui %2$s.",
- "UnsupportedArchiveType": "Encontrado tipo de arquivo não suportado %1$s.",
- "UpdaterHasNotBeenRun": "O atualizador nunca foi executado.",
- "UpdaterIsNotScheduledToRun": "Não está agendado para ser executado no futuro.",
- "UpdaterScheduledForNextRun": "Está programado para ser executado durante a próxima execução do cron job archive.php",
- "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",
- "InstallGeoIp2": "O Matomo recomenda usar as bases de dados %1$sdbip%2$s, mas isto requer usar o plugin GeoIp2. Se você instalá-lo e ativá-lo (o que deve possivelmente exigir uma atualização de longa duração), você poderá começar a usar bases de dados %1$sdbip%2$s. (Ignore isto se você estiver usando um plugin de terceiro que fornece sua própria funcionalidade de geolocalização.)"
+ "WidgetLocation": "Localização dos visitantes"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/pt.json b/plugins/UserCountry/lang/pt.json
index 7a6e417197..ae4b0ddb61 100644
--- a/plugins/UserCountry/lang/pt.json
+++ b/plugins/UserCountry/lang/pt.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Não foi possível encontrar a função apache_get_modules; assumindo um servidor web não-Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Não foi possível encontrar o ficheiro %1$s no arquivo tar %2$s!",
- "CannotFindGeoIPServerVar": "A variável %s não está definida. O seu servidor pode não estar configurado corretamente.",
- "CannotListContent": "Não foi possível listar o conteúdo para %1$s: %2$s",
"CannotLocalizeLocalIP": "O endereço de IP %s é um endereço local e não pode ser geolocalizado.",
- "CannotUnzipDatFile": "Não foi possível extrair o ficheiro dat em %1$s: %2$s",
"City": "Cidade",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Continente",
@@ -19,61 +14,32 @@
"VisitLocation": "Localização da visita",
"CurrentLocationIntro": "De acordo com este fornecedor, a sua localização atual é",
"DefaultLocationProviderDesc1": "O fornecedor de localização predefinido estima o país de um visitante com base no idioma que este utiliza.",
+ "DefaultLocationProviderDesc2": "Isto não é muito preciso, pelo que %1$srecomendamos a instalação e utilização de %2$suma base de dados de geolocalização%3$s.%4$s",
"DefaultLocationProviderExplanation": "Está a utilizar o fornecedor de localização predefinido, o que significa que o Matomo irá estimar a localização do visitante com base no idioma que este utiliza. %1$sConsulte isto%2$s para saber como configurar uma geolocalização mais precisa.",
"DistinctCountries": "%s países distintos",
- "DownloadingDb": "A descarregar %s",
- "DownloadNewDatabasesEvery": "Atualizar bases de dados todos\/todas",
- "FoundApacheModules": "O Matomo encontrou os seguintes módulos Apache",
"FromDifferentCities": "cidades diferentes",
- "GeoIPCannotFindMbstringExtension": "Não foi possível encontrar a função %1$s. Por favor, confirme que a extensão %2$s está instalada e carregada.",
- "GeoIPDatabases": "Bases de dados GeoIP",
"GeoIPDocumentationSuffix": "Para ver dados para este relatório, deve configurar o GeoIP no separador de administração da Geolocalização. As bases de dados comerciais %1$sMaxmind%2$s são mais precisas do que as gratuitas. Para ver quão precisas estas são, clique %3$saqui%4$s.",
- "GeoIPNoDatabaseFound": "Esta implementação do GeoIP não conseguiu encontrar qualquer base de dados.",
- "GeoIPImplHasAccessTo": "Esta implementação do GeoIP tem acesso aos seguintes tipos de bases de dados",
- "GeoIpLocationProviderDesc_Pecl2": "Não existem limitações com este fornecedor, pelo que recomendamos a utilização do mesmo.",
- "GeoIpLocationProviderDesc_Php2": "Se o seu site tiver muito tráfego, pode descobrir que este fornecedor de localização é demasiado lento. Neste caso, deve instalar a %1$sextensão PECL%2$s ou um %3$smódulo de servidor%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Este fornecedor de localização utiliza o módulo GeoIP que foi instalado no seu servidor HTTP. Este fornecedor é rápido e preciso, mas %1$ssó pode ser utilizado para acompanhamento normal de navegadores.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Se tiver de importar ficheiros de registo ou fazer algo mais que necessite a definição de endereços de IP, utilize a %1$simplementação PECL do GeoIP (recomendado)%2$s ou a %3$simplementação PHP dp GeoIP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Nota: a anonimização de IPs não tem qualquer efeito nas localizações reportadas por este fornecedor. Antes de o utilizar com a anonimização de IPs, confirme que este não viola quaisquer leis de privacidade que sejam aplicáveis a si.",
- "GeoIpLocationProviderNotRecomnended": "A geolocalização funciona, mas não está a utilizar um dos fornecedores recomendados.",
- "GeoIPNoServerVars": "O Matomo não consegue encontrar quaisquer variáveis GeoIP %s.",
- "GeoIPPeclCustomDirNotSet": "A opção ini do PHP %s não está definida.",
- "GeoIPServerVarsFound": "O Matomo deteta as seguintes variáveis GeoIP %s",
"Geolocation": "Geolocalização",
"GeolocationPageDesc": "Nesta página pode alterar como o Matomo determina as localizações dos visitantes.",
"getCityDocumentation": "Este relatório mostra as cidades onde os seus visitantes estavam quando acederam ao seu site.",
"getContinentDocumentation": "Este relatório mostra o continente onde os seus visitantes estavam quando acederam ao seu site.",
"getCountryDocumentation": "Este relatório mostra o país onde os seus visitantes estavam quando acederam ao seu site.",
"getRegionDocumentation": "Este relatório mostra a região onde os seus visitantes estavam quando acederam ao seu site.",
- "HowToInstallApacheModule": "Como instalo o módulo GeoIP para o Apache?",
- "HowToInstallGeoIpPecl": "Como instalo a extensão PECL GeoIP?",
- "HowToInstallNginxModule": "Como instalo o módulo GeoIP para o Nginx?",
- "HowToSetupGeoIPIntro": "Não parece ter uma configuração de Geolocalização precisa. Esta é uma funcionalidade útil e sem a mesma, não poderá ver informação de localização dos seus visitantes de forma precisa e completa. Eis como pode rapidamente começar a utilizá-la:",
- "HttpServerModule": "Módulo do servidor HTTP",
- "InvalidGeoIPUpdatePeriod": "Período inválido para o atualizador GeoIP: %1$s. Os valores válidos são %2$s.",
- "ISPDatabase": "Base de dados de ISP",
+ "HowToInstallGeoIPDatabases": "Como obtenho bases de dados de geolocalização?",
"Latitude": "Latitude",
"Latitudes": "Latitudes",
"Location": "Localização",
- "LocationDatabase": "Base de dados de localização",
- "LocationDatabaseHint": "Uma base de dados de localização é uma base de dados de um país, região ou cidade.",
"LocationProvider": "Fornecedor de localização",
"Longitude": "Longitude",
"Longitudes": "Longitudes",
"NoDataForGeoIPReport1": "Não existem dados para este relatório porque não existem dados de localização disponíveis ou os endereços de IP dos visitantes não podem ser geolocalizados.",
"NoDataForGeoIPReport2": "Para ativar uma geolocalização mais precisa, altere as definições %1$saqui%2$s e utilize uma %3$sbase de dados de nível de cidade%4$s.",
- "Organization": "Organização",
- "OrgDatabase": "Base de dados de organizações",
+ "NoProviders": "Atualmente, não existem fornecedores adicionais de geolocalização. O Matomo recomenda a utilização de bases de dados %1$sdbip%2$s, mas isto requer a ativação da extensão GeoIp2. (Alternativamente, pode instalar uma extensão de terceiros da loja, que forneça a sua própria funcionalidade de geolocalização.)",
"PluginDescription": "Relatórios com a localização dos seus visitantes: país, região, cidade e coordenadas geográficas (latitude\/longitude).",
"Region": "Região",
"SubmenuLocations": "Localizações",
+ "TestIPLocatorFailed": "O Matomo tentou confirmar a localização de um endereço de IP conhecido (%1$s), mas o seu servidor não devolveu qualquer informação. Este fornecedor pode não estar configurado corretamente (por exemplo, a base de dados de geolocalização pode ter um nome incorreto ou estar num diretório errado).",
"ToGeolocateOldVisits": "Para obter os dados de localização para as suas visitas antigas, utilize o script descrito %1$saqui%2$s.",
- "UnsupportedArchiveType": "Encontrado um tipo de arquivo não suportado %1$s.",
- "UpdaterHasNotBeenRun": "A ferramenta de atualização nunca foi executada.",
- "UpdaterIsNotScheduledToRun": "Não está agendada para ser executada no futuro.",
- "UpdaterScheduledForNextRun": "Está agendada para ser executada durante a próxima execução do comando cron core:archive.",
- "UpdaterWasLastRun": "A ferramenta de atualização foi executada pela última vez a %s.",
- "UpdaterWillRunNext": "Está agendada para ser executada a %s.",
"WidgetLocation": "Localização do visitante"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/ro.json b/plugins/UserCountry/lang/ro.json
index c3c4dc79d3..4d6e35912a 100644
--- a/plugins/UserCountry/lang/ro.json
+++ b/plugins/UserCountry/lang/ro.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Nu pot găsifuncție apache_obtine_module , presupunând non-server de web Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Nu se poate gasi %1$s fisierul din arhiva %2$s!",
- "CannotFindGeoIPServerVar": "Variabila %s nu este setata. Server-ul dvs. ar putea să nu fie configurat corect.",
- "CannotListContent": "Nu s-a putut lista continutul pentru: %1$s %2$s",
"CannotLocalizeLocalIP": "Adresa IP %s este o adresă locală și nu pot fi localizate geografic.",
- "CannotUnzipDatFile": "Nu s-a putut dezarhiva fișierul dat în %1$s: %2$s",
"City": "Oraş",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Continent",
@@ -18,55 +13,23 @@
"DefaultLocationProviderDesc1": "Furnizorul de locație implicită ghiceste tara unui vizitator bazat pe limba care o folosesc.",
"DefaultLocationProviderExplanation": "Acum folositi locatie implicita de furnizorul l, ceea ce înseamnă că Matomo va ghici locația vizitatorilor bazat pe limba pe care o folosesc. %1$scititi acest%2$s pentru a învăța cum să setați geolocalizarea mai precis.",
"DistinctCountries": "%s ţări distincte",
- "DownloadingDb": "Se descarcă %s",
- "DownloadNewDatabasesEvery": "Actializează baza de date fiecare",
- "FoundApacheModules": "Matomo a găsit următoarele module Apache",
"FromDifferentCities": "diferite orașe",
- "GeoIPCannotFindMbstringExtension": "Nu se poate găsi aceasta %1$s funcție . Asigurați-vă că %2$s extensia este instalata si incarcata.",
- "GeoIPDatabases": "Bazele de date GeoIP",
"GeoIPDocumentationSuffix": "Pentru a vedea datele pentru acest raport, trebuie să configurati GeoIP în fila Geolocation admin tine.Comercial %1$sMaxmind%2$s baze de date GeoIP sunt mai precise decât cele libere. Pentru a vedea cât de exacte sunt, faceți clic pe %3$saici%4$s.",
- "GeoIPImplHasAccessTo": "Aceasta implementare GeoIP are acces la următoarele tipuri de baze de date",
- "GeoIpLocationProviderDesc_Pecl2": "Nu există limitări cu acest furnizor, asta este cea pe care o recomandăm pentru utilizare.",
- "GeoIpLocationProviderDesc_Php2": "În cazul în care site-ul dvs. primeste o multime de trafic, ați putea găsi că acest furnizor este prea lent. În acest caz, ar trebui să instalați %1$sPECL extensie%2$ssau %3$smodul server%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Acest furnizor de localizare utilizează modulul GeoIP care a fost instalat în serverul de HTTP. Acest furnizor este rapid și precis, dar %1$scanare poate fi utilizat numai cu urmărirea normală browser.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Dacă aveți de importat fișierul jurnal sau sa faceti ceva care necesită stabilirea adrese IP, utilizați %1$s de punere în aplicare PECL GeoIP (recomandat)%2$s sau%3$s PHP GeoIP implementarea%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Notă: anonimizare IP nu are nici un efect asupra locațiilor raportate de acest furnizor. Înainte de al utiliza cu anonimizare, IP, asigurați-vă că aceasta nu încalcă legile privind confidențialitatea ar putea fi supuse.",
- "GeoIpLocationProviderNotRecomnended": "Geolocation funcționează, dar nu utilizați unul dintre furnizorii recomandati.",
- "GeoIPNoServerVars": "Matomo nu poate găsi nici un GeoIP %s variabile.",
- "GeoIPPeclCustomDirNotSet": "%s Opțiune PHP ini nu este setata.",
- "GeoIPServerVarsFound": "Matomo detectează următoarele GeoIP %s variabile",
"Geolocation": "Geolocation",
"GeolocationPageDesc": "Pe această pagină poți schimba cum Matomo determină locațiile vizitatorilor.",
"getCityDocumentation": "Acest raport arată din ce oras sunt vizitatorii când au accesat site-ul dumneavoastră.",
"getContinentDocumentation": "Acest raport arată pe ce continent au fost vizitatori când au accesat site-ul dumneavoastră.",
"getCountryDocumentation": "Acest raport arată din ce țară sunt vizitatorii dvs. cand au accesat site-ul dumneavoastră.",
"getRegionDocumentation": "Acest raport arată din ce regiune sunt vizitatorii dvs. când au accesat site-ul dumneavoastră.",
- "HowToInstallApacheModule": "Cum instalez modulul GeoIP pentru Apache?",
- "HowToInstallGeoIpPecl": "Cum instalez extensia GeoIP PECL?",
- "HowToInstallNginxModule": "Cum instalez modulul GeoIP pentru Nginx?",
- "HowToSetupGeoIPIntro": "Nu pare a avea o configurare exacte Geolocation. Aceasta este o caracteristică utilă și fără ea nu se vor vedea informatii corecte si complete de locație pentru vizitatori. Iată cum puteți începe rapid folosind-o:",
- "HttpServerModule": "Module HTTP Server",
- "InvalidGeoIPUpdatePeriod": "Perioada de valabilitate pentru updater GeoIP:%1$s. Valorile valide sunt %2$s.",
- "ISPDatabase": "Baza de date provideri internet",
"Latitude": "Latitudine",
"Location": "Localitate",
- "LocationDatabase": "Locatie baza de date",
- "LocationDatabaseHint": "O locatie bază de date este fie o țară, regiune sau oraș baza de date.",
"LocationProvider": "Locație Provider",
"Longitude": "Longitudine",
"NoDataForGeoIPReport1": "Nu există date pentru acest raport, deoarece nu există, fie nu există date disponibile de localizare sau adresele IP ale vizitatorilor nu pot fi localizate geografic.",
"NoDataForGeoIPReport2": "Pentru a activa geolocalizare exacta, modifica setările %1$saici%2$s și de a folosi o %3$s nivel oras baza de date%4$s.",
- "Organization": "Organizaţie",
- "OrgDatabase": "Orgaare baza de date",
"Region": "Regiune",
"SubmenuLocations": "Locații",
"ToGeolocateOldVisits": "Pentru a obține datele de localizare pentru d vizite vechi, script-ul descris %1$s aici %2$s.",
- "UnsupportedArchiveType": "Arhiva neacceptata tip întâlnit %1$s.",
- "UpdaterHasNotBeenRun": "Updater-ul nu a fost rulat.",
- "UpdaterIsNotScheduledToRun": "Acesta nu este programata să ruleze în viitor.",
- "UpdaterScheduledForNextRun": "Acesta este programat să ruleze în următoarea executare archive.php cron.",
- "UpdaterWasLastRun": "Programul de actualizare a fost lasat sa ruleze %s.",
- "UpdaterWillRunNext": "Programarea urmatoare trebuie sa ruleze pe %s.",
"WidgetLocation": "Locaţia vizitatorului"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/ru.json b/plugins/UserCountry/lang/ru.json
index 66baac4884..1bd1582c6a 100644
--- a/plugins/UserCountry/lang/ru.json
+++ b/plugins/UserCountry/lang/ru.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Не удается найти apache_get_modules функцию, видимо, это не веб-сервер Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Не найден файл %1$s в tar-архиве %2$s!",
- "CannotFindGeoIPServerVar": "Переменная %s не установлена. Ваш сервер не может быть сконфигурирован правильно.",
- "CannotListContent": "Не удалось перечислить содержимое для %1$s: %2$s",
"CannotLocalizeLocalIP": "IP адрес %s - это локальный адрес и его конкретное местонахождение не может быть определено.",
- "CannotUnzipDatFile": "Невозможно разархивировать dat-файл в %1$s : %2$s",
"City": "Город",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Континент",
@@ -20,54 +15,26 @@
"DefaultLocationProviderDesc1": "Этот способ отслеживания определяет местоположение на основе языка, которым пользователи пользуются в браузере и системе.",
"DefaultLocationProviderExplanation": "Вы используете провайдер определения местоположения по умолчанию. Это означает, что Matomo будет судить о местоположении посетителя по используемому им языку. %1$sПрочтите здесь%2$s о том, как устанавливать местоположение более точно.",
"DistinctCountries": "%s уникальных стран",
- "DownloadingDb": "Загрузка %s",
- "DownloadNewDatabasesEvery": "Обновлять базу раз в",
- "FoundApacheModules": "Matomo нашёл следующие модули Apache",
"FromDifferentCities": "разные города",
- "GeoIPCannotFindMbstringExtension": "Невозможно найти функцию %1$s. Пожалуйста, убедитесь, что расширение %2$s загружено и установлено.",
- "GeoIPDatabases": "Базы данных GeoIP",
"GeoIPDocumentationSuffix": "Чтобы увидеть данные по этому отчету вы должны установить GeoIP в секции Geolocation, которая находится в панели администрирования. Платные базы данных GeoIP %1$sMaxmind%2$s более точны, чем бесплатные. Насколько именно они точные, вы можете посмотреть %3$sздесь%4$s.",
- "GeoIPImplHasAccessTo": "Этот вариант реализации GeoIP имеет доступ к следующим базам данных",
- "GeoIpLocationProviderDesc_Pecl2": "Нет ограничений по использованию этого способа отслеживания, так что мы рекомендуем именно его.",
- "GeoIpLocationProviderDesc_Php2": "Если у вашего сайта слишком много посетителей, вы заметите, что этот способ слишком медленный. В этом случае вам нужно установить %1$sPECL расширение%2$s или специальный %3$sсерверный модуль%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Этот механизм определения местонахождения использует модуль GeoIP, установленный на ваш HTTP-сервер. Он быстр и точен, но %1$s может быть использован только при отслеживании обычных браузеров.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Если вам нужно импортировать лог-файлы или сделать что-то, требующее наличие IP адресов, используйте %1$s встраиваемый PECL GeoIP (рекомендуется)%2$s или %3$s встраиваемый PHP GeoIP %4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Подсказка: анонимизация IP не оказывает на эффект на получение локации пользователей таким способом. Перед тем, как использовать его с анонимизацией IP, убедитесь, что это не противоречит законодательству вашей страны.",
- "GeoIpLocationProviderNotRecomnended": "Геолокация работает, но вы не используете один из рекомендованных провайдеров.",
- "GeoIPNoServerVars": "Matomo не может найти GeoIP %s переменные.",
- "GeoIPPeclCustomDirNotSet": "PHP ini опция %s не установлена.",
- "GeoIPServerVarsFound": "Matomo нашёл следующие переменные GeoIP: %s",
"Geolocation": "Геолокация",
"GeolocationPageDesc": "На этой странице вы можете изменить способ определения местоположения посетителей.",
"getCityDocumentation": "Этот отчет показывает города посетителей вашего сайта.",
"getContinentDocumentation": "Этот отчет показывает континенты посетителей вашего сайта.",
"getCountryDocumentation": "Этот отчет показывает страны посетителей вашего сайта.",
"getRegionDocumentation": "Этот отчет показывает регионы посетителей вашего сайта.",
- "HowToInstallApacheModule": "Как установить GeoIP модуль для Apache?",
- "HowToInstallGeoIpPecl": "Как установить GeoIP PECL расширение?",
- "HowToInstallNginxModule": "Как установить GeoIP модуль для Nginx?",
- "HowToSetupGeoIPIntro": "Кажется, что у вас не настроено определено локации посетителей с помощью GeoIP. Это полезная \"штука\" - без нее вы не сможете достаточно точно определять местонахождение посетителей. И вот как вы можете быстро все настроить:",
- "HttpServerModule": "HTTP Серверный модуль",
- "ISPDatabase": "База провайдеров",
"Latitude": "Широта",
"Latitudes": "Широта",
"Location": "Локация",
- "LocationDatabase": "Расположение базы данных",
- "LocationDatabaseHint": "Расположение базы данных страны, региона или города.",
"LocationProvider": "Способ определения локации пользователя",
"Longitude": "Долгота",
"Longitudes": "Долгота",
"NoDataForGeoIPReport1": "Не существует данных для этого отчета, потому что либо нет данных о местоположении или IP адрес посетителя не может быть определён географически.",
"NoDataForGeoIPReport2": "Для обеспечения точной геолокации, изменить параметры %1$sтут%2$s и используйте %3$sбазу данных городов%4$s.",
- "Organization": "Организация",
- "OrgDatabase": "База организаций",
"PluginDescription": "Сообщает местонахождение посетителей: страна, регион, город и географические координаты (широта\/долгота).",
"Region": "Регион",
"SubmenuLocations": "Локации",
"ToGeolocateOldVisits": "Для того чтобы получить информацию о местоположении для предыдущих посетителей, воспользуйтесь скриптом, о котором написано %1$sтут%2$s.",
- "UnsupportedArchiveType": "Встретился неподдерживаемый тип архива %1$s.",
- "UpdaterHasNotBeenRun": "Обновления никогда не производились.",
- "UpdaterScheduledForNextRun": "Это запланированный запуск команды core:archive при следующем выполнении cron-задачи.",
"WidgetLocation": "Местонахождение посетителя"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/sk.json b/plugins/UserCountry/lang/sk.json
index 06b11392c2..370667d7ad 100644
--- a/plugins/UserCountry/lang/sk.json
+++ b/plugins/UserCountry/lang/sk.json
@@ -5,7 +5,6 @@
"Country": "Krajina",
"DistinctCountries": "Počet rôznych krajín: %s",
"Location": "Miesto",
- "SubmenuLocations": "Umiestnenie",
- "UpdaterWasLastRun": "Aktualizátor bol naposledy spustený %s."
+ "SubmenuLocations": "Umiestnenie"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/sq.json b/plugins/UserCountry/lang/sq.json
index 80ea3839f4..8adc52afab 100644
--- a/plugins/UserCountry/lang/sq.json
+++ b/plugins/UserCountry/lang/sq.json
@@ -1,13 +1,6 @@
{
"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ë Matomo-s (e dimë, ngaqë s’ka baza të dhënash te nëndrejtoria misc, por GeoIP-ja juaj funksionon). Matomo s’i përditëson dot vetvetiu bazat tuaja të të dhënave për gjeovendëzim, 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",
@@ -24,81 +17,29 @@
"DefaultLocationProviderDesc2": "Kjo s’është shumë e saktë, ndaj %1$skëshillojmë instalimin dhe përdorimin e %2$snjë baze të dhënash gjeovendëzimi%3$s.%4$s",
"DefaultLocationProviderExplanation": "Po përdorni furnizuesin parazgjedhje të vendeve, që do të thotë se Matomo 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 për gjeovendëzim që shkarkuat ose me Matomo-n. Provoni ta shkarkoni dhe instaloni dorazi.",
- "FoundApacheModules": "Matomo 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",
"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.",
- "GeoIPNoDatabaseFound": "Ky sendërtim i GeoIP-së s’qe në gjendje të gjente ndonjë bazë të dhënash.",
- "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 të gjeovendëzimit 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 bazë të dhënash gjeovendëzimi dhe 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 bazë të dhënash gjeovendëzimi 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": "Matomo s’gjen dot ndryshore GeoIP %s.",
- "GeoIPPeclCustomDirNotSet": "S’është caktuar mundësia %s PHP ini.",
- "GeoIPServerVarsFound": "Matomo pikas 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$sdbip%4$s ose %1$sMaxMind%2$s, këto lidhje mund t’i gjeni te llogaria juaj dbip ose MaxMind. Nëse keni probleme me hyrjen në to, ju lutemi, lidhuni me furnizuesin tuaj të bazës së të dhënave të gjeovendëzimit.",
- "GeoIPUpdaterIntro": "Matomo po administron përditësime për bazat vijuese të të dhënave",
- "GeoLiteCityLink": "Nëse përdorni bazën e të dhënave Dbip City Lite, 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 Matomo 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ë marr baza të dhënash gjeovendëzimi?",
- "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 dbip?",
- "HowToSetupGeoIP_Step1": "%1$sShkarkoni%2$s bazën e të dhënave DBIP City Lite prej %3$sdbip%4$s.",
- "HowToSetupGeoIP_Step2": "Përftojeni këtë kartelë dhe kopjojeni përfundimin, %1$s te nëndrejtoria %2$smisc%3$s e Matomo-s dhe riemërtojeni si %4$s (këtë mund ta bëni me FTP ose SSH).",
- "HowToSetupGeoIP_Step3": "Ringarkoni këtë skenë. Furnizuesi %1$sDBIP \/ GeoIP (PHP)%2$s tani do të jetë %3$sinstaluar%4$s. Përzgjidheni.",
- "HowToSetupGeoIP_Step4": "Dhe mbaruat! Sapo e rregulluat Matomo-n të përdorë DBIP, 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": "Bleva baza të dhënash më të sakta nga %3$sdbip%4$s ose %1$sMaxMind%2$s dhe dua të rregulloj përditësime të vetvetishme.",
- "ISPDatabase": "Bazë të Dhënash MShI",
- "IWantToDownloadFreeGeoIP": "Dua të shkarkoj bazën DBIP falas të të dhënave…",
"Latitude": "Gjerësi gjeografike",
"Latitudes": "Gjerësi gjeografike",
"Location": "Vend",
- "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",
"Longitudes": "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 gjeovendëzimi. Përndryshe, mund të caktoni për %2$s drejtorinë e saktë te kartela juaj php.ini.",
- "PeclGeoLiteError": "Baza juaj e të dhënave për gjeovendëzim 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": "Matomo hëpërhë s’administron ndonjë bazë të dhënash DBIP ose MaxMind.",
+ "NoProviders": "Hëpërhë s’ka furnizues shtesë gjeovendëzimi. Matomo këshillon përdorimin e bazave të dhënave %1$sdbip%2$s, por kjo lyp aktivizimin e shtojcës GeoIp2. (Ndryshe, mund të instaloni që nga tregu një shtojcë pale të tretë që furnizon funksionet e veta të gjeovendëzimit.)",
"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 për gjeovendëzim",
"SubmenuLocations": "Vende",
"TestIPLocatorFailed": "Matomo provoi të kontrollojë vendin e një adrese të njohur IP (%1$s), por shërbyesi juaj s’u përgjigj me ndonjë të dhënë. Ky furnizues mund të mos jetë formësuar si duhet (baza e të dhënave për gjeovendëzim mund të jetë emërtuar jo saktë ose të gjendet në drejtori të gabuar, për shembull).",
- "ThisUrlIsNotAValidGeoIPDB": "Kartela e shkarkuar s’është bazë të dhënash gjeovendëzimi 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.",
- "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",
- "InstallGeoIp2": "Matomo rekomandon përdorimin e bazave të të dhënave %1$sdbip%2$s, por kjo lyp përdorimin e shtojcës GeoIp2. Nëse e instaloni dhe e aktivizoni (çka ka shumë mundësi se do të kërkojë një përditësim që zgjat ca), do të jeni në gjendje të filloni të përdorni baza të dhënash %1$sdbip%2$s. (Shpërfilleni këtë , nëse përdorni një shtojcë pale të tretë që për gjeovendëzim sjell funksione të vetat.)"
+ "WidgetLocation": "Vend Vizitori"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/sr.json b/plugins/UserCountry/lang/sr.json
index 7dc97e248a..7f43e34e3f 100644
--- a/plugins/UserCountry/lang/sr.json
+++ b/plugins/UserCountry/lang/sr.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Ne mogu da nađem funkciju apache_get_modules, pretpostavljam da imate server koji nije Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Ne mogu da nađem datoteku %1$s u arhivi %2$s.",
- "CannotFindGeoIPServerVar": "Promenljiva %s nije postavljena. Vaš server možda nije valjano podešen.",
- "CannotListContent": "Ne mogu da pročitam sadržaj %1$s: %2$s",
"CannotLocalizeLocalIP": "IP adresa %s je lokalna i ne može biti locirana.",
- "CannotUnzipDatFile": "Na mogu da raspakujem dat u %1$s: %2$s",
"City": "Grad",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontinent",
@@ -18,56 +13,24 @@
"DefaultLocationProviderDesc1": "Podrazumevani provajder lokacija nagađa zemlju posetioca na osnovu jezika koji oni koriste.",
"DefaultLocationProviderExplanation": "Koristite podrazumevanog provajdera lokacije što znači da Matomo pokušava da pogodi lokaciju posetilaca na osnovu jezika koji oni koriste. %1$sPogledajte ovde%2$s kako da podesite znatno sigurniju geolokaciju.",
"DistinctCountries": "%s različitih zemalja",
- "DownloadingDb": "Preuzimanje %s",
- "DownloadNewDatabasesEvery": "Ažuriraj bazu svakih",
- "FoundApacheModules": "Matomo je našao sledeće Apache module",
"FromDifferentCities": "različiti gradovi",
- "GeoIPCannotFindMbstringExtension": "Ne mogu da nađem funkciju %1$s. Proverite da li je dodatak %2$s instaliran i učitan.",
- "GeoIPDatabases": "GeoIP baza",
"GeoIPDocumentationSuffix": "Da biste videli podatke za ovaj izveštaj potrebno je da podesite GeoIP preko taba Podešavannje geolokacije. Komercijalna %1$sMaxmind%2$s GeoIP baza je preciznija od besplatnih. Da biste videli koliko su one precizne, kliknite %3$sovde%4$s.",
- "GeoIPImplHasAccessTo": "Ova GeoIP implementacija ima pristup sledećim tipovima baza",
- "GeoIpLocationProviderDesc_Pecl2": "Nema ograničenja sa ovim provajderom tako da vam ga preporučujemo.",
- "GeoIpLocationProviderDesc_Php2": "Ukoliko vaš sajt ima puno saobraćaja, može se desiti da je ovaj provajder lokacija previše spor. U tom slučaju, instalirajte %1$sPECL proširenje%2$s ili %3$sserver modul%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Ovaj provajder lokacija koristi GeoIP modul koji je instaliran na vašem HTTP serveru. Provajder je brz i precizan ali %1$smože se koristiti samo za normalna praćenja brauzera.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Ako je potrebno da uvezete datoteke sa zapisima ili da uradite nešto drugo što zahteva podešavanje IP adresa, koristite %1$sPECL GeoIP implementaciju (preporučujemo)%2$s ili %3$sPHP GeoIP implementaciju%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Pažnja: anonimizacija IP adresa ne utiče na lokacije koje obezbeđuje ovaj provajder. Proverite da li ovo nije u suprotnosti sa zakonom o privatnosti pod koji pripadate.",
- "GeoIpLocationProviderNotRecomnended": "Geolokacija funkcioniše ali vi ne koristite jednog od preporučenih provajdera.",
- "GeoIPNoServerVars": "Matomo ne može da nađe nijednu GeoIP %s promenljivu",
- "GeoIPPeclCustomDirNotSet": "PHP ini opcija %s nije postavljena.",
- "GeoIPServerVarsFound": "Matomo je pronašao sledeće GeoIP %s promenljive",
"Geolocation": "Geolokacija",
"GeolocationPageDesc": "Na ovoj stranici možete promeniti način na koji Matomo prepoznaje lokacije posetilaca.",
"getCityDocumentation": "Ovaj izveštaj prikazuje gradove vaših posetilaca dok su pristupali vašem sajtu.",
"getContinentDocumentation": "Ovaj izveštaj prikazuje sa kojih kontinenata posetioci pristupaju vašem sajtu.",
"getCountryDocumentation": "Ovaj izveštaj prikazuje u kojim gradovima se nalaze vaši posetioci dok pristupaju vašem sajtu.",
"getRegionDocumentation": "Ovaj izveštaj prikazuje iz kojih regiona posetioci pristupaju vašem sajtu.",
- "HowToInstallApacheModule": "Kako da instaliram GeoIP modul za Apache?",
- "HowToInstallGeoIpPecl": "Kako da instaliram GeoIP PECL dodatak?",
- "HowToInstallNginxModule": "Kako da instaliram GeoIP modul za Nginx?",
- "HowToSetupGeoIPIntro": "Izgleda da nemate dobro podešeno geolociranje. Ovo je korisna opcija i bez nje nećete videti kompletne i precizne informacije o lokacijama vaših posetilaca. Evo kako brzo možete da počnete da je koristite:",
- "HttpServerModule": "HTTP server modul",
- "InvalidGeoIPUpdatePeriod": "Period GeoIP osvežavanje %1$s nije validan. Validne vrednosti su %2$s.",
- "ISPDatabase": "ISP baza",
"Latitude": "Geografska širina",
"Location": "Lokacija",
- "LocationDatabase": "Baza lokacija",
- "LocationDatabaseHint": "Baza lokacija je baza zemalja, regija ili gradova.",
"LocationProvider": "Provajder lokacije",
"Longitude": "Geografska dužina",
"NoDataForGeoIPReport1": "Nema podataka za ovaj izveštaj zato što ili podaci o lokaciji nisu dostupni ili IP adresu posetioca nije moguće geolocirati.",
"NoDataForGeoIPReport2": "Da biste omogućili preciznu geolokaciju, promenite podešavanja %1$sovde%2$s i koristite %3$sbazu gradova%4$s.",
- "Organization": "Organizacija",
- "OrgDatabase": "Baza organizacija",
"PluginDescription": "Prikazuje lokaciju vaših posetilaca: zemlja, region, grad i geografske koordinate (geografska dužina i širina).",
"Region": "Regija",
"SubmenuLocations": "Lokacije",
"ToGeolocateOldVisits": "Kako biste dobili podatke o lokacijama starih poseta, iskoristite skript %1$ssa ove adrese%2$s.",
- "UnsupportedArchiveType": "Tip arhive %1$s nije prepoznat.",
- "UpdaterHasNotBeenRun": "Program za nadogradnju nije nikada ranije pokretan.",
- "UpdaterIsNotScheduledToRun": "Nije zakazano buduće izvršenje.",
- "UpdaterScheduledForNextRun": "Zakazano je da bude pokrenuto prilikom sledećeg izvršenja archive.php posla.",
- "UpdaterWasLastRun": "Poslednja provera je izvršena %s.",
- "UpdaterWillRunNext": "Sledeće izvršenje je zakazano za %s.",
"WidgetLocation": "Lokacija posetioca"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/sv.json b/plugins/UserCountry/lang/sv.json
index a9072bd602..9e3d52e135 100644
--- a/plugins/UserCountry/lang/sv.json
+++ b/plugins/UserCountry/lang/sv.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Kan inte hitta funktionen apache_get_modules, förutsätter att Apache inte används som webbserver.",
- "CannotFindGeoIPDatabaseInArchive": "Kan inte hitta filen %1$s i tar-arkivet %2$s!",
- "CannotFindGeoIPServerVar": "Variabeln %s är inte inställd. Möjligtvis är din server inte rätt konfigurerad.",
- "CannotListContent": "Kunde inte lista innehåll för %1$s: %2$s",
"CannotLocalizeLocalIP": "IP-adressen %s är en lokal adress och kan inte geolokaliseras.",
- "CannotUnzipDatFile": "Kunde ej packa upp dat-fil i %1$s: %2$s",
"City": "Stad",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kontinent",
@@ -21,59 +16,26 @@
"DefaultLocationProviderDesc1": "Som standard gissar sig platstjänsten till besökarens plats baserat på vilket språk som används.",
"DefaultLocationProviderExplanation": "Du använder den standardiserade platsleverantören, det innebär att Matomo kommer räkna ut besökarens geografiska position baserat på språket de använder. %1$sLäs det här%2$s för att lära dig mer om hur du får en mer exakt lokalisering av dina besökare.",
"DistinctCountries": "%s distinkta länder",
- "DownloadingDb": "Laddar ner %s",
- "DownloadNewDatabasesEvery": "Uppdatera databasen varje",
- "FoundApacheModules": "Matomo hittade följande Apache-moduler",
"FromDifferentCities": "Olika städer",
- "GeoIPCannotFindMbstringExtension": "Funktionen %1$s kunde inte hittas. Kontrollera att tillägget %2$s är installerat och laddat.",
- "GeoIPDatabases": "GeoIP-databaser",
"GeoIPDocumentationSuffix": "För att se data i den här rapporten måste du ställa in GeoIP i inställningarna, under fliken Geolocation. Dom kommersiella versionerna av GeoIP-databaserna från %1$sMaxmind%2$s är mer exakta än dom som är gratis. Klicka %3$shär%4$s för att se hur exakta dom är.",
- "GeoIPNoDatabaseFound": "Denna GeoIP-tjänst kunde inte hitta någon databas.",
- "GeoIPImplHasAccessTo": "Den här GeoIP-tjänsten har tillgång till följande typer av databaser",
- "GeoIpLocationProviderDesc_Pecl2": "Det finns inga begränsningar med den här tjänsten, så det är den vi rekommenderar att använda.",
- "GeoIpLocationProviderDesc_Php2": "Den här tjänsten kan upplevas som långsam om din webbplats har mycket trafik. I så fall borde du installera %1$sPECL tillägget%2$s eller en %3$sservermodul%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Den här platstjänsten använder GeoIP-modulen som har installerats på din HTTP-server. Den här tjänsten är snabb och träffsäker, men %1$skan endast användas tillsammans med normal webbläsarspårning.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Om du behöver importera loggfiler eller göra något annat som kräver IP-adresser: Använd %1$sPECL GeoIP (rekommenderas)%2$s eller %3$sPHP GeoIP%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Notera: Anonymisering av IP-adresser har ingen effekt på platserna som rapporteras av den här tjänsten. Kontrollera så att du inte bryter mot några sekretesslagar innan du använder den med anonyma IP-adresser.",
- "GeoIpLocationProviderNotRecomnended": "Geografisk lokalisering fungerar, men du använder inte något av de rekommenderade verktygen.",
- "GeoIPNoServerVars": "Matomo hittar inga GeoIP %s variabler.",
- "GeoIPPeclCustomDirNotSet": "Valet %s i är inte inställt i PHP ini.",
- "GeoIPServerVarsFound": "Matomo har hittat följande variabler för GeoIP %s",
"Geolocation": "Geolocation",
"GeolocationPageDesc": "På den här sidan kan du ändra hur Matomo avgör besökarnas platser.",
"getCityDocumentation": "Den här rapporten visar vilka städer dina besökare var i när dom besökte webbplatsen.",
"getContinentDocumentation": "Den här rapporten visar vilka kontinenter dina besökare var på när dom besökte webbplatsen.",
"getCountryDocumentation": "Den här rapporten visar vilka länder dina besökare var i när dom besökte webbplatsen.",
"getRegionDocumentation": "Den här rapporten visar vilka regioner dina besökare var i när dom besökte webbplatsen.",
- "HowToInstallApacheModule": "Hur installerar jag GeoIP modulen för Apache?",
- "HowToInstallGeoIpPecl": "Hur installerar jag tillägget GeoIP PECL?",
- "HowToInstallNginxModule": "Hur installerar jag GeoIP-modulen för Nginx?",
- "HowToSetupGeoIPIntro": "Det verkar inte som att du har ställt in träffsäker Geolocation. Detta är en användbar funktion, utan den kan du inte se komplett information om dina användare. Så här kommer du snabbt igång och kan börja använda det:",
- "HttpServerModule": "HTTP-server modul",
- "InvalidGeoIPUpdatePeriod": "Perioden för uppdateringar av GeoIP är ogiltig: Invalid period for the GeoIP updater: %1$s. Giltiga värden är %2$s.",
- "ISPDatabase": "ISP-databas",
"Latitude": "Latitud",
"Latitudes": "Latituder",
"Location": "Plats",
- "LocationDatabase": "Platsdatabas",
- "LocationDatabaseHint": "En platsdatabas är antingen en lands-, region, eller stadsdatabas.",
"LocationProvider": "Platstjänst",
"Longitude": "Longitud",
"Longitudes": "Longituder",
"NoDataForGeoIPReport1": "Det finns ingen data för den här rapporten. Antingen finns det ingen platsdata tillgänglig, eller så kan inte besökarnas IP-adresser lokaliseras.",
"NoDataForGeoIPReport2": "Ändra inställningarna %1$shär%2$s och använd en %3$sdatabas på stadsnivå%4$s om du vill aktivera Geolocation.",
- "Organization": "Organisation",
- "OrgDatabase": "Organisationsdatabas",
"PluginDescription": "Geografiska rapporter för dina besökare: land, region, stad och geografiska koordinater (latitud\/longitud).",
"Region": "Region",
"SubmenuLocations": "Platser",
"ToGeolocateOldVisits": "Används skriptet som beskrivs %1$shär%2$s för att få platsdata för gamla besök.",
- "UnsupportedArchiveType": "En arkivtyp som ej stöds påträffades %1$s.",
- "UpdaterHasNotBeenRun": "Uppdateringen har aldrig körts.",
- "UpdaterIsNotScheduledToRun": "Den är inte planerad att köras i fortsättningen.",
- "UpdaterScheduledForNextRun": "Den är planerad att köras under den nästa archive.php tidssession.",
- "UpdaterWasLastRun": "Sensate uppdateringen gjordes den %s.",
- "UpdaterWillRunNext": "Den är planerar att köras på %s.",
"WidgetLocation": "Besökares plats"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/th.json b/plugins/UserCountry/lang/th.json
index e27da63e5a..cad4d3e608 100644
--- a/plugins/UserCountry/lang/th.json
+++ b/plugins/UserCountry/lang/th.json
@@ -6,13 +6,10 @@
"country_a2": "ผู้ให้บริการดาวเทียม",
"country_o1": "ประเทศอื่นๆ",
"DistinctCountries": "%s การเข้าชมตามประเทศ",
- "DownloadingDb": "กำลังดาวน์โหลด %s",
- "ISPDatabase": "ฐานข้อมูล ISP",
"Latitude": "ละติจูด",
"Location": "ตำแหน่งที่ตั้ง",
"Longitude": "ลองจิจูด",
"Region": "ภูมิภาค",
- "SubmenuLocations": "ตำแหน่งที่อยู่",
- "UpdaterWasLastRun": "ตัวปรับปรุงทำงานครั้งล่าสุดเมื่อ %s"
+ "SubmenuLocations": "ตำแหน่งที่อยู่"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/tl.json b/plugins/UserCountry/lang/tl.json
index c2700e8156..d0e18be94b 100644
--- a/plugins/UserCountry/lang/tl.json
+++ b/plugins/UserCountry/lang/tl.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Hindi mahanap ang apache_get_modules function sa pag-aakala na hindi Apache webserver.",
- "CannotFindGeoIPDatabaseInArchive": "Hindi mahanap ang file na %1$s sa %2$s!",
- "CannotFindGeoIPServerVar": "Ang %s variable ay hindi naka-set. Ang iyong server ay maaaring hindi naka-configure nang tama.",
- "CannotListContent": "Hindi ma-ilista ang nilalaman para sa %1$s: %2$s.",
"CannotLocalizeLocalIP": "Ang IP address %s ay isang lokal na address at hindi maaaring i-geolocated.",
- "CannotUnzipDatFile": "Hindi ma-unzip ang dat file sa %1$s: %2$s.",
"City": "Lungsod",
"CityAndCountry": "%1$s %2$s",
"Continent": "Kontinente",
@@ -18,54 +13,23 @@
"DefaultLocationProviderDesc1": "Ang default na lokasyon ng provider na humu-hula sa mga bansa ng bumibisita batay sa wika na ginagamit nila.",
"DefaultLocationProviderExplanation": "Iyong ginagamit ang default location provider na nangangahulugan na ang Matomo ay huhulaan ang lokasyon ng iyong bisita base sa wika na kanilang ginagamit. %1$sRead this%2$s upang malaman panu e-setup na may tamang geolocation.",
"DistinctCountries": "natatanging mga bansa %s",
- "DownloadingDb": "Downloading %s",
- "DownloadNewDatabasesEvery": "I-update ang mga bawat database",
- "FoundApacheModules": "Matomo nahanap ang mga sumusunod na Apache modules.",
"FromDifferentCities": "ibang mga lungsod",
- "GeoIPCannotFindMbstringExtension": "Hindi mahanap ang %1$s function. Mangyaring siguraduhin na ang %2$s extension na naka-install at na-load.",
- "GeoIPDatabases": "GeoIP ng mga Database",
"GeoIPDocumentationSuffix": "Upang makita ang dataus para sa ulat na ito kailangan mong mag setup ng GeoIP sa Geolocation admin tab. Ang komersyal %1$sMaxmind%2$s GeoIP databases ay higit na tiyak kaysa sa mga libre. Upang makita kung gaano ito ka-tiyak i-click ang %3$shere%4$s.",
- "GeoIPImplHasAccessTo": "Ang pagpapatupad ng GeoIP na ito ay may access sa mga sumusunod na uri ng database",
- "GeoIpLocationProviderDesc_Pecl2": "Walang mga limitasyon sa provider na ito kaya ito ay isa sa mga aming nirerekomenda na gamitin.",
- "GeoIpLocationProviderDesc_Php2": "Kung ang iyong website ay nakakakuha ng mataas ng traffic iyong mapapansin na itong location provider ay mabagal. Sa sitwasyong ito dapat mong i-install ang %1$sPECL extension%2$s o ang %3$sserver module%4$s.",
- "GeoIpLocationProviderDesc_ServerBased2": "Kung meron kang e-iimport na mga log files o di kaya ay may gagawing na may kinalaman sa pag set ng IP addresses gamitin ang %1$sPECL GeoIP implementation (recommended)%2$s or ang %3$sPHP GeoIP implementation%4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Tandaan: IP anonymization ay walang epekto sa mga lokasyon na inulat ng provider na ito. Bago ito gamitin na may IP anonymization siguraduhin na ito ay hindi lumalabag sa mga batas ng privacy na maaring sumailalim sa.",
- "GeoIpLocationProviderNotRecomnended": "Gumagana ang Geolocation ngunit hindi ka gumagamit ng isa sa mga inirerekomendang provider.",
- "GeoIPNoServerVars": "Hindi mahanap ng Matomo ang kahit na anong %s variable ng GeoIP.",
- "GeoIPPeclCustomDirNotSet": "Ang %s PHP ini options ay hindi pa na set.",
- "GeoIPServerVarsFound": "Nakita ng Matomo ang mga sumusunod na %s variable ng GeoIP",
"Geolocation": "Geolocation",
"GeolocationPageDesc": "Sa pahinang ito ay maaari mo nang baguhin kung paano malalaman ng Matomo ang lokasyon ng bisita.",
"getCityDocumentation": "Ipinapakita ng ulat na ito ang lungsod ng iyong mga bisita ng in-access nila ang iyong website.",
"getContinentDocumentation": "Ang ulat na ito ay nagpapakita kung aling mga kontinente galing ang iyong mga bisita na umaccess sa iyong website.",
"getCountryDocumentation": "Ang ulat na ito ay nagpapakita kung saang bansa galing ang iyong bisita ng ina-access nila ang iyong website.",
"getRegionDocumentation": "Ang ulat na ito ay nagpapakita kung saang rehiyon galing ang iyong mga bisita ng in-access nila ang iyong website.",
- "HowToInstallApacheModule": "Paano ko ii-install ang GeoIP module para sa Apache?",
- "HowToInstallGeoIpPecl": "Paano ako magiinstall ng karugtong ng GeoIP PECL?",
- "HowToInstallNginxModule": "Paano ko ii-install ang GeoIP module para sa Nginx?",
- "HowToSetupGeoIPIntro": "Ikaw ay may hindi wastong Geolocation setup. Ang feature na ito ay malaking tulong at kung wala nito hindi mo makikita ang tumpak na at kumpletong impormasyon ng lokasyon para sa iyong mga bisita. Narito kung paano mo agad masisimulan ang paggamit nito:",
- "HttpServerModule": "HTTP Module Server",
- "InvalidGeoIPUpdatePeriod": "Di-wastong panahon para sa GeoIP update: %1$s. Ang wastong value ay %2$s.",
- "ISPDatabase": "ISP Database",
"Latitude": "Latitud",
"Location": "Lokasyon",
- "LocationDatabase": "Lokasyon ng database",
- "LocationDatabaseHint": "Ang database ng lokasyon ay alinman sa isang bansa rehiyon o database ng lungsod.",
"LocationProvider": "Lokasyon ng provider",
"Longitude": "Longhitud",
"NoDataForGeoIPReport1": "Walang mga datus para sa ulat na ito dahil walang data na magagamit sa lokasyon o ang IP address ay hindi maaaring e-geolocated.",
"NoDataForGeoIPReport2": "Upang paganahin ang tamang geolocation baguhin ang mga setting %1$sdito%2$s at gumamit ng%3$scity database%4$s.",
- "Organization": "Organisasyon",
- "OrgDatabase": "Organisasyon ng Database",
"Region": "Rehiyon",
"SubmenuLocations": "Mga Lokasyon",
"ToGeolocateOldVisits": "Upang makakuha ng data ng lokasyon para sa iyong lumang mga pagbisita gamitin ang script na inilarawan %1$shere%2$s.",
- "UnsupportedArchiveType": "Nakatagpo ng hindi suportadong klase ng archive %1$s",
- "UpdaterHasNotBeenRun": "Ang updater ay hindi pa napapatatakbo.",
- "UpdaterIsNotScheduledToRun": "Ito ay hindi nakaiskedyul na tumakbo sa hinaharap.",
- "UpdaterScheduledForNextRun": "Ito ay naka-iskedyul na tumakbo sa loob ng susunod na cron core: i-archive ang execution ng command.",
- "UpdaterWasLastRun": "Ang updater ay huling na i-run ng %s.",
- "UpdaterWillRunNext": "Ito ang susunod na naka-schedule upang tumakbo ng %s.",
"WidgetLocation": "Lokasyon ng bisita"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/tr.json b/plugins/UserCountry/lang/tr.json
index ef27d981dc..6944ea4acf 100644
--- a/plugins/UserCountry/lang/tr.json
+++ b/plugins/UserCountry/lang/tr.json
@@ -1,13 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "apache_get_modules işlevi bulunamadığı için web sunucusunun Apache olmadığı varsayılıyor.",
- "CannotFindGeoIPDatabaseInArchive": "%1$s dosyası %2$s tar arşivinde bulunamadı!",
- "CannotFindGeoIPServerVar": "%s değişkeni ayarlanmamış. Sunucunuz doğru yapılandırılmamış.",
- "CannotFindPeclGeoIPDb": "GeoIP PECL modülü için bir ülke, bölge ya da ilçe veritabanı bulunamadı. Coğrafi konum veritabanının %1$s içinde bulunduğundan ve %2$s ya da %3$s olarak adlandırıldığından emin olun. Yoksa veritabanı PECL modülü tarafından algılanamaz.",
- "CannotListContent": "%1$s: %2$s içeriği listelenemedi",
"CannotLocalizeLocalIP": "%s IP adresi yerel bir adres olduğundan coğrafi konumu belirlemekte kullanılamaz.",
- "CannotSetupGeoIPAutoUpdating": "Coğrafi konum veritabanlarını Matomo dışında bir konumda bulunduruyorsunuz gibi görünüyor (bunu misc alt klasöründe herhangi bir veritabanı bulunmadığı halde coğrafi konum özelliğinin çalışıyor olduğuna bakarak söyleyebiliyoruz). Matomo, misc klasörünün dışında bulunan coğrafi konum veritabanlarını güncelleyemez.",
- "CannotUnzipDatFile": "%1$s: %2$s içindeki dat dosyası ayıklanamadı",
"City": "İl",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Kıta",
@@ -24,81 +17,29 @@
"DefaultLocationProviderDesc2": "Bu yöntem çok güvenilir değildir. %1$sBu nedenle %2$scoğrafi konum veritabanı%3$s özelliğini kurup kullanmanız önerilir.%4$s",
"DefaultLocationProviderExplanation": "Varsayılan konum hizmeti sağlayıcısını kullanıyorsunuz. Bu yöntemde bir ziyaretçinin ülkesi kullandığı dile göre belirlenir. Daha doğru coğrafi konumlama kurulumunun nasıl yapılacağı hakkında ayrıntılı bilgi almak için %1$sbu bölümü okuyun%2$s.",
"DistinctCountries": "%s ayrı ülke",
- "DownloadingDb": "İndiriliyor %s",
- "DownloadNewDatabasesEvery": "Veritabanı güncelleme sıklığı",
- "FatalErrorDuringDownload": "Coğrafi konum veritabanı indirilirken dosya ya da Matomo ile ilgili bir sorun çıktı. İnternet bağlantınız sağlıklı çalışmıyor olabilir. El ile indirip kurmayı deneyin.",
- "FoundApacheModules": "Matomo şu Apache modüllerini buldu.",
"FromDifferentCities": "ayrı iller",
- "GeoIPCannotFindMbstringExtension": "%1$s işlevi bulunamadı. Lütfen %2$s eklentisinin kurulmuş ve yüklenmiş olduğundan emin olun.",
- "GeoIPDatabases": "GeoIP Veritabanları",
"GeoIPDocumentationSuffix": "Bu raporun verilerini görüntülemek için Coğrafi konum yönetici sekmesinden GeoIP kurulumunu yapmalısınız. Ticari %1$sMaxmind%2$s GeoIP veritabanları ücretsiz olanlardan daha doğrudur. Doğruluğu görmek için %3$sburaya tıklayın%4$s",
- "GeoIPNoDatabaseFound": "Bu GeoIP uygulaması herhangi bir veritabanı bulamadı.",
- "GeoIPImplHasAccessTo": "GeoIP uygulaması şu türdeki veritabanlarına erişebilir",
- "GeoIPIncorrectDatabaseFormat": "Coğrafi konum veritabanı biçiminiz geçersiz görünüyor. Bozulmuş olabilir. Binary sürümü kullanıyor olduğunuzdan emin olun ve başka bir kopya ile değiştirmeyi deneyin.",
- "GeoIpLocationProviderDesc_Pecl1": "Bu konum hizmeti sağlayıcısı coğrafi konum veritabanı ve PECL modülünü kullanarak ziyaretçilerinizin konumunu doğru ve etkin bir şekilde belirler.",
- "GeoIpLocationProviderDesc_Pecl2": "Bu hizmet sağlayıcısı ile ilgili bir sınırlama olmadığından bu sağlayıcıyı kullanmanız önerilir.",
- "GeoIpLocationProviderDesc_Php1": "Bu konum hizmeti sağlayıcı en basit kurulanıdır ve sunucu yapılandırmasına gerek duymaz (paylaşılan barındırma hizmetleri için idealdir). Coğrafi konum veritabanını ve MaxMind PHP API uygulamasını kullanarak ziyaretçilerinizin konumunu doğru olarak belirler.",
- "GeoIpLocationProviderDesc_Php2": "Web siteniz yüksek trafiğe sahipse bu konum hizmeti sağlayıcısı çok yavaş kalabilir. Bu durumda %1$sPECL eklentisini%2$s ya da bir %3$ssunucu modülünü%4$s kurmalısınız.",
- "GeoIpLocationProviderDesc_ServerBased1": "Bu konum hizmeti sağlayıcı HTTP sunucunuza kurulan bir GeoIP modülünü kullanır. Bu hizmet sağlayıcı hızlı ve doğrudur ancak %1$syalnız normal web tarayıcı izlemesi ile kullanılabilir%2$s.",
- "GeoIpLocationProviderDesc_ServerBased2": "Günlük dosyalarını içe aktarmanız ya da IP adreslerini ayarlamanız gereken bir işlem yapmanız gerekiyorsa %1$sPECL GeoIP uygulamasını (önerilir)%2$s ya da %3$sPHP GeoIP uygulamasını%4$s kullanın.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Not: IP adresini anonim kılmanın bu hizmet sağlayıcı tarafından rapor edilen konumlar üzerinde bir etkisi yoktur. IP adresini anonim kılmadan önce bu durumun uymak zorunda olduğunuz kişisel veri güvenliği yasalarına aykırı olmadığından emin olun.",
- "GeoIpLocationProviderNotRecomnended": "Coğrafi konum bulma çalışıyor ancak önerilen hizmet sağlayıcılardan birini kullanmıyorsunuz.",
- "GeoIPNoServerVars": "Matomo herhangi bir GeoIP %s değişkeni bulamadı.",
- "GeoIPPeclCustomDirNotSet": "%s PHP ini ayarı yapılmamış.",
- "GeoIPServerVarsFound": "Matomo şu GeoIP %s değişkenlerini algılar",
- "GeoIPUpdaterInstructions": "Aşağıya veritabanlarınızın indirme bağlantılarını yazın. %3$sDB-IP%4$s ya da %1$sMaxMind%2$s veritabanlarını satın aldıysanız bu bağlantıları DB-IP ya da MaxMind hesabınızın altında bulabilirsiniz. Erişim sorunu yaşıyorsanız coğrafi konum veritabanı hizmeti sağlayıcınız ile görüşün.",
- "GeoIPUpdaterIntro": "Matomo şu anda şu coğrafi konum veritabanlarının güncellemelerini alıyor",
- "GeoLiteCityLink": "DB-IP City Lite veritabanını kullanıyorsanız şu bağlantıyı kullanın: %1$s%2$s%3$s",
"Geolocation": "Coğrafi Konum",
"GeolocationPageDesc": "Ziyaretçi konumun Matomo tarafından nasıl bulunacağı bu bölümden ayarlanabilir.",
"getCityDocumentation": "Bu rapor, ziyaretçilerin web sitenize eriştiği il bilgilerini içerir.",
"getContinentDocumentation": "Bu rapor, ziyaretçilerin web sitenize eriştiği kıta bilgilerini içerir.",
"getCountryDocumentation": "Bu rapor, ziyaretçilerin web sitenize eriştiği ülke bilgilerini içerir.",
"getRegionDocumentation": "Bu rapor, ziyaretçilerin web sitenize eriştiği bölge bilgilerini içerir.",
- "HowToInstallApacheModule": "Apache için GeoIP modülü nasıl kurulur?",
"HowToInstallGeoIPDatabases": "Coğrafi konum veritabanları nasıl alınır?",
- "HowToInstallGeoIpPecl": "GeoIP PECL eklentisi nasıl kurulur?",
- "HowToInstallNginxModule": "Nginx için GeoIP modülünü nasıl kurulur?",
- "HowToSetupGeoIP": "DB-IP ile doğru konum bulma ayarları nasıl yapılır?",
- "HowToSetupGeoIP_Step1": "%3$sDB-IP%4$s üzerinden DB-IP City Lite veritabanını %1$sİndirin%2$s.",
- "HowToSetupGeoIP_Step2": "Bu dosyayı ayıklayın ve çıkanları Matomo %2$smisc%3$s klasörü %1$s içine kopyalayıp adını %4$s olarak değiştirin (bunu FTP ya da SSH ile yapabilirsiniz).",
- "HowToSetupGeoIP_Step3": "Bu sayfayı yeniden yükleyin. Şimdi %1$sDB-IP \/ GeoIP (PHP)%2$s hizmet sağlayıcısı %3$skurulacak%4$s. Onu seçin.",
- "HowToSetupGeoIP_Step4": "İşlem tamam! Matomo için DB-IP uygulamasını ayarladınız. Böylece ziyaretçilerinizin geldiği ülkeleri büyük doğrulukla belirlerken bunun yanında bölge ve il bilgilerini de görebileceksiniz.",
- "HowToSetupGeoIPIntro": "Coğrafi konum bulma ayarlarınızın doğruluğu yeterli değil gibi görünüyor. Bu özellik oldukça kullanışlıdır ve düzgün çalışmadığında ziyaretçileriniz hakkında doğru ve tam konum bilgisi alamazsınız. Hızlıca kullanmaya başlamak için gerekli bilgileri şurada bulabilirsiniz:",
- "HttpServerModule": "HTTP Sunucu Modülü",
- "InvalidGeoIPUpdatePeriod": "GeoIP güncelleme sıklığı geçersiz: %1$s. Geçerli değerler şunlardır: %2$s.",
- "IPurchasedGeoIPDBs": "Daha doğru %3$sDB-IP%4$s ya da %1$sMaxMind%2$s veritabanları satın aldım ve otomatik güncellemeleri kurmak istiyorum.",
- "ISPDatabase": "ISP Veritabanı",
- "IWantToDownloadFreeGeoIP": "Ücretsiz DB-IP veritabanını indirmek istiyorum...",
"Latitude": "Enlem",
"Latitudes": "Enlem",
"Location": "Konum",
- "LocationDatabase": "Konum Veritabanı",
- "LocationDatabaseHint": "Bir ülke, bölge ya da il konumları veritabanı.",
"LocationProvider": "Konum Hizmeti Sağlayıcı",
"Longitude": "Boylam",
"Longitudes": "Boylam",
"NoDataForGeoIPReport1": "Kullanılabilecek bir konum verisi olmadığından ya da ziyaretçi IP adreslerinin coğrafi konumu algılanamadığından bu rapor için herhangi bir veri yok.",
"NoDataForGeoIPReport2": "Coğrafi konumun doğru olarak bulunması için %1$sburadan%2$s ayarları değiştirin ve %3$sil düzeyindeki bir veritabanı%4$s kullanın.",
- "Organization": "Kuruluş",
- "OrgDatabase": "Kuruluş Veritabanı",
- "PeclGeoIPNoDBDir": "PECL modülü %1$s içinde veritabanlarına bakıyor ancak klasör bulunamadı. Lütfen bu klasörü oluşturun ve içine coğrafi konum veritabanlarını ekleyin. Alternatif olarak php.ini dosyanızdaki %2$s ayarına doğru klasörü yazın.",
- "PeclGeoLiteError": "%1$s içindeki coğrafi konum veritabanının adı %2$s. Maalesef PECL modülü veritabanını bu ad ile tanıyamaz. Lütfen veritabanının adını %3$s olarak değiştirin.",
- "PiwikNotManagingGeoIPDBs": "Matomo şu anda herhangi bir DB-Ip ya da Maxmind veritabanını yönetmiyor.",
+ "NoProviders": "Şu anda kullanılabilecek bir ek coğrafi konum hizmeti sağlayıcısı yok. Matomo %1$sdbip%2$s veritabanlarının kullanılmasını önerir. Ancak bunun için GeoIp2 eklentisinin etkinleştirilmesi gerekir (Alternatif olarak mağazadan kendi coğrafi konum özelliğini sunan bir üçüncü taraf eklenti kurabilirsiniz).",
"PluginDescription": "Ziyaretçilerinizin konumlarını görüntüler: Ülke, bölge, il ve coğrafi koordinatlar (enlem\/boylam).",
"Region": "Bölge",
- "SetupAutomaticUpdatesOfGeoIP": "Otomatik coğrafi konum veritabanı güncellemesini kurun",
"SubmenuLocations": "Konumlar",
"TestIPLocatorFailed": "Matomo bilinen bir IP adresinin konumunu belirlemeyi denedi (%1$s) ancak sunucudan herhangi bir yanıt gelmedi. Bu hizöet sağlayıcı doğru yapılandırılmamış olabilir (coğrafi konum veritabanının adı ya da bulunduğu klasör yanlış olabilir).",
- "ThisUrlIsNotAValidGeoIPDB": "İndirilen dosya geçerli bir coğrafi konum veritabanı değil. Lütfen adresi yeniden denetleyin ya da dosyayı el ile indirin.",
"ToGeolocateOldVisits": "Eski ziyaretlerinizle ilgili konum bilgilerini almak için %1$sburada%2$s belirtilen betiği kullanın.",
- "UnsupportedArchiveType": "Desteklenmeyen %1$s arşiv türü bulundu.",
- "UpdaterHasNotBeenRun": "Güncelleyici henüz hiç çalışmamış.",
- "UpdaterIsNotScheduledToRun": "Gelecekte çalışmak üzere ayarlanmamış.",
- "UpdaterScheduledForNextRun": "core:archive komutunun yürütüleceği zamanlanmış görevin bir sonraki çalışmasında güncellenecek.",
- "UpdaterWasLastRun": "Güncelleyici en son %s zamanında çalıştı.",
- "UpdaterWillRunNext": "Zamanlanmış görev %s zamanında çalışacak.",
- "WidgetLocation": "Ziyaretçi Konumu",
- "InstallGeoIp2": "Matomo %1$sdbip%2$s veritabanlarının kullanılmasını önerir. Ancak bunun için GeoIp2 uygulama eki gereklidir. Bu uygulama ekini kurup etkinleştirdiyseniz (büyük olasılıkla uzun sürecek bir güncelleme yapılır), %1$sdbip%2$s veritabanlarını kullanmaya başlayabilirsiniz (kendi coğrafi konum özelliğini sunan bir üçüncü taraf uygulama eki kullanıyorsanız bunu yok sayabilirsiniz)."
+ "WidgetLocation": "Ziyaretçi Konumu"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/uk.json b/plugins/UserCountry/lang/uk.json
index 29265076d6..789549fe31 100644
--- a/plugins/UserCountry/lang/uk.json
+++ b/plugins/UserCountry/lang/uk.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Не вдається знайти apache_get_modules функцію, мабуть цей веб-сервер це не на Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Не знайдено файл %1$s в tar-архіві %2$s!",
- "CannotFindGeoIPServerVar": "Змінна %s не встановлена. Ваш сервер не може бути налаштований правильно.",
- "CannotListContent": "Не вдалося перерахувати вміст %1$s: %2$s",
"CannotLocalizeLocalIP": "IP адреса %s - це локальна адреса і її конкретне місцезнаходження не може бути визначено.",
- "CannotUnzipDatFile": "Неможливо розпакувати dat-файл в %1$s : %2$s",
"City": "Місто",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Континент",
@@ -18,56 +13,24 @@
"DefaultLocationProviderDesc1": "Цей спосіб відстеження визначає місце розташування на основі мови, яким користуються користувачі в браузері і системі.",
"DefaultLocationProviderExplanation": "Ви використовуєте провайдер визначення розташування за промовчанням. Це означає, що за Matomo буде судити про місцезнаходження відвідувача по використовуваній ним мові. %1$sПрочитайте тут%2$s про те, як встановлювати розташування більш точно.",
"DistinctCountries": "%s унікальних країн",
- "DownloadingDb": "Завантаження %s",
- "DownloadNewDatabasesEvery": "Оновлювати базу раз в",
- "FoundApacheModules": "Matomo знайшов наступні модулі Apache",
"FromDifferentCities": "різні міста",
- "GeoIPCannotFindMbstringExtension": "Неможливо знайти функцію %1$s. Будь ласка, переконайтеся, що розширення %2$s завантажено і встановлено.",
- "GeoIPDatabases": "Бази даних GeoIP",
"GeoIPDocumentationSuffix": "Щоб побачити дані з цього звіту ви повинні встановити GeoIP в секції Geolocation, яка знаходиться в панелі адміністрування. Платні бази даних GeoIP %1$sMaxmind%2$s більш точні, ніж безкоштовні. Наскільки саме вони точні, ви можете подивитися %3$sтут%4$s.",
- "GeoIPImplHasAccessTo": "Цей варіант реалізації GeoIP має доступ до таких баз даних",
- "GeoIpLocationProviderDesc_Pecl2": "Обмежень по використанню цього способу відстеження немає, тому ми рекомендуємо саме його.",
- "GeoIpLocationProviderDesc_Php2": "Якщо у вашого сайту дуже багато відвідувачів, ви помітите, що цей спосіб занадто повільний. У цьому випадку вам потрібно встановити %1$sPECL розширення%2$s або спеціальний %3$sсерверний модуль%4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Визначення локації засноване на модулі GeoIP, який був встановлений на ваш HTTP-сервер. Це працює швидше і точніше, але %1$sможе бути використаний лише при відстеженні відвідувачів, які користуються звичайними браузерами.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Якщо вам потрібно імпортувати лог-файли або зробити щось, що вимагає наявності та IP адрес, використовуйте %1$s вбудовуваний PECL GeoIP (рекомендується)%2$s або %3$s вбудовуваний PHP GeoIP %4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Підказка: анонімізація IP не впливає на ефект на отримання локації користувачів таким способом. Перед тим, як використовувати його з анонімізацією IP, переконайтеся, що це не суперечить законодавству вашої країни.",
- "GeoIpLocationProviderNotRecomnended": "Геолокація працює, але ви не використовуєте один з рекомендованих провайдерів.",
- "GeoIPNoServerVars": "Matomo не може знайти GeoIP %s змінні.",
- "GeoIPPeclCustomDirNotSet": "PHP ini опція %s не встановлена.",
- "GeoIPServerVarsFound": "Matomo знайшов наступні змінні GeoIP: %s",
"Geolocation": "Геолокація",
"GeolocationPageDesc": "На цій сторінці ви можете змінити спосіб визначення місцеположення відвідувачів.",
"getCityDocumentation": "Цей звіт показує міста відвідувачів вашого сайту.",
"getContinentDocumentation": "Цей звіт показує континенти відвідувачів вашого сайту.",
"getCountryDocumentation": "Цей звіт показує країни відвідувачів вашого сайту.",
"getRegionDocumentation": "Цей звіт показує регіони відвідувачів вашого сайту.",
- "HowToInstallApacheModule": "Як встановити GeoIP модуль для Apache?",
- "HowToInstallGeoIpPecl": "Як встановити GeoIP PECL розширення?",
- "HowToInstallNginxModule": "Як встановити GeoIP модуль для Nginx?",
- "HowToSetupGeoIPIntro": "Здається, що у вас не налаштоване визначено локації відвідувачів з допомогою GeoIP. Це корисна \"штука\" - без неї ви не зможете досить точно визначати місцезнаходження відвідувачів. І ось як ви можете швидко налаштувати все:",
- "HttpServerModule": "HTTP Серверний модуль",
- "InvalidGeoIPUpdatePeriod": "Невірний період для GeoIP оновлення: %1$s. Допустимі значення: %2$s.",
- "ISPDatabase": "База провайдерів",
"Latitude": "Широта",
"Location": "Локація",
- "LocationDatabase": "Розташування бази даних",
- "LocationDatabaseHint": "Розташування бази даних країни, регіону або міста.",
"LocationProvider": "Спосіб визначення локації користувача",
"Longitude": "Довгота",
"NoDataForGeoIPReport1": "Не існує даних для звіту, тому що немає даних про місцезнаходження або IP адреса відвідувача не може бути визначена географічно.",
"NoDataForGeoIPReport2": "Для забезпечення точної геолокаціі, змініть параметри %1$sтут%2$s і використовуйте %3$sбазу даних міст%4$s.",
- "Organization": "Організація",
- "OrgDatabase": "База організацій",
"PluginDescription": "Повідомляє місцезнаходження відвідувачів: країна, регіон, місто і географічні координати (широта\/довгота).",
"Region": "Регіон",
"SubmenuLocations": "Локації",
"ToGeolocateOldVisits": "Для того щоб отримати інформацію про місцезнаходження для попередніх відвідувачів, скористайтеся скриптом, про який написано %1$sтут%2$s.",
- "UnsupportedArchiveType": "Зустрівся непідтримуваний тип архіву %1$s.",
- "UpdaterHasNotBeenRun": "Оновлення ніколи не проводилися.",
- "UpdaterIsNotScheduledToRun": "Це не заплановано до запуску в майбутньому.",
- "UpdaterScheduledForNextRun": "Це запланований запуск команди core:archive при наступному виконанні cron-завдання.",
- "UpdaterWasLastRun": "Оновлення останнього запуску в %s.",
- "UpdaterWillRunNext": "Заплановано наступний запуск на %s.",
"WidgetLocation": "Місцезнаходження відвідувача"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/vi.json b/plugins/UserCountry/lang/vi.json
index cf901f7932..8eac6f9089 100644
--- a/plugins/UserCountry/lang/vi.json
+++ b/plugins/UserCountry/lang/vi.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "Không thể tìm thấy hàm apache_get_modules, giả sử không có máy chủ web Apache.",
- "CannotFindGeoIPDatabaseInArchive": "Không thể tìm thấy %1$s tập tin trong lưu trữ dấu sắc %2$s!",
- "CannotFindGeoIPServerVar": "Biến %s không được thiết lập. Máy chủ của bạn có thể không được cấu hình đúng.",
- "CannotListContent": "Không thể liệt kê nội dung cho %1$s: %2$s",
"CannotLocalizeLocalIP": "Địa chỉ IP %s là một địa chỉ địa phương và không có thể được geolocated.",
- "CannotUnzipDatFile": "Không thể giải nén tập tin dat trong %1$s: %2$s",
"City": "Thành phố",
"CityAndCountry": "%1$s, %2$s",
"Continent": "Châu lục",
@@ -18,51 +13,23 @@
"DefaultLocationProviderDesc1": "Nhà cung cấp vị trí mặc định phỏng đoán quốc gia của người truy cập dựa trên ngôn ngữ mà họ sử dụng.",
"DefaultLocationProviderExplanation": "Bạn đang sử dụng các nhà cung cấp vị trí mặc định, có nghĩa là Matomo sẽ đoán vị trí của khách truy cập dựa trên ngôn ngữ mà họ sử dụng. %1$s đọc %2$s này để tìm hiểu cách thiết lập định vị chính xác hơn.",
"DistinctCountries": "%s Các nước riêng biệt",
- "DownloadingDb": "Đang tải xuống %s",
- "DownloadNewDatabasesEvery": "Cập nhật tất cả các cơ sở dữ liệu",
- "FoundApacheModules": "Matomo tìm thấy các mô-đun Apache sau",
"FromDifferentCities": "Các thành phố khác nhau",
- "GeoIPCannotFindMbstringExtension": "Không thể tìm thấy hàm %1$s. Hãy chắc chắn rằng phần mở rộng %2$s đã được cài đặt và nạp.",
- "GeoIPDatabases": "Cơ sở dữ liệu GeoIP",
"GeoIPDocumentationSuffix": "Theo thứ tự xem dữ liệu báo cáo này, bạn phải thiết lập GeoIP trong tab quản trị định vị. Cơ sở dữ liệu GeoIP %1$sMaxmind%2$s thương mại chính xác hơn những bản miễn phí. Để xem cách chính xác họ đang có, click %3$s tại đây %4$s.",
- "GeoIPImplHasAccessTo": "GeoIP thực thi này có quyền truy cập vào các kiểu cơ sở dữ liệu sau",
- "GeoIpLocationProviderDesc_Pecl2": "Không có giới hạn với nhà cung cấp này, vì vậy nó là một cái chúng tôi khuyên bạn nên sử dụng.",
- "GeoIpLocationProviderDesc_Php2": "Nếu trang web của bạn nhận được rất nhiều lưu lượng truy cập, bạn có thể thấy rằng nhà cung cấp vị trí này là quá chậm. Trong trường hợp này, bạn nên cài đặt PECL %1$s mở rộng %2$s hoặc một %3$s module máy chủ %4$s.",
- "GeoIpLocationProviderDesc_ServerBased1": "Nhà cung cấp vị trí này sử dụng module geoip đã được cài đặt trong máy chủ HTTP của bạn. Nhà cung cấp này là nhanh chóng và chính xác, nhưng %1$s chỉ có thể sử dụng theo dõi trình duyệt thông thường.%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "Nếu bạn phải nhập các tập tin bản ghi hoặc làm cái gì khác mà đòi hỏi phải thiết lập địa chỉ IP, sử dụng PECL %1$s thực thi GeoIP (khuyến nghị) %2$s hoặc PHP %3$s thực thi GeoIP %4$s.",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "Lưu ý: IP anonymization không ảnh hưởng đến các vị trí được báo cáo bởi nhà cung cấp này. Trước khi sử dụng nó với IP anonymization, đảm bảo điều này không vi phạm bất kỳ luật riêng tư nào bạn có thể bị phạt.",
- "GeoIPNoServerVars": "Matomo không thể tìm thấy bất kỳ biến %s Geoip nào.",
- "GeoIPPeclCustomDirNotSet": "Lựa chọn ini PHP %s không được thiết lập.",
- "GeoIPServerVarsFound": "Matomo phát hiện các biến %s Geoip sau đây",
"Geolocation": "Định vị",
"GeolocationPageDesc": "Trên trang này bạn có thể thay đổi cách Matomo xác định địa điểm khách truy cập.",
"getCityDocumentation": "Báo cáo này cho thấy các thành phố khách truy cập của bạn đã ở khi họ truy cập website của bạn.",
"getContinentDocumentation": "Báo cáo này cho thấy lục địa khách truy cập của bạn đã ở khi họ truy cập website của bạn.",
"getCountryDocumentation": "Báo cáo này cho thấy quốc gia khách truy cập của bạn đã ở khi họ truy cập website của bạn.",
"getRegionDocumentation": "Báo cáo này cho thấy vùng miền khách truy cập của bạn đã ở khi họ truy cập website của bạn.",
- "HowToInstallApacheModule": "Làm thế nào để cài đặt các module Geoip cho Apache?",
- "HowToInstallGeoIpPecl": "Làm thế nào để cài đặt PECL GeoIP mở rộng?",
- "HowToInstallNginxModule": "Làm thế nào để cài đặt module GeoIP cho Nginx?",
- "HowToSetupGeoIPIntro": "Bạn không hiển thị để có cài đặt định vị chính xác. Đây là một tính năng hữu ích và không có nó, bạn sẽ không nhìn thấy thông tin vị trí chính xác và đầy đủ cho khách truy cập. Đây là cách bạn có thể nhanh chóng bắt đầu sử dụng nó:",
- "HttpServerModule": "Module máy chủ HTTP",
- "InvalidGeoIPUpdatePeriod": "Thời gian cho GeoIP cập nhật không hợp lệ: %1$s. Giá trị hợp lệ là %2$s.",
- "ISPDatabase": "Cơ sở dữ liệu ISP",
"Latitude": "Miền",
"Location": "Vị trí",
- "LocationDatabase": "Cơ sở dữ liệu vị trí",
- "LocationDatabaseHint": "Một cơ sở dữ liệu vị trí là một quốc gia, khu vực hoặc cơ sở dữ liệu thành phố.",
"LocationProvider": "Nhà cung cấp vị trí",
"Longitude": "Kinh độ",
"NoDataForGeoIPReport1": "Không có dữ liệu cho báo cáo này bởi vì ở đó không có dữ liệu vị trí có sẵn hoặc địa chỉ IP khách truy cập không thể định vị.",
"NoDataForGeoIPReport2": "Để cho phép định vị chính xác, thay đổi thiết lập %1$s tại đây %2$s và sử dụng một cơ sở dữ liệu %4$s mức thành phố %3$s.",
- "Organization": "Cơ quan",
- "OrgDatabase": "Cơ sở dữ liệu cơ quan",
"Region": "Vùng",
"SubmenuLocations": "Các vị trí",
"ToGeolocateOldVisits": "Để có được dữ liệu vị trí cho các truy cập cũ của bạn, sử dụng đoạn mã được mô tả %1$s tại đây %2$s",
- "UnsupportedArchiveType": "Bắt gặp kiêu lưu trữ %1$s không được hỗ trợ",
- "UpdaterHasNotBeenRun": "Các cập nhật chưa bao giờ được chạy.",
- "UpdaterWasLastRun": "Các cập nhật chạy sau cùng trên %s.",
"WidgetLocation": "Vị trí khách truy cập"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/zh-cn.json b/plugins/UserCountry/lang/zh-cn.json
index 2c9a10c2e4..2fa0261700 100644
--- a/plugins/UserCountry/lang/zh-cn.json
+++ b/plugins/UserCountry/lang/zh-cn.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "没有找到apache_get_modules函数,可能没有apache网络服务器。",
- "CannotFindGeoIPDatabaseInArchive": "在%2$star存档文件中没有发现%1$s文件",
- "CannotFindGeoIPServerVar": "变量 %s 没有设置,您的服务器配置不正确。",
- "CannotListContent": "无法列出 %1$s: %2$s 的内容",
"CannotLocalizeLocalIP": "IP 地址 %s 是内部地址,无法定位地理位置。",
- "CannotUnzipDatFile": "无法解压缩文件%1$s中的%2$s",
"City": "城市",
"CityAndCountry": "%1$s, %2$s",
"Continent": "大洲",
@@ -21,59 +16,26 @@
"DefaultLocationProviderDesc1": "默认的地理位置查询以访客的浏览器猜测国家。",
"DefaultLocationProviderExplanation": "您正在使用默认的地理位置服务商,Matomo 会根据访客使用的语言来判断地理位置。%1$s请查看%2$s 了解如何设置更精确的地理位置。",
"DistinctCountries": "%s 个不同的国家\/地区",
- "DownloadingDb": "下载%s",
- "DownloadNewDatabasesEvery": "更新数据每",
- "FoundApacheModules": "Matomo找到了如下Apache模块",
"FromDifferentCities": "不同城市",
- "GeoIPCannotFindMbstringExtension": "没有找到 %1$s 功能。请确认 %2$s 扩展已安装和加载。",
- "GeoIPDatabases": "GeoIP 数据库",
"GeoIPDocumentationSuffix": "要看到本报表的数据,您需要在管理页面的地理位置菜单下设置 GeoIP. 商业版 %1$sMaxmind%2$s GeoIP 数据库比免费的更精确。要查看详细内容,请点%3$s这里%4$s.",
- "GeoIPNoDatabaseFound": "此GeoIP实现无法找到任何数据库。",
- "GeoIPImplHasAccessTo": "这个 GeoIP 方案可以读取以下类型的数据库",
- "GeoIpLocationProviderDesc_Pecl2": "这个服务商没有限制,我们推荐使用。",
- "GeoIpLocationProviderDesc_Php2": "如果您的网站流量很大,这个服务速度会很慢。如果这样,您最好安装 %1$sPECL 扩展%2$s 或者 %3$s服务器模块%4$s。",
- "GeoIpLocationProviderDesc_ServerBased1": "本地理位置服务商使用已经安装在 HTTP 服务器上的 GeoIP 模块。本服务商速度快也更精确,但是 %1$s只能使用一般的浏览器跟踪。%2$s",
- "GeoIpLocationProviderDesc_ServerBased2": "如果您需要导入日志文件,或者需要设置 IP 地址的操作,使用 %1$sPECL GeoIP 方案 (推荐)%2$s 或者 %3$sPHP GeoIP 方案%4$s。",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "提示:IP 屏蔽对这个服务商的报表无效。在使用它和 IP 屏蔽前,请确认这不违反您当地的隐私保护法规。",
- "GeoIpLocationProviderNotRecomnended": "地理位置的工作,但你不使用推荐的供应商之一。",
- "GeoIPNoServerVars": "Matomo 没有找到 GeoIP %s 变量。",
- "GeoIPPeclCustomDirNotSet": "%s PHP ini 选项没有设置。",
- "GeoIPServerVarsFound": "Matomo 检测到以下 GeoIP %s 变量",
"Geolocation": "地理位置",
"GeolocationPageDesc": "本页面可设定 Matomo 如何检测访客的地理位置。",
"getCityDocumentation": "本报表显示访客所在的城市。",
"getContinentDocumentation": "本报表显示访客所在的洲。",
"getCountryDocumentation": "本报表显示访客所在的国家。",
"getRegionDocumentation": "本报表显示访客所在的地区。",
- "HowToInstallApacheModule": "我如何在Apache中安装GoeIP模块?",
- "HowToInstallGeoIpPecl": "我如何安装GeoIP PECL扩展?",
- "HowToInstallNginxModule": "我如何在Nginx下安装GeoIP模块?",
- "HowToSetupGeoIPIntro": "您的地理位置设置不正确,这个功能很有用,否则您无法查看访客的精确和完整的位置信息。如何快速开始使用:",
- "HttpServerModule": "HTTP 服务器模块",
- "InvalidGeoIPUpdatePeriod": "GeoIP 更新时间段不正确: %1$s. 正确的值为 %2$s。",
- "ISPDatabase": "ISP 数据库",
"Latitude": "纬度",
"Latitudes": "纬度",
"Location": "位置",
- "LocationDatabase": "位置信息数据库",
- "LocationDatabaseHint": "地理位置数据库可以是国家、地区或者城市数据库。",
"LocationProvider": "位置信息提供商",
"Longitude": "经度",
"Longitudes": "经度",
"NoDataForGeoIPReport1": "本报表没有数据,因为没有地理位置的数据或者无法定位访客的IP地址。",
"NoDataForGeoIPReport2": "要启用精确的地理位置统计,在%1$s这里%2$s修改设置并使用 %3$s城市级数据库%4$s。",
- "Organization": "组织",
- "OrgDatabase": "组织数据库",
"PluginDescription": "报告访问者的位置:国家,地区,城市和地理坐标(纬度\/经度)。",
"Region": "地区",
"SubmenuLocations": "所在地",
"ToGeolocateOldVisits": "要获得以前访问的地理数据,请使用 %1$s这里%2$s的脚步。",
- "UnsupportedArchiveType": "不支持的归档类型 %1$s。",
- "UpdaterHasNotBeenRun": "更新程序从未运行。",
- "UpdaterIsNotScheduledToRun": "它不计划在将来运行。",
- "UpdaterScheduledForNextRun": "计划在未来的cron core运行:归档命令执行。",
- "UpdaterWasLastRun": "更新程序最后运行时间 %s。",
- "UpdaterWillRunNext": "这是下一个计划在 %s 运行。",
"WidgetLocation": "访客位置"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/lang/zh-tw.json b/plugins/UserCountry/lang/zh-tw.json
index a59b152a8c..8ffd95b4f7 100644
--- a/plugins/UserCountry/lang/zh-tw.json
+++ b/plugins/UserCountry/lang/zh-tw.json
@@ -1,11 +1,6 @@
{
"UserCountry": {
- "AssumingNonApache": "找不到 apache_get_modules 功能,推測是非 Apache 伺服器。",
- "CannotFindGeoIPDatabaseInArchive": "在 tar 壓縮檔 %2$s 中找不到 %1$s 檔案!",
- "CannotFindGeoIPServerVar": "變數 %s 未設定。你的伺服器可能沒有正確的變更設定。",
- "CannotListContent": "無法列出 %1$s 的內容列表:%2$s",
"CannotLocalizeLocalIP": "IP 位址 %s 是本機位址因此無法顯示地理位置。",
- "CannotUnzipDatFile": "無法解壓縮 %1$s 的 dat 檔案:%2$s",
"City": "城市",
"CityAndCountry": "%1$s,%2$s",
"Continent": "洲",
@@ -20,59 +15,26 @@
"DefaultLocationProviderDesc1": "預設的地理位置供應商是透過訪客使用的語言來猜測他的國家。",
"DefaultLocationProviderExplanation": "你正在使用預設地理位置供應商,這代表 Matomo 將以訪客所使用的語言來猜測他們的地理位置。%1$s點此查看%2$s如何安裝更準確的地理位置。",
"DistinctCountries": "%s 個不同的國家",
- "DownloadingDb": "正在下載 %s",
- "DownloadNewDatabasesEvery": "更新資料庫每隔一",
- "FoundApacheModules": "Matomo 找到下列 Apache 模組",
"FromDifferentCities": "不同城市",
- "GeoIPCannotFindMbstringExtension": "找不到 %1$s 功能。請確定擴充功能 %2$s 已經安裝並載入。",
- "GeoIPDatabases": "GeoIP 資料庫",
"GeoIPDocumentationSuffix": "要查看此報表的數據,你必須先在管理後台中的地理位置設定 GeoIP 。商用的 %1$sMaxmind%2$s GeoIP 資料庫比免費的還來的精準。點擊%3$s這裡%4$s看看他們多準確。",
- "GeoIPNoDatabaseFound": "這個 GeoIP 執行時無法找到任何資料庫。",
- "GeoIPImplHasAccessTo": "這個 GeoIP 執行時會存取以下類型的資料庫",
- "GeoIpLocationProviderDesc_Pecl2": "這個供應商沒有任何限制,所以我們推薦你使用這個。",
- "GeoIpLocationProviderDesc_Php2": "如果你的網站有許多流量,你可能會覺得這個地理位置供應商太慢了。在這種情況下你應該安裝 %1$sPECL 擴充功能%2$s或是%3$s伺服器模組%4$s。",
- "GeoIpLocationProviderDesc_ServerBased1": "這個地理位置供應商使用安裝在你 HTTP 伺服器上的 GeoIP 模組。這個供應商快又精準,但是%1$s只適用於一般瀏覽器上的追蹤%2$s。",
- "GeoIpLocationProviderDesc_ServerBased2": "如果你需要匯入紀錄檔或是其他需要設定 IP 位址的事情,使用%1$sPECL GeoIP(推薦)%2$s或是%3$sPHP GeoIP%4$s執行。",
- "GeoIpLocationProviderDesc_ServerBasedAnonWarn": "注意:IP 匿名化在此供應商所提供的位置中沒有任何效果。在 IP 匿名化開啟時,請先確定這並不違反法律政策。",
- "GeoIpLocationProviderNotRecomnended": "地理位置已執行,但你不是使用推薦的供應商。",
- "GeoIPNoServerVars": "Matomo 找不到任何 GeoIP 的 %s 變數。",
- "GeoIPPeclCustomDirNotSet": "PHP ini 中的 %s 選項未設定。",
- "GeoIPServerVarsFound": "Matomo 偵測到下列 GeoIP 的 %s 變數",
"Geolocation": "地理位置",
"GeolocationPageDesc": "你可以在此頁面中改變 Matomo 決定訪客位置的方式。",
"getCityDocumentation": "這份報表顯示你的訪客在瀏覽網站時所位於的城市。",
"getContinentDocumentation": "這份報表顯示你的訪客在瀏覽網站時所位於的洲別。",
"getCountryDocumentation": "這份報表顯示你的訪客在瀏覽網站時所位於的國家。",
"getRegionDocumentation": "這份報表顯示你的訪客在瀏覽網站時所位於的地區。",
- "HowToInstallApacheModule": "我該如何在 Apache 上安裝 GeoIP 模組?",
- "HowToInstallGeoIpPecl": "我該如何安裝 GeoIP PECL 擴充功能?",
- "HowToInstallNginxModule": "我該如何在 Nginx 上安裝 GeoIP 模組?",
- "HowToSetupGeoIPIntro": "看起來你沒有設定準確的地理位置。這是個實用的功能,沒有它你將無法看到準確且完整的訪客資訊。這裡是幾個你可以快速開始使用的方法:",
- "HttpServerModule": "HTTP 伺服器模組",
- "InvalidGeoIPUpdatePeriod": "無效的 GeoIP 更新期間:%1$s。有效值為 %2$s。",
- "ISPDatabase": "網路服務供應商(ISP)資料庫",
"Latitude": "緯度",
"Latitudes": "緯度",
"Location": "位置",
- "LocationDatabase": "地理位置資料庫",
- "LocationDatabaseHint": "地理位置資料庫可能是國家、地區或城市資料庫。",
"LocationProvider": "地理位置供應商",
"Longitude": "經度",
"Longitudes": "經度",
"NoDataForGeoIPReport1": "這份報表沒有任何數據因為沒有位置數據可用或是 IP 位址無法被定位。",
"NoDataForGeoIPReport2": "%1$s在這裡%2$s變更設定並使用%3$s城市等級資料庫%4$s來啟用精準地理位置。",
- "Organization": "機構",
- "OrgDatabase": "機構資料庫",
"PluginDescription": "報告你訪客的位置:國家、地區、城市和地理坐標(經度\/緯度)。",
"Region": "地區",
"SubmenuLocations": "地理位置",
"ToGeolocateOldVisits": "要取得舊的訪客紀錄中的地理位置資料,使用%1$s這裡%2$s所提供的程式碼。",
- "UnsupportedArchiveType": "遇到不支援的壓縮檔類型 %1$s。",
- "UpdaterHasNotBeenRun": "還沒有自動更新過。",
- "UpdaterIsNotScheduledToRun": "未來沒有排程執行。",
- "UpdaterScheduledForNextRun": "已排程在下次 core:archive 指令執行時執行。",
- "UpdaterWasLastRun": "上次自動更新執行於 %s。",
- "UpdaterWillRunNext": "下次自動更新將於 %s 執行。",
"WidgetLocation": "訪客所在地點"
}
} \ No newline at end of file
diff --git a/plugins/UserCountry/templates/_updaterNextRunTime.twig b/plugins/UserCountry/templates/_updaterNextRunTime.twig
deleted file mode 100644
index 69882f08b4..0000000000
--- a/plugins/UserCountry/templates/_updaterNextRunTime.twig
+++ /dev/null
@@ -1,9 +0,0 @@
-{% if nextRunTime|default is not empty %}
- {% if date(nextRunTime.getTimestamp()) <= date() %}
- {{ 'UserCountry_UpdaterScheduledForNextRun'|translate }}
- {% else %}
- {{ 'UserCountry_UpdaterWillRunNext'|translate('<strong>' ~ nextRunTime.toString() ~ '</strong>')|raw }}
- {% endif %}
-{% else %}
- {{ 'UserCountry_UpdaterIsNotScheduledToRun'|translate }}
-{% endif %} \ No newline at end of file
diff --git a/plugins/UserCountry/templates/adminIndex.twig b/plugins/UserCountry/templates/adminIndex.twig
index f0a32da588..ca11eb6d06 100644
--- a/plugins/UserCountry/templates/adminIndex.twig
+++ b/plugins/UserCountry/templates/adminIndex.twig
@@ -15,19 +15,7 @@
<div piwik-location-provider-selection="{{ currentProviderId|e('html_attr') }}">
{% if not isThereWorkingProvider %}
- <h3 style="margin-top:0;">{{ 'UserCountry_HowToSetupGeoIP'|translate }}</h3>
- {% if dbipLiteUrl|default is not empty %}
- <p>{{ 'UserCountry_HowToSetupGeoIPIntro'|translate }}</p>
- <ul style="list-style:disc !important;margin-left:2em;">
- <li style="list-style-type: disc !important;">{{ 'UserCountry_HowToSetupGeoIP_Step1'|translate('<a rel="noreferrer noopener" href="'~dbipLiteUrl~'">','</a>','<a rel="noreferrer noopener" target="_blank" href="http://db-ip.com/?refid=mtm">','</a>')|raw }}</li>
- <li style="list-style-type: disc !important;">{{ 'UserCountry_HowToSetupGeoIP_Step2'|translate("'"~dbipLiteFilename~"'",'<strong>','</strong>','<strong>'~dbipLiteDesiredFilename~'</strong>')|raw }}</li>
- <li style="list-style-type: disc !important;">{{ 'UserCountry_HowToSetupGeoIP_Step3'|translate('<strong>','</strong>','<span style="color:green"><strong>','</strong></span>')|raw }}</li>
- <li style="list-style-type: disc !important;">{{ 'UserCountry_HowToSetupGeoIP_Step4'|translate }}</li>
- </ul>
- {% else %}
- <p>{{ 'UserCountry_InstallGeoIp2'|translate('<a rel="noreferrer noopener" target="_blank" href="http://db-ip.com/?refid=mtm">','</a>')|raw }}</p>
- {% endif %}
- <p>&nbsp;</p>
+ {{ setUpGuides|raw }}
{% endif %}
<div class="row">
@@ -97,95 +85,21 @@
</div>
{% endfor %}
- <div piwik-save-button onconfirm="locationSelector.save()" saving="locationSelector.isLoading"></div>
-
-</div>
-</div>
-
-{% if geoIPLegacyLocUrl is defined and geoIPLegacyLocUrl and isInternetEnabled %}
- {# The text in this part is not translatable on purpose, as it will be removed again soon #}
- <div piwik-content-block content-title="Automatic Updates for GeoIP Legacy">
-
- <p>Setting up automatic updates for GeoIP Legacy is no longer supported.</p>
-
- <div class="notification system notification-warning">
- {% if 'GeoLite' in geoIPLegacyLocUrl %}
- <div>Maxmind announced to discontinue updates to the GeoLite Legacy databases as of April 1, 2018.</div>
- {% endif %}
- <strong>Please consider switching to GeoIP 2 soon! GeoIP Legacy Support is deprecated and will be removed in one of the next major releases.</strong>
- </div>
-
- {% if geoIPLegacyLocUrl or geoIPLegacyIspUrl or geoIPLegacyOrgUrl %}
- <h3>GeoIP Legacy Auto Update</h3>
-
- <p>Your previous configuration for automatic updates for GeoIP legacy databases is still up and running. It will be automatically disabled and removed after switching to GeoIP2.</p>
-
- <p>Below you can find the current configuration:</p>
- {% if geoIPLegacyLocUrl %}<p>{{ 'UserCountry_LocationDatabase'|translate|e('html_attr') }}: {{ geoIPLegacyLocUrl }}</p>{% endif %}
- {% if geoIPLegacyIspUrl %}<p>{{ 'UserCountry_ISPDatabase'|translate|e('html_attr') }}: {{ geoIPLegacyIspUrl }}</p>{% endif %}
- {% if geoIPLegacyOrgUrl %}<p>{{ 'UserCountry_OrgDatabase'|translate|e('html_attr') }}: {{ geoIPLegacyOrgUrl }}</p>{% endif %}
- {% if geoIPLegacyUpdatePeriod %}<p>{{ 'UserCountry_DownloadNewDatabasesEvery'|translate|e('html_attr') }}: {{ geoIPLegacyUpdatePeriod }}</p>{% endif %}
-
- {% endif %}
+ {% if locationProviders|length == 1 %}
+ <div piwik-notification
+ noclear="true"
+ context="warning">
+ {{ 'UserCountry_NoProviders'|translate('<a rel="noreferrer noopener" href="https://db-ip.com/?refid=mtm">','</a>')|raw }}
</div>
-{% endif %}
-
-{% if isInternetEnabled and not notUsingGeoIpPlugin %}
- <div piwik-content-block
- content-title="{% if not geoIPDatabasesInstalled %}{{ 'UserCountry_GeoIPDatabases'|translate|e('html_attr') }}{% else %}{{ 'UserCountry_SetupAutomaticUpdatesOfGeoIP'|translate|e('html_attr') }}{% endif %}"
- id="geoip-db-mangement">
+ {% endif %}
- <div piwik-location-provider-updater
- geoip-database-installed="{% if geoIPDatabasesInstalled %}1{% else %}0{% endif %}">
+ <div piwik-save-button onconfirm="locationSelector.save()" saving="locationSelector.isLoading"></div>
- {% if showGeoIPUpdateSection %}
- {% if not geoIPDatabasesInstalled %}
- <div ng-show="!locationUpdater.geoipDatabaseInstalled">
- <div ng-show="locationUpdater.showPiwikNotManagingInfo">
- <h3>{{ 'UserCountry_PiwikNotManagingGeoIPDBs'|translate|e('html_attr') }}</h3>
- <div id="manage-geoip-dbs">
- <div class="row" id="geoipdb-screen1">
- <div class="geoipdb-column-1 col s6">
- <p>{{ 'UserCountry_IWantToDownloadFreeGeoIP'|translate|raw }}</p>
- </div>
- <div class="geoipdb-column-2 col s6">
- <p>{{ 'UserCountry_IPurchasedGeoIPDBs'|translate('<a rel="noreferrer noopener" href="http://www.maxmind.com/en/geolocation_landing?rId=piwik">','</a>','<a rel="noreferrer noopener" href="https://db-ip.com/db/?refid=mtm">','</a>')|raw }}</p>
- </div>
- <div class="geoipdb-column-1 col s6">
- <input type="button" class="btn"
- ng-click="locationUpdater.startDownloadFreeGeoIp()"
- value="{{ 'General_GetStarted'|translate }}..."/>
- </div>
- <div class="geoipdb-column-2 col s6">
- <input type="button" class="btn"
- ng-click="locationUpdater.startAutomaticUpdateGeoIp()"
- value="{{ 'General_GetStarted'|translate }}..." id="start-automatic-update-geoip"/>
- </div>
- </div>
- </div>
- </div>
- {% if dbipLiteUrl|default is not empty %}
- {% set downloadingDbLink %}<a href="{{ dbipLiteUrl|e('html_attr') }}">{{ dbipLiteFilename }}</a>{% endset %}
- {% else %}
- {% set downloadingDbLink = '' %}
- {% endif %}
- <div id="geoipdb-screen2-download" ng-show="locationUpdater.showFreeDownload">
- <div piwik-progressbar
- label="{{ ('UserCountry_DownloadingDb'|translate(downloadingDbLink) ~ '...')|json_encode }}"
- progress="locationUpdater.progressFreeDownload">
- </div>
- </div>
- </div>
- {% endif %}
+</div>
+</div>
- {% include "@UserCountry/_updaterManage.twig" %}
- {% else %}
- <p class="form-description">{{ 'UserCountry_CannotSetupGeoIPAutoUpdating'|translate }}</p>
- {% endif %}
- </div>
- </div>
-{% endif %}
+{{ configurations|raw }}
{% endblock %}
diff --git a/plugins/UserCountry/tests/Integration/APITest.php b/plugins/UserCountry/tests/Integration/APITest.php
index 43122a61a3..89d976e81d 100644
--- a/plugins/UserCountry/tests/Integration/APITest.php
+++ b/plugins/UserCountry/tests/Integration/APITest.php
@@ -29,7 +29,7 @@ class APITest extends IntegrationTestCase
*/
private $api;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -51,34 +51,31 @@ class APITest extends IntegrationTestCase
$this->assertEquals($locationProvider, Common::getCurrentLocationProviderId());
}
- /**
- * @expectedException \Exception
- */
public function test_setLocationProviderInvalid()
{
+ $this->expectException(\Exception::class);
+
$locationProvider = 'invalidProvider';
$this->api->setLocationProvider($locationProvider);
}
- /**
- * @expectedException \Exception
- */
public function test_setLocationProviderNoSuperUser()
{
+ $this->expectException(\Exception::class);
+
Access::getInstance()->setSuperUserAccess(false);
- $locationProvider = LocationProvider\GeoIp\Php::ID;
+ $locationProvider = GeoIp2\Php::ID;
$this->api->setLocationProvider($locationProvider);
}
- /**
- * @expectedException \Exception
- */
public function test_setLocationProviderDisabledInConfig()
{
+ $this->expectException(\Exception::class);
+
Config::getInstance()->General['enable_geolocation_admin'] = 0;
- $locationProvider = LocationProvider\GeoIp\Php::ID;
+ $locationProvider = GeoIp2\Php::ID;
$this->api->setLocationProvider($locationProvider);
}
diff --git a/plugins/UserCountry/tests/Integration/VisitorGeolocatorTest.php b/plugins/UserCountry/tests/Integration/VisitorGeolocatorTest.php
index e315a9ee77..0a30c38121 100644
--- a/plugins/UserCountry/tests/Integration/VisitorGeolocatorTest.php
+++ b/plugins/UserCountry/tests/Integration/VisitorGeolocatorTest.php
@@ -8,10 +8,9 @@
*/
namespace Piwik\Plugins\UserCountry\tests\Integration;
-use PHPUnit_Framework_MockObject_MockObject;
use Piwik\Common;
use Piwik\Db;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Plugins\UserCountry\VisitorGeolocator;
use Piwik\Plugins\UserCountry\LocationProvider;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
@@ -34,7 +33,7 @@ class VisitorGeolocatorTest extends IntegrationTestCase
*/
private $logInserter;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -236,13 +235,13 @@ class VisitorGeolocatorTest extends IntegrationTestCase
$geolocator = new VisitorGeolocator($mockLocationProvider);
$valuesUpdated = $geolocator->attributeExistingVisit($visit, $useCache = false);
- $this->assertEquals($expectedVisitProperties, $this->logInserter->getVisit($visit['idvisit']), $message = '', $delta = 0.001);
+ $this->assertEqualsWithDelta($expectedVisitProperties, $this->logInserter->getVisit($visit['idvisit']), $delta = 0.001);
$expectedUpdateValues = $expectedUpdateValues === null ? $expectedVisitProperties : $expectedUpdateValues;
- $this->assertEquals($expectedUpdateValues, $valuesUpdated, $message = '', $delta = 0.001);
+ $this->assertEqualsWithDelta($expectedUpdateValues, $valuesUpdated, $delta = 0.001);
$conversions = $this->getConversions($visit);
- $this->assertEquals(array($expectedVisitProperties, $expectedVisitProperties), $conversions, $message = '', $delta = 0.001);
+ $this->assertEqualsWithDelta(array($expectedVisitProperties, $expectedVisitProperties), $conversions, $delta = 0.001);
}
public function test_attributeExistingVisit_ReturnsNull_AndSkipsAttribution_IfIdVisitMissingFromInput()
@@ -359,7 +358,7 @@ class VisitorGeolocatorTest extends IntegrationTestCase
}
/**
- * @return PHPUnit_Framework_MockObject_MockObject|LocationProvider
+ * @return \PHPUnit\Framework\MockObject\MockObject|LocationProvider
*/
protected function getProviderMock()
{
diff --git a/plugins/UserCountry/tests/System/AttributeHistoricalDataWithLocationsTest.php b/plugins/UserCountry/tests/System/AttributeHistoricalDataWithLocationsTest.php
index 6e3d7060f8..251a8e8db8 100644
--- a/plugins/UserCountry/tests/System/AttributeHistoricalDataWithLocationsTest.php
+++ b/plugins/UserCountry/tests/System/AttributeHistoricalDataWithLocationsTest.php
@@ -10,11 +10,10 @@ namespace Piwik\Plugins\UserCountry\tests\System;
use Piwik\Common;
use Piwik\Db;
-use Piwik\Plugin;
use Piwik\Plugins\UserCountry\Commands\AttributeHistoricalDataWithLocations;
use Piwik\Tests\Fixtures\ManyVisitsWithGeoIP;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Tester\CommandTester;
@@ -32,7 +31,7 @@ class AttributeHistoricalDataWithLocationsTest extends IntegrationTestCase
*/
public static $fixture = null;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -61,21 +60,19 @@ class AttributeHistoricalDataWithLocationsTest extends IntegrationTestCase
self::$fixture->setLocationProvider('GeoIP2-City.mmdb');
}
- /**
- * @expectedException \RuntimeException
- * @expectedExceptionMessage Not enough arguments
- */
public function testExecute_ShouldThrowException_IfArgumentIsMissing()
{
+ $this->expectException(\RuntimeException::class);
+ $this->expectExceptionMessage('Not enough arguments');
+
$this->executeCommand(null);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ExceptionInvalidDateFormat
- */
public function testExecute_ShouldReturnMessage_IfDatesAreInvalid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ExceptionInvalidDateFormat');
+
$this->executeCommand('test');
}
@@ -91,7 +88,7 @@ class AttributeHistoricalDataWithLocationsTest extends IntegrationTestCase
{
$result = $this->executeCommand('2010-01-03,2010-06-03');
- $this->assertContains(
+ self::assertStringContainsString(
'Re-attribution for date range: 2010-01-03 to 2010-06-03. 35 visits to process with provider "geoip2php".',
$result
);
@@ -109,7 +106,7 @@ class AttributeHistoricalDataWithLocationsTest extends IntegrationTestCase
// if we do not load translations, a DataTable\Map containing multiple periods will contain only one DataTable having
// the label `General_DateRangeFromTo` instead of many like `From 2010-01-04 to 2010-01-11`, ' `From 2010-01-11 to 2010-01-18`
// As those data tables would all have the same prettyfied period label they would overwrite each other.
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$this->assertApiResponseEqualsExpected("UserCountry.getCountry", $queryParams);
$this->assertApiResponseEqualsExpected("UserCountry.getContinent", $queryParams);
diff --git a/plugins/UserCountry/tests/System/expected/test___UserCountry.getCountryCodeMapping.xml b/plugins/UserCountry/tests/System/expected/test___UserCountry.getCountryCodeMapping.xml
index 30240aea9d..8030bed7fe 100644
--- a/plugins/UserCountry/tests/System/expected/test___UserCountry.getCountryCodeMapping.xml
+++ b/plugins/UserCountry/tests/System/expected/test___UserCountry.getCountryCodeMapping.xml
@@ -144,11 +144,11 @@
<mf>St. Martin</mf>
<mg>Madagascar</mg>
<mh>Marshall Islands</mh>
- <mk>Macedonia</mk>
+ <mk>North Macedonia</mk>
<ml>Mali</ml>
<mm>Myanmar (Burma)</mm>
<mn>Mongolia</mn>
- <mo>Macau SAR China</mo>
+ <mo>Macao SAR China</mo>
<mp>Northern Mariana Islands</mp>
<mq>Martinique</mq>
<mr>Mauritania</mr>
@@ -213,7 +213,7 @@
<sv>El Salvador</sv>
<sx>Sint Maarten</sx>
<sy>Syria</sy>
- <sz>Swaziland</sz>
+ <sz>Eswatini</sz>
<tc>Turks &amp; Caicos Islands</tc>
<td>Chad</td>
<tf>French Southern Territories</tf>
diff --git a/plugins/UserCountry/tests/UI/UserCountry_spec.js b/plugins/UserCountry/tests/UI/UserCountry_spec.js
new file mode 100644
index 0000000000..140b152ddf
--- /dev/null
+++ b/plugins/UserCountry/tests/UI/UserCountry_spec.js
@@ -0,0 +1,35 @@
+/*!
+ * Matomo - free/libre analytics platform
+ *
+ * Screenshot integration tests.
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+describe("UserCountry", function () {
+
+ afterEach(function () {
+ delete testEnvironment.pluginsToUnload;
+ testEnvironment.save();
+ });
+
+ it('should show geolocation admin without additional providers', async function () {
+ testEnvironment.pluginsToUnload = ['GeoIp2'];
+ testEnvironment.save();
+
+ await page.goto("?module=UserCountry&action=adminIndex");
+
+ expect(await page.screenshotSelector('#content')).to.matchImage('admin_no_providers');
+ });
+
+ it('should show geolocation admin with GeoIP2 providers', async function () {
+ testEnvironment.pluginsToLoad = ['GeoIp2'];
+ testEnvironment.save();
+
+ await page.goto("?module=UserCountry&action=adminIndex");
+
+ expect(await page.screenshotSelector('#content')).to.matchImage('admin_geoip2');
+ });
+
+});
diff --git a/plugins/UserCountry/tests/UI/expected-screenshots/UserCountry_admin_geoip2.png b/plugins/UserCountry/tests/UI/expected-screenshots/UserCountry_admin_geoip2.png
new file mode 100644
index 0000000000..b2b9a0746d
--- /dev/null
+++ b/plugins/UserCountry/tests/UI/expected-screenshots/UserCountry_admin_geoip2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:80072ca5e400445105511d146c386428b68f4d0f812c054081f5fe5539a0bf9f
+size 237893
diff --git a/plugins/UserCountry/tests/UI/expected-screenshots/UserCountry_admin_no_providers.png b/plugins/UserCountry/tests/UI/expected-screenshots/UserCountry_admin_no_providers.png
new file mode 100644
index 0000000000..0e88b39b47
--- /dev/null
+++ b/plugins/UserCountry/tests/UI/expected-screenshots/UserCountry_admin_no_providers.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:31448253e042c0c4f62cd2232e1408529cde22595999d8355bde3ea955bcfd27
+size 67691
diff --git a/plugins/UserCountry/tests/Unit/UserCountryTest.php b/plugins/UserCountry/tests/Unit/UserCountryTest.php
index c9e8dae56c..cc38c0f2f7 100644
--- a/plugins/UserCountry/tests/Unit/UserCountryTest.php
+++ b/plugins/UserCountry/tests/Unit/UserCountryTest.php
@@ -10,16 +10,11 @@ namespace Piwik\Plugins\UserCountry\tests\Unit;
use Piwik\Container\StaticContainer;
use Piwik\Intl\Data\Provider\RegionDataProvider;
-use Piwik\Plugins\UserCountry\GeoIPAutoUpdater;
-use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
-use Piwik\Plugins\UserCountry;
-use Piwik\Plugins\UserCountry\LocationProvider;
-use Exception;
require_once PIWIK_INCLUDE_PATH . '/plugins/UserCountry/UserCountry.php';
require_once PIWIK_INCLUDE_PATH . '/plugins/UserCountry/functions.php';
-class UserCountryTest extends \PHPUnit_Framework_TestCase
+class UserCountryTest extends \PHPUnit\Framework\TestCase
{
/**
* @group Plugins
@@ -56,10 +51,10 @@ class UserCountryTest extends \PHPUnit_Framework_TestCase
// Get list of countries
foreach ($countries as $country => $continent) {
// test continent
- $this->assertContains($continent, $continents);
+ self::assertTrue(in_array($continent, $continents));
// test flag
- $this->assertContains($country . '.png', $flags);
+ self::assertTrue(in_array($country . '.png', $flags));
}
foreach ($flags as $filename) {
@@ -73,119 +68,4 @@ class UserCountryTest extends \PHPUnit_Framework_TestCase
$this->assertArrayHasKey($country, $countries, $filename);
}
}
-
- /**
- * Test that redundant checks work.
- *
- * @group Plugins
- */
- public function testGeoIpUpdaterRedundantChecks()
- {
- GeoIp::$geoIPDatabaseDir = 'tests/lib/geoip-files';
- LocationProvider::$providers = null;
-
- // create empty ISP & Org files
- $this->createEmptyISPOrgFiles();
-
- // run redundant checks
- $updater = new Piwik_UserCountry_GeoIPAutoUpdater_publictest();
- $updater->performRedundantDbChecks();
-
- // check that files are renamed correctly
- $this->checkBrokenGeoIPState();
-
- // create empty files again & run checks again
- $this->createEmptyISPOrgFiles();
- $updater->performRedundantDbChecks();
-
- // check that w/ broken files already there, redundant checks still work correctly
- $this->checkBrokenGeoIPState();
- }
-
- /**
- * @group Plugins
- *
- * @dataProvider getInvalidGeoIpUrlsToTest
- */
- public function testGeoIpDownloadInvalidUrl($url)
- {
- // unset translations, otherwise Exception message will be translated
- StaticContainer::get('Piwik\Translation\Translator')->reset();
-
- $updater = new Piwik_UserCountry_GeoIPAutoUpdater_publictest();
- try {
- $updater->downloadFile('loc', $url);
- $this->fail("Downloading invalid url succeeded!");
- } catch (Exception $ex) {
- $this->assertEquals("UserCountry_UnsupportedArchiveType", $ex->getMessage());
- }
- }
-
- public function getInvalidGeoIpUrlsToTest()
- {
- return array(array("http://localhost/tests/resources/geoip.tar"),
- array("http://localhost/tests/resources/geoip.tar.bz2"),
- array("http://localhost/tests/resources/geoip.dat"));
- }
-
- public function setUp()
- {
- // empty
- }
-
- public function tearDown()
- {
- $geoIpDirPath = PIWIK_INCLUDE_PATH . '/tests/lib/geoip-files';
- $filesToRemove = array('GeoIPISP.dat.broken', 'GeoIPOrg.dat.broken', 'GeoIPISP.dat', 'GeoIPOrg.dat');
-
- foreach ($filesToRemove as $name) {
- $path = $geoIpDirPath . '/' . $name;
- if (file_exists($path)) {
- @unlink($path);
- }
- }
- }
-
- private function createEmptyISPOrgFiles()
- {
- $geoIpDir = PIWIK_INCLUDE_PATH . '/tests/lib/geoip-files';
-
- $fd = fopen($geoIpDir . '/GeoIPISP.dat', 'w');
- fclose($fd);
-
- $fd = fopen($geoIpDir . '/GeoIPOrg.dat', 'w');
- fclose($fd);
- }
-
- private function checkBrokenGeoIPState()
- {
- $geoIpDir = PIWIK_INCLUDE_PATH . '/tests/lib/geoip-files';
-
- $this->assertFalse(file_exists($geoIpDir . '/GeoIPCity.dat.broken'));
-
- $this->assertFalse(file_exists($geoIpDir . '/GeoIPISP.dat'));
- $this->assertTrue(file_exists($geoIpDir . '/GeoIPISP.dat.broken'));
-
- $this->assertFalse(file_exists($geoIpDir . '/GeoIPOrg.dat'));
- $this->assertTrue(file_exists($geoIpDir . '/GeoIPOrg.dat.broken'));
- }
-}
-
-class Piwik_UserCountry_GeoIPAutoUpdater_publictest extends GeoIPAutoUpdater
-{
- public function __construct()
- {
- // empty
- }
-
- // during tests do not call the Log::error or they will be displayed in the output
- public function performRedundantDbChecks($logErrors = false)
- {
- parent::performRedundantDbChecks($logErrors);
- }
-
- public function downloadFile($type, $url)
- {
- parent::downloadFile($type, $url);
- }
-}
+} \ No newline at end of file
diff --git a/plugins/UserCountryMap/javascripts/visitor-map.js b/plugins/UserCountryMap/javascripts/visitor-map.js
index 9f9f94153c..396fac73a3 100644
--- a/plugins/UserCountryMap/javascripts/visitor-map.js
+++ b/plugins/UserCountryMap/javascripts/visitor-map.js
@@ -69,7 +69,6 @@
citySelectedLabelColor = colors['city-selected-label-color'],
regionLayerStrokeColor = colors['region-layer-stroke-color'],
hasUserZoomed = false;
- ;
/*
* our own custom selector to only select stuff of this widget
@@ -375,8 +374,8 @@
infobtn.off('mouseenter').on('mouseenter',function (e) {
$(infobtn.data('tooltip-target')).show();
}).off('mouseleave').on('mouseleave', function (e) {
- $(infobtn.data('tooltip-target')).hide();
- });
+ $(infobtn.data('tooltip-target')).hide();
+ });
$('.UserCountryMap-tooltip').hide();
}
@@ -700,6 +699,11 @@
}
function displayUnlocatableCount(unlocated, total, regionOrCity) {
+
+ if (0 == unlocated) {
+ return;
+ }
+
$('.unlocated-stats').html(
$('.unlocated-stats').data('tpl')
.replace('%s', unlocated)
diff --git a/plugins/UserCountryMap/stylesheets/visitor-map.less b/plugins/UserCountryMap/stylesheets/visitor-map.less
index 6becb0c902..4c96011302 100644
--- a/plugins/UserCountryMap/stylesheets/visitor-map.less
+++ b/plugins/UserCountryMap/stylesheets/visitor-map.less
@@ -81,6 +81,7 @@
position: absolute;
z-index: 700;
opacity: 0.9;
+ display: none;
}
/* this should me moved to TableView css sometimes */
diff --git a/plugins/UserCountryMap/templates/visitorMap.twig b/plugins/UserCountryMap/templates/visitorMap.twig
index cbfc53f02a..f87a2df356 100644
--- a/plugins/UserCountryMap/templates/visitorMap.twig
+++ b/plugins/UserCountryMap/templates/visitorMap.twig
@@ -20,6 +20,9 @@
</div>
<div class="mapWidgetStatus">
{% if noData %}
+ {% if not isWidget %}
+ <h2>{{ 'UserCountryMap_VisitorMap'|translate }}</h2>
+ {% endif %}
<div class="pk-emptyDataTable">{{ 'CoreHome_ThereIsNoDataForThisReport'|translate }}</div>
{% else %}
<span class="loadingPiwik">
@@ -28,6 +31,7 @@
</span>
{% endif %}
</div>
+ {% if not noData %}
<div class="dataTableFeatures" style="padding-top:0;">
<div class="dataTableFooterIcons">
<div class="dataTableFooterWrap" var="graphVerticalBar">
@@ -70,6 +74,7 @@
</select>
</div>
</div>
+ {% endif %}
</div>
</section>
diff --git a/plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_cities.png b/plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_cities.png
index b35c9c0fe3..2b903e0d67 100644
--- a/plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_cities.png
+++ b/plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_cities.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9fb473bc96a5749312cc1928b506df81fbabf474c02dd465d22c8c9c52a7ef04
-size 114792
+oid sha256:31f3a972fd727b7be525d242a0c95ffafc619ce64969c981d783f5151dedafa3
+size 114527
diff --git a/plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_regions.png b/plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_regions.png
index 3f2df782b7..6e61d68d4d 100644
--- a/plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_regions.png
+++ b/plugins/UserCountryMap/tests/UI/expected-screenshots/VisitorMap_regions.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1679723fce50ccd125e64475330ae1dbf134ef70ec0fd157ff5caeb315e0a99a
-size 114252
+oid sha256:826285bbd7d36882f590a4d6a489a2161fb42e2683b3b44809524e6b6ea35184
+size 113986
diff --git a/plugins/UserId/tests/Fixtures/TrackFewVisitsAndCreateUsers.php b/plugins/UserId/tests/Fixtures/TrackFewVisitsAndCreateUsers.php
index bd150ae4c9..9d463d5adb 100644
--- a/plugins/UserId/tests/Fixtures/TrackFewVisitsAndCreateUsers.php
+++ b/plugins/UserId/tests/Fixtures/TrackFewVisitsAndCreateUsers.php
@@ -19,7 +19,7 @@ class TrackFewVisitsAndCreateUsers extends Fixture
public $dateTime = '2010-02-01 11:22:33';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
if (!self::siteCreated($idSite = 1)) {
self::createWebsite($this->dateTime);
diff --git a/plugins/UserLanguage/tests/Fixtures/LanguageFixture.php b/plugins/UserLanguage/tests/Fixtures/LanguageFixture.php
index b96356d7bd..b4437b44b8 100644
--- a/plugins/UserLanguage/tests/Fixtures/LanguageFixture.php
+++ b/plugins/UserLanguage/tests/Fixtures/LanguageFixture.php
@@ -18,13 +18,13 @@ class LanguageFixture extends Fixture
public $dateTime = '2014-09-04 00:00:00';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
}
diff --git a/plugins/UsersManager/Controller.php b/plugins/UsersManager/Controller.php
index 3d67327469..49fb7bd563 100644
--- a/plugins/UsersManager/Controller.php
+++ b/plugins/UsersManager/Controller.php
@@ -433,9 +433,9 @@ class Controller extends ControllerAdmin
private function processPasswordChange($userLogin)
{
$email = Common::getRequestVar('email');
- $password = Common::getRequestvar('password', false);
- $passwordBis = Common::getRequestvar('passwordBis', false);
- $passwordCurrent = Common::getRequestvar('passwordConfirmation', false);
+ $password = Common::getRequestVar('password', false);
+ $passwordBis = Common::getRequestVar('passwordBis', false);
+ $passwordCurrent = Common::getRequestVar('passwordConfirmation', false);
$newPassword = false;
if (!empty($password) || !empty($passwordBis)) {
diff --git a/plugins/UsersManager/tests/Fixtures/ManyUsers.php b/plugins/UsersManager/tests/Fixtures/ManyUsers.php
index 1382a55fd2..9eba719d2a 100644
--- a/plugins/UsersManager/tests/Fixtures/ManyUsers.php
+++ b/plugins/UsersManager/tests/Fixtures/ManyUsers.php
@@ -68,13 +68,13 @@ class ManyUsers extends Fixture
$this->addTextSuffixes = $addTextSuffixes;
}
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
$this->setUpUsers();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/UsersManager/tests/Integration/APITest.php b/plugins/UsersManager/tests/Integration/APITest.php
index 7605335e88..cd5b43c269 100644
--- a/plugins/UsersManager/tests/Integration/APITest.php
+++ b/plugins/UsersManager/tests/Integration/APITest.php
@@ -145,7 +145,7 @@ class APITest extends IntegrationTestCase
private $email = 'userlogin@password.de';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -161,7 +161,7 @@ class APITest extends IntegrationTestCase
$this->api->addUser($this->login, $this->password, $this->email);
}
- public function tearDown()
+ public function tearDown(): void
{
Config::getInstance()->General['enable_update_users_email'] = 1;
@@ -293,11 +293,10 @@ class APITest extends IntegrationTestCase
$this->assertSame($expected, $result);
}
- /**
- * @expectedException \Exception
- */
public function test_setUserPreference_throws_whenPreferenceNameContainsUnderscore()
{
+ $this->expectException(\Exception::class);
+
$user2 = 'userLogin2';
$this->api->addUser($user2, 'password', 'userlogin2@password.de');
$this->api->setUserPreference($user2, 'ohOH_myPreferenceName', 'valueForUser2');
@@ -382,12 +381,11 @@ class APITest extends IntegrationTestCase
$this->assertSame($userBefore['ts_password_modified'], $user['ts_password_modified']);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionInvalidPasswordTooLong
- */
public function test_updateUser_failsIfPasswordTooLong()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionInvalidPasswordTooLong');
+
$this->api->updateUser($this->login, str_pad('foo', UsersManager::PASSWORD_MAX_LENGTH + 1), 'email@example.com', 'newAlias', false, $this->password);
}
@@ -759,75 +757,67 @@ class APITest extends IntegrationTestCase
$this->assertEquals($expected, $access);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionMultipleRoleSet
- */
public function test_setUserAccess_MultipleRolesCannotBeSet()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionMultipleRoleSet');
+
$this->api->setUserAccess($this->login, array('view', 'admin'), array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionNoRoleSet
- */
public function test_setUserAccess_NeedsAtLeastOneRole()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionNoRoleSet');
+
$this->api->setUserAccess($this->login, array(TestCap2::ID), array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAccessValues
- */
public function test_setUserAccess_NeedsAtLeastOneRoleAsString()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAccessValues');
+
$this->api->setUserAccess($this->login, TestCap2::ID, array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAccessValues
- */
public function test_setUserAccess_InvalidCapability()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAccessValues');
+
$this->api->setUserAccess($this->login, array('admin', 'foobar'), array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionNoRoleSet
- */
public function test_setUserAccess_NeedsAtLeastOneRoleNoneGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionNoRoleSet');
+
$this->api->setUserAccess($this->login, array(), array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAnonymousAccessNotPossible
- */
public function test_setUserAccess_CannotSetAdminToAnonymous()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAnonymousAccessNotPossible');
+
$this->api->setUserAccess('anonymous', 'admin', array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAnonymousAccessNotPossible
- */
public function test_setUserAccess_CannotSetWriteToAnonymous()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAnonymousAccessNotPossible');
+
$this->api->setUserAccess('anonymous', 'write', array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function test_setUserAccess_UserDoesNotExist()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$this->api->setUserAccess('foobar', Admin::ID, array(1));
}
@@ -862,30 +852,27 @@ class APITest extends IntegrationTestCase
$this->assertEquals(array(array('site' => '1', 'access' => 'view')), $access);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAccessValues
- */
public function test_addCapabilities_failsWhenNotCapabilityIsGivenAsString()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAccessValues');
+
$this->api->addCapabilities($this->login, View::ID, array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAccessValues
- */
public function test_addCapabilities_failsWhenNotCapabilityIsGivenAsArray()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAccessValues');
+
$this->api->addCapabilities($this->login, array(TestCap2::ID, View::ID), array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function test_addCapabilities_failsWhenUserDoesNotExist()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$this->api->addCapabilities('foobar', array(TestCap2::ID), array(1));
}
@@ -963,30 +950,27 @@ class APITest extends IntegrationTestCase
$this->assertEquals($expected, $access);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAccessValues
- */
public function test_removeCapabilities_failsWhenNotCapabilityIsGivenAsString()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAccessValues');
+
$this->api->removeCapabilities($this->login, View::ID, array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAccessValues
- */
public function test_removeCapabilities_failsWhenNotCapabilityIsGivenAsArray()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAccessValues');
+
$this->api->removeCapabilities($this->login, array(TestCap2::ID, View::ID), array(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function test_removeCapabilities_failsWhenUserDoesNotExist()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$this->api->removeCapabilities('foobar', array(TestCap2::ID), array(1));
}
@@ -1004,12 +988,11 @@ class APITest extends IntegrationTestCase
$this->assertEquals(array(View::ID, TestCap1::ID), $access);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_CurrentPasswordNotCorrect
- */
public function test_setSuperUserAccess_failsIfCurrentPasswordIsIncorrect()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_CurrentPasswordNotCorrect');
+
$this->api->setSuperUserAccess($this->login, true, 'asldfkjds');
}
diff --git a/plugins/UsersManager/tests/Integration/ModelTest.php b/plugins/UsersManager/tests/Integration/ModelTest.php
index e90f2314f2..be2c79d333 100644
--- a/plugins/UsersManager/tests/Integration/ModelTest.php
+++ b/plugins/UsersManager/tests/Integration/ModelTest.php
@@ -44,7 +44,7 @@ class ModelTest extends IntegrationTestCase
private $login = 'userLogin';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php b/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php
index 1d837a7d9f..86c150e2ed 100644
--- a/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php
+++ b/plugins/UsersManager/tests/Integration/UserAccessFilterTest.php
@@ -56,7 +56,7 @@ class UserAccessFilterTest extends IntegrationTestCase
'login8' => array('view' => array(4,7), 'admin' => array(2,5)), // access to a couple of sites with admin and view
);
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/UsersManager/tests/Integration/UserPreferencesTest.php b/plugins/UsersManager/tests/Integration/UserPreferencesTest.php
index b584541442..4367918029 100644
--- a/plugins/UsersManager/tests/Integration/UserPreferencesTest.php
+++ b/plugins/UsersManager/tests/Integration/UserPreferencesTest.php
@@ -29,7 +29,7 @@ class UserPreferencesTest extends IntegrationTestCase
*/
private $userPreferences;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/plugins/UsersManager/tests/Integration/UsersManagerTest.php b/plugins/UsersManager/tests/Integration/UsersManagerTest.php
index 15f2124ab6..d7ae784bf1 100644
--- a/plugins/UsersManager/tests/Integration/UsersManagerTest.php
+++ b/plugins/UsersManager/tests/Integration/UsersManagerTest.php
@@ -45,7 +45,7 @@ class UsersManagerTest extends IntegrationTestCase
private $backupIdentity;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -67,7 +67,7 @@ class UsersManagerTest extends IntegrationTestCase
$this->model = new Model();
}
- public function tearDown()
+ public function tearDown(): void
{
FakeAccess::$identity = $this->backupIdentity;
parent::tearDown();
@@ -125,12 +125,13 @@ class UsersManagerTest extends IntegrationTestCase
}
/**
- * bad password => exception#
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionInvalidPassword
+ * bad password => exception
*/
public function testUpdateUserBadpasswd()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionInvalidPassword');
+
$login = "login";
$user = array('login' => $login,
'password' => "geqgeagae",
@@ -162,31 +163,32 @@ class UsersManagerTest extends IntegrationTestCase
/**
* @dataProvider getAddUserInvalidLoginData
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionInvalidLogin
*/
public function testAddUserWrongLogin($userLogin, $password, $email, $alias)
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionInvalidLogin');
+
$this->api->addUser($userLogin, $password, $email, $alias);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionLoginExists
- */
public function testAddUserExistingLogin()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionLoginExists');
+
$this->api->addUser("test", "password", "email@email.com", "alias");
$this->api->addUser("test", "password2", "em2ail@email.com", "al2ias");
}
/**
* @see https://github.com/piwik/piwik/issues/8548
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionLoginExists
*/
public function testAddUserExistingLoginCaseInsensitive()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionLoginExists');
+
$this->api->addUser("test", "password", "email@email.com", "alias");
$this->api->addUser("TeSt", "password2", "em2ail@email.com", "al2ias");
}
@@ -204,20 +206,20 @@ class UsersManagerTest extends IntegrationTestCase
/**
* @dataProvider getWrongPasswordTestData
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionInvalidPassword
*/
public function testAddUserWrongPassword($userLogin, $password, $email, $alias)
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionInvalidPassword');
+
$this->api->addUser($userLogin, $password, $email, $alias);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage mail
- */
public function testAddUserWrongEmail()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('mail');
+
$this->api->addUser('geggeqgeqag', 'geqgeagae', "ema il@email.com", 'alias');
}
@@ -323,64 +325,58 @@ class UsersManagerTest extends IntegrationTestCase
], $access);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_AddUserNoInitialAccessError
- */
public function test_addUser_shouldNotAllowAdminUsersToCreateUsers_WithNoInitialSiteWithAccess()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_AddUserNoInitialAccessError');
+
FakeAccess::$superUser = false;
FakeAccess::$idSitesAdmin = [1];
$this->api->addUser('userLogin2', 'password', 'userlogin2@email.com', 'userLogin2');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasAdminAccess Fake exception
- */
public function test_addUser_shouldNotAllowAdminUsersToCreateUsersWithAccessToSite_ThatAdminUserDoesNotHaveAccessTo()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasAdminAccess Fake exception');
+
FakeAccess::$superUser = false;
FakeAccess::$idSitesAdmin = [2];
$this->api->addUser('userLogin2', 'password', 'userlogin2@email.com', 'userLogin2', false, 1);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testDeleteUserDoesntExist()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$this->api->addUser("geggeqgeqag", "geqgeagae", "test@test.com", "alias");
$this->api->deleteUser("geggeqggnew");
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testDeleteUserEmptyUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$this->api->deleteUser("");
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testDeleteUserNullUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$this->api->deleteUser(null);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionDeleteOnlyUserWithSuperUserAccess
- */
public function testDeleteUser_ShouldFail_InCaseTheUserIsTheOnlyRemainingSuperUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionDeleteOnlyUserWithSuperUserAccess');
+
//add user and set some rights
$this->api->addUser("regularuser", "geqgeagae1", "test1@test.com", "alias1");
$this->api->addUser("superuser", "geqgeagae2", "test2@test.com", "alias2");
@@ -439,12 +435,11 @@ class UsersManagerTest extends IntegrationTestCase
$this->assertFalse($option);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testGetUserNoUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
// try to get it, it should raise an exception
$this->api->getUser("geggeqgeqag");
}
@@ -464,8 +459,8 @@ class UsersManagerTest extends IntegrationTestCase
// check that all fields are the same
$this->assertEquals($login, $user['login']);
- $this->assertInternalType('string', $user['password']);
- $this->assertInternalType('string', $user['date_registered']);
+ self::assertIsString($user['password']);
+ self::assertIsString($user['date_registered']);
$this->assertEquals($email, $user['email']);
//alias shouldn't be empty even if no alias specified
@@ -501,12 +496,11 @@ class UsersManagerTest extends IntegrationTestCase
$this->assertEquals(array($user1, $user2), $this->_removeNonTestableFieldsFromUsers($this->api->getUsers('gegg4564eqgeqag,geggeqge632ge56a4qag')));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasSomeAdminAccess Fake exception
- */
public function testGetUsers_withViewAccess_shouldThrowAnException()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasSomeAdminAccess Fake exception');
+
$this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
$this->api->addUser("geggeqge632ge56a4qag", "geqgegeagae", "tesggt@tesgt.com", "alias");
$this->api->addUser("geggeqgeqagqegg", "geqgeaggggae", "tesgggt@tesgt.com");
@@ -553,73 +547,66 @@ class UsersManagerTest extends IntegrationTestCase
$this->assertSame('geggeqge632ge56a4qag', $this->api->getUserLoginFromUserEmail('teSGgT@tesgt.com'));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testGetUserLoginFromUserEmail_shouldThrowException_IfUserDoesNotExist()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$this->api->getUserLoginFromUserEmail('unknownUser@teSsgt.com');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasSomeAdminAccess Fake exception
- */
public function testGetUserLoginFromUserEmail_shouldThrowException_IfUserDoesNotHaveAtLeastAdminPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasSomeAdminAccess Fake exception');
+
FakeAccess::clearAccess($superUser = false, $admin =array(), $view = array(1));
$this->api->getUserLoginFromUserEmail('tegst@tesgt.com');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testSetUserAccessNoLogin()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
FakeAccess::clearAccess($superUser = false, $admin =array(1), $view = array());
$this->api->setUserAccess("nologin", "view", 1);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAccessValues
- */
public function testSetUserAccessWrongAccessSpecified()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAccessValues');
+
$this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
FakeAccess::clearAccess($superUser = false, $admin =array(1), $view = array());
$this->api->setUserAccess("gegg4564eqgeqag", "viewnotknown", 1);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAccessValues
- */
public function testSetUserAccess_ShouldFail_SuperUserAccessIsNotAllowed()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAccessValues');
+
$this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
FakeAccess::clearAccess($superUser = false, $admin =array(1), $view = array());
$this->api->setUserAccess("gegg4564eqgeqag", "superuser", 1);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testSetUserAccess_ShouldFail_IfLoginIsConfigSuperUserLogin()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
FakeAccess::clearAccess($superUser = false, $admin =array(1), $view = array());
$this->api->setUserAccess('superusertest', 'view', 1);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserHasSuperUserAccess
- */
public function testSetUserAccess_ShouldFail_IfLoginIsUserWithSuperUserAccess()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserHasSuperUserAccess');
+
$this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
$userUpdater = new UserUpdater();
$userUpdater->setSuperUserAccessWithoutCurrentPassword('gegg4564eqgeqag', true);
@@ -672,11 +659,10 @@ class UsersManagerTest extends IntegrationTestCase
$this->assertEquals($idSites, array_keys($access));
}
- /**
- * @expectedException \Exception
- */
public function testSetUserAccess_ShouldNotBeAbleToSetAnyAccess_IfIdSitesIsEmpty()
{
+ $this->expectException(\Exception::class);
+
$this->api->addUser("gegg4564eqgeqag", "geqgegagae", "tegst@tesgt.com", "alias");
$this->api->setUserAccess("gegg4564eqgeqag", "view", array());
@@ -818,44 +804,40 @@ class UsersManagerTest extends IntegrationTestCase
$this->assertEquals($wanted1, $access1);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage checkUserHasSuperUserAccess Fake exception
- */
public function testSetSuperUserAccess_ShouldFail_IfUserHasNotSuperUserPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('checkUserHasSuperUserAccess Fake exception');
+
$pwd = $this->createCurrentUser();
FakeAccess::$superUser= false;
$this->api->setSuperUserAccess('nologin', false, $pwd);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testSetSuperUserAccess_ShouldFail_IfUserWithGivenLoginDoesNotExist()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$pwd = $this->createCurrentUser();
$this->api->setSuperUserAccess('nologin', false, $pwd);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionEditAnonymous
- */
public function testSetSuperUserAccess_ShouldFail_IfUserIsAnonymous()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionEditAnonymous');
+
$pwd = $this->createCurrentUser();
$this->api->setSuperUserAccess('anonymous', true, $pwd);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionRemoveSuperUserAccessOnlySuperUser
- */
public function testSetSuperUserAccess_ShouldFail_IfUserIsOnlyRemainingUserWithSuperUserAccess()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionRemoveSuperUserAccessOnlySuperUser');
+
$pwd = $this->createCurrentUser();
$this->api->addUser('login1', 'password1', 'test@example.com', false);
@@ -923,39 +905,35 @@ class UsersManagerTest extends IntegrationTestCase
$this->assertEquals(1, $users[2]['superuser_access']);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testGetSitesAccessFromUserWrongUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$this->api->getSitesAccessFromUser("user1");
}
- /**
- * @expectedException \Exception
- */
public function testGetUsersAccessFromSiteWrongIdSite()
{
+ $this->expectException(\Exception::class);
+
FakeAccess::$superUser = false;
$this->api->getUsersAccessFromSite(1);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionAccessValues
- */
public function testGetUsersSitesFromAccessWrongSite()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionAccessValues');
+
$this->api->getUsersSitesFromAccess('unknown');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionUserDoesNotExist
- */
public function testUpdateUserNonExistingLogin()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionUserDoesNotExist');
+
$this->api->updateUser("lolgin", "password");
}
@@ -979,12 +957,11 @@ class UsersManagerTest extends IntegrationTestCase
$this->_checkUserHasNotChanged($user, "passowordOK");
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ConfirmWithPassword
- */
public function testUpdateUserFailsNoCurrentPassword()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ConfirmWithPassword');
+
$login = "login";
$user = array('login' => $login,
'password' => "geqgeagae",
@@ -997,12 +974,11 @@ class UsersManagerTest extends IntegrationTestCase
$this->api->updateUser($login, "passowordOK", false, false, false, "");
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_CurrentPasswordNotCorrect
- */
public function testUpdateUserFailsWrongCurrentPassword()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_CurrentPasswordNotCorrect');
+
$login = "login";
$user = array('login' => $login,
'password' => "geqgeagae",
@@ -1015,12 +991,11 @@ class UsersManagerTest extends IntegrationTestCase
$this->api->updateUser($login, "passowordOK", false, false, false, "geqgeag");
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_CurrentPasswordNotCorrect
- */
public function testUpdateUserFailsWrongCurrentPassword_requiresThePasswordOfCurrentLoggedInUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_CurrentPasswordNotCorrect');
+
$login = "login";
$user = array('login' => $login,
'password' => "geqgeagae",
@@ -1072,22 +1047,23 @@ class UsersManagerTest extends IntegrationTestCase
/**
* check to modify as the user
- * @expectedException \Exception
- * @expectedExceptionMessage UsersManager_ExceptionLoginExists
*/
public function testAddUserIAmTheUser()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('UsersManager_ExceptionLoginExists');
+
FakeAccess::$identity = 'login';
$this->testUpdateUserNoEmailNoAlias();
}
/**
* check to modify as being another user => exception
- *
- * @expectedException \Exception
*/
public function testUpdateUserIAmNotTheUser()
{
+ $this->expectException(\Exception::class);
+
FakeAccess::$identity = 'login2';
FakeAccess::$superUser = false;
$this->testUpdateUserNoEmailNoAlias();
@@ -1112,11 +1088,10 @@ class UsersManagerTest extends IntegrationTestCase
$this->_checkUserHasNotChanged($user, "passowordOK", "email@geaga.com", "NEW ALIAS");
}
- /**
- * @expectedException \Exception
- */
public function testGetUserByEmailInvalidMail()
{
+ $this->expectException(\Exception::class);
+
$this->api->getUserByEmail('email@test.com');
}
diff --git a/plugins/UsersManager/tests/UI/UsersManager_spec.js b/plugins/UsersManager/tests/UI/UsersManager_spec.js
index 0be4c33cb1..28e2d703cd 100644
--- a/plugins/UsersManager/tests/UI/UsersManager_spec.js
+++ b/plugins/UsersManager/tests/UI/UsersManager_spec.js
@@ -301,6 +301,7 @@ describe("UsersManager", function () {
await page.evaluate(() => $('.change-access-confirm-modal .modal-close:not(.modal-no):visible').click());
await page.mouse.move(-10, -10);
await page.waitForNetworkIdle();
+ await page.waitFor(100);
expect(await page.screenshotSelector('.usersManager')).to.matchImage({
imageName: 'permissions_bulk_access_set',
diff --git a/plugins/VisitFrequency/VisitFrequency.php b/plugins/VisitFrequency/VisitFrequency.php
index 9e64e5a08d..7a85832e9d 100644
--- a/plugins/VisitFrequency/VisitFrequency.php
+++ b/plugins/VisitFrequency/VisitFrequency.php
@@ -14,7 +14,7 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
class VisitFrequency extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/VisitFrequency/lang/pt.json b/plugins/VisitFrequency/lang/pt.json
index 6fbfa01e61..99ca8aa976 100644
--- a/plugins/VisitFrequency/lang/pt.json
+++ b/plugins/VisitFrequency/lang/pt.json
@@ -1,25 +1,27 @@
{
"VisitFrequency": {
- "ColumnActionsByNewVisits": "Ações por Novas Visitas",
+ "ColumnActionsByNewVisits": "Ações por novas visitas",
"ColumnActionsByReturningVisits": "Ações das visitas recorrentes",
- "ColumnAverageVisitDurationForNewVisitors": "Média de Duração de uma Nova Visita (em segundos)",
+ "ColumnAverageVisitDurationForNewVisitors": "Média de duração de uma nova visita (em segundos)",
"ColumnAverageVisitDurationForReturningVisitors": "Duração média de uma visita recorrente (em segundos)",
- "ColumnAvgActionsPerNewVisit": "Média de Ações por Nova Visita",
+ "ColumnAvgActionsPerNewVisit": "Média de ações por nova visita",
"ColumnAvgActionsPerReturningVisit": "Média de ações por visita recorrente",
"ColumnBounceCountForReturningVisits": "Total de ressalto para visitas recorrentes",
+ "ColumnBounceRateForNewVisits": "Taxa de ressalto para novas visitas",
"ColumnBounceRateForReturningVisits": "Taxa de ressalto por visitas recorrentes",
"ColumnMaxActionsInReturningVisit": "Máximo de ações numa visita recorrente",
"ColumnNbReturningVisitsConverted": "Número de conversões de visitas recorrentes",
- "ColumnNewVisits": "Novas Visitas",
+ "ColumnNewVisits": "Novas visitas",
"ColumnReturningVisits": "Visitas recorrentes",
"ColumnSumVisitLengthReturning": "Tempo total despendido por visitantes recorrentes (em segundos)",
"ColumnUniqueNewVisitors": "Novos visitantes únicos",
"ColumnUniqueReturningVisitors": "Visitantes recorrentes únicos",
- "ColumnNewUsers": "Novos Utilizadores",
+ "ColumnNewUsers": "Novos utilizadores",
"ColumnReturningUsers": "Utilizadores recorrentes",
"NewActions": "ações por novas visitas",
"NewAverageVisitDuration": "duração média da visita para novos visitantes",
"NewAvgActions": "ações por nova visita",
+ "NewBounceRate": "novas visitas que ressaltaram (que saíram do site após uma página)",
"NewVisits": "novas visitas",
"PluginDescription": "Apresenta métricas sobre os novos visitantes e visitantes recorrentes",
"ReturnActions": "ações por visitas recorrentes",
diff --git a/plugins/VisitFrequency/lang/zh-cn.json b/plugins/VisitFrequency/lang/zh-cn.json
index b0969237bb..b385ff8c40 100644
--- a/plugins/VisitFrequency/lang/zh-cn.json
+++ b/plugins/VisitFrequency/lang/zh-cn.json
@@ -1,16 +1,28 @@
{
"VisitFrequency": {
+ "ColumnActionsByNewVisits": "新访问者采取的行动",
"ColumnActionsByReturningVisits": "老访客的活动次数",
+ "ColumnAverageVisitDurationForNewVisitors": "平均 新访问的持续时间(以秒为单位)",
"ColumnAverageVisitDurationForReturningVisitors": "老访客的平均停留时间(秒)",
+ "ColumnAvgActionsPerNewVisit": "平均 每次新访问的动作",
"ColumnAvgActionsPerReturningVisit": "老访客的平均活动次数",
"ColumnBounceCountForReturningVisits": "老访客的跳出次数",
+ "ColumnBounceRateForNewVisits": "新访客的跳出率",
"ColumnBounceRateForReturningVisits": "老访客的跳出率",
"ColumnMaxActionsInReturningVisit": "老访客的最大活动次数",
"ColumnNbReturningVisitsConverted": "老访客的转化次数",
+ "ColumnNewVisits": "新访客",
"ColumnReturningVisits": "老访客的访问次数",
"ColumnSumVisitLengthReturning": "老访客总的停留时间 (秒)",
+ "ColumnUniqueNewVisitors": "不重复的新访客",
"ColumnUniqueReturningVisitors": "独立老访客数",
+ "ColumnNewUsers": "新用户",
"ColumnReturningUsers": "老访客",
+ "NewActions": "新造访者采取的行动",
+ "NewAverageVisitDuration": "新访客的平均访问时间",
+ "NewAvgActions": "每次新造访的动作",
+ "NewBounceRate": "新的访问量反弹了(访问后离开了网站)",
+ "NewVisits": "新访客",
"PluginDescription": "报告有关您的首次访问者和回访者的指标。",
"ReturnActions": "回访行动",
"ReturnAverageVisitDuration": "回访者的平均参观时间",
diff --git a/plugins/VisitFrequency/tests/Integration/APITest.php b/plugins/VisitFrequency/tests/Integration/APITest.php
index dfba727d4f..b5580c670d 100644
--- a/plugins/VisitFrequency/tests/Integration/APITest.php
+++ b/plugins/VisitFrequency/tests/Integration/APITest.php
@@ -19,7 +19,7 @@ class APITest extends IntegrationTestCase
private $idSite;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->api = API::getInstance();
diff --git a/plugins/VisitTime/tests/Unit/AddSegmentByLabelInUTCTest.php b/plugins/VisitTime/tests/Unit/AddSegmentByLabelInUTCTest.php
index 7641810f36..c082fc9eb3 100644
--- a/plugins/VisitTime/tests/Unit/AddSegmentByLabelInUTCTest.php
+++ b/plugins/VisitTime/tests/Unit/AddSegmentByLabelInUTCTest.php
@@ -16,7 +16,7 @@ use Piwik\DataTable;
* @group AddSegmentByLabelInUTCTest
* @group Plugins
*/
-class AddSegmentByLabelInUTCTest extends \PHPUnit_Framework_TestCase
+class AddSegmentByLabelInUTCTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'Piwik\Plugins\VisitTime\DataTable\Filter\AddSegmentByLabelInUTC';
@@ -25,7 +25,7 @@ class AddSegmentByLabelInUTCTest extends \PHPUnit_Framework_TestCase
*/
private $table;
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
$this->addRow(array('label' => '0'));
diff --git a/plugins/VisitorGenerator b/plugins/VisitorGenerator
-Subproject da7eb7142524a98926b29007ea78e5dc5e6cd1d
+Subproject 06192b5c7dac440049fdfa3b8c47ef5d25324da
diff --git a/plugins/VisitsSummary/VisitsSummary.php b/plugins/VisitsSummary/VisitsSummary.php
index 466808c173..72365412bc 100644
--- a/plugins/VisitsSummary/VisitsSummary.php
+++ b/plugins/VisitsSummary/VisitsSummary.php
@@ -21,7 +21,7 @@ use Piwik\Plugins\VisitsSummary\Reports\Get;
class VisitsSummary extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php b/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php
index 090741ddff..2c30400730 100644
--- a/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php
+++ b/plugins/VisitsSummary/tests/Integration/VisitsSummaryTest.php
@@ -31,7 +31,7 @@ class VisitsSummaryTest extends IntegrationTestCase
protected $date = '2014-04-04';
private $column = 'nb_users';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->plugin = new VisitsSummary();
@@ -42,7 +42,7 @@ class VisitsSummaryTest extends IntegrationTestCase
Fixture::createWebsite('2014-01-01 00:00:00');
}
- public function tearDown()
+ public function tearDown(): void
{
// clean up your test here if needed
$tables = ArchiveTableCreator::getTablesArchivesInstalled();
@@ -150,7 +150,7 @@ class VisitsSummaryTest extends IntegrationTestCase
}
}
- private function trackPageview(\PiwikTracker $tracker, $userId, $url)
+ private function trackPageview(\MatomoTracker $tracker, $userId, $url)
{
$tracker->setUrl('http://www.example.org' . $url);
$tracker->setUserId($userId);
diff --git a/plugins/VisitsSummary/tests/Unit/Reports/GetTest.php b/plugins/VisitsSummary/tests/Unit/Reports/GetTest.php
index 8d3152ec6a..c89efdf689 100644
--- a/plugins/VisitsSummary/tests/Unit/Reports/GetTest.php
+++ b/plugins/VisitsSummary/tests/Unit/Reports/GetTest.php
@@ -17,7 +17,7 @@ use Piwik\Plugins\VisitsSummary\Reports\Get;
* @group GetTest
* @group Plugins
*/
-class GetTest extends \PHPUnit_Framework_TestCase
+class GetTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Get
@@ -26,7 +26,7 @@ class GetTest extends \PHPUnit_Framework_TestCase
private $column = 'nb_users';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->get = new Get();
diff --git a/plugins/WebsiteMeasurable/MeasurableSettings.php b/plugins/WebsiteMeasurable/MeasurableSettings.php
index bc07b254a1..7c0ff2e9eb 100644
--- a/plugins/WebsiteMeasurable/MeasurableSettings.php
+++ b/plugins/WebsiteMeasurable/MeasurableSettings.php
@@ -9,7 +9,7 @@
namespace Piwik\Plugins\WebsiteMeasurable;
use Piwik\IP;
use Piwik\Measurable\Type\TypeManager;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Piwik;
use Piwik\Plugin;
use Piwik\Plugins\WebsiteMeasurable\Settings\Urls;
diff --git a/plugins/Widgetize/Widgetize.php b/plugins/Widgetize/Widgetize.php
index ce09c2e599..9d9c083b71 100644
--- a/plugins/Widgetize/Widgetize.php
+++ b/plugins/Widgetize/Widgetize.php
@@ -13,7 +13,7 @@ namespace Piwik\Plugins\Widgetize;
class Widgetize extends \Piwik\Plugin
{
/**
- * @see Piwik\Plugin::registerEvents
+ * @see \Piwik\Plugin::registerEvents
*/
public function registerEvents()
{
diff --git a/plugins/Widgetize/tests/Fixtures/WidgetizeFixture.php b/plugins/Widgetize/tests/Fixtures/WidgetizeFixture.php
index 322eb0754c..8f3522de79 100644
--- a/plugins/Widgetize/tests/Fixtures/WidgetizeFixture.php
+++ b/plugins/Widgetize/tests/Fixtures/WidgetizeFixture.php
@@ -26,13 +26,13 @@ class WidgetizeFixture extends Fixture
array('name' => 'Visit Docs', 'match' => 'url', 'pattern' => 'docs', 'patternType' => 'contains', 'revenue' => false),
);
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
$this->setUpGoals();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/plugins/Widgetize/tests/System/WidgetTest.php b/plugins/Widgetize/tests/System/WidgetTest.php
index 7cffdb013f..8aaed9f84f 100644
--- a/plugins/Widgetize/tests/System/WidgetTest.php
+++ b/plugins/Widgetize/tests/System/WidgetTest.php
@@ -28,7 +28,7 @@ class WidgetTest extends SystemTestCase
*/
public static $fixture = null; // initialized below class definition
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -38,7 +38,7 @@ class WidgetTest extends SystemTestCase
$_GET['date'] = '2013-01-23';
}
- public function tearDown()
+ public function tearDown(): void
{
$_GET = array();
parent::tearDown();
diff --git a/tests/LocalTracker.php b/tests/LocalTracker.php
index fd98ccfd89..1510b15b74 100644
--- a/tests/LocalTracker.php
+++ b/tests/LocalTracker.php
@@ -12,12 +12,11 @@ require_once PIWIK_INCLUDE_PATH . '/core/Tracker/IgnoreCookie.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/Visit.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/GoalManager.php';
require_once PIWIK_INCLUDE_PATH . '/core/Tracker/Action.php';
-require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php';
/**
* Tracker that uses core/Tracker.php directly.
*/
-class Piwik_LocalTracker extends PiwikTracker
+class Matomo_LocalTracker extends MatomoTracker
{
protected function sendRequest($url, $method = 'GET', $data = null, $force = false)
{
@@ -125,3 +124,4 @@ class Piwik_LocalTracker extends PiwikTracker
}
}
+class_alias('Matomo_LocalTracker', 'Piwik_LocalTracker'); \ No newline at end of file
diff --git a/tests/PHPUnit/Benchmarks/ArchiveQueryBenchmark.php b/tests/PHPUnit/Benchmarks/ArchiveQueryBenchmark.php
index c002e0e906..c24e9e1b59 100644
--- a/tests/PHPUnit/Benchmarks/ArchiveQueryBenchmark.php
+++ b/tests/PHPUnit/Benchmarks/ArchiveQueryBenchmark.php
@@ -19,7 +19,7 @@ class ArchiveQueryBenchmark extends BenchmarkTestCase
{
private $archivingLaunched = false;
- public function setUp()
+ public function setUp(): void
{
$archivingTables = ArchiveTableCreator::getTablesArchivesInstalled();
if (empty($archivingTables)) {
diff --git a/tests/PHPUnit/Benchmarks/ArchivingProcessBenchmark.php b/tests/PHPUnit/Benchmarks/ArchivingProcessBenchmark.php
index 504b31bbd6..ca3a9dfd2b 100644
--- a/tests/PHPUnit/Benchmarks/ArchivingProcessBenchmark.php
+++ b/tests/PHPUnit/Benchmarks/ArchivingProcessBenchmark.php
@@ -13,7 +13,7 @@ use Piwik\Tests\Framework\TestCase\BenchmarkTestCase;
*/
class ArchivingProcessBenchmark extends BenchmarkTestCase
{
- public function setUp()
+ public function setUp(): void
{
BenchmarkTestCase::deleteArchiveTables();
}
diff --git a/tests/PHPUnit/Benchmarks/Fixtures/ManyThousandSitesOneVisitEach.php b/tests/PHPUnit/Benchmarks/Fixtures/ManyThousandSitesOneVisitEach.php
index 81941ff67f..2a2a909469 100644
--- a/tests/PHPUnit/Benchmarks/Fixtures/ManyThousandSitesOneVisitEach.php
+++ b/tests/PHPUnit/Benchmarks/Fixtures/ManyThousandSitesOneVisitEach.php
@@ -20,7 +20,7 @@ class Piwik_Test_Fixture_ManyThousandSitesOneVisitEach
public $siteCount = 20000;
public $idSite = 'all';
- public function setUp()
+ public function setUp(): void
{
for ($i = 0; $i != $this->siteCount; ++$i) {
$idSite = Fixture::createWebsite(
diff --git a/tests/PHPUnit/Benchmarks/Fixtures/OneSiteThousandsOfDistinctUrlsOverMonth.php b/tests/PHPUnit/Benchmarks/Fixtures/OneSiteThousandsOfDistinctUrlsOverMonth.php
index 9ee3984b6d..0de4f2662a 100644
--- a/tests/PHPUnit/Benchmarks/Fixtures/OneSiteThousandsOfDistinctUrlsOverMonth.php
+++ b/tests/PHPUnit/Benchmarks/Fixtures/OneSiteThousandsOfDistinctUrlsOverMonth.php
@@ -21,7 +21,7 @@ class Piwik_Test_Fixture_OneSiteThousandsOfDistinctUrlsOverMonth
public $period = 'month';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
// add one site
Fixture::createWebsite(
diff --git a/tests/PHPUnit/Benchmarks/Fixtures/OneSiteTwelveThousandVisitsOneYear.php b/tests/PHPUnit/Benchmarks/Fixtures/OneSiteTwelveThousandVisitsOneYear.php
index c5bebf92c1..c437cd9599 100644
--- a/tests/PHPUnit/Benchmarks/Fixtures/OneSiteTwelveThousandVisitsOneYear.php
+++ b/tests/PHPUnit/Benchmarks/Fixtures/OneSiteTwelveThousandVisitsOneYear.php
@@ -21,7 +21,7 @@ class Piwik_Test_Fixture_OneSiteTwelveThousandVisitsOneYear
public $idGoal1 = 1;
public $idGoal2 = 2;
- public function setUp()
+ public function setUp(): void
{
// add one site
Fixture::createWebsite(
diff --git a/tests/PHPUnit/Benchmarks/Fixtures/ThousandSitesTwelveVisitsEachOneDay.php b/tests/PHPUnit/Benchmarks/Fixtures/ThousandSitesTwelveVisitsEachOneDay.php
index 0216e66e93..d0af41e26e 100644
--- a/tests/PHPUnit/Benchmarks/Fixtures/ThousandSitesTwelveVisitsEachOneDay.php
+++ b/tests/PHPUnit/Benchmarks/Fixtures/ThousandSitesTwelveVisitsEachOneDay.php
@@ -18,7 +18,7 @@ class Piwik_Test_Fixture_ThousandSitesTwelveVisitsEachOneDay
public $period = 'day';
public $idSite = 'all';
- public function setUp()
+ public function setUp(): void
{
// add one thousand sites
$allIdSites = array();
diff --git a/tests/PHPUnit/Benchmarks/MultiSitesBenchmark.php b/tests/PHPUnit/Benchmarks/MultiSitesBenchmark.php
index bd55f3e5b8..d69c98a4c1 100644
--- a/tests/PHPUnit/Benchmarks/MultiSitesBenchmark.php
+++ b/tests/PHPUnit/Benchmarks/MultiSitesBenchmark.php
@@ -18,7 +18,7 @@ class MultiSitesBenchmark extends BenchmarkTestCase
{
private $archivingLaunched = false;
- public function setUp()
+ public function setUp(): void
{
$archivingTables = ArchiveTableCreator::getTablesArchivesInstalled();
if (empty($archivingTables)) {
diff --git a/tests/PHPUnit/Benchmarks/TrackerBenchmark.php b/tests/PHPUnit/Benchmarks/TrackerBenchmark.php
index dfb8353196..16595d8777 100644
--- a/tests/PHPUnit/Benchmarks/TrackerBenchmark.php
+++ b/tests/PHPUnit/Benchmarks/TrackerBenchmark.php
@@ -20,7 +20,7 @@ class TrackerBenchmark extends BenchmarkTestCase
private $visitTimes = array();
private $t = null;
- public function setUp()
+ public function setUp(): void
{
// set up action URLs
for ($i = 0; $i != 100; ++$i) {
diff --git a/tests/PHPUnit/Fixtures/FewVisitsWithSetVisitorId.php b/tests/PHPUnit/Fixtures/FewVisitsWithSetVisitorId.php
index b182324bb6..a7969cdff0 100644
--- a/tests/PHPUnit/Fixtures/FewVisitsWithSetVisitorId.php
+++ b/tests/PHPUnit/Fixtures/FewVisitsWithSetVisitorId.php
@@ -9,9 +9,8 @@ namespace Piwik\Tests\Fixtures;
use Piwik\Date;
use Piwik\Plugins\Goals\API;
-use Piwik\Tracker\Visit;
use Piwik\Tests\Framework\Fixture;
-use PiwikTracker;
+use MatomoTracker;
use Exception;
/**
@@ -25,7 +24,7 @@ class FewVisitsWithSetVisitorId extends Fixture
const USER_ID_EXAMPLE_COM = 'email@example.com';
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits_setVisitorId();
@@ -35,7 +34,7 @@ class FewVisitsWithSetVisitorId extends Fixture
$this->trackVisits_oneWeekLater_setUserId();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
@@ -148,7 +147,7 @@ class FewVisitsWithSetVisitorId extends Fixture
// Request from a different computer not yet logged in, this should not be added to our User ID session
$t->setUserId(false);
// make sure the Id is not so random as to not fail the test
- $t->randomVisitorId = '5e15b4d842cc294d';
+ $t->setVisitorId('5e15b4d842cc294d');
$t->setIp('1.2.4.7');
$t->setUserAgent("New unique device");
@@ -193,7 +192,7 @@ class FewVisitsWithSetVisitorId extends Fixture
}
- private function settingInvalidVisitorIdShouldThrow(PiwikTracker $t)
+ private function settingInvalidVisitorIdShouldThrow(MatomoTracker $t)
{
try {
$t->setVisitorId('test');
@@ -215,7 +214,7 @@ class FewVisitsWithSetVisitorId extends Fixture
}
}
- private function settingInvalidUserIdShouldThrow(PiwikTracker $t)
+ private function settingInvalidUserIdShouldThrow(MatomoTracker $t)
{
try {
$t->setUserId('');
diff --git a/tests/PHPUnit/Fixtures/InvalidVisits.php b/tests/PHPUnit/Fixtures/InvalidVisits.php
index 7891e69a0d..f7694d0fea 100644
--- a/tests/PHPUnit/Fixtures/InvalidVisits.php
+++ b/tests/PHPUnit/Fixtures/InvalidVisits.php
@@ -24,13 +24,13 @@ class InvalidVisits extends Fixture
public $trackInvalidRequests = true;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/JSTrackingUIFixture.php b/tests/PHPUnit/Fixtures/JSTrackingUIFixture.php
index 73c86fef61..9aebb3e0a0 100644
--- a/tests/PHPUnit/Fixtures/JSTrackingUIFixture.php
+++ b/tests/PHPUnit/Fixtures/JSTrackingUIFixture.php
@@ -16,7 +16,7 @@ use Piwik\Tests\Framework\Fixture;
class JSTrackingUIFixture extends Fixture
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Fixtures/LatestStableInstall.php b/tests/PHPUnit/Fixtures/LatestStableInstall.php
index 3a1c381552..3d1578511b 100644
--- a/tests/PHPUnit/Fixtures/LatestStableInstall.php
+++ b/tests/PHPUnit/Fixtures/LatestStableInstall.php
@@ -30,7 +30,7 @@ class LatestStableInstall extends Fixture
$this->subdirToInstall = $subdirToInstall;
}
- public function setUp()
+ public function setUp(): void
{
$this->removeLatestStableInstall();
diff --git a/tests/PHPUnit/Fixtures/ManySitesImportedLogs.php b/tests/PHPUnit/Fixtures/ManySitesImportedLogs.php
index 6b4fea8102..dce0894088 100644
--- a/tests/PHPUnit/Fixtures/ManySitesImportedLogs.php
+++ b/tests/PHPUnit/Fixtures/ManySitesImportedLogs.php
@@ -32,7 +32,7 @@ class ManySitesImportedLogs extends Fixture
public $includeNginxJson = false;
public $includeApiCustomVarMapping = false;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
@@ -45,7 +45,7 @@ class ManySitesImportedLogs extends Fixture
$this->setupSegments();
}
- public function tearDown()
+ public function tearDown(): void
{
LocationProvider::$providers = null;
ManyVisitsWithGeoIP::unsetLocationProvider();
@@ -158,7 +158,7 @@ class ManySitesImportedLogs extends Fixture
$output = self::executeLogImporter($logFile, $opts);
$output = implode("\n", $output);
- $this->assertContains('4 filtered log lines', $output);
+ self::assertStringContainsString('4 filtered log lines', $output);
}
private function logWithIncludeFilters()
@@ -174,7 +174,7 @@ class ManySitesImportedLogs extends Fixture
$output = self::executeLogImporter($logFile, $opts);
$output = implode("\n", $output);
- $this->assertContains('2 filtered log lines', $output);
+ self::assertStringContainsString('2 filtered log lines', $output);
}
private function setupSegments()
@@ -288,13 +288,13 @@ class ManySitesImportedLogs extends Fixture
$output = self::executeLogImporter($logFile, $opts);
$output = implode("\n", $output);
- $this->assertContains('1 filtered log lines', $output);
+ self::assertStringContainsString('1 filtered log lines', $output);
// test that correct logs are excluded when the host is in the log file
$output = self::executeLogImporter($logFileWithHost, $opts);
$output = implode("\n", $output);
- $this->assertContains('2 filtered log lines', $output);
+ self::assertStringContainsString('2 filtered log lines', $output);
}
/**
diff --git a/tests/PHPUnit/Fixtures/ManySitesImportedLogsWithXssAttempts.php b/tests/PHPUnit/Fixtures/ManySitesImportedLogsWithXssAttempts.php
index 72ba5ed6b6..097b2fecbb 100644
--- a/tests/PHPUnit/Fixtures/ManySitesImportedLogsWithXssAttempts.php
+++ b/tests/PHPUnit/Fixtures/ManySitesImportedLogsWithXssAttempts.php
@@ -28,7 +28,7 @@ class ManySitesImportedLogsWithXssAttempts extends ManySitesImportedLogs
$this->now = Date::factory('now');
}
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php b/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php
index 39f5129cdd..38b812e400 100644
--- a/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php
+++ b/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIP.php
@@ -56,7 +56,7 @@ class ManyVisitsWithGeoIP extends Fixture
protected $idGoal;
protected $idGoal2;
- public function setUp()
+ public function setUp(): void
{
// set option, so tracked data for the past won't get converted
Option::set(GeoIp2::SWITCH_TO_ISO_REGIONS_OPTION_NAME, 1);
@@ -78,7 +78,7 @@ class ManyVisitsWithGeoIP extends Fixture
$this->setLocationProvider('GeoIP2-City.mmdb');
}
- public function tearDown()
+ public function tearDown(): void
{
$this->unsetLocationProvider();
}
@@ -129,13 +129,13 @@ class ManyVisitsWithGeoIP extends Fixture
/**
* Insert a new visit into the database.
- * @param \PiwikTracker $t The tracker to record the visits on
+ * @param \MatomoTracker $t The tracker to record the visits on
* @param int $fixtureCounter Number of times this fixture has been run
* @param int $visitorCounter Visitor counter within this execution of the fixture
* @param boolean $doBulk Should this visit be left for bulk insert later, or processed now?
* @param array $params Other params as required to set up the visit
*/
- protected function trackVisit(\PiwikTracker $t, $fixtureCounter, $visitorCounter, $doBulk, array $params)
+ protected function trackVisit(\MatomoTracker $t, $fixtureCounter, $visitorCounter, $doBulk, array $params)
{
$setIp = isset($params['setIp']) && $params['setIp'];
@@ -199,7 +199,7 @@ class ManyVisitsWithGeoIP extends Fixture
$date = $date->addHour(0.1);
$t->setForceVisitDateTime($date->getDatetime());
if( ($visitorCounter % 2) == 0) {
- $r = $t->doTrackSiteSearch('Bring on the party', 'CAT');
+ $r = $t->doTrackSiteSearch('Bring on the party', 'CAT', $visitorCounter*6);
}
if (!$doBulk) {
diff --git a/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIPAndEcommerce.php b/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIPAndEcommerce.php
index db094351a5..cb9e24c543 100644
--- a/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIPAndEcommerce.php
+++ b/tests/PHPUnit/Fixtures/ManyVisitsWithGeoIPAndEcommerce.php
@@ -12,13 +12,13 @@ class ManyVisitsWithGeoIPAndEcommerce extends ManyVisitsWithGeoIP
{
/**
* Insert a new visit into the database.
- * @param \PiwikTracker $t The tracker to record the visits on
+ * @param \MatomoTracker $t The tracker to record the visits on
* @param int $fixtureCounter Number of times this fixture has been run
* @param int $visitorCounter Visitor counter within this execution of the fixture
* @param boolean $doBulk Should this visit be left for bulk insert later, or processed now?
* @param array $params Other params as required to set up the visit
*/
- protected function trackVisit(\PiwikTracker $t, $fixtureCounter, $visitorCounter, $doBulk, array $params)
+ protected function trackVisit(\MatomoTracker $t, $fixtureCounter, $visitorCounter, $doBulk, array $params)
{
parent::trackVisit($t, $fixtureCounter, $visitorCounter, $doBulk, $params);
diff --git a/tests/PHPUnit/Fixtures/ManyVisitsWithMockLocationProvider.php b/tests/PHPUnit/Fixtures/ManyVisitsWithMockLocationProvider.php
index 887f542d7c..66dc09b052 100644
--- a/tests/PHPUnit/Fixtures/ManyVisitsWithMockLocationProvider.php
+++ b/tests/PHPUnit/Fixtures/ManyVisitsWithMockLocationProvider.php
@@ -30,7 +30,7 @@ class ManyVisitsWithMockLocationProvider extends Fixture
$this->nextDay = Date::factory($this->dateTime)->addDay(1)->getDatetime();
}
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->customDimensionId = CustomDimensions\API::getInstance()->configureNewCustomDimension($this->idSite, 'testdim', 'visit', '1');
@@ -41,7 +41,7 @@ class ManyVisitsWithMockLocationProvider extends Fixture
ManyVisitsWithGeoIP::unsetLocationProvider();
}
- public function tearDown()
+ public function tearDown(): void
{
ManyVisitsWithGeoIP::unsetLocationProvider();
}
@@ -138,7 +138,7 @@ class ManyVisitsWithMockLocationProvider extends Fixture
$this->trackOrders($t);
}
- private function trackActions(\PiwikTracker $t, &$visitorCounter, $actionType, $userAgents, $resolutions,
+ private function trackActions(\MatomoTracker $t, &$visitorCounter, $actionType, $userAgents, $resolutions,
$referrers = null, $customVars = null)
{
for ($i = 0; $i != 5; ++$i, ++$visitorCounter) {
@@ -207,7 +207,7 @@ class ManyVisitsWithMockLocationProvider extends Fixture
}
}
- private function trackAction(\PiwikTracker $t, $actionType, $visitorCounter, $actionNum)
+ private function trackAction(\MatomoTracker $t, $actionType, $visitorCounter, $actionNum)
{
if ($actionType == 'pageview') {
self::checkResponse($t->doTrackPageView(
diff --git a/tests/PHPUnit/Fixtures/ManyVisitsWithSubDirReferrersAndCustomVars.php b/tests/PHPUnit/Fixtures/ManyVisitsWithSubDirReferrersAndCustomVars.php
index dcd6b8e169..2551896b14 100644
--- a/tests/PHPUnit/Fixtures/ManyVisitsWithSubDirReferrersAndCustomVars.php
+++ b/tests/PHPUnit/Fixtures/ManyVisitsWithSubDirReferrersAndCustomVars.php
@@ -19,13 +19,13 @@ class ManyVisitsWithSubDirReferrersAndCustomVars extends Fixture
public $dateTime = '2010-03-05 11:22:33';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/OmniFixture.php b/tests/PHPUnit/Fixtures/OmniFixture.php
index 3b716a22c5..626580574c 100644
--- a/tests/PHPUnit/Fixtures/OmniFixture.php
+++ b/tests/PHPUnit/Fixtures/OmniFixture.php
@@ -122,7 +122,7 @@ class OmniFixture extends Fixture
return $result;
}
- public function setUp()
+ public function setUp(): void
{
$firstFixture = array_shift($this->fixtures);
$this->setUpFixture($firstFixture);
@@ -140,7 +140,7 @@ class OmniFixture extends Fixture
Option::set("Tests.forcedNowTimestamp", $this->now->getTimestamp());
}
- public function tearDown()
+ public function tearDown(): void
{
foreach ($this->fixtures as $fixture) {
echo "Tearing down " . get_class($fixture) . "...\n";
diff --git a/tests/PHPUnit/Fixtures/OneVisitSeveralPageViews.php b/tests/PHPUnit/Fixtures/OneVisitSeveralPageViews.php
index 33c6c3adfc..178f02d2d2 100644
--- a/tests/PHPUnit/Fixtures/OneVisitSeveralPageViews.php
+++ b/tests/PHPUnit/Fixtures/OneVisitSeveralPageViews.php
@@ -18,13 +18,13 @@ class OneVisitSeveralPageViews extends Fixture
public $dateTime = '2010-03-06 11:22:33';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/OneVisitWithAbnormalPageviewUrls.php b/tests/PHPUnit/Fixtures/OneVisitWithAbnormalPageviewUrls.php
index 49e78f32de..67500c6efc 100644
--- a/tests/PHPUnit/Fixtures/OneVisitWithAbnormalPageviewUrls.php
+++ b/tests/PHPUnit/Fixtures/OneVisitWithAbnormalPageviewUrls.php
@@ -19,13 +19,13 @@ class OneVisitWithAbnormalPageviewUrls extends Fixture
public $dateTime = '2010-03-06 11:22:33';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/OneVisitWithSiteSearch.php b/tests/PHPUnit/Fixtures/OneVisitWithSiteSearch.php
index af78854901..bf0f8f14a1 100644
--- a/tests/PHPUnit/Fixtures/OneVisitWithSiteSearch.php
+++ b/tests/PHPUnit/Fixtures/OneVisitWithSiteSearch.php
@@ -9,13 +9,13 @@ class OneVisitWithSiteSearch extends Fixture
public $dateTime = '2012-01-11 07:22:33';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/OneVisitorTwoVisits.php b/tests/PHPUnit/Fixtures/OneVisitorTwoVisits.php
index ed4a717aa8..0bbf1a673a 100644
--- a/tests/PHPUnit/Fixtures/OneVisitorTwoVisits.php
+++ b/tests/PHPUnit/Fixtures/OneVisitorTwoVisits.php
@@ -30,14 +30,14 @@ class OneVisitorTwoVisits extends Fixture
public $simulateIntegerOverflow = false;
public $maxUnsignedIntegerValue = '4294967295';
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->simulateIntegerOverflow();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
@@ -192,7 +192,7 @@ class OneVisitorTwoVisits extends Fixture
$t->setForceVisitDateTime(Date::factory($dateTime)->addHour(1)->getDatetime());
$t->setUrl('http://example.org/store/purchase.htm');
$t->setUrlReferrer('http://search.yahoo.com/search?p=purchase');
- // Temporary, until we implement 1st party cookies in PiwikTracker
+ // Temporary, until we implement 1st party cookies in MatomoTracker
$t->DEBUG_APPEND_URL = '&_idvc=2';
// Goal Tracking URL matching, testing custom referrer including keyword
diff --git a/tests/PHPUnit/Fixtures/RawArchiveDataWithTempAndInvalidated.php b/tests/PHPUnit/Fixtures/RawArchiveDataWithTempAndInvalidated.php
index b4f597b97a..b007548eae 100644
--- a/tests/PHPUnit/Fixtures/RawArchiveDataWithTempAndInvalidated.php
+++ b/tests/PHPUnit/Fixtures/RawArchiveDataWithTempAndInvalidated.php
@@ -355,7 +355,7 @@ class RawArchiveDataWithTempAndInvalidated extends Fixture
*/
public $february;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php b/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php
index 5865c114da..d7d096c736 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsAllConversions.php
@@ -21,13 +21,13 @@ class SomeVisitsAllConversions extends Fixture
public $idGoal_OneConversionPerVisit = 1;
public $idGoal_MultipleConversionPerVisit = 2;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php b/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php
index d8bd02903f..7a8826db71 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php
@@ -11,7 +11,7 @@ use Piwik\Date;
use Piwik\Plugins\Goals\API;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestingEnvironmentVariables;
-use PiwikTracker;
+use MatomoTracker;
/**
* Add one site and track many visits with custom variables & campaign IDs and
@@ -24,14 +24,14 @@ class SomeVisitsCustomVariablesCampaignsNotHeuristics extends Fixture
public $idGoal = 1;
private $tmpHost = '';
- public function setUp()
+ public function setUp(): void
{
$this->setPiwikEnvironmentOverrides();
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
}
@@ -211,7 +211,7 @@ class SomeVisitsCustomVariablesCampaignsNotHeuristics extends Fixture
private function getFirstPartyCookieDomainHash()
{
$host = \Piwik\Url::getHost();
- $cookiePath = PiwikTracker::DEFAULT_COOKIE_PATH;
+ $cookiePath = MatomoTracker::DEFAULT_COOKIE_PATH;
return substr(sha1( $host . $cookiePath), 0, 4);
}
@@ -219,7 +219,7 @@ class SomeVisitsCustomVariablesCampaignsNotHeuristics extends Fixture
* Test setting/getting the first party cookie via the PHP Tracking Client
* @param $t
*/
- private function testFirstPartyCookies(PiwikTracker $t)
+ private function testFirstPartyCookies(MatomoTracker $t)
{
$domainHash = $this->getFirstPartyCookieDomainHash();
$idCookieName = '_pk_id_1_' . $domainHash;
@@ -233,7 +233,7 @@ class SomeVisitsCustomVariablesCampaignsNotHeuristics extends Fixture
$_COOKIE[$customVarCookieName] = '{"1":["VAR 1 set, var 2 not set","yes"],"3":["var 3 set","yes!!!!"]}';
// test loading 'id' cookie
- self::assertContains("_viewts=" . $viewts, $t->getUrlTrackPageView());
+ self::assertStringContainsString("_viewts=" . $viewts, $t->getUrlTrackPageView());
self::assertEquals($uuid, $t->getVisitorId());
self::assertEquals($t->getAttributionInfo(), $_COOKIE[$refCookieName]);
self::assertEquals(array("VAR 1 set, var 2 not set", "yes"), $t->getCustomVariable(1));
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsManyPageviewsWithTransitions.php b/tests/PHPUnit/Fixtures/SomeVisitsManyPageviewsWithTransitions.php
index 3a91bf6a91..d2d9ce3714 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsManyPageviewsWithTransitions.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsManyPageviewsWithTransitions.php
@@ -9,7 +9,7 @@ namespace Piwik\Tests\Fixtures;
use Piwik\Date;
use Piwik\Tests\Framework\Fixture;
-use PiwikTracker;
+use MatomoTracker;
/**
* Adds one site and tracks a couple visits with many pageviews. The
@@ -22,13 +22,13 @@ class SomeVisitsManyPageviewsWithTransitions extends Fixture
private $prefixCounter = 0;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
@@ -137,7 +137,7 @@ class SomeVisitsManyPageviewsWithTransitions extends Fixture
$prefix = $prefixes[$this->prefixCounter % 4];
$this->prefixCounter = $this->prefixCounter + 1;
- /** @var $visit PiwikTracker */
+ /** @var $visit MatomoTracker */
$visit->setUrl($prefix . 'example.org/' . $path);
$visit->setForceVisitDateTime(Date::factory($dateTime)->addHour($timeOffset)->getDatetime());
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsWithLongUrls.php b/tests/PHPUnit/Fixtures/SomeVisitsWithLongUrls.php
index 52b5ca7044..60a60be815 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsWithLongUrls.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsWithLongUrls.php
@@ -19,13 +19,13 @@ class SomeVisitsWithLongUrls extends Fixture
public $dateTime = '2010-03-06 01:22:33';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsWithNonUnicodePageTitles.php b/tests/PHPUnit/Fixtures/SomeVisitsWithNonUnicodePageTitles.php
index 798ed1a620..18d2066619 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsWithNonUnicodePageTitles.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsWithNonUnicodePageTitles.php
@@ -19,13 +19,13 @@ class SomeVisitsWithNonUnicodePageTitles extends Fixture
public $idSite1 = 1;
public $dateTime = '2010-01-03 11:22:33';
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsites();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/SqlDump.php b/tests/PHPUnit/Fixtures/SqlDump.php
index 8c9175c8c1..94cddf0bc5 100644
--- a/tests/PHPUnit/Fixtures/SqlDump.php
+++ b/tests/PHPUnit/Fixtures/SqlDump.php
@@ -27,7 +27,7 @@ class SqlDump extends Fixture
public $tablesPrefix = 'piwik_';
public $dumpUrl = "http://piwik-team.s3.amazonaws.com/generated-logs-one-day.sql.gz";
- public function setUp()
+ public function setUp(): void
{
// drop all tables
Db::dropAllTables();
diff --git a/tests/PHPUnit/Fixtures/ThreeGoalsOnePageview.php b/tests/PHPUnit/Fixtures/ThreeGoalsOnePageview.php
index de0cb90db7..07c24faff9 100644
--- a/tests/PHPUnit/Fixtures/ThreeGoalsOnePageview.php
+++ b/tests/PHPUnit/Fixtures/ThreeGoalsOnePageview.php
@@ -23,14 +23,14 @@ class ThreeGoalsOnePageview extends Fixture
public $idGoal2 = 2;
public $idGoal3 = 3;
- public function setUp()
+ public function setUp(): void
{
Fixture::createSuperUser();
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/ThreeSitesWithManyVisitsWithSiteSearch.php b/tests/PHPUnit/Fixtures/ThreeSitesWithManyVisitsWithSiteSearch.php
index 9b90c82e85..e522c5e296 100644
--- a/tests/PHPUnit/Fixtures/ThreeSitesWithManyVisitsWithSiteSearch.php
+++ b/tests/PHPUnit/Fixtures/ThreeSitesWithManyVisitsWithSiteSearch.php
@@ -22,13 +22,13 @@ class ThreeSitesWithManyVisitsWithSiteSearch extends Fixture
public $idSite3 = 3;
public $dateTime = '2010-01-03 11:22:33';
- public function setUp()
+ public function setUp(): void
{
self::setUpWebsites();
self::trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/ThreeSitesWithSharedVisitors.php b/tests/PHPUnit/Fixtures/ThreeSitesWithSharedVisitors.php
index 56ad3fa841..d772a5e356 100644
--- a/tests/PHPUnit/Fixtures/ThreeSitesWithSharedVisitors.php
+++ b/tests/PHPUnit/Fixtures/ThreeSitesWithSharedVisitors.php
@@ -7,9 +7,7 @@
*/
namespace Piwik\Tests\Fixtures;
-use Piwik\Common;
use Piwik\Date;
-use Piwik\Db;
use Piwik\Tests\Framework\Fixture;
/**
@@ -22,13 +20,13 @@ class ThreeSitesWithSharedVisitors extends Fixture
public $idSite2 = 3;
public $dateTime = '2010-03-06 11:22:33';
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/ThreeVisitsWithCustomEvents.php b/tests/PHPUnit/Fixtures/ThreeVisitsWithCustomEvents.php
index 078a315078..330efd179a 100644
--- a/tests/PHPUnit/Fixtures/ThreeVisitsWithCustomEvents.php
+++ b/tests/PHPUnit/Fixtures/ThreeVisitsWithCustomEvents.php
@@ -10,7 +10,7 @@ namespace Piwik\Tests\Fixtures;
use Piwik\Date;
use Piwik\Plugins\Goals\API as APIGoals;
use Piwik\Tests\Framework\Fixture;
-use PiwikTracker;
+use MatomoTracker;
/**
* Tracks custom events
@@ -21,7 +21,7 @@ class ThreeVisitsWithCustomEvents extends Fixture
public $idSite = 1;
public static $idGoalTriggeredOnEventCategory = 3;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
@@ -82,13 +82,13 @@ class ThreeVisitsWithCustomEvents extends Fixture
}
- private function moveTimeForward(PiwikTracker $vis, $minutes)
+ private function moveTimeForward(MatomoTracker $vis, $minutes)
{
$hour = $minutes / 60;
return $vis->setForceVisitDateTime(Date::factory($this->dateTime)->addHour($hour)->getDatetime());
}
- protected function trackEventWithoutUrl(PiwikTracker $vis)
+ protected function trackEventWithoutUrl(MatomoTracker $vis)
{
$url = $vis->pageUrl;
$vis->setUrl('');
@@ -108,7 +108,7 @@ class ThreeVisitsWithCustomEvents extends Fixture
$vis->setUrl($url);
}
- protected function trackMusicPlaying(PiwikTracker $vis)
+ protected function trackMusicPlaying(MatomoTracker $vis)
{
$this->moveTimeForward($vis, 1);
$this->setMusicEventCustomVar($vis);
@@ -129,7 +129,7 @@ class ThreeVisitsWithCustomEvents extends Fixture
self::checkResponse($vis->doTrackEvent('Music', 'playEnd', 'La fiancée de l\'eau'));
}
- protected function trackMusicRatings(PiwikTracker $vis)
+ protected function trackMusicRatings(MatomoTracker $vis)
{
$this->moveTimeForward($vis, 5);
$this->setMusicEventCustomVar($vis);
@@ -140,7 +140,7 @@ class ThreeVisitsWithCustomEvents extends Fixture
self::checkResponse($vis->doTrackEvent('Music', 'rating', 'La fiancée de l\'eau', 10));
}
- protected function trackMovieWatchingIncludingInterval(PiwikTracker $vis)
+ protected function trackMovieWatchingIncludingInterval(MatomoTracker $vis)
{
// First a pageview so the time on page is tracked properly
$this->moveTimeForward($vis, 30);
@@ -208,14 +208,14 @@ class ThreeVisitsWithCustomEvents extends Fixture
self::checkResponse($vis->doTrackEvent('Movie', 'Purchase'));
}
- private function setMusicEventCustomVar(PiwikTracker $vis)
+ private function setMusicEventCustomVar(MatomoTracker $vis)
{
$vis->setCustomVariable($id = 1, $name = 'Page Scope Custom var', $value = 'should not appear in events report', $scope = 'page');
$vis->setCustomVariable($id = 1, $name = 'album', $value = 'En attendant les caravanes...', $scope = 'event');
$vis->setCustomVariable($id = 1, $name = 'genre', $value = 'World music', $scope = 'event');
}
- private function setMovieEventCustomVar(PiwikTracker $vis)
+ private function setMovieEventCustomVar(MatomoTracker $vis)
{
$vis->setCustomVariable($id = 1, $name = 'country', $value = '日本', $scope = 'event');
$vis->setCustomVariable($id = 2, $name = 'genre', $value = 'Greatest animated films', $scope = 'event');
@@ -226,7 +226,7 @@ class ThreeVisitsWithCustomEvents extends Fixture
$vis->setCustomVariable($id = 1, $name = 'Visit Scope Custom var', $value = 'should not appear in events report Bis', $scope = 'visit');
}
- public function tearDown()
+ public function tearDown(): void
{
}
} \ No newline at end of file
diff --git a/tests/PHPUnit/Fixtures/TwoSitesEcommerceOrderWithItems.php b/tests/PHPUnit/Fixtures/TwoSitesEcommerceOrderWithItems.php
index 9c24915796..fc6bb422a8 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesEcommerceOrderWithItems.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesEcommerceOrderWithItems.php
@@ -21,7 +21,7 @@ class TwoSitesEcommerceOrderWithItems extends Fixture
public $idSite2 = 2;
public $idGoalStandard = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
self::setUpScheduledReports($this->idSite);
@@ -30,7 +30,7 @@ class TwoSitesEcommerceOrderWithItems extends Fixture
$this->trackVisitsSite2($url = 'http://example-site2.com/index.htm');
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers.php b/tests/PHPUnit/Fixtures/TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers.php
index 6134f01ec6..29892783da 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers.php
@@ -26,13 +26,13 @@ class TwoSitesManyVisitsOverSeveralDaysWithSearchEngineReferrers extends Fixture
'justice )(&^#%$ NOT \'" corruption!',
);
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/TwoSitesTwoVisitorsDifferentDays.php b/tests/PHPUnit/Fixtures/TwoSitesTwoVisitorsDifferentDays.php
index 1f6afab1b8..3ac0bd51a0 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesTwoVisitorsDifferentDays.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesTwoVisitorsDifferentDays.php
@@ -27,14 +27,14 @@ class TwoSitesTwoVisitorsDifferentDays extends Fixture
const URL_IS_GOAL_WITH_CAMPAIGN_PARAMETERS = 'http://example.org/index.htm?pk_campaign=goal-matching-url-parameter';
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
self::setUpScheduledReports($this->idSite1);
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
@@ -132,7 +132,7 @@ class TwoSitesTwoVisitorsDifferentDays extends Fixture
$visitorB->setForceVisitDateTime(Date::factory($dateTime)->addHour($hoursOffset)->getDatetime());
// visitor_returning is set to 1 only when visit count more than 1
- // Temporary, until we implement 1st party cookies in PiwikTracker
+ // Temporary, until we implement 1st party cookies in MatomoTracker
$visitorB->DEBUG_APPEND_URL .= '&_idvc=2&_viewts=' . Date::factory($dateTime)->getTimestamp();
$protocol = (0 === $days % 2) ? 'http' : 'https';
diff --git a/tests/PHPUnit/Fixtures/TwoSitesVisitsInPast.php b/tests/PHPUnit/Fixtures/TwoSitesVisitsInPast.php
index 373b418992..4b5d3c8fd5 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesVisitsInPast.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesVisitsInPast.php
@@ -22,13 +22,13 @@ class TwoSitesVisitsInPast extends Fixture
public $idSite = 1;
public $idSite2 = 2;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/TwoSitesWithAnnotations.php b/tests/PHPUnit/Fixtures/TwoSitesWithAnnotations.php
index 90c98bb950..6b909ba43e 100644
--- a/tests/PHPUnit/Fixtures/TwoSitesWithAnnotations.php
+++ b/tests/PHPUnit/Fixtures/TwoSitesWithAnnotations.php
@@ -22,13 +22,13 @@ class TwoSitesWithAnnotations extends Fixture
public $idSite1 = 1;
public $idSite2 = 2;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->addAnnotations();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/TwoVisitsNoKeywordWithBot.php b/tests/PHPUnit/Fixtures/TwoVisitsNoKeywordWithBot.php
index ac1dfc4236..6623b931b9 100644
--- a/tests/PHPUnit/Fixtures/TwoVisitsNoKeywordWithBot.php
+++ b/tests/PHPUnit/Fixtures/TwoVisitsNoKeywordWithBot.php
@@ -20,13 +20,13 @@ class TwoVisitsNoKeywordWithBot extends Fixture
public $dateTime = '2010-03-06 11:22:33';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomVariables.php b/tests/PHPUnit/Fixtures/TwoVisitsWithCustomVariables.php
index 8840f9767b..c9e6e93aa2 100644
--- a/tests/PHPUnit/Fixtures/TwoVisitsWithCustomVariables.php
+++ b/tests/PHPUnit/Fixtures/TwoVisitsWithCustomVariables.php
@@ -28,13 +28,13 @@ class TwoVisitsWithCustomVariables extends Fixture
public $resolutionWidthToUse = 1111;
public $resolutionHeightToUse = 222;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/UITestFixture.php b/tests/PHPUnit/Fixtures/UITestFixture.php
index e83070eb8f..dd4dadea0a 100644
--- a/tests/PHPUnit/Fixtures/UITestFixture.php
+++ b/tests/PHPUnit/Fixtures/UITestFixture.php
@@ -66,7 +66,7 @@ class UITestFixture extends SqlDump
$this->xssTesting = new XssTesting();
}
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Fixtures/Utf8mb4.php b/tests/PHPUnit/Fixtures/Utf8mb4.php
index 20313332b9..7d61f28f8c 100644
--- a/tests/PHPUnit/Fixtures/Utf8mb4.php
+++ b/tests/PHPUnit/Fixtures/Utf8mb4.php
@@ -20,13 +20,13 @@ class Utf8mb4 extends Fixture
public $trackInvalidRequests = true;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/VisitOverSeveralDaysImportedLogs.php b/tests/PHPUnit/Fixtures/VisitOverSeveralDaysImportedLogs.php
index 16d6849a09..df3fcdadb9 100644
--- a/tests/PHPUnit/Fixtures/VisitOverSeveralDaysImportedLogs.php
+++ b/tests/PHPUnit/Fixtures/VisitOverSeveralDaysImportedLogs.php
@@ -19,13 +19,13 @@ class VisitOverSeveralDaysImportedLogs extends Fixture
public $dateTime = '2013-04-07 19:00:00';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/VisitsInDifferentTimezones.php b/tests/PHPUnit/Fixtures/VisitsInDifferentTimezones.php
index 88f31ba955..0cebc6d29a 100644
--- a/tests/PHPUnit/Fixtures/VisitsInDifferentTimezones.php
+++ b/tests/PHPUnit/Fixtures/VisitsInDifferentTimezones.php
@@ -25,13 +25,13 @@ class VisitsInDifferentTimezones extends Fixture
$this->date = Date::factory($this->dateTime)->toString();
}
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/VisitsOverSeveralDays.php b/tests/PHPUnit/Fixtures/VisitsOverSeveralDays.php
index 8f15052b02..d670799389 100644
--- a/tests/PHPUnit/Fixtures/VisitsOverSeveralDays.php
+++ b/tests/PHPUnit/Fixtures/VisitsOverSeveralDays.php
@@ -42,13 +42,13 @@ class VisitsOverSeveralDays extends Fixture
'http://mixi.jp',
);
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Fixtures/VisitsTwoWebsitesWithAdditionalVisits.php b/tests/PHPUnit/Fixtures/VisitsTwoWebsitesWithAdditionalVisits.php
index 3784ddb824..675ee917d0 100644
--- a/tests/PHPUnit/Fixtures/VisitsTwoWebsitesWithAdditionalVisits.php
+++ b/tests/PHPUnit/Fixtures/VisitsTwoWebsitesWithAdditionalVisits.php
@@ -21,13 +21,13 @@ class VisitsTwoWebsitesWithAdditionalVisits extends Fixture
public $idSite1 = 1;
public $idSite2 = 2;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsitesAndGoals();
$this->trackVisits();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/PHPUnit/Framework/Constraint/HttpResponseText.php b/tests/PHPUnit/Framework/Constraint/HttpResponseText.php
index 2225d9daf3..318a69ad8d 100644
--- a/tests/PHPUnit/Framework/Constraint/HttpResponseText.php
+++ b/tests/PHPUnit/Framework/Constraint/HttpResponseText.php
@@ -10,9 +10,10 @@ namespace Piwik\Tests\Framework\Constraint;
/**
* @deprecated
*/
-class HttpResponseText extends \PHPUnit_Framework_Constraint
+class HttpResponseText extends \PHPUnit\Framework\Constraint\Constraint
{
private $actualCode;
+ private $value;
/**
* @param string $value Expected response text.
@@ -47,7 +48,7 @@ class HttpResponseText extends \PHPUnit_Framework_Constraint
* @param mixed $other Value or object to evaluate.
* @return bool
*/
- public function matches($other)
+ public function matches($other): bool
{
$this->actualCode = $this->getResponse($other);
@@ -59,8 +60,8 @@ class HttpResponseText extends \PHPUnit_Framework_Constraint
*
* @return string
*/
- public function toString()
+ public function toString(): string
{
- return 'does not return response text ' . $this->exporter->export($this->value) . ' it is ' . $this->actualCode;
+ return 'does not return response text ' . $this->exporter()->export($this->value) . ' it is ' . $this->actualCode;
}
-}?>
+} \ No newline at end of file
diff --git a/tests/PHPUnit/Framework/Constraint/ResponseCode.php b/tests/PHPUnit/Framework/Constraint/ResponseCode.php
index fc0cae2f97..a9977a097d 100644
--- a/tests/PHPUnit/Framework/Constraint/ResponseCode.php
+++ b/tests/PHPUnit/Framework/Constraint/ResponseCode.php
@@ -10,9 +10,10 @@ namespace Piwik\Tests\Framework\Constraint;
/**
* @deprecated
*/
-class ResponseCode extends \PHPUnit_Framework_Constraint
+class ResponseCode extends \PHPUnit\Framework\Constraint\Constraint
{
private $actualCode;
+ private $value;
/**
* @param integer $value Expected response code
@@ -30,7 +31,7 @@ class ResponseCode extends \PHPUnit_Framework_Constraint
* @param mixed $other Value or object to evaluate.
* @return bool
*/
- public function matches($other)
+ public function matches($other): bool
{
$options = array(
CURLOPT_URL => $other,
@@ -55,8 +56,8 @@ class ResponseCode extends \PHPUnit_Framework_Constraint
*
* @return string
*/
- public function toString()
+ public function toString(): string
{
- return 'does not return response code ' . $this->exporter->export($this->value) . ' it is ' . $this->actualCode;
+ return 'does not return response code ' . $this->exporter()->export($this->value) . ' it is ' . $this->actualCode;
}
-}?>
+} \ No newline at end of file
diff --git a/tests/PHPUnit/Framework/Fixture.php b/tests/PHPUnit/Framework/Fixture.php
index e1308751bb..307daa838c 100644
--- a/tests/PHPUnit/Framework/Fixture.php
+++ b/tests/PHPUnit/Framework/Fixture.php
@@ -13,7 +13,7 @@ use Piwik\Archive;
use Piwik\ArchiveProcessor\PluginsArchiver;
use Piwik\Auth;
use Piwik\Auth\Password;
-use Piwik\Cache\Backend\File;
+use Matomo\Cache\Backend\File;
use Piwik\Cache as PiwikCache;
use Piwik\CliMulti\CliPhp;
use Piwik\Common;
@@ -25,14 +25,12 @@ use Piwik\Date;
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\FrontController;
-use Piwik\Ini\IniReader;
+use Matomo\Ini\IniReader;
use Piwik\Log;
use Piwik\NumberFormatter;
use Piwik\Option;
-use Piwik\Piwik;
use Piwik\Plugin;
use Piwik\Plugin\Manager;
-use Piwik\Plugins\API\ProcessedReport;
use Piwik\Plugins\LanguagesManager\API as APILanguagesManager;
use Piwik\Plugins\MobileMessaging\MobileMessaging;
use Piwik\Plugins\PrivacyManager\DoNotTrackHeaderChecker;
@@ -48,16 +46,13 @@ use Piwik\SettingsPiwik;
use Piwik\SettingsServer;
use Piwik\Singleton;
use Piwik\Site;
+use Piwik\Tests;
use Piwik\Tests\Framework\Mock\FakeAccess;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
use Piwik\Tracker;
use Piwik\Tracker\Cache;
-use Piwik\Translate;
-use Piwik\Url;
-use PHPUnit_Framework_Assert;
-use Piwik\Tests\Framework\TestingEnvironmentVariables;
-use PiwikTracker;
-use Piwik_LocalTracker;
+use MatomoTracker;
+use Matomo_LocalTracker;
use Piwik\Updater;
use Exception;
use ReflectionClass;
@@ -77,10 +72,10 @@ use ReflectionClass;
* merging some together.
* @since 2.8.0
*/
-class Fixture extends \PHPUnit_Framework_Assert
+class Fixture extends \PHPUnit\Framework\Assert
{
const IMAGES_GENERATED_ONLY_FOR_OS = 'linux';
- const IMAGES_GENERATED_FOR_PHP = '5.6';
+ const IMAGES_GENERATED_FOR_PHP = '7.2';
const IMAGES_GENERATED_FOR_GD = '2.1.0';
const DEFAULT_SITE_NAME = 'Piwik test';
@@ -179,13 +174,13 @@ class Fixture extends \PHPUnit_Framework_Assert
}
/** Adds data to Piwik. Creates sites, tracks visits, imports log files, etc. */
- public function setUp()
+ public function setUp(): void
{
// empty
}
/** Does any clean up. Most of the time there will be no need to clean up. */
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
@@ -404,12 +399,23 @@ class Fixture extends \PHPUnit_Framework_Assert
Plugin\API::unsetAllInstances();
$_GET = $_REQUEST = array();
- Translate::reset();
+ self::resetTranslations();
self::getConfig()->Plugins; // make sure Plugins exists in a config object for next tests that use Plugin\Manager
// since Plugin\Manager uses getFromGlobalConfig which doesn't init the config object
}
+ public static function resetTranslations()
+ {
+ StaticContainer::get('Piwik\Translation\Translator')->reset();
+ }
+
+ public static function loadAllTranslations()
+ {
+ StaticContainer::get('Piwik\Translation\Translator')->addDirectory(PIWIK_INCLUDE_PATH . '/lang');
+ Manager::getInstance()->loadPluginTranslations();
+ }
+
protected static function resetPluginsInstalledConfig()
{
$config = self::getConfig();
@@ -604,22 +610,22 @@ class Fixture extends \PHPUnit_Framework_Assert
}
/**
- * Returns a PiwikTracker object that you can then use to track pages or goals.
+ * Returns a MatomoTracker object that you can then use to track pages or goals.
*
* @param int $idSite
* @param string $dateTime
* @param boolean $defaultInit If set to true, the tracker object will have default IP, user agent, time, resolution, etc.
* @param bool $useLocal
*
- * @return PiwikTracker
+ * @return MatomoTracker
*/
public static function getTracker($idSite, $dateTime, $defaultInit = true, $useLocal = false)
{
if ($useLocal) {
require_once PIWIK_INCLUDE_PATH . '/tests/LocalTracker.php';
- $t = new Piwik_LocalTracker($idSite, self::getTrackerUrl());
+ $t = new Matomo_LocalTracker($idSite, self::getTrackerUrl());
} else {
- $t = new PiwikTracker($idSite, self::getTrackerUrl());
+ $t = new MatomoTracker($idSite, self::getTrackerUrl());
}
$t->setForceVisitDateTime($dateTime);
@@ -649,7 +655,7 @@ class Fixture extends \PHPUnit_Framework_Assert
$trans_gif_64 = "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
$expectedResponse = base64_decode($trans_gif_64);
- $url = "\n =========================== \n URL was: " . PiwikTracker::$DEBUG_LAST_REQUESTED_URL;
+ $url = "\n =========================== \n URL was: " . MatomoTracker::$DEBUG_LAST_REQUESTED_URL;
self::assertEquals($expectedResponse, $response, "Expected GIF beacon, got: <br/>\n"
. var_export($response, true)
. "\n If you are stuck, you can enable [Tracker] debug=1; in config.ini.php to get more debug info."
@@ -664,10 +670,10 @@ class Fixture extends \PHPUnit_Framework_Assert
$trans_gif_64 = "R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
$expectedResponse = base64_decode($trans_gif_64);
- self::assertContains($expectedResponse, $response);
- self::assertContains('This resource is part of Matomo.', $response);
- self::assertNotContains('Error', $response);
- self::assertNotContains('Fatal', $response);
+ self::assertStringContainsString($expectedResponse, $response);
+ self::assertStringContainsString('This resource is part of Matomo.', $response);
+ self::assertStringNotContainsString('Error', $response);
+ self::assertStringNotContainsString('Fatal', $response);
}
/**
diff --git a/tests/PHPUnit/Framework/Mock/TestConfig.php b/tests/PHPUnit/Framework/Mock/TestConfig.php
index 06e836c864..7fe0302e11 100644
--- a/tests/PHPUnit/Framework/Mock/TestConfig.php
+++ b/tests/PHPUnit/Framework/Mock/TestConfig.php
@@ -90,10 +90,6 @@ class TestConfig extends Config
$log =& $chain->get('log');
$database =& $chain->get('database');
- if ($testingEnvironment->configFileLocal) {
- $general['session_save_handler'] = 'dbtable';
- }
-
$log['log_writers'] = array('file');
// TODO: replace this and below w/ configOverride use
diff --git a/tests/PHPUnit/Framework/TestCase/BenchmarkTestCase.php b/tests/PHPUnit/Framework/TestCase/BenchmarkTestCase.php
index 3790b0f2a1..c4802942c6 100644
--- a/tests/PHPUnit/Framework/TestCase/BenchmarkTestCase.php
+++ b/tests/PHPUnit/Framework/TestCase/BenchmarkTestCase.php
@@ -27,7 +27,7 @@ abstract class BenchmarkTestCase extends SystemTestCase
{
public static $fixture;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
$dbName = false;
if (!empty($GLOBALS['PIWIK_BENCHMARK_DATABASE'])) {
@@ -69,7 +69,7 @@ abstract class BenchmarkTestCase extends SystemTestCase
}
}
- public static function tearDownAfterClass()
+ public static function tearDownAfterClass(): void
{
// only drop the database if PIWIK_BENCHMARK_DATABASE isn't set
$dropDatabase = empty($GLOBALS['PIWIK_BENCHMARK_DATABASE']);
@@ -83,7 +83,7 @@ abstract class BenchmarkTestCase extends SystemTestCase
{
require_once PIWIK_INCLUDE_PATH . '/tests/LocalTracker.php';
- $t = new \Piwik_LocalTracker($idSite, Fixture::getTrackerUrl());
+ $t = new \Matomo_LocalTracker($idSite, Fixture::getTrackerUrl());
$t->setUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)");
$t->setBrowserLanguage('fr');
$t->setLocalTime('12:34:06');
@@ -104,7 +104,7 @@ class Piwik_Test_Fixture_EmptyOneSite
public $period = 'day';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
// add one site
Fixture::createWebsite(
diff --git a/tests/PHPUnit/Framework/TestCase/ConsoleCommandTestCase.php b/tests/PHPUnit/Framework/TestCase/ConsoleCommandTestCase.php
index 91747847c2..46bd0546ff 100644
--- a/tests/PHPUnit/Framework/TestCase/ConsoleCommandTestCase.php
+++ b/tests/PHPUnit/Framework/TestCase/ConsoleCommandTestCase.php
@@ -71,7 +71,7 @@ class ConsoleCommandTestCase extends SystemTestCase
*/
protected $application;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Framework/TestCase/IntegrationTestCase.php b/tests/PHPUnit/Framework/TestCase/IntegrationTestCase.php
index 7d9013b3bc..5e46659a8a 100644
--- a/tests/PHPUnit/Framework/TestCase/IntegrationTestCase.php
+++ b/tests/PHPUnit/Framework/TestCase/IntegrationTestCase.php
@@ -46,18 +46,18 @@ abstract class IntegrationTestCase extends SystemTestCase
* If your test modifies table columns, you will need to recreate the database
* completely. This can be accomplished by:
*
- * public function setUp()
+ * public function setUp(): void
* {
* self::$fixture->performSetUp();
* }
*
- * public function tearDown()
+ * public function tearDown(): void
* {
* parent::tearDown();
* self::$fixture->performTearDown();
* }
*/
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
static::configureFixture(static::$fixture);
parent::setUpBeforeClass();
@@ -66,7 +66,7 @@ abstract class IntegrationTestCase extends SystemTestCase
self::$tableData = self::getDbTablesWithData();
}
- public static function tearDownAfterClass()
+ public static function tearDownAfterClass(): void
{
self::$tableData = array();
}
@@ -74,7 +74,7 @@ abstract class IntegrationTestCase extends SystemTestCase
/**
* Setup the database and create the base tables for all tests
*/
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -92,14 +92,13 @@ abstract class IntegrationTestCase extends SystemTestCase
PiwikCache::getEagerCache()->flushAll();
PiwikCache::getTransientCache()->flushAll();
- MenuAbstract::clearMenus();
Option::clearCache();
}
/**
* Resets all caches and drops the database
*/
- public function tearDown()
+ public function tearDown(): void
{
static::$fixture->clearInMemoryCaches();
static::$fixture->destroyEnvironment();
diff --git a/tests/PHPUnit/Framework/TestCase/SystemTestCase.php b/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
index 6622c6ea7a..1cc27afef4 100644
--- a/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
+++ b/tests/PHPUnit/Framework/TestCase/SystemTestCase.php
@@ -29,13 +29,11 @@ use Piwik\Tests\Framework\TestRequest\ApiTestConfig;
use Piwik\Tests\Framework\TestRequest\Collection;
use Piwik\Tests\Framework\TestRequest\Response;
use Piwik\Log;
-use PHPUnit_Framework_TestCase;
+use PHPUnit\Framework\TestCase;
use Piwik\Tests\Framework\Fixture;
use Piwik\Translation\Translator;
use Piwik\Url;
-require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php';
-
/**
* Base class for System tests.
*
@@ -43,7 +41,7 @@ require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php';
*
* @since 2.8.0
*/
-abstract class SystemTestCase extends PHPUnit_Framework_TestCase
+abstract class SystemTestCase extends TestCase
{
/**
* Identifies the last language used in an API/Controller call.
@@ -60,7 +58,7 @@ abstract class SystemTestCase extends PHPUnit_Framework_TestCase
*/
public static $fixture;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
Log::debug("Setting up " . get_called_class());
@@ -85,7 +83,7 @@ abstract class SystemTestCase extends PHPUnit_Framework_TestCase
}
}
- public static function tearDownAfterClass()
+ public static function tearDownAfterClass(): void
{
Log::debug("Tearing down " . get_called_class());
@@ -108,16 +106,6 @@ abstract class SystemTestCase extends PHPUnit_Framework_TestCase
return !empty($travis);
}
- public static function isPhpVersion53()
- {
- return strpos(PHP_VERSION, '5.3') === 0;
- }
-
- public static function isPhp7orLater()
- {
- return version_compare('7.0.0-dev', PHP_VERSION) < 1;
- }
-
public static function isMysqli()
{
return getenv('MYSQL_ADAPTER') == 'MYSQLI';
diff --git a/tests/PHPUnit/Framework/TestCase/UnitTestCase.php b/tests/PHPUnit/Framework/TestCase/UnitTestCase.php
index c196e59a7e..8c0516c3d6 100644
--- a/tests/PHPUnit/Framework/TestCase/UnitTestCase.php
+++ b/tests/PHPUnit/Framework/TestCase/UnitTestCase.php
@@ -19,14 +19,14 @@ use Piwik\Tests\Framework\Mock\File;
*
* @since 2.10.0
*/
-abstract class UnitTestCase extends \PHPUnit_Framework_TestCase
+abstract class UnitTestCase extends \PHPUnit\Framework\TestCase
{
/**
* @var Environment
*/
protected $environment;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -35,7 +35,7 @@ abstract class UnitTestCase extends \PHPUnit_Framework_TestCase
File::reset();
}
- public function tearDown()
+ public function tearDown(): void
{
File::reset();
diff --git a/tests/PHPUnit/Framework/TestDataHelper/LogHelper.php b/tests/PHPUnit/Framework/TestDataHelper/LogHelper.php
index 2346191dd2..0aaac97cd4 100644
--- a/tests/PHPUnit/Framework/TestDataHelper/LogHelper.php
+++ b/tests/PHPUnit/Framework/TestDataHelper/LogHelper.php
@@ -9,7 +9,7 @@
namespace Piwik\Tests\Framework\TestDataHelper;
use Piwik\Common;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Db;
/**
diff --git a/tests/PHPUnit/Framework/TestRequest/Response.php b/tests/PHPUnit/Framework/TestRequest/Response.php
index 24ddae506d..0e6e062366 100644
--- a/tests/PHPUnit/Framework/TestRequest/Response.php
+++ b/tests/PHPUnit/Framework/TestRequest/Response.php
@@ -9,7 +9,7 @@
namespace Piwik\Tests\Framework\TestRequest;
use Piwik\API\Request;
-use PHPUnit_Framework_Assert as Asserts;
+use PHPUnit\Framework\Assert as Asserts;
use Exception;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
diff --git a/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php b/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php
index 12b648fe67..1138b3ca71 100644
--- a/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php
+++ b/tests/PHPUnit/Framework/TestingEnvironmentManipulator.php
@@ -107,7 +107,7 @@ class TestingEnvironmentManipulator implements EnvironmentManipulator
\Piwik\Profiler::setupProfilerXHProf($mainRun = false, $setupDuringTracking = true);
}
- \Piwik\Cache\Backend\File::$invalidateOpCacheBeforeRead = true;
+ \Matomo\Cache\Backend\File::$invalidateOpCacheBeforeRead = true;
}
public function onEnvironmentBootstrapped()
@@ -253,6 +253,10 @@ class TestingEnvironmentManipulator implements EnvironmentManipulator
$plugins = $this->getPluginAndRequiredPlugins($pluginName, $plugins);
}
+ $pluginsToUnload = $this->vars->pluginsToUnload ?? [];
+
+ $plugins = array_diff($plugins, $pluginsToUnload);
+
return $plugins;
}
diff --git a/tests/PHPUnit/Framework/TestingEnvironmentVariables.php b/tests/PHPUnit/Framework/TestingEnvironmentVariables.php
index 6c611dd624..06dfcdd999 100644
--- a/tests/PHPUnit/Framework/TestingEnvironmentVariables.php
+++ b/tests/PHPUnit/Framework/TestingEnvironmentVariables.php
@@ -104,11 +104,11 @@ class TestingEnvironmentVariables
$pluginManager = new PluginManager($pluginList);
$disabledPlugins = $pluginList->getCorePluginsDisabledByDefault();
- $disabledPlugins[] = 'LoginHttpAuth';
$disabledPlugins[] = 'LoginLdap';
$disabledPlugins[] = 'MarketingCampaignsReporting';
$disabledPlugins[] = 'ExampleVisualization';
$disabledPlugins[] = 'DeviceDetectorCache';
+ $disabledPlugins[] = 'Provider';
$disabledPlugins = array_diff($disabledPlugins, array(
'DBStats', 'ExampleUI', 'ExampleCommand', 'ExampleSettingsPlugin'
@@ -135,4 +135,4 @@ class TestingEnvironmentVariables
$this->behaviorOverrideProperties = json_decode(file_get_contents($overridePath), true);
}
}
-} \ No newline at end of file
+}
diff --git a/tests/PHPUnit/Framework/XssTesting.php b/tests/PHPUnit/Framework/XssTesting.php
index 4e9160562a..ba2853a40e 100644
--- a/tests/PHPUnit/Framework/XssTesting.php
+++ b/tests/PHPUnit/Framework/XssTesting.php
@@ -170,7 +170,7 @@ JS;
$actualEntries = array_values($actualEntries);
try {
- \PHPUnit_Framework_Assert::assertEquals($expectedEntries, $actualEntries);
+ \PHPUnit\Framework\Assert::assertEquals($expectedEntries, $actualEntries);
} catch (\Exception $ex) {
print "XssTesting::sanityCheck() failed, got: " . var_export($actualEntries, true)
. "\nexpected: " . var_export($expectedEntries, true);
diff --git a/tests/PHPUnit/Integration/API/RequestTest.php b/tests/PHPUnit/Integration/API/RequestTest.php
index 2ef1576b60..809a876925 100644
--- a/tests/PHPUnit/Integration/API/RequestTest.php
+++ b/tests/PHPUnit/Integration/API/RequestTest.php
@@ -18,9 +18,9 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class RequestTest extends IntegrationTestCase
{
- /** @var \Piwik\Auth|\PHPUnit_Framework_MockObject_MockObject */
+ /** @var \Piwik\Auth|\PHPUnit\Framework\MockObject\MockObject */
private $auth;
- /** @var \Piwik\Access|\PHPUnit_Framework_MockObject_MockObject */
+ /** @var \Piwik\Access|\PHPUnit\Framework\MockObject\MockObject */
private $access;
private $userAuthToken = 'token';
diff --git a/tests/PHPUnit/Integration/AccessTest.php b/tests/PHPUnit/Integration/AccessTest.php
index 69c3898712..d1eeec96ea 100644
--- a/tests/PHPUnit/Integration/AccessTest.php
+++ b/tests/PHPUnit/Integration/AccessTest.php
@@ -11,7 +11,7 @@ namespace Piwik\Tests\Integration;
use Exception;
use Piwik\Access;
use Piwik\AuthResult;
-use Piwik\Cache\Cache;
+use Matomo\Cache\Cache;
use Piwik\Db;
use Piwik\NoAccessException;
use Piwik\Piwik;
@@ -167,11 +167,9 @@ class AccessTest extends IntegrationTestCase
$this->assertEmpty($access->getSitesIdWithViewAccess());
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasSuperUserAccessWithEmptyAccess()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$access = $this->getAccess();
$access->checkUserHasSuperUserAccess();
}
@@ -183,11 +181,9 @@ class AccessTest extends IntegrationTestCase
$access->checkUserHasSuperUserAccess();
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasSomeAdminAccessWithEmptyAccess()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$access = $this->getAccess();
$access->checkUserHasSomeAdminAccess();
}
@@ -212,38 +208,30 @@ class AccessTest extends IntegrationTestCase
$this->assertFalse($access->isUserHasSomeAdminAccess());
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function test_CheckUserHasSomeAdminAccessWithSomeAccessFails_IfUserHasPermissionsToSitesButIsNotAuthenticated()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$mock = $this->createAccessMockWithAccessToSitesButUnauthenticated(array(2, 9));
$mock->checkUserHasSomeAdminAccess();
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function test_checkUserHasAdminAccessFails_IfUserHasPermissionsToSitesButIsNotAuthenticated()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$mock = $this->createAccessMockWithAccessToSitesButUnauthenticated(array(2, 9));
$mock->checkUserHasAdminAccess('2');
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function test_checkUserHasSomeViewAccessFails_IfUserHasPermissionsToSitesButIsNotAuthenticated()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$mock = $this->createAccessMockWithAccessToSitesButUnauthenticated(array(2, 9));
$mock->checkUserHasSomeViewAccess();
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function test_checkUserHasViewAccessFails_IfUserHasPermissionsToSitesButIsNotAuthenticated()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$mock = $this->createAccessMockWithAccessToSitesButUnauthenticated(array(2, 9));
$mock->checkUserHasViewAccess('2');
}
@@ -259,11 +247,9 @@ class AccessTest extends IntegrationTestCase
$mock->checkUserHasSomeAdminAccess();
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasSomeViewAccessWithEmptyAccess()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$access = $this->getAccess();
$access->checkUserHasSomeViewAccess();
}
@@ -297,11 +283,9 @@ class AccessTest extends IntegrationTestCase
$mock->checkUserHasSomeWriteAccess();
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasSomeWriteAccessWithSomeAccessDoesNotHaveAccess()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$mock = $this->createAccessMockWithAuthenticatedUser(array('getRawSitesWithSomeViewAccess'));
$mock->expects($this->once())
@@ -311,11 +295,9 @@ class AccessTest extends IntegrationTestCase
$mock->checkUserHasSomeWriteAccess();
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasViewAccessWithEmptyAccessNoSiteIdsGiven()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$access = $this->getAccess();
$access->checkUserHasViewAccess(array());
}
@@ -351,12 +333,10 @@ class AccessTest extends IntegrationTestCase
$mock->checkUserHasViewAccess('all');
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasViewAccessWithSomeAccessFailure()
{
- $mock = $this->getMockBuilder('Piwik\Access')->setMethods(array('getSitesIdWithAtLeastViewAccess'))->getMock();
+ $this->expectException(\Piwik\NoAccessException::class);
+ $mock = $this->getMockBuilder('Piwik\Access')->onlyMethods(array('getSitesIdWithAtLeastViewAccess'))->getMock();
$mock->expects($this->once())
->method('getSitesIdWithAtLeastViewAccess')
@@ -365,11 +345,9 @@ class AccessTest extends IntegrationTestCase
$mock->checkUserHasViewAccess(array(1, 5));
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasWriteAccessWithEmptyAccessNoSiteIdsGiven()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$access = $this->getAccess();
$access->checkUserHasWriteAccess(array());
}
@@ -381,12 +359,10 @@ class AccessTest extends IntegrationTestCase
$access->checkUserHasWriteAccess(array());
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasWriteAccessWithSomeAccessFailure()
{
- $mock = $this->getMockBuilder('Piwik\Access')->setMethods(array('getSitesIdWithAtLeastWriteAccess'))->getMock();
+ $this->expectException(\Piwik\NoAccessException::class);
+ $mock = $this->getMockBuilder('Piwik\Access')->onlyMethods(array('getSitesIdWithAtLeastWriteAccess'))->getMock();
$mock->expects($this->once())
->method('getSitesIdWithAtLeastWriteAccess')
@@ -402,18 +378,16 @@ class AccessTest extends IntegrationTestCase
$access->checkUserHasAdminAccess(array());
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasAdminAccessWithEmptyAccessNoSiteIdsGiven()
{
+ $this->expectException(\Piwik\NoAccessException::class);
$access = $this->getAccess();
$access->checkUserHasViewAccess(array());
}
public function testCheckUserHasAdminAccessWithSomeAccessSuccessIdSitesAsString()
{
- $mock = $this->getMock(
+ $mock = $this->createPartialMock(
'Piwik\Access',
array('getSitesIdWithAdminAccess')
);
@@ -427,7 +401,7 @@ class AccessTest extends IntegrationTestCase
public function testCheckUserHasAdminAccessWithSomeAccessSuccessAllSites()
{
- $mock = $this->getMock(
+ $mock = $this->createPartialMock(
'Piwik\Access',
array('getSitesIdWithAdminAccess', 'getSitesIdWithAtLeastViewAccess')
);
@@ -443,12 +417,10 @@ class AccessTest extends IntegrationTestCase
$mock->checkUserHasAdminAccess('all');
}
- /**
- * @expectedException \Piwik\NoAccessException
- */
public function testCheckUserHasAdminAccessWithSomeAccessFailure()
{
- $mock = $this->getMock(
+ $this->expectException(\Piwik\NoAccessException::class);
+ $mock = $this->createPartialMock(
'Piwik\Access',
array('getSitesIdWithAdminAccess')
);
@@ -697,7 +669,7 @@ class AccessTest extends IntegrationTestCase
private function createPiwikAuthMockInstance()
{
return $this->getMockBuilder('Piwik\\Auth')
- ->setMethods(array('authenticate', 'getName', 'getTokenAuthSecret', 'getLogin', 'setTokenAuth', 'setLogin',
+ ->onlyMethods(array('authenticate', 'getName', 'getTokenAuthSecret', 'getLogin', 'setTokenAuth', 'setLogin',
'setPassword', 'setPasswordHash'))
->getMock();
}
@@ -705,7 +677,7 @@ class AccessTest extends IntegrationTestCase
private function createAccessMockWithAccessToSitesButUnauthenticated($idSites)
{
$mock = $this->getMockBuilder('Piwik\Access')
- ->setMethods(array('getRawSitesWithSomeViewAccess', 'loadSitesIfNeeded'))
+ ->onlyMethods(array('getRawSitesWithSomeViewAccess', 'loadSitesIfNeeded'))
->getMock();
// this method will be actually never called as it is unauthenticated. The tests are supposed to fail if it
@@ -719,7 +691,7 @@ class AccessTest extends IntegrationTestCase
private function createAccessMockWithAuthenticatedUser($methodsToMock = array())
{
- $methods = array('authenticate');
+ $methods = [];
foreach ($methodsToMock as $methodToMock) {
$methods[] = $methodToMock;
@@ -730,7 +702,7 @@ class AccessTest extends IntegrationTestCase
->method('authenticate')
->will($this->returnValue(new AuthResult(AuthResult::SUCCESS, 'login', 'token')));
- $mock = $this->getMockBuilder('Piwik\Access')->setMethods($methods)->getMock();
+ $mock = $this->getMockBuilder('Piwik\Access')->onlyMethods($methods)->getMock();
$mock->reloadAccess($authMock);
return $mock;
diff --git a/tests/PHPUnit/Integration/Application/Kernel/PluginListTest.php b/tests/PHPUnit/Integration/Application/Kernel/PluginListTest.php
index a7759df1b1..a8f0df2369 100644
--- a/tests/PHPUnit/Integration/Application/Kernel/PluginListTest.php
+++ b/tests/PHPUnit/Integration/Application/Kernel/PluginListTest.php
@@ -14,7 +14,7 @@ use Piwik\Container\StaticContainer;
* @group PluginListTest
* @group Core
*/
-class PluginListTest extends \PHPUnit_Framework_TestCase
+class PluginListTest extends \PHPUnit\Framework\TestCase
{
/**
@@ -22,7 +22,7 @@ class PluginListTest extends \PHPUnit_Framework_TestCase
*/
private $pluginList = array();
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->pluginList = $this->makePluginList();
diff --git a/tests/PHPUnit/Integration/Archive/ArchivePurgerTest.php b/tests/PHPUnit/Integration/Archive/ArchivePurgerTest.php
index 8045376478..9a0bed2301 100644
--- a/tests/PHPUnit/Integration/Archive/ArchivePurgerTest.php
+++ b/tests/PHPUnit/Integration/Archive/ArchivePurgerTest.php
@@ -41,7 +41,7 @@ class ArchivePurgerTest extends IntegrationTestCase
*/
private $february;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Archive/ChunksTest.php b/tests/PHPUnit/Integration/Archive/ChunksTest.php
index aba383174f..bd8621b8e8 100644
--- a/tests/PHPUnit/Integration/Archive/ChunksTest.php
+++ b/tests/PHPUnit/Integration/Archive/ChunksTest.php
@@ -33,7 +33,7 @@ class ChunksTest extends IntegrationTestCase
{
private $date = '2015-01-01';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Archive/DataTableFactoryTest.php b/tests/PHPUnit/Integration/Archive/DataTableFactoryTest.php
index 0339cd0473..2f19a7732c 100644
--- a/tests/PHPUnit/Integration/Archive/DataTableFactoryTest.php
+++ b/tests/PHPUnit/Integration/Archive/DataTableFactoryTest.php
@@ -42,7 +42,7 @@ class DataTableFactoryTest extends IntegrationTestCase
'nb_visits' => 97
);
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -267,12 +267,11 @@ class DataTableFactoryTest extends IntegrationTestCase
$this->assertRowEquals($row3, $this->site2, $map->getTable($this->date2)->getRowFromId(1));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage supposed to work with non-numeric data types but it is not tested
- */
public function test_makeMerged_shouldThrowAnException_IfANonNumericDataTypeIsGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('supposed to work with non-numeric data types but it is not tested');
+
$dataType = 'blob';
$dataNames = array('nb_visits');
diff --git a/tests/PHPUnit/Integration/ArchiveProcessingTest.php b/tests/PHPUnit/Integration/ArchiveProcessingTest.php
index 0a493dff34..5c53c4a2b1 100644
--- a/tests/PHPUnit/Integration/ArchiveProcessingTest.php
+++ b/tests/PHPUnit/Integration/ArchiveProcessingTest.php
@@ -40,7 +40,7 @@ class ArchiveProcessorTest extends ArchiveProcessor\Loader
*/
class ArchiveProcessingTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -50,7 +50,7 @@ class ArchiveProcessingTest extends IntegrationTestCase
ArchiveTableCreator::$tablesAlreadyInstalled = null;
}
- public function tearDown()
+ public function tearDown(): void
{
ArchiveTableCreator::$tablesAlreadyInstalled = null;
}
diff --git a/tests/PHPUnit/Integration/ArchiveProcessor/ArchivingStatusTest.php b/tests/PHPUnit/Integration/ArchiveProcessor/ArchivingStatusTest.php
index 4db7bd10d4..0372f7421f 100644
--- a/tests/PHPUnit/Integration/ArchiveProcessor/ArchivingStatusTest.php
+++ b/tests/PHPUnit/Integration/ArchiveProcessor/ArchivingStatusTest.php
@@ -22,7 +22,7 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
class ArchivingStatusTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/ArchiveProcessor/ParametersTest.php b/tests/PHPUnit/Integration/ArchiveProcessor/ParametersTest.php
index 39fb445c25..ed6c2d3ee8 100644
--- a/tests/PHPUnit/Integration/ArchiveProcessor/ParametersTest.php
+++ b/tests/PHPUnit/Integration/ArchiveProcessor/ParametersTest.php
@@ -19,7 +19,7 @@ use Piwik\Period;
class ParametersTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/ArchiveProcessor/PluginsArchiverTest.php b/tests/PHPUnit/Integration/ArchiveProcessor/PluginsArchiverTest.php
index 587fd92662..613e88c9cb 100644
--- a/tests/PHPUnit/Integration/ArchiveProcessor/PluginsArchiverTest.php
+++ b/tests/PHPUnit/Integration/ArchiveProcessor/PluginsArchiverTest.php
@@ -60,7 +60,7 @@ class PluginsArchiverTest extends IntegrationTestCase
*/
private $pluginsArchiver;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -81,13 +81,12 @@ class PluginsArchiverTest extends IntegrationTestCase
return $params;
}
- /**
- * @expectedException \Piwik\ArchiveProcessor\PluginsArchiverException
- * @expectedExceptionMessage Failed query foo bar - in plugin MyPluginName
- * @expectedExceptionCode 42
- */
public function test_purgeOutdatedArchives_PurgesCorrectTemporaryArchives_WhileKeepingNewerTemporaryArchives_WithBrowserTriggeringEnabled()
{
+ $this->expectException(\Piwik\ArchiveProcessor\PluginsArchiverException::class);
+ $this->expectExceptionCode(42);
+ $this->expectExceptionMessage('Failed query foo bar - in plugin MyPluginName');
+
$this->pluginsArchiver->callAggregateAllPlugins(1, 1);
}
diff --git a/tests/PHPUnit/Integration/ArchiveWithNoVisitsTest.php b/tests/PHPUnit/Integration/ArchiveWithNoVisitsTest.php
index 58a7dafb33..feb0dc8b17 100644
--- a/tests/PHPUnit/Integration/ArchiveWithNoVisitsTest.php
+++ b/tests/PHPUnit/Integration/ArchiveWithNoVisitsTest.php
@@ -40,7 +40,7 @@ class ArchiveWithNoVisitsTest_MockArchiver extends Archiver
class ArchiveWithNoVisitsTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/AssetManager/UIAssetMinifierTest.php b/tests/PHPUnit/Integration/AssetManager/UIAssetMinifierTest.php
index c45c92876a..3448607b61 100644
--- a/tests/PHPUnit/Integration/AssetManager/UIAssetMinifierTest.php
+++ b/tests/PHPUnit/Integration/AssetManager/UIAssetMinifierTest.php
@@ -11,14 +11,14 @@ namespace Piwik\Tests\Integration\AssetManager;
use Piwik\AssetManager\UIAsset\OnDiskUIAsset;
use Piwik\AssetManager\UIAssetMinifier;
-class UIAssetMinifierTest extends \PHPUnit_Framework_TestCase
+class UIAssetMinifierTest extends \PHPUnit\Framework\TestCase
{
/**
* @var UIAssetMinifier
*/
private $assetMinifier;
- public function setUp()
+ public function setUp(): void
{
$this->assetMinifier = UIAssetMinifier::getInstance();
}
diff --git a/tests/PHPUnit/Integration/AssetManagerTest.php b/tests/PHPUnit/Integration/AssetManagerTest.php
index 82654af55a..3a5e165071 100644
--- a/tests/PHPUnit/Integration/AssetManagerTest.php
+++ b/tests/PHPUnit/Integration/AssetManagerTest.php
@@ -61,7 +61,7 @@ class AssetManagerTest extends IntegrationTestCase
*/
private $pluginManager;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -80,7 +80,7 @@ class AssetManagerTest extends IntegrationTestCase
$this->setUpPlugins();
}
- public function tearDown()
+ public function tearDown(): void
{
if ($this->assetManager !== null) {
$this->assetManager->removeMergedAssets();
diff --git a/tests/PHPUnit/Integration/CacheIdTest.php b/tests/PHPUnit/Integration/CacheIdTest.php
index 3795005148..7865d8d11c 100644
--- a/tests/PHPUnit/Integration/CacheIdTest.php
+++ b/tests/PHPUnit/Integration/CacheIdTest.php
@@ -9,8 +9,8 @@
namespace Piwik\Tests\Integration;
use Piwik\CacheId;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
/**
* @group Cache
@@ -18,14 +18,14 @@ use Piwik\Translate;
*/
class CacheIdTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::reset();
+ Fixture::resetTranslations();
}
public function test_languageAware_shouldAppendTheLoadedLanguage()
diff --git a/tests/PHPUnit/Integration/CacheTest.php b/tests/PHPUnit/Integration/CacheTest.php
index a2d1fe06b8..097553a900 100644
--- a/tests/PHPUnit/Integration/CacheTest.php
+++ b/tests/PHPUnit/Integration/CacheTest.php
@@ -25,7 +25,7 @@ class CacheTest extends IntegrationTestCase
$cache->save('test', 'mycontent'); // make sure something was changed, otherwise it won't save anything
/** @var Cache\Backend $backend */
- $backend = StaticContainer::get('Piwik\Cache\Backend');
+ $backend = StaticContainer::get('Matomo\Cache\Backend');
$this->assertFalse($backend->doContains($storageId));
$result = ''; $module = 'CoreHome'; $action = 'index'; $params = array();
diff --git a/tests/PHPUnit/Integration/CliMulti/OutputTest.php b/tests/PHPUnit/Integration/CliMulti/OutputTest.php
index c01993f459..e0a897d526 100644
--- a/tests/PHPUnit/Integration/CliMulti/OutputTest.php
+++ b/tests/PHPUnit/Integration/CliMulti/OutputTest.php
@@ -15,14 +15,14 @@ use Piwik\Url;
/**
* @group CliMulti
*/
-class OutputTest extends \PHPUnit_Framework_TestCase
+class OutputTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Output
*/
private $output;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -31,7 +31,7 @@ class OutputTest extends \PHPUnit_Framework_TestCase
$this->output = new Output('myid');
}
- public function tearDown()
+ public function tearDown(): void
{
if(is_object($this->output)){
$this->output->destroy();
@@ -42,12 +42,11 @@ class OutputTest extends \PHPUnit_Framework_TestCase
parent::tearDown();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The given output id has an invalid format
- */
public function test_construct_shouldFail_IfInvalidOutputIdGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The given output id has an invalid format');
+
new Output('../../');
}
diff --git a/tests/PHPUnit/Integration/CliMulti/ProcessTest.php b/tests/PHPUnit/Integration/CliMulti/ProcessTest.php
index 61da75b9ed..5c14919a71 100644
--- a/tests/PHPUnit/Integration/CliMulti/ProcessTest.php
+++ b/tests/PHPUnit/Integration/CliMulti/ProcessTest.php
@@ -15,14 +15,14 @@ use ReflectionProperty;
/**
* @group CliMulti
*/
-class ProcessTest extends \PHPUnit_Framework_TestCase
+class ProcessTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Process
*/
private $process;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -30,7 +30,7 @@ class ProcessTest extends \PHPUnit_Framework_TestCase
$this->process = new Process('testPid');
}
- public function tearDown()
+ public function tearDown(): void
{
if(is_object($this->process)){
$this->process->finishProcess();
@@ -38,12 +38,11 @@ class ProcessTest extends \PHPUnit_Framework_TestCase
File::reset();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The given pid has an invalid format
- */
public function test_construct_shouldFailInCasePidIsInvalid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The given pid has an invalid format');
+
new Process('../../htaccess');
}
diff --git a/tests/PHPUnit/Integration/Columns/ComputedMetricFactoryTest.php b/tests/PHPUnit/Integration/Columns/ComputedMetricFactoryTest.php
index d83a6f5c9e..ea852ce60a 100644
--- a/tests/PHPUnit/Integration/Columns/ComputedMetricFactoryTest.php
+++ b/tests/PHPUnit/Integration/Columns/ComputedMetricFactoryTest.php
@@ -11,8 +11,8 @@ namespace Piwik\Tests\Integration\Columns;
use Piwik\Columns\ComputedMetricFactory;
use Piwik\Columns\MetricsList;
use Piwik\Plugin\ComputedMetric;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
/**
* @group Core
@@ -24,18 +24,18 @@ class ComputedMetricFactoryTest extends IntegrationTestCase
*/
private $factory;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- Translate::loadEnglishTranslation();
+ Fixture::loadAllTranslations();
$this->factory = new ComputedMetricFactory(MetricsList::get());
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::unloadEnglishTranslation();
+ Fixture::resetTranslations();
parent::tearDown();
}
diff --git a/tests/PHPUnit/Integration/Columns/DimensionMetricFactoryTest.php b/tests/PHPUnit/Integration/Columns/DimensionMetricFactoryTest.php
index 0957d64350..c92d2da0a7 100644
--- a/tests/PHPUnit/Integration/Columns/DimensionMetricFactoryTest.php
+++ b/tests/PHPUnit/Integration/Columns/DimensionMetricFactoryTest.php
@@ -8,15 +8,13 @@
namespace Piwik\Tests\Integration\Columns;
-use Piwik\Columns\ComputedMetricFactory;
use Piwik\Columns\Dimension;
use Piwik\Columns\DimensionMetricFactory;
-use Piwik\Columns\MetricsList;
use Piwik\Plugin\ArchivedMetric;
use Piwik\Plugin\ComputedMetric;
use Piwik\Plugins\UserCountry\Columns\Country;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
/**
* @group Core
@@ -26,18 +24,18 @@ class DimensionMetricFactoryTest extends IntegrationTestCase
/** @var Dimension */
private $country;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- Translate::loadEnglishTranslation();
+ Fixture::loadAllTranslations();
$this->country = new Country();
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::unloadEnglishTranslation();
+ Fixture::resetTranslations();
parent::tearDown();
}
diff --git a/tests/PHPUnit/Integration/Columns/DimensionTest.php b/tests/PHPUnit/Integration/Columns/DimensionTest.php
index c18c9f66fc..551da965d8 100644
--- a/tests/PHPUnit/Integration/Columns/DimensionTest.php
+++ b/tests/PHPUnit/Integration/Columns/DimensionTest.php
@@ -19,7 +19,6 @@ use Piwik\Plugin\Dimension\VisitDimension;
use Piwik\Plugin\Manager;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
class CustomDimensionTest extends Dimension
{
@@ -80,11 +79,11 @@ class ColumnDimensionTest extends IntegrationTestCase
*/
private $dimension;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- Translate::loadEnglishTranslation();
+ Fixture::loadAllTranslations();
Fixture::createWebsite('2014-04-05 01:02:03');
@@ -94,9 +93,9 @@ class ColumnDimensionTest extends IntegrationTestCase
$this->dimension = new CustomDimensionTest();
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::unloadEnglishTranslation();
+ Fixture::resetTranslations();
parent::tearDown();
}
diff --git a/tests/PHPUnit/Integration/Columns/UpdaterTest.php b/tests/PHPUnit/Integration/Columns/UpdaterTest.php
index 757697803b..c9ca49d0c8 100644
--- a/tests/PHPUnit/Integration/Columns/UpdaterTest.php
+++ b/tests/PHPUnit/Integration/Columns/UpdaterTest.php
@@ -59,7 +59,7 @@ class UpdaterTest extends IntegrationTestCase
*/
private $columnsUpdater;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -92,33 +92,6 @@ class UpdaterTest extends IntegrationTestCase
$this->tableColumnsCache = array();
}
- public function test_getMigrationQueries_ReturnsCorrectQueries_IfDimensionIsNotInTable()
- {
- $updater = $this->getMockUpdater();
- $actualMigrationQueries = $this->columnsUpdater->getMigrationQueries($updater);
-
- $expectedMigrationQueries = array(
- 'ALTER TABLE `log_visit` ADD COLUMN `test_visit_col_1` INTEGER(10) UNSIGNED NOT NULL, ADD COLUMN `test_visit_col_2` VARCHAR(32) NOT NULL;' => array('1091', '1060'),
- 'ALTER TABLE `log_link_visit_action` ADD COLUMN `test_action_col_1` VARCHAR(32) NOT NULL, ADD COLUMN `test_action_col_2` INTEGER(10) UNSIGNED DEFAULT NULL;' => array('1091', '1060'),
- 'ALTER TABLE `log_conversion` ADD COLUMN `test_conv_col_1` FLOAT DEFAULT NULL, ADD COLUMN `test_conv_col_2` VARCHAR(32) NOT NULL;' => array('1091', '1060'),
- );
- $this->assertEquals($expectedMigrationQueries, $this->flattenQueries($actualMigrationQueries));
- }
-
- public function test_getMigrationQueries_ReturnsCorrectQueries_IfDimensionIsInTable_ButHasNewVersion()
- {
- $this->addDimensionsToTables();
-
- $updater = $this->getMockUpdater();
- $actualMigrationQueries = $this->columnsUpdater->getMigrationQueries($updater);
-
- $expectedMigrationQueries = array(
- 'ALTER TABLE `log_visit` MODIFY COLUMN `test_visit_col_1` INTEGER(10) UNSIGNED NOT NULL, MODIFY COLUMN `test_visit_col_2` VARCHAR(32) NOT NULL;' => array('1091', '1060'),
- 'ALTER TABLE `log_link_visit_action` MODIFY COLUMN `test_action_col_1` VARCHAR(32) NOT NULL, MODIFY COLUMN `test_action_col_2` INTEGER(10) UNSIGNED DEFAULT NULL;' => array('1091', '1060'),
- 'ALTER TABLE `log_conversion` MODIFY COLUMN `test_conv_col_1` FLOAT DEFAULT NULL, MODIFY COLUMN `test_conv_col_2` VARCHAR(32) NOT NULL;' => array('1091', '1060')
- );
- $this->assertEquals($expectedMigrationQueries, $this->flattenQueries($actualMigrationQueries));
- }
/**
* @param Migration\Db\Sql[] $queries
@@ -133,16 +106,6 @@ class UpdaterTest extends IntegrationTestCase
return $response;
}
- public function test_getMigrationQueries_ReturnsNoQueries_IfDimensionsAreInTable_ButHaveNoNewVersions()
- {
- $this->addDimensionsToTables();
-
- $updater = $this->getMockUpdater($hasNewVersion = false);
- $actualMigrationQueries = $this->columnsUpdater->getMigrationQueries($updater);
-
- $this->assertEquals(array(), $actualMigrationQueries);
- }
-
public function test_doUpdate_AddsDimensions_WhenDimensionsNotInTables()
{
$updater = $this->getMockUpdater();
@@ -226,7 +189,7 @@ class UpdaterTest extends IntegrationTestCase
private function getMockUpdater($hasNewVersion = true)
{
- $result = $this->getMockBuilder("Piwik\\Updater")->setMethods(array('hasNewVersion'))->getMock();
+ $result = $this->getMockBuilder("Piwik\\Updater")->onlyMethods(array('hasNewVersion'))->getMock();
$result->expects($this->any())->method('hasNewVersion')->will($this->returnCallback(function () use ($hasNewVersion) {
return $hasNewVersion;
diff --git a/tests/PHPUnit/Integration/Concurrency/DistributedListTest.php b/tests/PHPUnit/Integration/Concurrency/DistributedListTest.php
index f846b185be..dc322418c2 100644
--- a/tests/PHPUnit/Integration/Concurrency/DistributedListTest.php
+++ b/tests/PHPUnit/Integration/Concurrency/DistributedListTest.php
@@ -33,7 +33,7 @@ class DistributedListTest extends IntegrationTestCase
*/
private $distributedList;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Concurrency/LockBackend/MysqlLockBackendTest.php b/tests/PHPUnit/Integration/Concurrency/LockBackend/MysqlLockBackendTest.php
index 432491591b..8c2c9e1517 100644
--- a/tests/PHPUnit/Integration/Concurrency/LockBackend/MysqlLockBackendTest.php
+++ b/tests/PHPUnit/Integration/Concurrency/LockBackend/MysqlLockBackendTest.php
@@ -21,7 +21,7 @@ class MysqlLockBackendTest extends IntegrationTestCase
private $backend;
private $key = 'testKeyValueKey';
- public function setUp()
+ public function setUp(): void
{
if (!$this->hasDependencies()) {
parent::setUp();
@@ -34,7 +34,7 @@ class MysqlLockBackendTest extends IntegrationTestCase
$this->backend = $this->createMysqlBackend();
}
- public function tearDown()
+ public function tearDown(): void
{
$GLOBALS['PIWIK_TRACKER_MODE'] = false;
Db::destroyDatabaseObject();
diff --git a/tests/PHPUnit/Integration/Concurrency/LockTest.php b/tests/PHPUnit/Integration/Concurrency/LockTest.php
index cb1345c2f2..228c96d08b 100644
--- a/tests/PHPUnit/Integration/Concurrency/LockTest.php
+++ b/tests/PHPUnit/Integration/Concurrency/LockTest.php
@@ -23,7 +23,7 @@ class LockTest extends IntegrationTestCase
*/
public $lock;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -31,7 +31,7 @@ class LockTest extends IntegrationTestCase
$this->lock = $this->createLock($mysql);
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
}
diff --git a/tests/PHPUnit/Integration/Config/CacheTest.php b/tests/PHPUnit/Integration/Config/CacheTest.php
index 34ecd9bc3f..2a9e51415f 100644
--- a/tests/PHPUnit/Integration/Config/CacheTest.php
+++ b/tests/PHPUnit/Integration/Config/CacheTest.php
@@ -7,7 +7,6 @@
*/
namespace Piwik\Tests\Integration\Config\Cache;
-use PHPUnit_Framework_TestCase;
use Piwik\Config;
use Piwik\Config\Cache;
use Piwik\Config\IniFileChain;
@@ -25,7 +24,7 @@ class CacheTest extends IntegrationTestCase
private $testHost = 'analytics.test.matomo.org';
- public function setUp()
+ public function setUp(): void
{
unset($GLOBALS['ENABLE_CONFIG_PHP_CACHE']);
$this->setTrustedHosts();
@@ -40,7 +39,7 @@ class CacheTest extends IntegrationTestCase
Config::setSetting('General', 'trusted_hosts', array($this->testHost, 'foonot.exists'));
}
- public function tearDown()
+ public function tearDown(): void
{
$this->setTrustedHosts();
$this->cache->doDelete(IniFileChain::CONFIG_CACHE_KEY);
@@ -56,11 +55,12 @@ class CacheTest extends IntegrationTestCase
/**
* @dataProvider getRandmHosts
- * @expectedException \Exception
- * @expectedExceptionMessage Unsupported host
*/
public function test_construct_failsWhenUsingRandomHost($host)
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Unsupported host');
+
$_SERVER['HTTP_HOST'] = $host;
new Cache();
}
diff --git a/tests/PHPUnit/Integration/CronArchive/SharedSiteIdsTest.php b/tests/PHPUnit/Integration/CronArchive/SharedSiteIdsTest.php
index e514e797ea..5dd0327d86 100644
--- a/tests/PHPUnit/Integration/CronArchive/SharedSiteIdsTest.php
+++ b/tests/PHPUnit/Integration/CronArchive/SharedSiteIdsTest.php
@@ -22,7 +22,7 @@ class SharedSiteIdsTest extends IntegrationTestCase
*/
private $sharedSiteIds;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -34,7 +34,7 @@ class SharedSiteIdsTest extends IntegrationTestCase
$this->sharedSiteIds = $this->makeSharedSiteIds(array(1,2,5,9));
}
- public function tearDown()
+ public function tearDown(): void
{
if (!SharedSiteIds::isSupported()) {
return;
diff --git a/tests/PHPUnit/Integration/CronArchiveTest.php b/tests/PHPUnit/Integration/CronArchiveTest.php
index a9b9ee7b93..bb83400022 100644
--- a/tests/PHPUnit/Integration/CronArchiveTest.php
+++ b/tests/PHPUnit/Integration/CronArchiveTest.php
@@ -123,9 +123,9 @@ class CronArchiveTest extends IntegrationTestCase
$archiver->init();
$archiver->run();
- $this->assertContains('Will skip segments archiving for today unless they were created recently', $logger->output);
- $this->assertContains('Segment "actions>=1" was created or changed recently and will therefore archive today', $logger->output);
- $this->assertNotContains('Segment "actions>=2" was created recently', $logger->output);
+ self::assertStringContainsString('Will skip segments archiving for today unless they were created recently', $logger->output);
+ self::assertStringContainsString('Segment "actions>=1" was created or changed recently and will therefore archive today', $logger->output);
+ self::assertStringNotContainsString('Segment "actions>=2" was created recently', $logger->output);
}
public function test_output()
@@ -229,7 +229,7 @@ Will pre-process for website id = 1, period = day, date = last52
- pre-processing all visits
LOG;
- $this->assertContains($expected, $logger->output);
+ self::assertStringContainsString($expected, $logger->output);
}
/**
diff --git a/tests/PHPUnit/Integration/DataAccess/ActionsTest.php b/tests/PHPUnit/Integration/DataAccess/ActionsTest.php
index d74e2e655d..ef6b83c869 100644
--- a/tests/PHPUnit/Integration/DataAccess/ActionsTest.php
+++ b/tests/PHPUnit/Integration/DataAccess/ActionsTest.php
@@ -22,7 +22,7 @@ class ActionsTest extends IntegrationTestCase
*/
private $actionsAccess;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php b/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php
index acb94e2fb9..13d70cb1c2 100644
--- a/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php
+++ b/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php
@@ -54,7 +54,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
*/
private static $segment2;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
@@ -72,7 +72,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
}
}
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/DataAccess/ArchiveTableDaoTest.php b/tests/PHPUnit/Integration/DataAccess/ArchiveTableDaoTest.php
index 5090799496..0ceb3eb959 100644
--- a/tests/PHPUnit/Integration/DataAccess/ArchiveTableDaoTest.php
+++ b/tests/PHPUnit/Integration/DataAccess/ArchiveTableDaoTest.php
@@ -28,7 +28,7 @@ class ArchiveTableDaoTest extends IntegrationTestCase
*/
private $archiveTableDao;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/DataAccess/ArchiveWriterTest.php b/tests/PHPUnit/Integration/DataAccess/ArchiveWriterTest.php
index f513518e3b..fa60b7d2dc 100644
--- a/tests/PHPUnit/Integration/DataAccess/ArchiveWriterTest.php
+++ b/tests/PHPUnit/Integration/DataAccess/ArchiveWriterTest.php
@@ -38,7 +38,7 @@ class ArchiveWriterTest extends IntegrationTestCase
{
private $idSite;
- public function setUp()
+ public function setUp(): void
{
Access::getInstance()->setSuperUserAccess(true);
$this->idSite = Fixture::createWebsite('2019-08-29');
diff --git a/tests/PHPUnit/Integration/DataAccess/LogAggregatorTest.php b/tests/PHPUnit/Integration/DataAccess/LogAggregatorTest.php
index 817595270b..3aa46d1875 100644
--- a/tests/PHPUnit/Integration/DataAccess/LogAggregatorTest.php
+++ b/tests/PHPUnit/Integration/DataAccess/LogAggregatorTest.php
@@ -41,7 +41,7 @@ class LogAggregatorTest extends IntegrationTestCase
*/
private $logAggregator;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/DataAccess/ModelTest.php b/tests/PHPUnit/Integration/DataAccess/ModelTest.php
index d5191026bb..8f165f0420 100644
--- a/tests/PHPUnit/Integration/DataAccess/ModelTest.php
+++ b/tests/PHPUnit/Integration/DataAccess/ModelTest.php
@@ -23,7 +23,7 @@ class ModelTest extends IntegrationTestCase
private $model;
private $tableName = 'archive_numeric_test';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/DataAccess/TableMetadataTest.php b/tests/PHPUnit/Integration/DataAccess/TableMetadataTest.php
index a1a1bbf7de..b00ae83f4e 100644
--- a/tests/PHPUnit/Integration/DataAccess/TableMetadataTest.php
+++ b/tests/PHPUnit/Integration/DataAccess/TableMetadataTest.php
@@ -21,7 +21,7 @@ class TableMetadataTest extends IntegrationTestCase
*/
private $tableMetadataAccess;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/DataTable/Filter/PivotByDimensionTest.php b/tests/PHPUnit/Integration/DataTable/Filter/PivotByDimensionTest.php
index 4e72693de4..30ea7a4934 100644
--- a/tests/PHPUnit/Integration/DataTable/Filter/PivotByDimensionTest.php
+++ b/tests/PHPUnit/Integration/DataTable/Filter/PivotByDimensionTest.php
@@ -9,6 +9,7 @@ namespace Piwik\Tests\Core\DataTable\Filter;
use Piwik\API\Proxy;
use Piwik\Plugins\CustomVariables\CustomVariables;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Piwik\Tracker\Cache;
use Piwik\DataTable;
@@ -16,7 +17,6 @@ use Piwik\DataTable\Filter\PivotByDimension;
use Piwik\DataTable\Row;
use Piwik\Plugin\Manager as PluginManager;
use Exception;
-use Piwik\Translate;
/**
* @group DataTableTest
@@ -39,78 +39,72 @@ class PivotByDimensionTest extends IntegrationTestCase
*/
public $segmentUsedToGetIntersected = array();
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- Translate::reset();
+ Fixture::resetTranslations();
Cache::clearCacheGeneral();
\Piwik\Cache::flushAll();
$this->segmentTableCount = 0;
}
- /**
- * @expectedException Exception
- * @expectedExceptionMessage Unsupported pivot: report 'ExampleReport.getExampleReport' has no subtable dimension.
- */
public function test_construction_ShouldFail_WhenReportHasNoSubtableAndSegmentFetchingIsDisabled()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Unsupported pivot: report \'ExampleReport.getExampleReport\' has no subtable dimension.');
+
$this->loadPlugins('ExampleReport', 'UserCountry');
new PivotByDimension(new DataTable(), "ExampleReport.GetExampleReport", "UserCountry.City", 'nb_visits', $columnLimit = -1, $enableFetchBySegment = false);
}
- /**
- * @expectedException Exception
- * @expectedExceptionMessage Unsupported pivot: the subtable dimension for 'Referrers.getKeywords' does not match the requested pivotBy dimension.
- */
public function test_construction_ShouldFail_WhenDimensionIsNotSubtableAndSegmentFetchingIsDisabled()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Unsupported pivot: the subtable dimension for \'Referrers.getKeywords\' does not match the requested pivotBy dimension.');
+
$this->loadPlugins('Referrers', 'UserCountry');
new PivotByDimension(new DataTable(), "Referrers.getKeywords", "UserCountry.City", "nb_visits", $columnLimit = -1, $enableFetchBySegment = false);
}
- /**
- * @expectedException Exception
- * @expectedExceptionMessage Unsupported pivot: No segment for dimension of report 'Resolution.getConfiguration'
- */
public function test_construction_ShouldFail_WhenDimensionIsNotSubtableAndSegmentFetchingIsEnabledButThereIsNoSegment()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Unsupported pivot: No segment for dimension of report \'Resolution.getConfiguration\'');
+
$this->loadPlugins('Referrers', 'Resolution');
new PivotByDimension(new DataTable(), "Resolution.GetConfiguration", "Referrers.Keyword", "nb_visits");
}
- /**
- * @expectedException Exception
- * @expectedExceptionMessage Invalid dimension 'ExampleTracker.InvalidDimension'
- */
public function test_construction_ShouldFail_WhenDimensionDoesNotExist()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Invalid dimension \'ExampleTracker.InvalidDimension\'');
+
$this->loadPlugins('ExampleReport', 'ExampleTracker');
new PivotByDimension(new DataTable(), "ExampleReport.GetExampleReport", "ExampleTracker.InvalidDimension", 'nb_visits');
}
- /**
- * @expectedException Exception
- * @expectedExceptionMessage Unsupported pivot: No report for pivot dimension 'ExampleTracker.ExampleDimension'
- */
public function test_construction_ShouldFail_WhenThereIsNoReportForADimension()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Unsupported pivot: No report for pivot dimension \'ExampleTracker.ExampleDimension\'');
+
$this->loadPlugins('ExampleReport', 'ExampleTracker');
new PivotByDimension(new DataTable(), "ExampleReport.GetExampleReport", "ExampleTracker.ExampleDimension", "nb_visits");
}
- /**
- * @expectedException Exception
- * @expectedExceptionMessage Unable to find report 'ExampleReport.InvalidReport'
- */
public function test_construction_ShouldFail_WhenSpecifiedReportIsNotValid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Unable to find report \'ExampleReport.InvalidReport\'');
+
$this->loadPlugins('ExampleReport', 'Referrers');
new PivotByDimension(new DataTable(), "ExampleReport.InvalidReport", "Referrers.Keyword", "nb_visits");
@@ -380,7 +374,7 @@ class PivotByDimensionTest extends IntegrationTestCase
public function provideContainerConfig()
{
- $proxyMock = $this->getMockBuilder('stdClass')->setMethods(array('call'))->getMock();
+ $proxyMock = $this->getMockBuilder('stdClass')->addMethods(array('call'))->getMock();
$proxyMock->expects($this->any())->method('call')->willReturnCallback(function ($className, $methodName, $parameters) {
if ($className == "\\Piwik\\Plugins\\UserCountry\\API"
&& $methodName == 'getCity'
diff --git a/tests/PHPUnit/Integration/Db/TransactionLevelTest.php b/tests/PHPUnit/Integration/Db/TransactionLevelTest.php
index 3438108879..129526e058 100644
--- a/tests/PHPUnit/Integration/Db/TransactionLevelTest.php
+++ b/tests/PHPUnit/Integration/Db/TransactionLevelTest.php
@@ -30,7 +30,7 @@ class TransactionLevelTest extends IntegrationTestCase
*/
private $db;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->db = Db::get();
diff --git a/tests/PHPUnit/Integration/DbHelperTest.php b/tests/PHPUnit/Integration/DbHelperTest.php
index d9f60418f0..523f197cde 100644
--- a/tests/PHPUnit/Integration/DbHelperTest.php
+++ b/tests/PHPUnit/Integration/DbHelperTest.php
@@ -16,7 +16,7 @@ use Piwik\Version;
class DbHelperTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -93,14 +93,14 @@ class DbHelperTest extends IntegrationTestCase
{
$dbs = Db::fetchAll("SHOW DATABASES");
$dbs = array_column($dbs, 'Database');
- $this->assertContains($this->cleanName($dbName), $dbs);
+ self::assertTrue(in_array($this->cleanName($dbName), $dbs));
}
private function assertDbNotExists($dbName)
{
$dbs = Db::fetchAll("SHOW DATABASES");
$dbs = array_column($dbs, 'Database');
- $this->assertNotContains($this->cleanName($dbName), $dbs);
+ self::assertTrue(!in_array($this->cleanName($dbName), $dbs));
}
private function cleanName($dbName)
diff --git a/tests/PHPUnit/Integration/DbTest.php b/tests/PHPUnit/Integration/DbTest.php
index c88b207810..f4632e01fc 100644
--- a/tests/PHPUnit/Integration/DbTest.php
+++ b/tests/PHPUnit/Integration/DbTest.php
@@ -20,14 +20,14 @@ class DbTest extends IntegrationTestCase
{
private $dbReaderConfigBackup;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->dbReaderConfigBackup = Config::getInstance()->database_reader;
}
- public function tearDown()
+ public function tearDown(): void
{
Db::destroyDatabaseObject();
Config::getInstance()->database_reader = $this->dbReaderConfigBackup;
@@ -130,12 +130,11 @@ class DbTest extends IntegrationTestCase
$this->assertSame($expected, $result);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessagelock name has to be 64 characters or less
- */
public function test_getDbLock_shouldThrowAnException_IfDbLockNameIsTooLong()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('name has to be 64 characters or less');
+
Db::getDbLock(str_pad('test', 65, '1'));
}
diff --git a/tests/PHPUnit/Integration/DependencyTest.php b/tests/PHPUnit/Integration/DependencyTest.php
index 862f4d8196..221a4a1de0 100644
--- a/tests/PHPUnit/Integration/DependencyTest.php
+++ b/tests/PHPUnit/Integration/DependencyTest.php
@@ -23,7 +23,7 @@ class DependencyTest extends IntegrationTestCase
*/
private $dependency;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->dependency = new Dependency();
diff --git a/tests/PHPUnit/Integration/DocumentationGeneratorTest.php b/tests/PHPUnit/Integration/DocumentationGeneratorTest.php
index bdb64e90aa..f41889eaef 100644
--- a/tests/PHPUnit/Integration/DocumentationGeneratorTest.php
+++ b/tests/PHPUnit/Integration/DocumentationGeneratorTest.php
@@ -8,7 +8,7 @@
namespace Piwik\Tests\Integration;
-use PHPUnit_Framework_TestCase;
+use PHPUnit\Framework\TestCase;
use Piwik\API\DocumentationGenerator;
use Piwik\API\Proxy;
use Piwik\EventDispatcher;
@@ -16,14 +16,14 @@ use Piwik\EventDispatcher;
/**
* @group Core
*/
-class DocumentationGeneratorTest extends PHPUnit_Framework_TestCase
+class DocumentationGeneratorTest extends TestCase
{
public function test_CheckIfModule_ContainsHideAnnotation()
{
$annotation = '@hideExceptForSuperUser test test';
$mock = $this->getMockBuilder('ReflectionClass')
->disableOriginalConstructor()
- ->setMethods(array('getDocComment'))
+ ->onlyMethods(array('getDocComment'))
->getMock();
$mock->expects($this->once())->method('getDocComment')->willReturn($annotation);
$documentationGenerator = new DocumentationGenerator();
diff --git a/tests/PHPUnit/Integration/EmailValidatorTest.php b/tests/PHPUnit/Integration/EmailValidatorTest.php
index 34ccf69e2b..6b2afcf080 100644
--- a/tests/PHPUnit/Integration/EmailValidatorTest.php
+++ b/tests/PHPUnit/Integration/EmailValidatorTest.php
@@ -14,7 +14,7 @@ use Piwik\Piwik;
/**
* @group Core
*/
-class EmailValidatorTest extends \PHPUnit_Framework_TestCase
+class EmailValidatorTest extends \PHPUnit\Framework\TestCase
{
protected function isValid($email)
{
diff --git a/tests/PHPUnit/Integration/FilesystemTest.php b/tests/PHPUnit/Integration/FilesystemTest.php
index 0738328904..37521df668 100644
--- a/tests/PHPUnit/Integration/FilesystemTest.php
+++ b/tests/PHPUnit/Integration/FilesystemTest.php
@@ -14,7 +14,7 @@ use Piwik\Filesystem;
/**
* @group Core
*/
-class FilesystemTest extends \PHPUnit_Framework_TestCase
+class FilesystemTest extends \PHPUnit\Framework\TestCase
{
public function test_getFileSize_ShouldRecognizeLowerUnits()
{
diff --git a/tests/PHPUnit/Integration/FrontControllerTest.php b/tests/PHPUnit/Integration/FrontControllerTest.php
index 45f73293b8..ca666618d2 100644
--- a/tests/PHPUnit/Integration/FrontControllerTest.php
+++ b/tests/PHPUnit/Integration/FrontControllerTest.php
@@ -48,15 +48,9 @@ FORMAT;
$this->assertEquals('error', $response['result']);
$expectedFormat = <<<FORMAT
-test message on {includePath}/tests/resources/trigger-fatal-exception.php(23) #0 [internal function]: {closure}('CoreHome', 'index', Array) #1 {includePath}/core/EventDispatcher.php(141): call_user_func_array(Object(Closure), Array) #2 {includePath}/core/Piwik.php(775): Piwik\EventDispatcher-&gt;postEvent('Request.dispatc...', Array, false, NULL) #3 {includePath}/core/FrontController.php(570): Piwik\Piwik::postEvent('Request.dispatc...', Array) #4 {includePath}/core/FrontController.php(165): Piwik\FrontController-&gt;doDispatch('CoreHome', 'index', NULL) #5 {includePath}/tests/resources/trigger-fatal-exception.php(31): Piwik\FrontController-&gt;dispatch('CoreHome', 'index') #6 {main}
+test message on {includePath}/tests/resources/trigger-fatal-exception.php(23) #0 [internal function]: {closure}('CoreHome', 'index', Array) #1 {includePath}/core/EventDispatcher.php(141): call_user_func_array(Object(Closure), Array) #2 {includePath}/core/Piwik.php(756): Piwik\EventDispatcher-&gt;postEvent('Request.dispatc...', Array, false, Array) #3 {includePath}/core/FrontController.php(570): Piwik\Piwik::postEvent('Request.dispatc...', Array) #4 {includePath}/core/FrontController.php(165): Piwik\FrontController-&gt;doDispatch('CoreHome', 'index', Array) #5 {includePath}/tests/resources/trigger-fatal-exception.php(31): Piwik\FrontController-&gt;dispatch('CoreHome', 'index') #6 {main}
FORMAT;
- if (PHP_MAJOR_VERSION >= 7) {
- $expectedFormat = <<<FORMAT
-test message on {includePath}/tests/resources/trigger-fatal-exception.php(23) #0 [internal function]: {closure}('CoreHome', 'index', Array) #1 {includePath}/core/EventDispatcher.php(141): call_user_func_array(Object(Closure), Array) #2 {includePath}/core/Piwik.php(775): Piwik\EventDispatcher-&gt;postEvent('Request.dispatc...', Array, false, Array) #3 {includePath}/core/FrontController.php(570): Piwik\Piwik::postEvent('Request.dispatc...', Array) #4 {includePath}/core/FrontController.php(165): Piwik\FrontController-&gt;doDispatch('CoreHome', 'index', Array) #5 {includePath}/tests/resources/trigger-fatal-exception.php(31): Piwik\FrontController-&gt;dispatch('CoreHome', 'index') #6 {main}
-FORMAT;
- }
-
$this->assertStringMatchesFormat($expectedFormat, $response['message']);
}
diff --git a/tests/PHPUnit/Integration/HttpTest.php b/tests/PHPUnit/Integration/HttpTest.php
index 85385cfd9a..11f90249e4 100644
--- a/tests/PHPUnit/Integration/HttpTest.php
+++ b/tests/PHPUnit/Integration/HttpTest.php
@@ -17,7 +17,7 @@ use Piwik\Version;
* @group Core
* @group HttpTest
*/
-class HttpTest extends \PHPUnit_Framework_TestCase
+class HttpTest extends \PHPUnit\Framework\TestCase
{
/**
* Dataprovider for testFetchRemoteFile
@@ -270,21 +270,21 @@ class HttpTest extends \PHPUnit_Framework_TestCase
* curl_exec: server certificate verification failed. CAfile: /home/travis/build/piwik/piwik/core/DataFiles/cacert.pem CRLfile: none. Hostname requested was: self-signed.badssl.com
* or
* curl_exec: SSL certificate problem: self signed certificate. Hostname requested was: self-signed.badssl.com
- * @expectedException \Exception
- * @expectedExceptionMessageRegExp /curl_exec: .*certificate.* /
*/
public function testCurlHttpsFailsWithInvalidCertificate()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessageRegExp('/curl_exec: .*certificate.* /');
+
// use a domain from https://badssl.com/
Http::sendHttpRequestBy('curl', 'https://self-signed.badssl.com/', 10);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage failed to open stream
- */
public function testFopenHttpsFailsWithInvalidCertificate()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('failed to open stream');
+
// use a domain from https://badssl.com/
Http::sendHttpRequestBy('fopen', 'https://self-signed.badssl.com/', 10);
}
diff --git a/tests/PHPUnit/Integration/JsProxyTest.php b/tests/PHPUnit/Integration/JsProxyTest.php
index 65e8e56570..2c9830d71c 100644
--- a/tests/PHPUnit/Integration/JsProxyTest.php
+++ b/tests/PHPUnit/Integration/JsProxyTest.php
@@ -16,7 +16,7 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class JsProxyTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Fixture::createWebsite('2014-01-01 02:03:04');
diff --git a/tests/PHPUnit/Integration/LogDeleterTest.php b/tests/PHPUnit/Integration/LogDeleterTest.php
index bfb8df5b23..310da942a1 100644
--- a/tests/PHPUnit/Integration/LogDeleterTest.php
+++ b/tests/PHPUnit/Integration/LogDeleterTest.php
@@ -31,7 +31,7 @@ class LogDeleterTest extends IntegrationTestCase
*/
private $logDeleter;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/MailTest.php b/tests/PHPUnit/Integration/MailTest.php
index 01a2b9b1c8..ea7d7f764d 100644
--- a/tests/PHPUnit/Integration/MailTest.php
+++ b/tests/PHPUnit/Integration/MailTest.php
@@ -10,7 +10,7 @@ namespace Piwik\Tests\Integration;
use Piwik\Mail;
-class MailTest extends \PHPUnit_Framework_TestCase
+class MailTest extends \PHPUnit\Framework\TestCase
{
public function getEmailFilenames()
diff --git a/tests/PHPUnit/Integration/Measurable/MeasurableSettingTest.php b/tests/PHPUnit/Integration/Measurable/MeasurableSettingTest.php
index 639f2153ce..bfc49e8cdd 100644
--- a/tests/PHPUnit/Integration/Measurable/MeasurableSettingTest.php
+++ b/tests/PHPUnit/Integration/Measurable/MeasurableSettingTest.php
@@ -20,7 +20,7 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class MeasurableSettingTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Fixture::createWebsite('2014-01-01 00:00:01');
@@ -42,23 +42,21 @@ class MeasurableSettingTest extends IntegrationTestCase
$this->assertSame('test', $value);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingChangeNotAllowed
- */
public function testSetValue_shouldThrowException_IfOnlyViewPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingChangeNotAllowed');
+
FakeAccess::clearAccess();
FakeAccess::setIdSitesView(array(1, 2, 3));
$this->createSetting()->setValue('test');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingChangeNotAllowed
- */
public function testSetValue_shouldThrowException_IfNoPermissionAtAll()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingChangeNotAllowed');
+
FakeAccess::clearAccess();
$this->createSetting()->setValue('test');
}
diff --git a/tests/PHPUnit/Integration/Measurable/MeasurableSettingsTest.php b/tests/PHPUnit/Integration/Measurable/MeasurableSettingsTest.php
index d130dd9eed..599b5e0355 100644
--- a/tests/PHPUnit/Integration/Measurable/MeasurableSettingsTest.php
+++ b/tests/PHPUnit/Integration/Measurable/MeasurableSettingsTest.php
@@ -29,7 +29,7 @@ class MeasurableSettingsTest extends IntegrationTestCase
*/
private $settings;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -56,12 +56,11 @@ class MeasurableSettingsTest extends IntegrationTestCase
$this->assertStoredSettingsValue(array('value3'), 'sitesearch_category_parameters');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingChangeNotAllowed
- */
public function test_save_shouldCheckAdminPermissionsForThatSite()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingChangeNotAllowed');
+
FakeAccess::clearAccess();
$this->settings = $this->createSettings();
diff --git a/tests/PHPUnit/Integration/NumberFormatterTest.php b/tests/PHPUnit/Integration/NumberFormatterTest.php
index e481e2ab52..44e5cf3158 100644
--- a/tests/PHPUnit/Integration/NumberFormatterTest.php
+++ b/tests/PHPUnit/Integration/NumberFormatterTest.php
@@ -16,21 +16,21 @@ use Piwik\Translation\Translator;
* @group Core
* @group NumberFormatter
*/
-class NumberFormatterTest extends \PHPUnit_Framework_TestCase
+class NumberFormatterTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Translator
*/
private $translator;
- public function setUp()
+ public function setUp(): void
{
\Piwik\Plugin\Manager::getInstance()->loadPluginTranslations();
$this->translator = StaticContainer::get('Piwik\Translation\Translator');
}
- public function tearDown()
+ public function tearDown(): void
{
$this->translator->reset();
}
@@ -70,7 +70,7 @@ class NumberFormatterTest extends \PHPUnit_Framework_TestCase
$this->translator->setCurrentLanguage($language);
$numberFormatter = new NumberFormatter($this->translator);
- $this->assertEquals($expected, $numberFormatter->formatNumber($value, $maximumFractionDigits, $minimumFractionDigits));
+ $this->assertSame($expected, $numberFormatter->formatNumber($value, $maximumFractionDigits, $minimumFractionDigits));
}
public function getNumberFormattingTestData()
@@ -114,7 +114,7 @@ class NumberFormatterTest extends \PHPUnit_Framework_TestCase
array('en', -5, 0, 3, '-5%'),
array('en', 5.299, 0, 0, '5%'),
array('en', 5.299, 3, 0, '5.299%'),
- array('en', -50, 3, 3, '-50%'),
+ array('en', -50, 3, 3, '-50.000%'),
array('en', -50.1, 3, 3, '-50.100%'),
array('en', 5000, 0, 0, '5,000%'),
array('en', +5000, 0, 0, '5,000%'),
diff --git a/tests/PHPUnit/Integration/Period/FactoryTest.php b/tests/PHPUnit/Integration/Period/FactoryTest.php
index 4168f770b4..7df6f71d36 100644
--- a/tests/PHPUnit/Integration/Period/FactoryTest.php
+++ b/tests/PHPUnit/Integration/Period/FactoryTest.php
@@ -108,21 +108,19 @@ class FactoryTest extends IntegrationTestCase
$this->assertInstanceOf(TestPeriod::class, $period);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ExceptionInvalidPeriod
- */
public function test_build_ThrowsIfPeriodIsUnrecognized()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ExceptionInvalidPeriod');
+
Period\Factory::build('garbageperiod', '2015-01-01');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ExceptionInvalidPeriod
- */
public function test_build_ThrowsIfPeriodIsNotEnabledForApi()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ExceptionInvalidPeriod');
+
Config::getInstance()->General['enabled_periods_API'] = 'day';
Period\Factory::build('week', '2015-01-01');
}
diff --git a/tests/PHPUnit/Integration/PiwikTest.php b/tests/PHPUnit/Integration/PiwikTest.php
index 4cbf92eeb1..875a14899d 100644
--- a/tests/PHPUnit/Integration/PiwikTest.php
+++ b/tests/PHPUnit/Integration/PiwikTest.php
@@ -11,8 +11,6 @@ namespace Piwik\Tests\Integration;
use Piwik\Access;
use Piwik\AuthResult;
use Piwik\Piwik;
-use Piwik\Plugins\SitesManager\API;
-use Piwik\Translate;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
/**
@@ -33,11 +31,6 @@ class PiwikTest extends IntegrationTestCase
'1e3', 0x123, "-1e-2",
);
- if (!self::isPhp7orLater()) {
- // this seems to be no longer considered valid in PHP 7+
- $value[] = '0x123';
- }
-
foreach ($valid as $key => $value) {
$valid[$key] = array($value);
}
@@ -110,10 +103,10 @@ class PiwikTest extends IntegrationTestCase
/**
* @dataProvider getInvalidLoginStringData
- * @expectedException \Exception
*/
public function testCheckInvalidLoginString($toTest)
{
+ $this->expectException(\Exception::class);
Piwik::checkValidLoginString($toTest);
}
@@ -249,7 +242,7 @@ class PiwikTest extends IntegrationTestCase
private function createPiwikAuthMockInstance()
{
return $this->getMockBuilder('Piwik\\Auth')
- ->setMethods(array('authenticate', 'getName', 'getTokenAuthSecret', 'getLogin', 'setTokenAuth', 'setLogin',
+ ->onlyMethods(array('authenticate', 'getName', 'getTokenAuthSecret', 'getLogin', 'setTokenAuth', 'setLogin',
'setPassword', 'setPasswordHash'))
->getMock();
}
diff --git a/tests/PHPUnit/Integration/Plugin/ArchivedMetricTest.php b/tests/PHPUnit/Integration/Plugin/ArchivedMetricTest.php
index 179419dd50..03946c9b63 100644
--- a/tests/PHPUnit/Integration/Plugin/ArchivedMetricTest.php
+++ b/tests/PHPUnit/Integration/Plugin/ArchivedMetricTest.php
@@ -12,13 +12,10 @@ use Piwik\Columns\Dimension;
use Piwik\DataTable;
use Piwik\Metrics\Formatter;
use Piwik\Plugin\ArchivedMetric;
-use Piwik\Plugin\ComputedMetric;
-use Piwik\Plugins\UserCountry\Columns\City;
use Piwik\Plugins\UserCountry\Columns\Country;
use Piwik\Site;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
/**
* @group ArchivedMetric
@@ -36,11 +33,11 @@ class ArchivedMetricTest extends IntegrationTestCase
*/
private $metric;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- Translate::loadEnglishTranslation();
+ Fixture::loadAllTranslations();
Fixture::createWebsite('2015-01-01 00:00:00');
@@ -48,9 +45,9 @@ class ArchivedMetricTest extends IntegrationTestCase
$this->metric = $this->makeMetric('%s');
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::unloadEnglishTranslation();
+ Fixture::resetTranslations();
parent::tearDown();
}
diff --git a/tests/PHPUnit/Integration/Plugin/CategoriesTest.php b/tests/PHPUnit/Integration/Plugin/CategoriesTest.php
index 1c2c92539b..981fbbb00d 100644
--- a/tests/PHPUnit/Integration/Plugin/CategoriesTest.php
+++ b/tests/PHPUnit/Integration/Plugin/CategoriesTest.php
@@ -27,7 +27,7 @@ class CategoriesTest extends IntegrationTestCase
*/
private $categories;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -39,7 +39,7 @@ class CategoriesTest extends IntegrationTestCase
$this->categories = new Categories(StaticContainer::get('Piwik\Plugin\Manager'));
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
unset($_GET['idSite']);
diff --git a/tests/PHPUnit/Integration/Plugin/ComputedMetricTest.php b/tests/PHPUnit/Integration/Plugin/ComputedMetricTest.php
index 59862bc14f..5ab1c4b338 100644
--- a/tests/PHPUnit/Integration/Plugin/ComputedMetricTest.php
+++ b/tests/PHPUnit/Integration/Plugin/ComputedMetricTest.php
@@ -15,7 +15,6 @@ use Piwik\Plugin\ComputedMetric;
use Piwik\Site;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Piwik\Translate;
/**
* @group ComputedMetric
@@ -23,18 +22,18 @@ use Piwik\Translate;
*/
class ComputedMetricTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- Translate::loadEnglishTranslation();
+ Fixture::loadAllTranslations();
Fixture::createWebsite('2015-01-01 00:00:00');
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::unloadEnglishTranslation();
+ Fixture::resetTranslations();
parent::tearDown();
}
diff --git a/tests/PHPUnit/Integration/Plugin/Dimension/ActionDimensionTest.php b/tests/PHPUnit/Integration/Plugin/Dimension/ActionDimensionTest.php
index 944dbdc0ff..68c2ede8e5 100644
--- a/tests/PHPUnit/Integration/Plugin/Dimension/ActionDimensionTest.php
+++ b/tests/PHPUnit/Integration/Plugin/Dimension/ActionDimensionTest.php
@@ -53,7 +53,7 @@ class ActionDimensionTest extends IntegrationTestCase
*/
private $dimension;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Plugin/Dimension/ConversionDimensionTest.php b/tests/PHPUnit/Integration/Plugin/Dimension/ConversionDimensionTest.php
index 544fba56ec..f4b40e2b28 100644
--- a/tests/PHPUnit/Integration/Plugin/Dimension/ConversionDimensionTest.php
+++ b/tests/PHPUnit/Integration/Plugin/Dimension/ConversionDimensionTest.php
@@ -53,7 +53,7 @@ class ConversionDimensionTest extends IntegrationTestCase
*/
private $dimension;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Plugin/Dimension/DimensionMetadataProviderTest.php b/tests/PHPUnit/Integration/Plugin/Dimension/DimensionMetadataProviderTest.php
index 497c7facc4..1e60b7fd77 100644
--- a/tests/PHPUnit/Integration/Plugin/Dimension/DimensionMetadataProviderTest.php
+++ b/tests/PHPUnit/Integration/Plugin/Dimension/DimensionMetadataProviderTest.php
@@ -15,7 +15,7 @@ use Piwik\Plugin\Manager as PluginManager;
class DimensionMetadataProviderTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Plugin/Dimension/VisitDimensionTest.php b/tests/PHPUnit/Integration/Plugin/Dimension/VisitDimensionTest.php
index 7d9b964f08..4ca8550d7d 100644
--- a/tests/PHPUnit/Integration/Plugin/Dimension/VisitDimensionTest.php
+++ b/tests/PHPUnit/Integration/Plugin/Dimension/VisitDimensionTest.php
@@ -74,7 +74,7 @@ class VisitDimensionTest extends IntegrationTestCase
*/
private $conversionDimension;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -212,12 +212,11 @@ class VisitDimensionTest extends IntegrationTestCase
$this->assertSame(array($dimension3, $dimension4, $dimension2, $dimension1), $instances);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Circular reference detected for required field column4 in dimension column2
- */
public function test_sortDimensions_ShouldThrowAnException_IfCircularReferenceDetected()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Circular reference detected for required field column4 in dimension column2');
+
$dimension1 = new FakeVisitDimension();
$dimension1->set('columnName', 'column1');
$dimension1->requiredFields = array('column3');
diff --git a/tests/PHPUnit/Integration/Plugin/ManagerTest.php b/tests/PHPUnit/Integration/Plugin/ManagerTest.php
index a8ab5c71b9..d2bfd4133d 100644
--- a/tests/PHPUnit/Integration/Plugin/ManagerTest.php
+++ b/tests/PHPUnit/Integration/Plugin/ManagerTest.php
@@ -30,7 +30,7 @@ class ManagerTest extends IntegrationTestCase
*/
private $manager;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->manager = Plugin\Manager::getInstance();
@@ -91,7 +91,7 @@ class ManagerTest extends IntegrationTestCase
public function test_ListenNotToControllerMethodEventsThatDoesNotExists()
{
foreach ($this->manager->getLoadedPlugins() as $plugin) {
- $hooks = $plugin->getListHooksRegistered();
+ $hooks = $plugin->registerEvents();
foreach ($hooks as $hook => $callback) {
if (0 === strpos($hook, 'Controller.')) {
list($controller, $module, $action) = explode('.', $hook);
diff --git a/tests/PHPUnit/Integration/Plugin/ReleaseChannelsTest.php b/tests/PHPUnit/Integration/Plugin/ReleaseChannelsTest.php
index 3d2eae212b..54847143a6 100644
--- a/tests/PHPUnit/Integration/Plugin/ReleaseChannelsTest.php
+++ b/tests/PHPUnit/Integration/Plugin/ReleaseChannelsTest.php
@@ -30,7 +30,7 @@ class ReleaseChannelsTest extends IntegrationTestCase
*/
private $channels;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -79,7 +79,7 @@ class ReleaseChannelsTest extends IntegrationTestCase
return array(
array($exists = true, $id = 'latest_stable'),
array($exists = true, $id = 'latest_beta'),
- array($exists = true, $id = 'latest_3x_stable'),
+ array($exists = true, $id = 'latest_4x_stable'),
array($exists = true, $id = 'laTest_stable'), // we do not check for exact match
array($exists = false, $id = ''),
array($exists = false, $id = 'latest'),
@@ -92,7 +92,7 @@ class ReleaseChannelsTest extends IntegrationTestCase
{
return array(
array('latest_stable', 'latest_stable'),
- array('latest_3x_stable', 'latest_3x_stable'),
+ array('latest_4x_stable', 'latest_4x_stable'),
array('latest_beta', 'latest_beta'),
array('latest_beta', 'latEst_betA'),
array('latest_stable', ''), // if nothing configured should return default (the one with lowest order)
diff --git a/tests/PHPUnit/Integration/Plugin/SettingsProviderTest.php b/tests/PHPUnit/Integration/Plugin/SettingsProviderTest.php
index 0d620cfef1..7698d24b5d 100644
--- a/tests/PHPUnit/Integration/Plugin/SettingsProviderTest.php
+++ b/tests/PHPUnit/Integration/Plugin/SettingsProviderTest.php
@@ -37,7 +37,7 @@ class SettingsProviderTest extends IntegrationTestCase
private $examplePlugin = 'ExampleSettingsPlugin';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -50,7 +50,7 @@ class SettingsProviderTest extends IntegrationTestCase
$this->settings = new SettingsProvider($this->pluginManager);
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
unset($_GET['idSite']);
diff --git a/tests/PHPUnit/Integration/Plugin/WidgetsProviderTest.php b/tests/PHPUnit/Integration/Plugin/WidgetsProviderTest.php
index 14e18d2851..9f375fe7b1 100644
--- a/tests/PHPUnit/Integration/Plugin/WidgetsProviderTest.php
+++ b/tests/PHPUnit/Integration/Plugin/WidgetsProviderTest.php
@@ -28,7 +28,7 @@ class WidgetsProviderTest extends IntegrationTestCase
*/
private $widgets;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -40,7 +40,7 @@ class WidgetsProviderTest extends IntegrationTestCase
$this->widgets = new WidgetsProvider(StaticContainer::get('Piwik\Plugin\Manager'));
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
unset($_GET['idSite']);
diff --git a/tests/PHPUnit/Integration/ProfessionalSupport/AdvertisingTest.php b/tests/PHPUnit/Integration/ProfessionalSupport/AdvertisingTest.php
index 946c226104..2c10e38d98 100644
--- a/tests/PHPUnit/Integration/ProfessionalSupport/AdvertisingTest.php
+++ b/tests/PHPUnit/Integration/ProfessionalSupport/AdvertisingTest.php
@@ -18,7 +18,7 @@ use Piwik\Tests\Framework\Mock\Plugin\Manager;
* @group Advertising
* @group Integration
*/
-class AdvertisingTest extends \PHPUnit_Framework_TestCase
+class AdvertisingTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Advertising
@@ -37,7 +37,7 @@ class AdvertisingTest extends \PHPUnit_Framework_TestCase
private $exampleUrl = 'https://piwik.xyz/test';
- public function setUp()
+ public function setUp(): void
{
$this->config = new FakeConfig(array('General' => array('piwik_professional_support_ads_enabled' => '1')));
$this->pluginManager = new Manager();
diff --git a/tests/PHPUnit/Integration/ReleaseCheckListTest.php b/tests/PHPUnit/Integration/ReleaseCheckListTest.php
index 0bc8438445..690ef8e166 100644
--- a/tests/PHPUnit/Integration/ReleaseCheckListTest.php
+++ b/tests/PHPUnit/Integration/ReleaseCheckListTest.php
@@ -13,7 +13,7 @@ use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Filesystem;
use Piwik\Http;
-use Piwik\Ini\IniReader;
+use Matomo\Ini\IniReader;
use Piwik\Plugin\Manager;
use Piwik\Tests\Framework\TestCase\SystemTestCase;
use Piwik\Tracker;
@@ -24,13 +24,13 @@ use RecursiveIteratorIterator;
* @group Core
* @group ReleaseCheckListTest
*/
-class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
+class ReleaseCheckListTest extends \PHPUnit\Framework\TestCase
{
private $globalConfig;
- const MINIMUM_PHP_VERSION = '5.5.9';
+ const MINIMUM_PHP_VERSION = '7.2.0';
- public function setUp()
+ public function setUp(): void
{
$iniReader = new IniReader();
$this->globalConfig = $iniReader->readFile(PIWIK_PATH_TEST_TO_ROOT . '/config/global.ini.php');
@@ -159,7 +159,6 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
$this->_checkEqual(array('log' => 'log_writers'), array('screen'));
$this->_checkEqual(array('log' => 'logger_api_call'), null);
- require_once PIWIK_INCLUDE_PATH . "/core/TaskScheduler.php";
$this->assertFalse(defined('DEBUG_FORCE_SCHEDULED_TASKS'));
// Check the index.php has "backtrace disabled"
@@ -222,7 +221,8 @@ class ReleaseCheckListTest extends \PHPUnit_Framework_TestCase
// Note: entries below are paths and any file within these paths will be automatically whitelisted
PIWIK_INCLUDE_PATH . '/tests/resources/overlay-test-site-real/',
PIWIK_INCLUDE_PATH . '/tests/resources/overlay-test-site/',
- PIWIK_INCLUDE_PATH . '/vendor/facebook/xhprof/xhprof_html/docs/',
+ PIWIK_INCLUDE_PATH . '/vendor/lox/xhprof/xhprof_html/docs/',
+ PIWIK_INCLUDE_PATH . '/vendor/phpunit/php-code-coverage/tests',
PIWIK_INCLUDE_PATH . '/plugins/Morpheus/icons/',
);
diff --git a/tests/PHPUnit/Integration/Report/ReportsTest.php b/tests/PHPUnit/Integration/Report/ReportsTest.php
index 0f6255d9de..b6da6d02ff 100644
--- a/tests/PHPUnit/Integration/Report/ReportsTest.php
+++ b/tests/PHPUnit/Integration/Report/ReportsTest.php
@@ -14,7 +14,7 @@ use Piwik\Plugin\Manager as PluginManager;
/**
* @group Core
*/
-class ReportTest extends \PHPUnit_Framework_TestCase
+class ReportTest extends \PHPUnit\Framework\TestCase
{
public function test_getAllReports_shouldNotFindAReport_IfNoPluginLoaded()
{
diff --git a/tests/PHPUnit/Integration/ReportRenderingTest.php b/tests/PHPUnit/Integration/ReportRenderingTest.php
index 01a0337d41..5be9b787ba 100644
--- a/tests/PHPUnit/Integration/ReportRenderingTest.php
+++ b/tests/PHPUnit/Integration/ReportRenderingTest.php
@@ -31,6 +31,6 @@ class ReportRenderingTest extends IntegrationTestCase
$frontController = FrontController::getInstance();
$response = $frontController->dispatch('DevicesDetection', 'getBrand');
- $this->assertContains('Diagnostics_NoDataForReportArchivingNotRun', $response);
+ self::assertStringContainsString('Diagnostics_NoDataForReportArchivingNotRun', $response);
}
} \ No newline at end of file
diff --git a/tests/PHPUnit/Integration/ReportTest.php b/tests/PHPUnit/Integration/ReportTest.php
index a8dd543478..3029420eff 100644
--- a/tests/PHPUnit/Integration/ReportTest.php
+++ b/tests/PHPUnit/Integration/ReportTest.php
@@ -19,7 +19,6 @@ use Piwik\Plugins\ExampleTracker\Columns\ExampleDimension;
use Piwik\Plugins\Referrers\Columns\Keyword;
use Piwik\Plugin\ReportsProvider;
use Piwik\Report\ReportWidgetFactory;
-use Piwik\Translate;
use Piwik\Plugin\Manager as PluginManager;
use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
@@ -103,7 +102,7 @@ class ReportTest extends IntegrationTestCase
*/
private $advancedReport;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -117,7 +116,7 @@ class ReportTest extends IntegrationTestCase
$this->advancedReport = new GetAdvancedReport();
}
- public function tearDown()
+ public function tearDown(): void
{
unset($_GET['idSite']);
parent::tearDown();
@@ -143,20 +142,19 @@ class ReportTest extends IntegrationTestCase
$this->assertTrue($this->basicReport->isEnabled());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ExceptionReportNotEnabled
- */
public function test_checkIsEnabled_shouldThrowAnExceptionIfReportIsNotEnabled()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ExceptionReportNotEnabled');
+
$this->disabledReport->checkIsEnabled();
}
public function test_getCategory_shouldReturnTranslatedCategory()
{
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$this->assertEquals('Goals_Goals', $this->advancedReport->getCategoryId());
- Translate::reset();
+ Fixture::resetTranslations();
}
public function test_getMetrics_shouldUseDefaultMetrics()
@@ -366,7 +364,7 @@ class ReportTest extends IntegrationTestCase
{
PluginManager::getInstance()->loadPlugins(array('API', 'ExampleReport'));
- $proxyMock = $this->getMockBuilder('stdClass')->setMethods(array('call', '__construct'))->getMock();
+ $proxyMock = $this->getMockBuilder('stdClass')->addMethods(array('call', '__construct'))->getMock();
$proxyMock->expects($this->once())->method('call')->with(
'\\Piwik\\Plugins\\ExampleReport\\API', 'getExampleReport', array(
'idSite' => 1,
@@ -390,7 +388,7 @@ class ReportTest extends IntegrationTestCase
{
PluginManager::getInstance()->loadPlugins(array('API', 'Referrers'));
- $proxyMock = $this->getMockBuilder('stdClass')->setMethods(array('call', '__construct'))->getMock();
+ $proxyMock = $this->getMockBuilder('stdClass')->addMethods(array('call', '__construct'))->getMock();
$proxyMock->expects($this->once())->method('call')->with(
'\\Piwik\\Plugins\\Referrers\\API', 'getSearchEnginesFromKeywordId', array(
'idSubtable' => 23,
diff --git a/tests/PHPUnit/Integration/SegmentTest.php b/tests/PHPUnit/Integration/SegmentTest.php
index 5cb987fdd6..22586fa147 100644
--- a/tests/PHPUnit/Integration/SegmentTest.php
+++ b/tests/PHPUnit/Integration/SegmentTest.php
@@ -33,7 +33,7 @@ class SegmentTest extends IntegrationTestCase
private $exampleSegment = 'visitCount>=1';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -1696,17 +1696,17 @@ log_visit.visit_total_actions
{
$self = $this;
- $cacheProxy = $this->getMockBuilder('Piwik\Cache\Lazy')
+ $cacheProxy = $this->getMockBuilder('Matomo\Cache\Lazy')
->setMethods(array('fetch', 'contains', 'save', 'delete', 'flushAll'))
->disableOriginalConstructor()
->getMock();
$cacheProxy->expects($this->any())->method('fetch')->willReturnCallback(function ($id) {
- $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+ $realCache = StaticContainer::get('Matomo\Cache\Lazy');
return $realCache->fetch($id);
});
$cacheProxy->expects($this->any())->method('contains')->willReturnCallback(function ($id) use ($self) {
- $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+ $realCache = StaticContainer::get('Matomo\Cache\Lazy');
$result = $realCache->contains($id);
if ($result) {
@@ -1716,15 +1716,15 @@ log_visit.visit_total_actions
return $result;
});
$cacheProxy->expects($this->any())->method('save')->willReturnCallback(function ($id, $data, $lifetime = 0) {
- $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+ $realCache = StaticContainer::get('Matomo\Cache\Lazy');
return $realCache->save($id, $data, $lifetime);
});
$cacheProxy->expects($this->any())->method('delete')->willReturnCallback(function ($id) {
- $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+ $realCache = StaticContainer::get('Matomo\Cache\Lazy');
return $realCache->delete($id);
});
$cacheProxy->expects($this->any())->method('flushAll')->willReturnCallback(function () {
- $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+ $realCache = StaticContainer::get('Matomo\Cache\Lazy');
return $realCache->flushAll();
});
diff --git a/tests/PHPUnit/Integration/SequenceTest.php b/tests/PHPUnit/Integration/SequenceTest.php
index 24e96fa91f..75a42f4a6c 100644
--- a/tests/PHPUnit/Integration/SequenceTest.php
+++ b/tests/PHPUnit/Integration/SequenceTest.php
@@ -42,12 +42,11 @@ class SequenceTest extends IntegrationTestCase
$this->assertSame(11, $id);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Duplicate entry
- */
public function test_create_shouldFailIfSequenceAlreadyExists()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Duplicate entry');
+
$sequence = $this->getExistingSequence();
$sequence->create();
@@ -62,12 +61,11 @@ class SequenceTest extends IntegrationTestCase
$this->assertNextIdGenerated($sequence, 3);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Sequence 'notCreatedSequence' not found
- */
public function test_getNextId_shouldFailIfThereIsNoSequenceHavingThisName()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Sequence \'notCreatedSequence\' not found');
+
$sequence = $this->getEmptySequence();
$sequence->getNextId();
}
diff --git a/tests/PHPUnit/Integration/ServeStaticFileTest.php b/tests/PHPUnit/Integration/ServeStaticFileTest.php
index 8eabd6a499..062157d0b0 100644
--- a/tests/PHPUnit/Integration/ServeStaticFileTest.php
+++ b/tests/PHPUnit/Integration/ServeStaticFileTest.php
@@ -47,9 +47,9 @@ define("PARTIAL_BYTE_START", 1204);
define("PARTIAL_BYTE_END", 14724);
// If the static file server has not been requested, the standard unit test case class is defined
-class ServeStaticFileTest extends \PHPUnit_Framework_TestCase
+class ServeStaticFileTest extends \PHPUnit\Framework\TestCase
{
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
if(!chmod(TEST_FILE_LOCATION, 0644)) {
@@ -159,7 +159,7 @@ class ServeStaticFileTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(200, $responseInfo["http_code"]);
// Tests content type
- $this->assertContains(TEST_FILE_CONTENT_TYPE, $responseInfo["content_type"]);
+ self::assertStringContainsString(TEST_FILE_CONTENT_TYPE, $responseInfo["content_type"]);
// Tests no compression has been applied
$this->assertNull($this->getContentEncodingValue($fullResponse));
diff --git a/tests/PHPUnit/Integration/Session/SessionAuthTest.php b/tests/PHPUnit/Integration/Session/SessionAuthTest.php
index e2579ceb08..4f4c7eccb3 100644
--- a/tests/PHPUnit/Integration/Session/SessionAuthTest.php
+++ b/tests/PHPUnit/Integration/Session/SessionAuthTest.php
@@ -29,7 +29,7 @@ class SessionAuthTest extends IntegrationTestCase
*/
private $testInstance;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/SessionTest.php b/tests/PHPUnit/Integration/SessionTest.php
index 5b216e436c..4664611dfb 100644
--- a/tests/PHPUnit/Integration/SessionTest.php
+++ b/tests/PHPUnit/Integration/SessionTest.php
@@ -18,7 +18,7 @@ use Piwik\Tests\Framework\Fixture;
* @group Session
* @group SessionTest
*/
-class SessionTest extends \PHPUnit_Framework_TestCase
+class SessionTest extends \PHPUnit\Framework\TestCase
{
public function test_session_should_not_be_started_if_it_was_already_started()
{
diff --git a/tests/PHPUnit/Integration/Settings/BaseSettingsTestCase.php b/tests/PHPUnit/Integration/Settings/BaseSettingsTestCase.php
index b51c7a54d7..d85289d0ea 100644
--- a/tests/PHPUnit/Integration/Settings/BaseSettingsTestCase.php
+++ b/tests/PHPUnit/Integration/Settings/BaseSettingsTestCase.php
@@ -41,12 +41,11 @@ class BaseSettingsTestCase extends IntegrationTestCase
$this->assertNotNull($this->settings->getSetting('myName'));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage A setting with name "myName" does already exist for plugin "ExampleSettingsPlugin"
- */
public function test_makeSetting_ShouldFailWhenAdingSameSettingTwice()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('A setting with name "myName" does already exist for plugin "ExampleSettingsPlugin"');
+
$this->makeSetting('myName');
$this->makeSetting('myName');
}
@@ -136,12 +135,11 @@ class BaseSettingsTestCase extends IntegrationTestCase
$this->assertSame($setting, $settings->getSetting($settingName));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage "testSetting" does already exist
- */
public function test_addSetting_throwsException_IfSameSettingAddedTwice()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('"testSetting" does already exist');
+
$settingName = 'testSetting';
$setting = $this->buildSetting($settingName);
$settings = $this->createSettingsInstance();
diff --git a/tests/PHPUnit/Integration/Settings/IntegrationTestCase.php b/tests/PHPUnit/Integration/Settings/IntegrationTestCase.php
index b01c61397f..0a2b8fe76d 100644
--- a/tests/PHPUnit/Integration/Settings/IntegrationTestCase.php
+++ b/tests/PHPUnit/Integration/Settings/IntegrationTestCase.php
@@ -8,6 +8,7 @@
namespace Piwik\Tests\Integration\Settings;
+use PHPUnit\Framework\Constraint\IsType;
use Piwik\Db;
use Piwik\Settings\Setting;
use Piwik\Settings\Storage;
@@ -26,7 +27,7 @@ class IntegrationTestCase extends \Piwik\Tests\Framework\TestCase\IntegrationTes
*/
protected $settings;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Db::destroyDatabaseObject();
@@ -39,7 +40,10 @@ class IntegrationTestCase extends \Piwik\Tests\Framework\TestCase\IntegrationTes
$this->assertEquals($expectedValue, $value);
if (!is_null($expectedType)) {
- $this->assertInternalType($expectedType, $value);
+ static::assertThat(
+ $value,
+ new IsType($expectedType)
+ );
}
}
diff --git a/tests/PHPUnit/Integration/Settings/Measurable/MeasurablePropertyTest.php b/tests/PHPUnit/Integration/Settings/Measurable/MeasurablePropertyTest.php
index 4d8023a989..4332de1c2e 100644
--- a/tests/PHPUnit/Integration/Settings/Measurable/MeasurablePropertyTest.php
+++ b/tests/PHPUnit/Integration/Settings/Measurable/MeasurablePropertyTest.php
@@ -25,7 +25,7 @@ use Piwik\Tests\Integration\Settings\IntegrationTestCase;
class MeasurablePropertyTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Db::destroyDatabaseObject();
@@ -49,12 +49,11 @@ class MeasurablePropertyTest extends IntegrationTestCase
$this->assertNotDbConnectionCreated();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Name "name" is not allowed to be used
- */
public function test_constructor_shouldThrowAnExceptionWhenNotWhitelistedNameIsUsed()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Name "name" is not allowed to be used');
+
new MeasurableProperty('name', $default = 5, FieldConfig::TYPE_INT, 'MyPlugin', $idSite = 1);
}
diff --git a/tests/PHPUnit/Integration/Settings/Measurable/MeasurableSettingTest.php b/tests/PHPUnit/Integration/Settings/Measurable/MeasurableSettingTest.php
index 3ce37143c6..3a6d9603f4 100644
--- a/tests/PHPUnit/Integration/Settings/Measurable/MeasurableSettingTest.php
+++ b/tests/PHPUnit/Integration/Settings/Measurable/MeasurableSettingTest.php
@@ -24,7 +24,7 @@ use Piwik\Tests\Integration\Settings\IntegrationTestCase;
class MeasurableSettingTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
foreach (array(2,3) as $idSite) {
diff --git a/tests/PHPUnit/Integration/Settings/Plugin/SystemConfigSettingTest.php b/tests/PHPUnit/Integration/Settings/Plugin/SystemConfigSettingTest.php
index 37db4918ca..4b0d2fdf29 100644
--- a/tests/PHPUnit/Integration/Settings/Plugin/SystemConfigSettingTest.php
+++ b/tests/PHPUnit/Integration/Settings/Plugin/SystemConfigSettingTest.php
@@ -24,7 +24,7 @@ class SystemConfigSettingTest extends IntegrationTestCase
{
private $section = 'MySection';
- public function tearDown()
+ public function tearDown(): void
{
$this->setConfigValues(array());
parent::tearDown();
@@ -39,24 +39,22 @@ class SystemConfigSettingTest extends IntegrationTestCase
$this->assertNotDbConnectionCreated();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingChangeNotAllowed
- */
public function test_setSettingValue_shouldThrowException_IfAUserIsTryingToSetASettingWhichNeedsSuperUserPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingChangeNotAllowed');
+
$this->setUser();
$setting = $this->buildSetting('mysystem');
$setting->setValue(2);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingChangeNotAllowed
- */
public function test_setSettingValue_shouldThrowException_IfAnonymousIsTryingToSetASettingWhichNeedsSuperUserPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingChangeNotAllowed');
+
$this->setAnonymousUser();
$setting = $this->buildSetting('mysystem');
diff --git a/tests/PHPUnit/Integration/Settings/Plugin/SystemSettingTest.php b/tests/PHPUnit/Integration/Settings/Plugin/SystemSettingTest.php
index e44d6e0fdd..f0d55e5fba 100644
--- a/tests/PHPUnit/Integration/Settings/Plugin/SystemSettingTest.php
+++ b/tests/PHPUnit/Integration/Settings/Plugin/SystemSettingTest.php
@@ -22,7 +22,7 @@ use Piwik\Tests\Integration\Settings\IntegrationTestCase;
class SystemSettingTest extends IntegrationTestCase
{
- public function tearDown()
+ public function tearDown(): void
{
Config::getInstance()->MyPluginName = array();
parent::tearDown();
@@ -37,24 +37,22 @@ class SystemSettingTest extends IntegrationTestCase
$this->assertNotDbConnectionCreated();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingChangeNotAllowed
- */
public function test_setSettingValue_shouldThrowException_IfAUserIsTryingToSetASettingWhichNeedsSuperUserPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingChangeNotAllowed');
+
$this->setUser();
$setting = $this->buildSetting('mysystem');
$setting->setValue(2);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingChangeNotAllowed
- */
public function test_setSettingValue_shouldThrowException_IfAnonymousIsTryingToSetASettingWhichNeedsSuperUserPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingChangeNotAllowed');
+
$this->setAnonymousUser();
$setting = $this->buildSetting('mysystem');
@@ -147,12 +145,11 @@ class SystemSettingTest extends IntegrationTestCase
$this->assertTrue($setting->isWritableByCurrentUser());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingChangeNotAllowed
- */
public function test_setSettingsValue_shouldNotBePossible_AsSoonAsAConfigValueIsConfigured()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingChangeNotAllowed');
+
$this->setSuperUser();
$setting = $this->buildSetting('myusersetting');
diff --git a/tests/PHPUnit/Integration/Settings/Plugin/UserSettingTest.php b/tests/PHPUnit/Integration/Settings/Plugin/UserSettingTest.php
index a0478b6229..fa435b34c4 100644
--- a/tests/PHPUnit/Integration/Settings/Plugin/UserSettingTest.php
+++ b/tests/PHPUnit/Integration/Settings/Plugin/UserSettingTest.php
@@ -68,12 +68,11 @@ class UserSettingTest extends IntegrationTestCase
$this->assertDbConnectionCreated();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingChangeNotAllowed
- */
public function test_setSettingValue_shouldThrowException_IfAnonymousIsTryingToSetASettingWhichNeedsUserPermission()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingChangeNotAllowed');
+
$this->setAnonymousUser();
$setting = $this->buildSetting('mysystem');
@@ -141,12 +140,11 @@ class UserSettingTest extends IntegrationTestCase
$this->assertSettingHasValue($setting, 43939, 'integer');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Validation Fail
- */
public function test_setSettingValue_shouldValidateAValue_IfAFilterIsSet()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Validation Fail');
+
$this->setUser();
$self = $this;
diff --git a/tests/PHPUnit/Integration/Settings/SettingTest.php b/tests/PHPUnit/Integration/Settings/SettingTest.php
index 544082fc02..8cbdf76c3d 100644
--- a/tests/PHPUnit/Integration/Settings/SettingTest.php
+++ b/tests/PHPUnit/Integration/Settings/SettingTest.php
@@ -23,27 +23,26 @@ use Piwik\Validators\NumberRange;
* @group Settings
* @group Setting
*/
-class SettingTest extends \PHPUnit_Framework_TestCase
+class SettingTest extends \PHPUnit\Framework\TestCase
{
- protected function setUp()
+ public function setUp(): void
{
$fixutre = new Fixture();
$fixutre->createEnvironmentInstance();
}
- protected function tearDown()
+ public function tearDown(): void
{
$fixutre = new Fixture();
$fixutre->clearInMemoryCaches();
$fixutre->destroyEnvironment();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage setting name "myname-" in plugin "MyPluginName" is invalid
- */
public function test_constructor_shouldThrowException_IfTheSettingNameIsNotValid()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('setting name "myname-" in plugin "MyPluginName" is invalid');
+
$this->makeSetting('myname-');
}
@@ -58,24 +57,22 @@ class SettingTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(FieldConfig::UI_CONTROL_CHECKBOX, $field->uiControl);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Type must be an array when using a multi select
- */
public function test_configureField_ShouldCheckThatTypeMakesActuallySenseForConfiguredUiControl()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Type must be an array when using a multi select');
+
$setting = $this->makeSetting('myname', FieldConfig::TYPE_STRING, $default = '', function (FieldConfig $field) {
$field->uiControl = FieldConfig::UI_CONTROL_MULTI_SELECT;
});
$setting->configureField();
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Type does not exist
- */
public function test_configureField_ChecksTheGivenTypeIsKnown()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Type does not exist');
+
$setting = $this->makeSetting('myname', 'unknOwnTyPe');
$setting->configureField();
}
@@ -93,19 +90,18 @@ class SettingTest extends \PHPUnit_Framework_TestCase
try {
$setting->setValue('invAliDValue');
} catch (Exception $e) {
- $this->assertContains('CoreAdminHome_PluginSettingsValueNotAllowed', $e->getMessage());
+ self::assertStringContainsString('CoreAdminHome_PluginSettingsValueNotAllowed', $e->getMessage());
return;
}
$this->fail('An expected exception has not been thrown');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage CoreAdminHome_PluginSettingsValueNotAllowed
- */
public function test_setValue_shouldApplyValidationAndFail_IfOptionsAreSetAndValueIsAnArray()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('CoreAdminHome_PluginSettingsValueNotAllowed');
+
$setting = $this->makeSetting('myname', FieldConfig::TYPE_ARRAY, $default = '', function (FieldConfig $field) {
$field->availableValues = array('allowedval' => 'DisplayName', 'allowedval2' => 'Name 2');
$field->uiControl = FieldConfig::UI_CONTROL_MULTI_SELECT;
@@ -146,7 +142,7 @@ class SettingTest extends \PHPUnit_Framework_TestCase
try {
$setting->setValue('invAliDValue');
} catch (Exception $e) {
- $this->assertContains('CoreAdminHome_PluginSettingsValueNotAllowed', $e->getMessage());
+ self::assertStringContainsString('CoreAdminHome_PluginSettingsValueNotAllowed', $e->getMessage());
return;
}
@@ -170,7 +166,7 @@ class SettingTest extends \PHPUnit_Framework_TestCase
try {
$setting->setValue('1invalid');
} catch (Exception $e) {
- $this->assertContains('CoreAdminHome_PluginSettingsValueNotAllowed', $e->getMessage());
+ self::assertStringContainsString('CoreAdminHome_PluginSettingsValueNotAllowed', $e->getMessage());
return;
}
@@ -192,21 +188,21 @@ class SettingTest extends \PHPUnit_Framework_TestCase
$setting->setValue('1invalid');
$this->fail('An expected exception has not been thrown');
} catch (Exception $e) {
- $this->assertContains('General_ValidatorErrorNotANumber', $e->getMessage());
+ self::assertStringContainsString('General_ValidatorErrorNotANumber', $e->getMessage());
}
try {
$setting->setValue('3');
$this->fail('An expected exception has not been thrown');
} catch (Exception $e) {
- $this->assertContains('General_ValidatorErrorNumberTooLow', $e->getMessage());
+ self::assertStringContainsString('General_ValidatorErrorNumberTooLow', $e->getMessage());
}
try {
$setting->setValue('');
$this->fail('An expected exception has not been thrown');
} catch (Exception $e) {
- $this->assertContains('General_ValidatorErrorEmptyValue', $e->getMessage());
+ self::assertStringContainsString('General_ValidatorErrorEmptyValue', $e->getMessage());
}
}
diff --git a/tests/PHPUnit/Integration/Settings/Storage/Backend/CacheTest.php b/tests/PHPUnit/Integration/Settings/Storage/Backend/CacheTest.php
index 577cdb0d61..f8c8bc06e4 100644
--- a/tests/PHPUnit/Integration/Settings/Storage/Backend/CacheTest.php
+++ b/tests/PHPUnit/Integration/Settings/Storage/Backend/CacheTest.php
@@ -30,7 +30,7 @@ class CacheTest extends IntegrationTestCase
*/
private $cacheBackend;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Settings/Storage/Backend/ConfigTest.php b/tests/PHPUnit/Integration/Settings/Storage/Backend/ConfigTest.php
index 21e375325f..ce75cd8e59 100644
--- a/tests/PHPUnit/Integration/Settings/Storage/Backend/ConfigTest.php
+++ b/tests/PHPUnit/Integration/Settings/Storage/Backend/ConfigTest.php
@@ -41,7 +41,7 @@ class ConfigTest extends IntegrationTestCase
*/
private $allBackends = array();
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -56,12 +56,11 @@ class ConfigTest extends IntegrationTestCase
return new Config($plugin);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage No section given
- */
public function test_construct_shouldThrowAnException_IfSectionIsEmpty()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('No section given');
+
$this->createSettings('');
}
diff --git a/tests/PHPUnit/Integration/Settings/Storage/Backend/MeasurableSettingsTableTest.php b/tests/PHPUnit/Integration/Settings/Storage/Backend/MeasurableSettingsTableTest.php
index f9572eb153..6b636cd687 100644
--- a/tests/PHPUnit/Integration/Settings/Storage/Backend/MeasurableSettingsTableTest.php
+++ b/tests/PHPUnit/Integration/Settings/Storage/Backend/MeasurableSettingsTableTest.php
@@ -41,7 +41,7 @@ class MeasurableSettingsTableTest extends IntegrationTestCase
*/
private $allBackends = array();
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -56,21 +56,19 @@ class MeasurableSettingsTableTest extends IntegrationTestCase
return new MeasurableSettingsTable($idSite, $plugin);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage No plugin name given
- */
public function test_construct_shouldThrowAnException_IfPluginNameIsEmpty()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('No plugin name given');
+
$this->createSettings(1, '');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage No idSite given
- */
public function test_construct_shouldThrowAnException_IfIdSiteIsEmpty()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('No idSite given');
+
$this->createSettings(0, 'MyPlugin');
}
diff --git a/tests/PHPUnit/Integration/Settings/Storage/Backend/NullTest.php b/tests/PHPUnit/Integration/Settings/Storage/Backend/NullTest.php
index ea3639d035..362b0c43d6 100644
--- a/tests/PHPUnit/Integration/Settings/Storage/Backend/NullTest.php
+++ b/tests/PHPUnit/Integration/Settings/Storage/Backend/NullTest.php
@@ -15,7 +15,7 @@ use Piwik\Settings\Storage\Backend\NullBackend;
* @group Backend
* @group Storage
*/
-class NullTest extends \PHPUnit_Framework_TestCase
+class NullTest extends \PHPUnit\Framework\TestCase
{
/**
@@ -23,7 +23,7 @@ class NullTest extends \PHPUnit_Framework_TestCase
*/
private $backend;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Settings/Storage/Backend/PluginSettingsTableTest.php b/tests/PHPUnit/Integration/Settings/Storage/Backend/PluginSettingsTableTest.php
index ec1c0b229a..1c57d27041 100644
--- a/tests/PHPUnit/Integration/Settings/Storage/Backend/PluginSettingsTableTest.php
+++ b/tests/PHPUnit/Integration/Settings/Storage/Backend/PluginSettingsTableTest.php
@@ -46,7 +46,7 @@ class PluginSettingsTableTest extends IntegrationTestCase
*/
private $allBackends = array();
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -62,30 +62,27 @@ class PluginSettingsTableTest extends IntegrationTestCase
return new PluginSettingsTable($plugin, $login);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage No plugin name given
- */
public function test_construct_shouldThrowAnException_IfPluginNameIsEmpty()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('No plugin name given');
+
$this->createSettings('', '');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Invalid user login name
- */
public function test_construct_shouldThrowAnException_IfUserLoginFalse()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Invalid user login name');
+
$this->createSettings('MyPlugin', false);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Invalid user login name
- */
public function test_construct_shouldThrowAnException_IfUserLoginNull()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Invalid user login name');
+
$this->createSettings('MyPlugin', null);
}
@@ -263,12 +260,11 @@ class PluginSettingsTableTest extends IntegrationTestCase
}
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage No userLogin specified
- */
public function test_removeAllUserSettingsForUser_shouldThrowAnExceptionIfLoginIsEmpty()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('No userLogin specified');
+
PluginSettingsTable::removeAllUserSettingsForUser('');
}
diff --git a/tests/PHPUnit/Integration/Settings/Storage/Backend/SitesTableTest.php b/tests/PHPUnit/Integration/Settings/Storage/Backend/SitesTableTest.php
index 32d3a2c903..aa54f175cb 100644
--- a/tests/PHPUnit/Integration/Settings/Storage/Backend/SitesTableTest.php
+++ b/tests/PHPUnit/Integration/Settings/Storage/Backend/SitesTableTest.php
@@ -32,7 +32,7 @@ class SitesTableTest extends IntegrationTestCase
*/
private $backendSite2;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -48,12 +48,11 @@ class SitesTableTest extends IntegrationTestCase
return new SitesTable($idSite);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage No idSite given
- */
public function test_construct_shouldThrowAnException_IfPluginNameIsEmpty()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('No idSite given');
+
$this->createSettings(0);
}
@@ -63,11 +62,10 @@ class SitesTableTest extends IntegrationTestCase
$this->assertFieldsLoaded(array('idsite' => '2'), $this->backendSite2);
}
- /**
- * @expectedException \Piwik\Exception\UnexpectedWebsiteFoundException
- */
public function test_load_shouldThrowException_IfSiteDoesNotExist()
{
+ $this->expectException(\Piwik\Exception\UnexpectedWebsiteFoundException::class);
+
$this->createSettings($idSite = 999)->load();
}
diff --git a/tests/PHPUnit/Integration/Settings/Storage/FactoryTest.php b/tests/PHPUnit/Integration/Settings/Storage/FactoryTest.php
index ddfdd2da4d..1e573e88ef 100644
--- a/tests/PHPUnit/Integration/Settings/Storage/FactoryTest.php
+++ b/tests/PHPUnit/Integration/Settings/Storage/FactoryTest.php
@@ -33,7 +33,7 @@ class FactoryTest extends IntegrationTestCase
*/
private $factory;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->factory = new Factory();
diff --git a/tests/PHPUnit/Integration/Settings/Storage/StorageTest.php b/tests/PHPUnit/Integration/Settings/Storage/StorageTest.php
index 9e9089438f..5f3e43a32e 100644
--- a/tests/PHPUnit/Integration/Settings/Storage/StorageTest.php
+++ b/tests/PHPUnit/Integration/Settings/Storage/StorageTest.php
@@ -36,7 +36,7 @@ class StorageTest extends IntegrationTestCase
*/
protected $settingName = 'myname';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/SiteTest.php b/tests/PHPUnit/Integration/SiteTest.php
index 1a8b1a3324..1d7a1e4ff6 100644
--- a/tests/PHPUnit/Integration/SiteTest.php
+++ b/tests/PHPUnit/Integration/SiteTest.php
@@ -22,7 +22,7 @@ class SiteTest extends IntegrationTestCase
public $siteAppendix = ' foo';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -39,12 +39,11 @@ class SiteTest extends IntegrationTestCase
});
}
- /**
- * @expectedException \Piwik\Exception\UnexpectedWebsiteFoundException
- * @expectedExceptionMessage An unexpected website was found in the request
- */
public function test_constructor_throwsException_ifSiteDoesNotExist()
{
+ $this->expectException(\Piwik\Exception\UnexpectedWebsiteFoundException::class);
+ $this->expectExceptionMessage('An unexpected website was found in the request');
+
$this->makeSite(9999);
}
diff --git a/tests/PHPUnit/Integration/SqlTest.php b/tests/PHPUnit/Integration/SqlTest.php
index ccafa9e6ee..df8301074d 100644
--- a/tests/PHPUnit/Integration/SqlTest.php
+++ b/tests/PHPUnit/Integration/SqlTest.php
@@ -16,7 +16,7 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class SqlTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -29,7 +29,7 @@ class SqlTest extends IntegrationTestCase
Db::exec("CREATE TABLE table4 (d INT) ENGINE=InnoDB");
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
}
diff --git a/tests/PHPUnit/Integration/Tracker/ActionTest.php b/tests/PHPUnit/Integration/Tracker/ActionTest.php
index ad2bfbd06f..adc3f0efff 100644
--- a/tests/PHPUnit/Integration/Tracker/ActionTest.php
+++ b/tests/PHPUnit/Integration/Tracker/ActionTest.php
@@ -10,11 +10,11 @@ namespace Piwik\Tests\Integration\Tracker;
use Piwik\Config;
use Piwik\Plugins\SitesManager\API;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\Mock\FakeAccess;
use Piwik\Tracker\Action;
use Piwik\Tracker\PageUrl;
use Piwik\Tracker\Request;
-use Piwik\Translate;
use Piwik\Plugin\Manager as PluginManager;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
@@ -24,7 +24,7 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class ActionTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -37,14 +37,14 @@ class ActionTest extends IntegrationTestCase
PluginManager::getInstance()->loadPlugins(array('SitesManager'));
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
- Translate::reset();
+ Fixture::resetTranslations();
}
protected function setUpRootAccess()
diff --git a/tests/PHPUnit/Integration/Tracker/DbTest.php b/tests/PHPUnit/Integration/Tracker/DbTest.php
index 4d94d34f9c..f340725343 100644
--- a/tests/PHPUnit/Integration/Tracker/DbTest.php
+++ b/tests/PHPUnit/Integration/Tracker/DbTest.php
@@ -22,7 +22,7 @@ use Piwik\Tracker;
class DbTest extends IntegrationTestCase
{
private $tableName;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->tableName = Common::prefixTable('option');
@@ -60,24 +60,22 @@ class DbTest extends IntegrationTestCase
$this->assertSame(1, $db->rowCount($result));
}
- /**
- * @expectedExceptionMessage doesn't exist
- * @expectedException \Piwik\Tracker\Db\DbException
- */
public function test_fetchOne_notExistingTable()
{
+ $this->expectException(\Piwik\Tracker\Db\DbException::class);
+ $this->expectExceptionMessage('doesn\'t exist');
+
$db = Tracker::getDatabase();
$this->insertRowId(3);
$val = $db->fetchOne('SELECT option_value FROM foobarbaz where option_value = "rowid"');
$this->assertEquals('3', $val);
}
- /**
- * @expectedExceptionMessage Duplicate entry
- * @expectedException \Piwik\Tracker\Db\DbException
- */
public function test_query_error_whenInsertingDuplicateRow()
{
+ $this->expectException(\Piwik\Tracker\Db\DbException::class);
+ $this->expectExceptionMessage('Duplicate entry');
+
$this->insertRowId();
$this->insertRowId();
}
diff --git a/tests/PHPUnit/Integration/Tracker/FailuresTest.php b/tests/PHPUnit/Integration/Tracker/FailuresTest.php
index 308dfc18ab..748cdba93c 100644
--- a/tests/PHPUnit/Integration/Tracker/FailuresTest.php
+++ b/tests/PHPUnit/Integration/Tracker/FailuresTest.php
@@ -30,7 +30,7 @@ class FailuresTest extends IntegrationTestCase
*/
private $now;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Tracker/Handler/FactoryTest.php b/tests/PHPUnit/Integration/Tracker/Handler/FactoryTest.php
index 9ffecb9a30..f500c3e244 100644
--- a/tests/PHPUnit/Integration/Tracker/Handler/FactoryTest.php
+++ b/tests/PHPUnit/Integration/Tracker/Handler/FactoryTest.php
@@ -53,12 +53,11 @@ class FactoryTest extends IntegrationTestCase
$this->assertSame($handlerToUse, $handler);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The Handler object set in the plugin
- */
public function test_make_shouldTriggerExceptionInCaseWrongInstanceCreatedInHandler()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The Handler object set in the plugin');
+
Piwik::addAction('Tracker.newHandler', function (&$handler) {
$handler = new Tracker();
});
diff --git a/tests/PHPUnit/Integration/Tracker/HandlerTest.php b/tests/PHPUnit/Integration/Tracker/HandlerTest.php
index 840345fea3..63bd684c60 100644
--- a/tests/PHPUnit/Integration/Tracker/HandlerTest.php
+++ b/tests/PHPUnit/Integration/Tracker/HandlerTest.php
@@ -46,7 +46,7 @@ class HandlerTest extends IntegrationTestCase
*/
private $requestSet;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -80,58 +80,6 @@ class HandlerTest extends IntegrationTestCase
$this->assertTrue($this->response->isSend);
}
- public function test_finish_ShouldRedirectIfThereIsAValidUrl()
- {
- $_GET['redirecturl'] = 'http://localhost/test?foo=bar';
-
- $this->requestSet->setRequests(array(array('idsite' => '1')));
-
- try {
- $this->handler->finish($this->tracker, $this->requestSet);
- $this->fail('An expected exception was not thrown');
- } catch (Exception $e) {
- $this->assertContains('Matomo would redirect you to this URL: ' . $_GET['redirecturl'], $e->getMessage());
- unset($_GET['redirecturl']);
- }
- }
-
- public function test_finish_ShouldRedirectIfThereIsAValidBelongingToTheSite()
- {
- $_GET['redirecturl'] = 'http://piwik.net/';
-
- $this->requestSet->setRequests(array(array('idsite' => '1')));
-
- try {
- $this->handler->finish($this->tracker, $this->requestSet);
- $this->fail('An expected exception was not thrown');
- } catch (Exception $e) {
- $this->assertContains('Matomo would redirect you to this URL: http://piwik.net/', $e->getMessage());
- unset($_GET['redirecturl']);
- }
- }
-
- public function test_finish_ShouldNotRedirectIfThereIsAUrlThatDoesNotBelongToAnySite()
- {
- $_GET['redirecturl'] = 'http://random.piwik.org/test?foo=bar';
-
- $this->requestSet->setRequests(array(array('idsite' => '1')));
- $this->handler->finish($this->tracker, $this->requestSet);
- unset($_GET['redirecturl']);
-
- $this->assertTrue(true);
- }
-
- public function test_finish_ShouldNotRedirectIfUrlIsValidButNoRequests()
- {
- $_GET['redirecturl'] = 'http://localhost/test';
-
- $this->requestSet->setRequests(array());
- $this->handler->finish($this->tracker, $this->requestSet);
- unset($_GET['redirecturl']);
-
- $this->assertTrue(true);
- }
-
public function test_finish_ShoulAlsoReturnAPossibleRenderedException()
{
$this->executeOnException($this->buildException());
@@ -172,21 +120,6 @@ class HandlerTest extends IntegrationTestCase
$this->assertSame(400, $this->response->statusCode);
}
- public function test_onException_ShouldStilRedirectIfThereIsAnExceptionAndAValidRedirectUrl()
- {
- $_GET['redirecturl'] = 'http://localhost/test?foo=bar';
-
- $this->requestSet->setRequests(array(array('idsite' => '1')));
-
- try {
- $this->handler->onException($this->tracker, $this->requestSet, $this->buildException());
- $this->fail('An expected exception was not thrown');
- } catch (Exception $e) {
- $this->assertContains('Matomo would redirect you to this URL: ' . $_GET['redirecturl'], $e->getMessage());
- unset($_GET['redirecturl']);
- }
- }
-
public function test_onException_ShouldNotRethrowExceptionToExitTrackerImmediately()
{
$exception = $this->buildException();
diff --git a/tests/PHPUnit/Integration/Tracker/ModelTest.php b/tests/PHPUnit/Integration/Tracker/ModelTest.php
index b14c066afc..4d8f940b90 100644
--- a/tests/PHPUnit/Integration/Tracker/ModelTest.php
+++ b/tests/PHPUnit/Integration/Tracker/ModelTest.php
@@ -7,7 +7,9 @@
*/
namespace Piwik\Tests\Integration\Tracker;
+use Matomo\Network\IPUtils;
use Piwik\Common;
+use Piwik\Date;
use Piwik\Db;
use Piwik\Tests\Fixtures\OneVisitorTwoVisits;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
@@ -28,13 +30,36 @@ class ModelTest extends IntegrationTestCase
*/
private $model;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->model = new Model();
}
+ public function test_hasVisit() {
+ $this->model->createVisit(array(
+ 'idvisitor' => hex2bin('1234567812345678'),
+ 'config_id' => '1234567',
+ 'location_ip' => IPUtils::binaryToStringIP('10.10.10.10'),
+ 'idvisit' => '4',
+ 'idsite' => '3',
+ 'visitor_count_visits' => 0,
+ 'visit_total_time' => 0,
+ 'visit_first_action_time' => Date::now()->getDatetime(),
+ 'visit_last_action_time' => Date::now()->getDatetime(),
+ ));
+
+ $this->assertTrue($this->model->hasVisit(3, 4));
+ $this->assertTrue($this->model->hasVisit('3', '4'));
+
+ // idsite not match
+ $this->assertFalse($this->model->hasVisit(9, 4));
+
+ // idvisit not match
+ $this->assertFalse($this->model->hasVisit(3, 8));
+ }
+
public function test_createNewIdAction_CreatesNewAction_WhenNoActionWithSameNameAndType()
{
$newIdAction = $this->model->createNewIdAction(self::TEST_ACTION_NAME, self::TEST_ACTION_TYPE, self::TEST_ACTION_URL_PREFIX);
diff --git a/tests/PHPUnit/Integration/Tracker/PingRequestTest.php b/tests/PHPUnit/Integration/Tracker/PingRequestTest.php
index cb103514cb..7b2d149754 100644
--- a/tests/PHPUnit/Integration/Tracker/PingRequestTest.php
+++ b/tests/PHPUnit/Integration/Tracker/PingRequestTest.php
@@ -26,7 +26,7 @@ class PingRequestTest extends IntegrationTestCase
const CHANGED_COUNTRY = 'jp';
const CHANGED_REGION = '22';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -183,7 +183,7 @@ class PingRequestTest extends IntegrationTestCase
return Db::fetchOne("SELECT $columnName FROM " . Common::prefixTable('log_visit') . " WHERE idvisit = ?", array($idVisit));
}
- private function doPingRequest(\PiwikTracker $tracker, $pingTime, $changeDimensionValues)
+ private function doPingRequest(\MatomoTracker $tracker, $pingTime, $changeDimensionValues)
{
if ($changeDimensionValues) {
$tracker->setUserAgent(self::CHANGED_USER_AGENT);
diff --git a/tests/PHPUnit/Integration/Tracker/RequestSetTest.php b/tests/PHPUnit/Integration/Tracker/RequestSetTest.php
index 9abee61d38..c07dcffd6d 100644
--- a/tests/PHPUnit/Integration/Tracker/RequestSetTest.php
+++ b/tests/PHPUnit/Integration/Tracker/RequestSetTest.php
@@ -19,20 +19,11 @@ class TestRequestSet extends RequestSet {
private $redirectUrl = '';
- public function setRedirectUrl($url)
- {
- $this->redirectUrl = $url;
- }
-
public function getAllSiteIdsWithinRequest()
{
return parent::getAllSiteIdsWithinRequest();
}
- public function getRedirectUrl()
- {
- return $this->redirectUrl;
- }
}
/**
* @group RequestSetTest
@@ -49,7 +40,7 @@ class RequestSetTest extends IntegrationTestCase
private $post;
private $time;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -72,7 +63,7 @@ class RequestSetTest extends IntegrationTestCase
$_POST = array();
}
- public function tearDown()
+ public function tearDown(): void
{
$_GET = $this->get;
$_POST = $this->post;
@@ -128,49 +119,6 @@ class RequestSetTest extends IntegrationTestCase
return $request;
}
- public function test_shouldPerformRedirectToUrl_shouldNotRedirect_IfNoUrlIsSet()
- {
- $this->assertFalse($this->requestSet->shouldPerformRedirectToUrl());
- }
-
- public function test_shouldPerformRedirectToUrl_shouldNotRedirect_IfUrlIsSetButNoRequests()
- {
- $this->requestSet->setRedirectUrl('http://localhost');
- $this->assertEquals('http://localhost', $this->requestSet->getRedirectUrl());
-
- $this->requestSet->setRequests(array());
-
- $this->assertFalse($this->requestSet->shouldPerformRedirectToUrl());
- }
-
- public function test_shouldPerformRedirectToUrl_shouldNotRedirect_IfUrlHasNoHostOrIsNotUrl()
- {
- $this->requestSet->setRedirectUrl('abc');
-
- $this->assertFalse($this->requestSet->shouldPerformRedirectToUrl());
- }
-
- public function test_shouldPerformRedirectToUrl_shouldNotRedirect_IfUrlIsNotWhitelistedInAnySiteId()
- {
- $this->requestSet->setRedirectUrl('http://example.org');
-
- $this->assertFalse($this->requestSet->shouldPerformRedirectToUrl());
- }
-
- public function test_shouldPerformRedirectToUrl_shouldRedirect_IfUrlIsGivenAndWhitelistedInAnySiteId()
- {
- $this->requestSet->setRedirectUrl('http://www.example.com');
-
- $this->assertEquals('http://www.example.com', $this->requestSet->shouldPerformRedirectToUrl());
- }
-
- public function test_shouldPerformRedirectToUrl_shouldRedirect_IfBaseDomainIsGivenAndWhitelistedInAnySiteId()
- {
- $this->requestSet->setRedirectUrl('http://example.com');
-
- $this->assertEquals('http://example.com', $this->requestSet->shouldPerformRedirectToUrl());
- }
-
public function test_initRequestsAndTokenAuth_shouldTriggerEventToInitRequestsButOnlyOnce()
{
$requestSet = $this->buildNewRequestSetThatIsNotInitializedYet();
diff --git a/tests/PHPUnit/Integration/Tracker/RequestTest.php b/tests/PHPUnit/Integration/Tracker/RequestTest.php
index 7465cc7dc8..2de6b0e92f 100644
--- a/tests/PHPUnit/Integration/Tracker/RequestTest.php
+++ b/tests/PHPUnit/Integration/Tracker/RequestTest.php
@@ -8,7 +8,7 @@
namespace Piwik\Tests\Integration\Tracker;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Piwik;
use Piwik\Plugins\CustomVariables\CustomVariables;
use Piwik\Plugins\UsersManager\API;
@@ -34,7 +34,7 @@ class RequestTest extends IntegrationTestCase
private $time;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -50,12 +50,11 @@ class RequestTest extends IntegrationTestCase
$this->time = 1416795617;
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Custom timestamp is 86500 seconds old
- */
public function test_cdt_ShouldNotTrackTheRequest_IfNotAuthenticatedAndTimestampIsNotRecent()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Custom timestamp is 86500 seconds old');
+
$request = $this->buildRequest(array('cdt' => '' . $this->time - 86500));
$request->setCurrentTimestamp($this->time);
$this->assertSame($this->time, $request->getCurrentTimestamp());
@@ -99,22 +98,20 @@ class RequestTest extends IntegrationTestCase
$this->assertSame(14, $request->getIdSite());
}
- /**
- * @expectedException \Piwik\Exception\UnexpectedWebsiteFoundException
- * @expectedExceptionMessage Invalid idSite: '0'
- */
public function test_getIdSite_shouldNotThrowException_IfValueIsZero()
{
+ $this->expectException(\Piwik\Exception\UnexpectedWebsiteFoundException::class);
+ $this->expectExceptionMessage('Invalid idSite: \'0\'');
+
$request = $this->buildRequest(array('idsite' => '0'));
$request->getIdSite();
}
- /**
- * @expectedException \Piwik\Exception\UnexpectedWebsiteFoundException
- * @expectedExceptionMessage Invalid idSite: '-1'
- */
public function test_getIdSite_shouldThrowException_IfValueIsLowerThanZero()
{
+ $this->expectException(\Piwik\Exception\UnexpectedWebsiteFoundException::class);
+ $this->expectExceptionMessage('Invalid idSite: \'-1\'');
+
$request = $this->buildRequest(array('idsite' => '-1'));
$request->getIdSite();
}
@@ -472,12 +469,11 @@ class RequestTest extends IntegrationTestCase
);
}
- /**
- * @expectedException \Piwik\Exception\UnexpectedWebsiteFoundException
- * @expectedExceptionMessage An unexpected website was found in the request: website id was set to '155'
- */
public function test_getIdSite_shouldTriggerExceptionWhenSiteNotExists()
{
+ $this->expectException(\Piwik\Exception\UnexpectedWebsiteFoundException::class);
+ $this->expectExceptionMessage('An unexpected website was found in the request: website id was set to \'155\'');
+
$self = $this;
Piwik::addAction('Tracker.Request.getIdSite', function (&$idSite, $params) use ($self) {
$self->assertSame(14, $idSite);
diff --git a/tests/PHPUnit/Integration/Tracker/SettingsTest.php b/tests/PHPUnit/Integration/Tracker/SettingsTest.php
index 14e32113bb..4689d8d274 100644
--- a/tests/PHPUnit/Integration/Tracker/SettingsTest.php
+++ b/tests/PHPUnit/Integration/Tracker/SettingsTest.php
@@ -26,7 +26,7 @@ class SettingsTest extends IntegrationTestCase
*/
protected $ip = '123.30.30.30';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Tracker/Visit/FactoryTest.php b/tests/PHPUnit/Integration/Tracker/Visit/FactoryTest.php
index b4c76fe9c1..fc5e210882 100644
--- a/tests/PHPUnit/Integration/Tracker/Visit/FactoryTest.php
+++ b/tests/PHPUnit/Integration/Tracker/Visit/FactoryTest.php
@@ -54,12 +54,11 @@ class FactoryTest extends IntegrationTestCase
$this->assertSame($visitToUse, $visit);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage The Visit object set in the plugin
- */
public function test_make_shouldTriggerExceptionInCaseWrongInstanceCreatedInHandler()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('The Visit object set in the plugin');
+
Piwik::addAction('Tracker.makeNewVisitObject', function (&$visit) {
$visit = new Tracker();
});
diff --git a/tests/PHPUnit/Integration/Tracker/Visit/ReferrerSpamFilterTest.php b/tests/PHPUnit/Integration/Tracker/Visit/ReferrerSpamFilterTest.php
index f7b256d7c5..f6570b9300 100644
--- a/tests/PHPUnit/Integration/Tracker/Visit/ReferrerSpamFilterTest.php
+++ b/tests/PHPUnit/Integration/Tracker/Visit/ReferrerSpamFilterTest.php
@@ -25,7 +25,7 @@ class ReferrerSpamFilterTest extends IntegrationTestCase
*/
private $filter;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -33,7 +33,7 @@ class ReferrerSpamFilterTest extends IntegrationTestCase
$this->filter = new ReferrerSpamFilter;
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
diff --git a/tests/PHPUnit/Integration/Tracker/Visit2Test.php b/tests/PHPUnit/Integration/Tracker/Visit2Test.php
index a1606f668a..67ffd18b2a 100644
--- a/tests/PHPUnit/Integration/Tracker/Visit2Test.php
+++ b/tests/PHPUnit/Integration/Tracker/Visit2Test.php
@@ -141,7 +141,7 @@ class FakeTrackerVisit extends Visit
*/
class Visit2Test extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Fixture::createWebsite('2014-01-01 00:00:00');
diff --git a/tests/PHPUnit/Integration/Tracker/VisitTest.php b/tests/PHPUnit/Integration/Tracker/VisitTest.php
index ccd73ce15f..8fb265fe9e 100644
--- a/tests/PHPUnit/Integration/Tracker/VisitTest.php
+++ b/tests/PHPUnit/Integration/Tracker/VisitTest.php
@@ -11,7 +11,7 @@ namespace Piwik\Tests\Integration\Tracker;
use Piwik\Cache;
use Piwik\Container\StaticContainer;
use Piwik\Date;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Plugin\Manager;
use Piwik\Plugins\SitesManager\API;
use Piwik\Tests\Framework\Fixture;
@@ -27,7 +27,7 @@ use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
*/
class VisitTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/TrackerTest.php b/tests/PHPUnit/Integration/TrackerTest.php
index 94f2feefa0..3b7786940e 100644
--- a/tests/PHPUnit/Integration/TrackerTest.php
+++ b/tests/PHPUnit/Integration/TrackerTest.php
@@ -40,7 +40,7 @@ class TrackerTest extends IntegrationTestCase
private $iniTimeZone;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -52,7 +52,7 @@ class TrackerTest extends IntegrationTestCase
$this->iniTimeZone = ini_get('date.timezone');
}
- public function tearDown()
+ public function tearDown(): void
{
$this->restoreConfigFile();
diff --git a/tests/PHPUnit/Integration/TravisEnvironmentTest.php b/tests/PHPUnit/Integration/TravisEnvironmentTest.php
index 0c3001e2e5..023b2aadd2 100644
--- a/tests/PHPUnit/Integration/TravisEnvironmentTest.php
+++ b/tests/PHPUnit/Integration/TravisEnvironmentTest.php
@@ -9,7 +9,6 @@
namespace Piwik\Tests\Integration;
use Piwik\Db;
-use Piwik\Translate;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
/**
diff --git a/tests/PHPUnit/Integration/Updater/Migration/Db/FactoryTest.php b/tests/PHPUnit/Integration/Updater/Migration/Db/FactoryTest.php
index 40afc8b5a4..7e26c33c45 100644
--- a/tests/PHPUnit/Integration/Updater/Migration/Db/FactoryTest.php
+++ b/tests/PHPUnit/Integration/Updater/Migration/Db/FactoryTest.php
@@ -43,7 +43,7 @@ class FactoryTest extends IntegrationTestCase
private $testTable = 'tablename';
private $testTablePrefixed = '';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Updater/Migration/Db/MigrationsTest.php b/tests/PHPUnit/Integration/Updater/Migration/Db/MigrationsTest.php
index 73d0716a7f..496a01df20 100644
--- a/tests/PHPUnit/Integration/Updater/Migration/Db/MigrationsTest.php
+++ b/tests/PHPUnit/Integration/Updater/Migration/Db/MigrationsTest.php
@@ -32,14 +32,14 @@ class MigrationsTest extends IntegrationTestCase
private $testTable = 'tablename';
private $testTablePrefixed = '';
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
self::dropTestTableIfNeeded();
}
- public static function tearDownAfterClass()
+ public static function tearDownAfterClass(): void
{
self::dropTestTableIfNeeded();
@@ -52,7 +52,7 @@ class MigrationsTest extends IntegrationTestCase
Db::exec("DROP TABLE IF EXISTS `$table`");
}
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -156,6 +156,7 @@ class MigrationsTest extends IntegrationTestCase
public function test_changeColumnType()
{
$this->factory->changeColumnType($this->testTable, 'column2', 'SMALLINT(4) NOT NULL')->exec();
+ $this->assertTrue(true);
}
/**
diff --git a/tests/PHPUnit/Integration/Updater/Migration/FactoryTest.php b/tests/PHPUnit/Integration/Updater/Migration/FactoryTest.php
index 3cbde51fd3..88a780a5bf 100644
--- a/tests/PHPUnit/Integration/Updater/Migration/FactoryTest.php
+++ b/tests/PHPUnit/Integration/Updater/Migration/FactoryTest.php
@@ -25,7 +25,7 @@ class FactoryTest extends IntegrationTestCase
*/
private $factory;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Updater/Migration/Plugin/FactoryTest.php b/tests/PHPUnit/Integration/Updater/Migration/Plugin/FactoryTest.php
index f0da8fd54b..dc278750d5 100644
--- a/tests/PHPUnit/Integration/Updater/Migration/Plugin/FactoryTest.php
+++ b/tests/PHPUnit/Integration/Updater/Migration/Plugin/FactoryTest.php
@@ -26,7 +26,7 @@ class FactoryTest extends IntegrationTestCase
private $pluginName = 'MyTestPluginName';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Integration/Validator/IdSiteTest.php b/tests/PHPUnit/Integration/Validator/IdSiteTest.php
index 3fa670a1e2..5128be372d 100644
--- a/tests/PHPUnit/Integration/Validator/IdSiteTest.php
+++ b/tests/PHPUnit/Integration/Validator/IdSiteTest.php
@@ -18,7 +18,7 @@ use Piwik\Validators\IdSite;
*/
class IdSiteTest extends IntegrationTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Fixture::createWebsite('2012-03-04 05:06:07');
@@ -34,27 +34,24 @@ class IdSiteTest extends IntegrationTestCase
$this->validate(2);
}
- /**
- * @expectedException \Piwik\Exception\UnexpectedWebsiteFoundException
- */
public function test_validate_failValueDoesNotExist()
{
+ $this->expectException(\Piwik\Exception\UnexpectedWebsiteFoundException::class);
+
$this->validate(99);
}
- /**
- * @expectedException \Piwik\Exception\UnexpectedWebsiteFoundException
- */
public function test_validate_failValueIsEmpty()
{
+ $this->expectException(\Piwik\Exception\UnexpectedWebsiteFoundException::class);
+
$this->validate(0);
}
- /**
- * @expectedException \Piwik\Exception\UnexpectedWebsiteFoundException
- */
public function test_validate_failValueIsFalse()
{
+ $this->expectException(\Piwik\Exception\UnexpectedWebsiteFoundException::class);
+
$this->validate(false);
}
diff --git a/tests/PHPUnit/Integration/ViewDataTable/ManagerTest.php b/tests/PHPUnit/Integration/ViewDataTable/ManagerTest.php
index eb88564d1f..0492edd19e 100644
--- a/tests/PHPUnit/Integration/ViewDataTable/ManagerTest.php
+++ b/tests/PHPUnit/Integration/ViewDataTable/ManagerTest.php
@@ -41,12 +41,11 @@ class ManagerTest extends IntegrationTestCase
$this->assertEquals($params['params'], $storedParams);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Setting parameters translations is not allowed. Please report this bug to the Matomo team.
- */
public function test_setViewDataTableParameters_inConfigProperty_shouldOnlyAllowOverridableParams()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Setting parameters translations is not allowed. Please report this bug to the Matomo team.');
+
$login = 'mylogin';
$method = 'API.get';
$params = array(
@@ -58,12 +57,11 @@ class ManagerTest extends IntegrationTestCase
ViewDataTableManager::saveViewDataTableParameters($login, $method, $params);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Setting parameters filters is not allowed. Please report this bug to the Matomo team.
- */
public function test_setViewDataTableParameters_inConfigProperty_shouldOnlyAllowOverridableParams_bis()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Setting parameters filters is not allowed. Please report this bug to the Matomo team.');
+
$login = 'mylogin';
$method = 'API.get';
$params = array(
@@ -75,12 +73,11 @@ class ManagerTest extends IntegrationTestCase
ViewDataTableManager::saveViewDataTableParameters($login, $method, $params);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Setting parameters apiMethodToRequestDataTable is not allowed. Please report this bug to the Matomo team.
- */
public function test_setViewDataTableParameters_inRequestConfigProperty_shouldOnlyAllowOverridableParams()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Setting parameters apiMethodToRequestDataTable is not allowed. Please report this bug to the Matomo team.');
+
$login = 'mylogin';
$method = 'API.get';
$params = array(
diff --git a/tests/PHPUnit/Integration/WidgetsListTest.php b/tests/PHPUnit/Integration/WidgetsListTest.php
index 1cc5cae17c..5e643d1f81 100644
--- a/tests/PHPUnit/Integration/WidgetsListTest.php
+++ b/tests/PHPUnit/Integration/WidgetsListTest.php
@@ -10,7 +10,6 @@ namespace Piwik\Tests\Integration;
use Piwik\Widget\WidgetConfig;
use Piwik\Plugins\Goals\API;
-use Piwik\Translate;
use Piwik\Tests\Framework\Mock\FakeAccess;
use Piwik\Widget\WidgetsList;
use Piwik\Tests\Framework\Fixture;
@@ -152,7 +151,7 @@ class WidgetsListTest extends IntegrationTestCase
public function testIsDefined()
{
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
Fixture::createWebsite('2009-01-04 00:11:42', true);
@@ -169,7 +168,7 @@ class WidgetsListTest extends IntegrationTestCase
$this->assertTrue($list->isDefined('Actions', 'getPageUrls'));
$this->assertFalse($list->isDefined('Actions', 'inValiD'));
- Translate::reset();
+ Fixture::resetTranslations();
}
public function provideContainerConfig()
diff --git a/tests/PHPUnit/System/AllWebsitesTest.php b/tests/PHPUnit/System/AllWebsitesTest.php
new file mode 100644
index 0000000000..eaa6f08e16
--- /dev/null
+++ b/tests/PHPUnit/System/AllWebsitesTest.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+namespace Piwik\Tests\System;
+
+use Piwik\Plugins\UsersManager\API as UsersManagerAPI;
+use Piwik\Plugins\UsersManager\Model as UsersManagerModel;
+use Piwik\Tests\Fixtures\ThreeSitesWithSharedVisitors;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+
+/**
+ * @group Core
+ * @group AllWebsitesTest
+ */
+class AllWebsitesTest extends SystemTestCase
+{
+ public static $fixture = null; // initialized below class definition
+ protected static $userTokenAuth = '34bcc4d2c330259d6f37bc3d98d425f4';
+
+ public static function setUpBeforeClass(): void
+ {
+ parent::setUpBeforeClass();
+
+ self::createUser();
+ }
+
+ private static function createUser()
+ {
+ if (!UsersManagerAPI::getInstance()->userExists('limitedUser')) {
+ // create non super user
+ UsersManagerAPI::getInstance()->addUser('limitedUser', 'smartypants', 'user@limited.com');
+ UsersManagerAPI::getInstance()->setUserAccess('limitedUser', 'view', array(2, 3));
+ $userModel = new UsersManagerModel();
+ $userModel->updateUserTokenAuth('limitedUser', self::$userTokenAuth);
+ }
+ }
+
+ public function getApiForTesting()
+ {
+ $dateTime = substr(self::$fixture->dateTime, 0, 10);
+
+ return [
+ // should return all websites as super user has access to all
+ ['VisitsSummary.get', ['idSite' => 'all',
+ 'date' => $dateTime,
+ 'period' => 'day',
+ 'format' => 'csv'], [
+ 'testSuffix' => 'superuser']
+ ],
+
+ // should only return results for sites the user has access to (2,3)
+ ['VisitsSummary.get', ['idSite' => 'all',
+ 'date' => $dateTime,
+ 'period' => 'day',
+ 'format' => 'csv',
+ 'token_auth' => self::$userTokenAuth], [
+ 'testSuffix' => 'user']
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider getApiForTesting
+ */
+ public function testApi($api, $params, $options)
+ {
+ $this->runAnyApiTest($api, '', $params, $options);
+ }
+}
+
+AllWebsitesTest::$fixture = new ThreeSitesWithSharedVisitors(); \ No newline at end of file
diff --git a/tests/PHPUnit/System/ApiGetReportMetadataTest.php b/tests/PHPUnit/System/ApiGetReportMetadataTest.php
index a33f3a6663..aa49071c5e 100644
--- a/tests/PHPUnit/System/ApiGetReportMetadataTest.php
+++ b/tests/PHPUnit/System/ApiGetReportMetadataTest.php
@@ -24,7 +24,7 @@ class ApiGetReportMetadataTest extends SystemTestCase
{
public static $fixture = null; // initialized below class definition
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -34,7 +34,7 @@ class ApiGetReportMetadataTest extends SystemTestCase
Proxy::getInstance()->setHideIgnoredFunctions(false);
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
diff --git a/tests/PHPUnit/System/BackwardsCompatibility1XTest.php b/tests/PHPUnit/System/BackwardsCompatibility1XTest.php
index a8745832cd..1e8604eab0 100644
--- a/tests/PHPUnit/System/BackwardsCompatibility1XTest.php
+++ b/tests/PHPUnit/System/BackwardsCompatibility1XTest.php
@@ -26,7 +26,7 @@ class BackwardsCompatibility1XTest extends SystemTestCase
public static $fixture = null; // initialized below class
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
@@ -118,6 +118,10 @@ class BackwardsCompatibility1XTest extends SystemTestCase
// those reports generate a different segment as a different raw value was stored that time
'DevicesDetection.getOsVersions',
+ 'DevicesDetection.getBrowserFamilies',
+ 'DevicesDetection.getBrowserVersions',
+ 'DevicesDetection.getBrowserEngines',
+ 'DevicesDetection.getBrowsers',
'Goals.get',
// Following #9345
diff --git a/tests/PHPUnit/System/BlobReportLimitingTest.php b/tests/PHPUnit/System/BlobReportLimitingTest.php
index c2231e327e..7b7e7a78a1 100644
--- a/tests/PHPUnit/System/BlobReportLimitingTest.php
+++ b/tests/PHPUnit/System/BlobReportLimitingTest.php
@@ -29,7 +29,7 @@ class BlobReportLimitingTest extends SystemTestCase
*/
public static $fixture = null; // initialized below class definition
- public function setUp()
+ public function setUp(): void
{
Cache::getTransientCache()->flushAll();
parent::setUp();
diff --git a/tests/PHPUnit/System/CliMultiTest.php b/tests/PHPUnit/System/CliMultiTest.php
index f76f889fb6..ce211263ae 100644
--- a/tests/PHPUnit/System/CliMultiTest.php
+++ b/tests/PHPUnit/System/CliMultiTest.php
@@ -39,7 +39,7 @@ class CliMultiTest extends SystemTestCase
*/
private $responses = array();
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -66,14 +66,9 @@ class CliMultiTest extends SystemTestCase
$this->assertEquals(array(), $response);
}
- /**
- * @expectedException PHPUnit_Framework_Error
- */
public function test_request_shouldFail_IfUrlsIsNotAnArray()
{
- if (PHP_MAJOR_VERSION >= 7) {
- $this->setExpectedException('TypeError');
- }
+ $this->expectException('TypeError');
$this->cliMulti->request('');
}
@@ -147,7 +142,7 @@ class CliMultiTest extends SystemTestCase
{
$this->cliMulti->runAsSuperUser();
$response = $this->cliMulti->request(array($this->completeUrl('')));
- $this->assertContains('Error: no website was found', $response[0]);
+ self::assertStringContainsString('Error: no website was found', $response[0]);
}
public function test_request_shouldBeAbleToRenderARegularPageInPiwik()
@@ -216,7 +211,7 @@ class CliMultiTest extends SystemTestCase
{
$actualResponse = $this->cliMulti->request($urls);
- $this->assertInternalType('array', $actualResponse);
+ self::assertIsArray($actualResponse, '$actualResponse is not an array');
$this->assertCount(count($expectedResponseIds), $actualResponse);
$expected = array();
diff --git a/tests/PHPUnit/System/ConsoleTest.php b/tests/PHPUnit/System/ConsoleTest.php
index 8584888ada..c0a0cfa750 100644
--- a/tests/PHPUnit/System/ConsoleTest.php
+++ b/tests/PHPUnit/System/ConsoleTest.php
@@ -107,7 +107,7 @@ class TestCommandWithException extends ConsoleCommand
class ConsoleTest extends ConsoleCommandTestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->application->addCommands([
@@ -169,6 +169,7 @@ Matomo encountered an error: Allowed memory size of X bytes exhausted (tried to
',
))
END;
+
$this->assertEquals($expected, $output);
}
diff --git a/tests/PHPUnit/System/CookieTest.php b/tests/PHPUnit/System/CookieTest.php
index 2220e37bb4..0c5d709a5b 100644
--- a/tests/PHPUnit/System/CookieTest.php
+++ b/tests/PHPUnit/System/CookieTest.php
@@ -23,14 +23,14 @@ class CookieTest extends SystemTestCase
private $originalAssumeSecureValue;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->testVars = static::$fixture->getTestEnvironment();
$this->originalAssumeSecureValue = Config::getInstance()->General['assume_secure_protocol'];
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
$this->testVars->overrideConfig('General', 'assume_secure_protocol', $this->originalAssumeSecureValue);
@@ -68,7 +68,7 @@ class CookieTest extends SystemTestCase
{
$headers = $this->setIgnoreCookie(self::USERAGENT_SAFARI);
$cookie = $this->findIgnoreCookie($headers);
- $this->assertNotContains($cookie, 'SameSite');
+ self::assertStringNotContainsString($cookie, 'SameSite');
}
private function setIgnoreCookie($userAgent)
@@ -103,6 +103,6 @@ class CookieTest extends SystemTestCase
private function assertCookieSameSiteMatches($expectedSameSite, $cookieHeader)
{
- $this->assertContains('SameSite=' . $expectedSameSite, $cookieHeader);
+ self::assertStringContainsString('SameSite=' . $expectedSameSite, $cookieHeader);
}
} \ No newline at end of file
diff --git a/tests/PHPUnit/System/CustomEventsTest.php b/tests/PHPUnit/System/CustomEventsTest.php
index 385c6d3c46..a82a77e7d6 100644
--- a/tests/PHPUnit/System/CustomEventsTest.php
+++ b/tests/PHPUnit/System/CustomEventsTest.php
@@ -44,7 +44,7 @@ class CustomEventsTest extends SystemTestCase
);
}
- protected function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
}
diff --git a/tests/PHPUnit/System/DuplicateActionsTest.php b/tests/PHPUnit/System/DuplicateActionsTest.php
index a0179ed9d2..8860d29cde 100644
--- a/tests/PHPUnit/System/DuplicateActionsTest.php
+++ b/tests/PHPUnit/System/DuplicateActionsTest.php
@@ -30,7 +30,7 @@ class DuplicateActionsTest extends SystemTestCase
*/
public static $fixture = null; // initialized below class
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
diff --git a/tests/PHPUnit/System/EnvironmentValidationTest.php b/tests/PHPUnit/System/EnvironmentValidationTest.php
index 3af600ab8d..e7b28f2740 100644
--- a/tests/PHPUnit/System/EnvironmentValidationTest.php
+++ b/tests/PHPUnit/System/EnvironmentValidationTest.php
@@ -27,7 +27,7 @@ class EnvironmentValidationTest extends SystemTestCase
);
}
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -57,7 +57,7 @@ class EnvironmentValidationTest extends SystemTestCase
$this->simulateAbsentConfigFile('config.ini.php');
$output = $this->triggerPiwikFrom('tracker');
- $this->assertContains('As Matomo is not installed yet, the Tracking API cannot proceed and will exit without error.', $output);
+ self::assertStringContainsString('As Matomo is not installed yet, the Tracking API cannot proceed and will exit without error.', $output);
}
public function test_NoLocalConfigFile_TriggersError_inConsole()
@@ -135,7 +135,7 @@ class EnvironmentValidationTest extends SystemTestCase
private function assertInstallationProcessStarted($output)
{
- $this->assertContains('<title>Matomo '. Version::VERSION .' &rsaquo; Installation</title>', $output);
+ self::assertStringContainsString('<title>Matomo '. Version::VERSION .' &rsaquo; Installation</title>', $output);
}
private function simulateAbsentConfigFile($fileName)
diff --git a/tests/PHPUnit/System/FrontControllerTest.php b/tests/PHPUnit/System/FrontControllerTest.php
index e0eb62df7d..c2f3063c2e 100644
--- a/tests/PHPUnit/System/FrontControllerTest.php
+++ b/tests/PHPUnit/System/FrontControllerTest.php
@@ -24,9 +24,9 @@ class FrontControllerTest extends SystemTestCase
$header = $this->getResponseHeader($url);
if ($redirection) {
- $this->assertContains('Location: ' . Fixture::getRootUrl() . 'tests/PHPUnit/proxy/' . $redirection . "\r\n", $header);
+ self::assertStringContainsString('Location: ' . Fixture::getRootUrl() . 'tests/PHPUnit/proxy/' . $redirection . "\r\n", $header);
} else {
- $this->assertNotContains('Location: ', $header);
+ self::assertStringNotContainsString('Location: ', $header);
}
}
diff --git a/tests/PHPUnit/System/ImportLogsTest.php b/tests/PHPUnit/System/ImportLogsTest.php
index 94d542a9f9..9cf644be60 100644
--- a/tests/PHPUnit/System/ImportLogsTest.php
+++ b/tests/PHPUnit/System/ImportLogsTest.php
@@ -27,7 +27,7 @@ class ImportLogsTest extends SystemTestCase
/** @var ManySitesImportedLogs */
public static $fixture = null; // initialized below class definition
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -132,8 +132,8 @@ class ImportLogsTest extends SystemTestCase
$this->assertEquals(1, count($whateverDotCom));
// make sure invalid requests are reported correctly
- $this->assertContains('The Matomo tracker identified 2 invalid requests on lines: 10, 11', $output);
- $this->assertContains("The following lines were not tracked by Matomo, either due to a malformed tracker request or error in the tracker:\n\n10, 11", $output);
+ self::assertStringContainsString('The Matomo tracker identified 2 invalid requests on lines: 10, 11', $output);
+ self::assertStringContainsString("The following lines were not tracked by Matomo, either due to a malformed tracker request or error in the tracker:\n\n10, 11", $output);
}
public function test_LogImporter_RetriesWhenServerFails()
@@ -153,12 +153,12 @@ class ImportLogsTest extends SystemTestCase
$output = implode("\n", $output);
for ($i = 2; $i != 6; ++$i) {
- $this->assertContains("Retrying request, attempt number $i", $output);
+ self::assertStringContainsString("Retrying request, attempt number $i", $output);
}
- $this->assertNotContains("Retrying request, attempt number 6", $output);
+ self::assertStringNotContainsString("Retrying request, attempt number 6", $output);
- $this->assertContains("Max number of attempts reached, server is unreachable!", $output);
+ self::assertStringContainsString("Max number of attempts reached, server is unreachable!", $output);
}
private function simulateTrackerFailure()
diff --git a/tests/PHPUnit/System/MultipleSitesArchivingTest.php b/tests/PHPUnit/System/MultipleSitesArchivingTest.php
index 1889e3770e..198828d6fd 100644
--- a/tests/PHPUnit/System/MultipleSitesArchivingTest.php
+++ b/tests/PHPUnit/System/MultipleSitesArchivingTest.php
@@ -21,7 +21,7 @@ class MultipleSitesArchivingTest extends SystemTestCase
{
public static $fixture = null; // initialized below class definition
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
diff --git a/tests/PHPUnit/System/OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTest.php b/tests/PHPUnit/System/OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTest.php
index 9268944755..f706896868 100644
--- a/tests/PHPUnit/System/OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTest.php
+++ b/tests/PHPUnit/System/OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTest.php
@@ -112,9 +112,9 @@ class OneVisitorOneWebsiteSeveralDaysDateRangeArchivingTest extends SystemTestCa
$archivePurger->purgeInvalidatedArchivesFrom(Date::factory($date));
}
- // we expect 5 blobs for Actions plugins, because flat=1 or expanded=1 was not set
+ // we expect 6 blobs for Actions plugins, because flat=1 or expanded=1 was not set
// so we only archived the parent table
- $expectedActionsBlobs = 5;
+ $expectedActionsBlobs = 6;
// When flat=1, Actions plugin will process 5 + 1 extra chunk blobs (URL = 'http://example.org/sub1/sub2/sub3/news')
$expectedActionsBlobsWhenFlattened = $expectedActionsBlobs + 1;
diff --git a/tests/PHPUnit/System/OneVisitorTwoVisitsTest.php b/tests/PHPUnit/System/OneVisitorTwoVisitsTest.php
index 1670177ba9..f4708492d9 100644
--- a/tests/PHPUnit/System/OneVisitorTwoVisitsTest.php
+++ b/tests/PHPUnit/System/OneVisitorTwoVisitsTest.php
@@ -33,12 +33,12 @@ class OneVisitorTwoVisitsTest extends SystemTestCase
*/
public static $fixture = null; // initialized below class
- public function setUp()
+ public function setUp(): void
{
Proxy::getInstance()->setHideIgnoredFunctions(false);
}
- public function tearDown()
+ public function tearDown(): void
{
Proxy::getInstance()->setHideIgnoredFunctions(true);
}
diff --git a/tests/PHPUnit/System/PeriodIsRangeDateIsLastNMetadataAndNormalAPITest.php b/tests/PHPUnit/System/PeriodIsRangeDateIsLastNMetadataAndNormalAPITest.php
index 9b9b74295d..5842250617 100644
--- a/tests/PHPUnit/System/PeriodIsRangeDateIsLastNMetadataAndNormalAPITest.php
+++ b/tests/PHPUnit/System/PeriodIsRangeDateIsLastNMetadataAndNormalAPITest.php
@@ -21,7 +21,7 @@ class PeriodIsRangeDateIsLastNMetadataAndNormalAPITest extends SystemTestCase
{
public static $fixture = null;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
self::$fixture->dateTime = Date::factory('yesterday')->getDateTime();
parent::setUpBeforeClass();
diff --git a/tests/PHPUnit/System/PivotByQueryParamTest.php b/tests/PHPUnit/System/PivotByQueryParamTest.php
index f94d1749fa..8250cfb159 100644
--- a/tests/PHPUnit/System/PivotByQueryParamTest.php
+++ b/tests/PHPUnit/System/PivotByQueryParamTest.php
@@ -23,7 +23,7 @@ class PivotByQueryParamTest extends SystemTestCase
*/
public static $fixture = null;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
diff --git a/tests/PHPUnit/System/RawLogDaoTest.php b/tests/PHPUnit/System/RawLogDaoTest.php
index c8108972f9..cce4e7a40d 100644
--- a/tests/PHPUnit/System/RawLogDaoTest.php
+++ b/tests/PHPUnit/System/RawLogDaoTest.php
@@ -44,7 +44,7 @@ class RawLogDaoTest extends SystemTestCase
private $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -85,12 +85,11 @@ class RawLogDaoTest extends SystemTestCase
$this->assertSame('idvisit', $this->dao->getIdFieldForLogTable('log_visit'));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Unknown log table 'log_foobarbaz'
- */
public function test_getIdFieldForLogTable_whenUnknownTable()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Unknown log table \'log_foobarbaz\'');
+
$this->dao->getIdFieldForLogTable('log_foobarbaz');
}
diff --git a/tests/PHPUnit/System/SiteSearchTest.php b/tests/PHPUnit/System/SiteSearchTest.php
index ee9c8bce46..516368efe0 100644
--- a/tests/PHPUnit/System/SiteSearchTest.php
+++ b/tests/PHPUnit/System/SiteSearchTest.php
@@ -34,7 +34,6 @@ class SiteSearchTest extends SystemTestCase
'Actions.get',
'Actions.getPageUrls',
'Actions.getPageTitles',
- 'CustomVariables.getCustomVariables',
'Actions.getSiteSearchKeywords',
'Actions.getSiteSearchCategories',
'Actions.getSiteSearchNoResultKeywords',
diff --git a/tests/PHPUnit/System/TimezonesTest.php b/tests/PHPUnit/System/TimezonesTest.php
index 3ae4e1433a..7bce78d87a 100644
--- a/tests/PHPUnit/System/TimezonesTest.php
+++ b/tests/PHPUnit/System/TimezonesTest.php
@@ -24,7 +24,7 @@ class TimezonesTest extends SystemTestCase
*/
public static $fixture = null; // initialized below class definition
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/System/TrackerResponseTest.php b/tests/PHPUnit/System/TrackerResponseTest.php
index 427a664e82..c76d145591 100644
--- a/tests/PHPUnit/System/TrackerResponseTest.php
+++ b/tests/PHPUnit/System/TrackerResponseTest.php
@@ -20,11 +20,11 @@ class TrackerResponseTest extends SystemTestCase
public static $fixture = null;
/**
- * @var \PiwikTracker
+ * @var \MatomoTracker
*/
private $tracker;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -85,6 +85,15 @@ class TrackerResponseTest extends SystemTestCase
$this->assertEquals(400, $response['status']);
}
+ public function test_response_ShouldSend400ResponseCode_IfIdGoalIsInvalid()
+ {
+ $url = $this->tracker->getUrlTrackPageView('Test');
+ $url .= '&idgoal=9999';
+
+ $response = $this->sendHttpRequest($url);
+ $this->assertEquals(400, $response['status']);
+ }
+
public function test_response_ShouldSend400ResponseCode_IfSiteIdIsNegative()
{
$url = $this->tracker->getUrlTrackPageView('Test');
diff --git a/tests/PHPUnit/System/TrackerTest.php b/tests/PHPUnit/System/TrackerTest.php
index 4595df922f..98b689e34e 100644
--- a/tests/PHPUnit/System/TrackerTest.php
+++ b/tests/PHPUnit/System/TrackerTest.php
@@ -30,7 +30,7 @@ class TrackerTest extends IntegrationTestCase
const TASKS_FINISHED_OPTION_NAME = "Tests.scheduledTasksFinished";
const TASKS_STARTED_OPTION_NAME = "Tests.scheduledTasksStarted";
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -161,7 +161,7 @@ class TrackerTest extends IntegrationTestCase
$this->assertEquals(1, count($this->getConversionItems()));
$response = $this->sendTrackingRequestByCurl($urlToTest);
- $this->assertContains('This resource is part of Matomo.', $response);
+ self::assertStringContainsString('This resource is part of Matomo.', $response);
$this->assertEquals(1, $this->getCountOfConversions());
$this->assertEquals(1, count($this->getConversionItems()));
@@ -210,7 +210,7 @@ class TrackerTest extends IntegrationTestCase
$this->assertScheduledTasksWereRun();
- $this->assertContains('Scheduled Tasks: Starting...', $response);
+ self::assertStringContainsString('Scheduled Tasks: Starting...', $response);
}
public function getTypesOfErrorsForScheduledTasksTrackerFailureTest()
@@ -255,11 +255,11 @@ class TrackerTest extends IntegrationTestCase
$this->assertStringStartsWith('{"status":', $output);
if($expectTrackingToSucceed) {
- $this->assertNotContains('error', $output);
- $this->assertContains('success', $output);
+ self::assertStringNotContainsString('error', $output);
+ self::assertStringContainsString('success', $output);
} else {
- $this->assertContains('error', $output);
- $this->assertNotContains('success', $output);
+ self::assertStringContainsString('error', $output);
+ self::assertStringNotContainsString('success', $output);
}
}
@@ -359,7 +359,7 @@ class TrackerTest extends IntegrationTestCase
$initialTask = new Task($this, 'markCustomTaskExecuted', null, Schedule::factory('hourly'));
$tasksToAdd = array_merge(array($initialTask), $tasksToAdd);
- $mockTaskLoader = $this->getMock('Piwik\Scheduler\TaskLoader', array('loadTasks'));
+ $mockTaskLoader = $this->createPartialMock('Piwik\Scheduler\TaskLoader', array('loadTasks'));
$mockTaskLoader->expects($this->any())->method('loadTasks')->will($this->returnValue($tasksToAdd));
$result['Piwik\Scheduler\TaskLoader'] = $mockTaskLoader;
}
diff --git a/tests/PHPUnit/System/UserIdAndVisitorIdTest.php b/tests/PHPUnit/System/UserIdAndVisitorIdTest.php
index 7e3acbcf97..d4536cc327 100644
--- a/tests/PHPUnit/System/UserIdAndVisitorIdTest.php
+++ b/tests/PHPUnit/System/UserIdAndVisitorIdTest.php
@@ -21,12 +21,12 @@ class UserIdAndVisitorIdTest extends SystemTestCase
{
public static $fixture = null; // initialized below class definition
- public function setUp()
+ public function setUp(): void
{
Proxy::getInstance()->setHideIgnoredFunctions(false);
}
- public function tearDown()
+ public function tearDown(): void
{
Proxy::getInstance()->setHideIgnoredFunctions(true);
}
diff --git a/tests/PHPUnit/System/expected/test_AllWebsitesTest_superuser__VisitsSummary.get_.csv b/tests/PHPUnit/System/expected/test_AllWebsitesTest_superuser__VisitsSummary.get_.csv
new file mode 100644
index 0000000000..795ea8569d
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_AllWebsitesTest_superuser__VisitsSummary.get_.csv
Binary files differ
diff --git a/tests/PHPUnit/System/expected/test_AllWebsitesTest_user__VisitsSummary.get_.csv b/tests/PHPUnit/System/expected/test_AllWebsitesTest_user__VisitsSummary.get_.csv
new file mode 100644
index 0000000000..05b493ec92
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_AllWebsitesTest_user__VisitsSummary.get_.csv
Binary files differ
diff --git a/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserEngines_day.xml b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserEngines_day.xml
new file mode 100644
index 0000000000..1e5bfba16d
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserEngines_day.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Gecko (Firefox)</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>8</nb_actions>
+ <max_actions>7</max_actions>
+
+ <bounce_count>1</bounce_count>
+
+ <segment>browserEngine==gecko</segment>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserFamilies_day.xml b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserFamilies_day.xml
new file mode 100644
index 0000000000..13ca1ba5ec
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserFamilies_day.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Firefox</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>8</nb_actions>
+ <max_actions>7</max_actions>
+
+ <bounce_count>1</bounce_count>
+
+ <logo>plugins/Morpheus/icons/dist/browsers/FF.png</logo>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserVersions_day.xml b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserVersions_day.xml
new file mode 100644
index 0000000000..ea268fc55d
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowserVersions_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Firefox 3.6</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>8</nb_actions>
+ <max_actions>7</max_actions>
+
+ <bounce_count>1</bounce_count>
+
+ <segment>browserCode==FF;browserVersion==3.6</segment>
+ <logo>plugins/Morpheus/icons/dist/browsers/FF.png</logo>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowsers_day.xml b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowsers_day.xml
new file mode 100644
index 0000000000..77de3fc187
--- /dev/null
+++ b/tests/PHPUnit/System/expected/test_BackwardsCompatibility1XTest__DevicesDetection.getBrowsers_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+ <row>
+ <label>Firefox</label>
+ <nb_uniq_visitors>1</nb_uniq_visitors>
+ <nb_visits>2</nb_visits>
+ <nb_actions>8</nb_actions>
+ <max_actions>7</max_actions>
+
+ <bounce_count>1</bounce_count>
+
+ <logo>plugins/Morpheus/icons/dist/browsers/FF.png</logo>
+ <segment>browserCode==FF</segment>
+ </row>
+</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml
index 3fb722203c..978cde6a3b 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_day.xml
@@ -22,7 +22,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Purchase&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Purchase&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -149,7 +149,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -278,7 +278,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play50%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play50%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -299,7 +299,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play75%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play75%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -320,7 +320,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<eventName>Search query here</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -341,7 +341,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playEnd&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playEnd&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -362,7 +362,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;rating&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<eventValue>9.66</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -382,7 +382,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;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;---', Action: &quot;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;---&quot;</subtitle>
+ <subtitle>Category: &quot;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;---', Action: &quot;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;---&quot;</subtitle>
<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>
<eventValue>9.66</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -511,7 +511,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -676,7 +676,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -700,7 +700,7 @@
<timeSpentPretty>1 min 0s</timeSpentPretty>
<interactionPosition>1</interactionPosition>
<title>Event</title>
- <subtitle>Event_Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
+ <subtitle>Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
@@ -738,7 +738,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play25%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play25%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -762,7 +762,7 @@
<timeSpentPretty>1 min 0s</timeSpentPretty>
<interactionPosition>1</interactionPosition>
<title>Event</title>
- <subtitle>Event_Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
+ <subtitle>Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
@@ -801,7 +801,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play50%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play50%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -825,7 +825,7 @@
<timeSpentPretty>1 min 0s</timeSpentPretty>
<interactionPosition>1</interactionPosition>
<title>Event</title>
- <subtitle>Event_Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
+ <subtitle>Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
@@ -864,7 +864,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play75%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play75%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -891,7 +891,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;playEnd&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;playEnd&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -918,7 +918,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<eventValue>9</eventValue>
<customVariables>
@@ -946,7 +946,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<eventValue>10</eventValue>
<customVariables>
@@ -995,7 +995,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Princess Mononoke (もののけ姫)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1016,7 +1016,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Ponyo (崖の上のポニョ)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1037,7 +1037,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1058,7 +1058,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;clickBuyNow&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;clickBuyNow&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1079,7 +1079,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playStart&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playStart&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1098,7 +1098,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play25%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play25%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1226,7 +1226,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Purchase&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Purchase&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -1349,7 +1349,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -1474,7 +1474,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play50%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play50%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1495,7 +1495,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play75%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play75%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1516,7 +1516,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<eventName>Search query here</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1537,7 +1537,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playEnd&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playEnd&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1558,7 +1558,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;rating&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<eventValue>9.66</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -1578,7 +1578,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;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;---', Action: &quot;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;---&quot;</subtitle>
+ <subtitle>Category: &quot;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;---', Action: &quot;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;---&quot;</subtitle>
<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>
<eventValue>9.66</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -1703,7 +1703,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -1828,7 +1828,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1855,7 +1855,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play25%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play25%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1882,7 +1882,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play50%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play50%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1909,7 +1909,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play75%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play75%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1936,7 +1936,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;playEnd&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;playEnd&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1963,7 +1963,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<eventValue>9</eventValue>
<customVariables>
@@ -1991,7 +1991,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<eventValue>10</eventValue>
<customVariables>
@@ -2040,7 +2040,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Princess Mononoke (もののけ姫)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2061,7 +2061,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Ponyo (崖の上のポニョ)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2082,7 +2082,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2103,7 +2103,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;clickBuyNow&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;clickBuyNow&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2124,7 +2124,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playStart&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playStart&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2143,7 +2143,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play25%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play25%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
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 63435b5db1..8dff814a96 100644
--- a/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml
+++ b/tests/PHPUnit/System/expected/test_CustomEvents__Live.getLastVisitsDetails_month.xml
@@ -22,7 +22,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Purchase&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Purchase&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -145,7 +145,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -270,7 +270,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play50%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play50%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -291,7 +291,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play75%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play75%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -312,7 +312,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<eventName>Search query here</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -333,7 +333,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playEnd&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playEnd&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -354,7 +354,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;rating&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<eventValue>9.66</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -374,7 +374,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;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;---', Action: &quot;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;---&quot;</subtitle>
+ <subtitle>Category: &quot;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;---', Action: &quot;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;---&quot;</subtitle>
<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>
<eventValue>9.66</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -499,7 +499,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -624,7 +624,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -651,7 +651,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play25%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play25%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -678,7 +678,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play50%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play50%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -705,7 +705,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play75%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play75%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -732,7 +732,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;playEnd&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;playEnd&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -759,7 +759,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<eventValue>9</eventValue>
<customVariables>
@@ -787,7 +787,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<eventValue>10</eventValue>
<customVariables>
@@ -836,7 +836,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Princess Mononoke (もののけ姫)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -857,7 +857,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Ponyo (崖の上のポニョ)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -878,7 +878,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -899,7 +899,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;clickBuyNow&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;clickBuyNow&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -920,7 +920,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playStart&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playStart&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -939,7 +939,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play25%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play25%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1063,7 +1063,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Purchase&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Purchase&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -1190,7 +1190,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -1319,7 +1319,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play50%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play50%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1340,7 +1340,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play75%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play75%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1361,7 +1361,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<eventName>Search query here</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1382,7 +1382,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playEnd&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playEnd&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -1403,7 +1403,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;rating&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<eventValue>9.66</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -1423,7 +1423,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;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;---', Action: &quot;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;---&quot;</subtitle>
+ <subtitle>Category: &quot;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;---', Action: &quot;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;---&quot;</subtitle>
<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>
<eventValue>9.66</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -1552,7 +1552,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;Search&quot;</subtitle>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
</actionDetails>
@@ -1717,7 +1717,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1741,7 +1741,7 @@
<timeSpentPretty>1 min 0s</timeSpentPretty>
<interactionPosition>1</interactionPosition>
<title>Event</title>
- <subtitle>Event_Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
+ <subtitle>Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
@@ -1779,7 +1779,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play25%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play25%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1803,7 +1803,7 @@
<timeSpentPretty>1 min 0s</timeSpentPretty>
<interactionPosition>1</interactionPosition>
<title>Event</title>
- <subtitle>Event_Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
+ <subtitle>Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
@@ -1842,7 +1842,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play50%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play50%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1866,7 +1866,7 @@
<timeSpentPretty>1 min 0s</timeSpentPretty>
<interactionPosition>1</interactionPosition>
<title>Event</title>
- <subtitle>Event_Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
+ <subtitle>Category: &quot;CategoryTriggersGoal here', Action: &quot;This is an event without a URL&quot;</subtitle>
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
@@ -1905,7 +1905,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;play75%&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;play75%&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1932,7 +1932,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;playEnd&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;playEnd&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<customVariables>
<row>
@@ -1959,7 +1959,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<eventValue>9</eventValue>
<customVariables>
@@ -1987,7 +1987,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
+ <subtitle>Category: &quot;Music', Action: &quot;rating&quot;</subtitle>
<eventName>La fiancée de l'eau</eventName>
<eventValue>10</eventValue>
<customVariables>
@@ -2036,7 +2036,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Princess Mononoke (もののけ姫)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2057,7 +2057,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Ponyo (崖の上のポニョ)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2078,7 +2078,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playTrailer&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2099,7 +2099,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;clickBuyNow&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;clickBuyNow&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2120,7 +2120,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;playStart&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;playStart&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
@@ -2139,7 +2139,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Movie', Action: &quot;play25%&quot;</subtitle>
+ <subtitle>Category: &quot;Movie', Action: &quot;play25%&quot;</subtitle>
<eventName>Spirited Away (千と千尋の神隠し)</eventName>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml b/tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml
index a234c57a46..57c2419562 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__CorePluginsAdmin.getSystemSettings.xml
@@ -322,8 +322,8 @@
<availableValues>
<latest_stable>Latest stable release (Recommended)</latest_stable>
<latest_beta>Latest beta release</latest_beta>
- <latest_3x_stable>Latest stable 3.X (Long Term Support version)</latest_3x_stable>
- <latest_3x_beta>Latest beta 3.X (Long Term Support version)</latest_3x_beta>
+ <latest_4x_stable>Latest stable 3.X (Long Term Support version)</latest_4x_stable>
+ <latest_4x_beta>Latest beta 3.X (Long Term Support version)</latest_4x_beta>
</availableValues>
<description />
<inlineHelp>While our development process includes thousands of automated tests, Beta Testers play a key role in achieving the &quot;No bug policy&quot; in Matomo.&lt;br/&gt;If Matomo is a critical part of your business, we recommend you use the latest stable release. If you use the latest beta and you find a bug or have a suggestion, please &lt;a target='_blank' rel='noreferrer noopener' href='https://developer.matomo.org/guides/core-team-workflow#influencing-piwik-development'&gt;see here&lt;/a&gt;.&lt;br /&gt;LTS (Long Term Support) versions receive only security and bug fixes.</inlineHelp>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml
index 41e39d8828..c2920295b9 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowserFamilies_month.xml
@@ -8,6 +8,15 @@
<sum_visit_length>305</sum_visit_length>
<bounce_count>9</bounce_count>
<nb_visits_converted>10</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>10</nb_conversions>
+ <nb_visits_converted>10</nb_visits_converted>
+ <revenue>50</revenue>
+ </row>
+ </goals>
+ <nb_conversions>10</nb_conversions>
+ <revenue>50</revenue>
<sum_daily_nb_uniq_visitors>11</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/RM.png</logo>
@@ -20,6 +29,15 @@
<sum_visit_length>4</sum_visit_length>
<bounce_count>8</bounce_count>
<nb_visits_converted>10</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>10</nb_conversions>
+ <nb_visits_converted>10</nb_visits_converted>
+ <revenue>50</revenue>
+ </row>
+ </goals>
+ <nb_conversions>10</nb_conversions>
+ <revenue>50</revenue>
<sum_daily_nb_uniq_visitors>8</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>3</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/CH.png</logo>
@@ -32,6 +50,15 @@
<sum_visit_length>242</sum_visit_length>
<bounce_count>7</bounce_count>
<nb_visits_converted>8</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>8</nb_conversions>
+ <nb_visits_converted>8</nb_visits_converted>
+ <revenue>40</revenue>
+ </row>
+ </goals>
+ <nb_conversions>8</nb_conversions>
+ <revenue>40</revenue>
<sum_daily_nb_uniq_visitors>8</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/IE.png</logo>
@@ -44,6 +71,15 @@
<sum_visit_length>0</sum_visit_length>
<bounce_count>5</bounce_count>
<nb_visits_converted>5</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>5</nb_conversions>
+ <nb_visits_converted>5</nb_visits_converted>
+ <revenue>25</revenue>
+ </row>
+ </goals>
+ <nb_conversions>5</nb_conversions>
+ <revenue>25</revenue>
<sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/EP.png</logo>
@@ -56,6 +92,15 @@
<sum_visit_length>0</sum_visit_length>
<bounce_count>5</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>2</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>10</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>10</revenue>
<sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/UNK.png</logo>
@@ -68,6 +113,15 @@
<sum_visit_length>0</sum_visit_length>
<bounce_count>2</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>2</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>10</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>10</revenue>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/AN.png</logo>
@@ -80,6 +134,15 @@
<sum_visit_length>0</sum_visit_length>
<bounce_count>2</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>2</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>10</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>10</revenue>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/FF.png</logo>
@@ -92,6 +155,15 @@
<sum_visit_length>2</sum_visit_length>
<bounce_count>0</bounce_count>
<nb_visits_converted>1</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>5</revenue>
+ </row>
+ </goals>
+ <nb_conversions>1</nb_conversions>
+ <revenue>5</revenue>
<sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>1</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/CM.png</logo>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml
index 2bc6b9c3ac..1eebfd78fb 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__DevicesDetection.getBrowsers_month.xml
@@ -8,6 +8,15 @@
<sum_visit_length>305</sum_visit_length>
<bounce_count>9</bounce_count>
<nb_visits_converted>10</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>10</nb_conversions>
+ <nb_visits_converted>10</nb_visits_converted>
+ <revenue>50</revenue>
+ </row>
+ </goals>
+ <nb_conversions>10</nb_conversions>
+ <revenue>50</revenue>
<sum_daily_nb_uniq_visitors>11</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/RM.png</logo>
@@ -21,6 +30,15 @@
<sum_visit_length>4</sum_visit_length>
<bounce_count>8</bounce_count>
<nb_visits_converted>10</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>10</nb_conversions>
+ <nb_visits_converted>10</nb_visits_converted>
+ <revenue>50</revenue>
+ </row>
+ </goals>
+ <nb_conversions>10</nb_conversions>
+ <revenue>50</revenue>
<sum_daily_nb_uniq_visitors>8</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>3</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/CH.png</logo>
@@ -34,6 +52,15 @@
<sum_visit_length>242</sum_visit_length>
<bounce_count>7</bounce_count>
<nb_visits_converted>8</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>8</nb_conversions>
+ <nb_visits_converted>8</nb_visits_converted>
+ <revenue>40</revenue>
+ </row>
+ </goals>
+ <nb_conversions>8</nb_conversions>
+ <revenue>40</revenue>
<sum_daily_nb_uniq_visitors>8</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/IE.png</logo>
@@ -47,6 +74,15 @@
<sum_visit_length>0</sum_visit_length>
<bounce_count>5</bounce_count>
<nb_visits_converted>5</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>5</nb_conversions>
+ <nb_visits_converted>5</nb_visits_converted>
+ <revenue>25</revenue>
+ </row>
+ </goals>
+ <nb_conversions>5</nb_conversions>
+ <revenue>25</revenue>
<sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/EP.png</logo>
@@ -60,6 +96,15 @@
<sum_visit_length>0</sum_visit_length>
<bounce_count>5</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>2</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>10</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>10</revenue>
<sum_daily_nb_uniq_visitors>5</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/UNK.png</logo>
@@ -73,6 +118,15 @@
<sum_visit_length>0</sum_visit_length>
<bounce_count>2</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>2</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>10</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>10</revenue>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/AN.png</logo>
@@ -86,6 +140,15 @@
<sum_visit_length>0</sum_visit_length>
<bounce_count>2</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>2</nb_conversions>
+ <nb_visits_converted>2</nb_visits_converted>
+ <revenue>10</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>10</revenue>
<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>0</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/FF.png</logo>
@@ -99,6 +162,15 @@
<sum_visit_length>2</sum_visit_length>
<bounce_count>0</bounce_count>
<nb_visits_converted>1</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>5</revenue>
+ </row>
+ </goals>
+ <nb_conversions>1</nb_conversions>
+ <revenue>5</revenue>
<sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
<sum_daily_nb_users>1</sum_daily_nb_users>
<logo>plugins/Morpheus/icons/dist/browsers/CM.png</logo>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml b/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml
index 30a9e0f4e0..d569fae4a7 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__Live.getLastVisitsDetails_range.xml
@@ -4115,7 +4115,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;cloudfront_rtmp', Action: &quot;play&quot;</subtitle>
+ <subtitle>Category: &quot;cloudfront_rtmp', Action: &quot;play&quot;</subtitle>
<eventName>myvideo</eventName>
<customVariables>
<row>
@@ -4232,7 +4232,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;cloudfront_rtmp', Action: &quot;connect&quot;</subtitle>
+ <subtitle>Category: &quot;cloudfront_rtmp', Action: &quot;connect&quot;</subtitle>
<customVariables>
<row>
<customVariablePageName1>HTTP-code</customVariablePageName1>
diff --git a/tests/PHPUnit/System/expected/test_ImportLogs__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml b/tests/PHPUnit/System/expected/test_ImportLogs__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
index e552d62330..da3d21a6ab 100644
--- a/tests/PHPUnit/System/expected/test_ImportLogs__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
+++ b/tests/PHPUnit/System/expected/test_ImportLogs__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
@@ -117,6 +117,14 @@
<default_value />
</row>
<row>
+ <column_name>search_cat</column_name>
+ <default_value />
+ </row>
+ <row>
+ <column_name>search_count</column_name>
+ <default_value />
+ </row>
+ <row>
<column_name>time_spent</column_name>
<default_value />
</row>
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_1__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_1__Live.getLastVisitsDetails_month.xml
index b8118b6fdc..bd605241db 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_1__Live.getLastVisitsDetails_month.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_1__Live.getLastVisitsDetails_month.xml
@@ -52,18 +52,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>48</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 48</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -134,7 +130,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
+ <subtitle>Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
<eventName>Name8</eventName>
<eventValue>353.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -509,7 +505,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
+ <subtitle>Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
<eventName>Name7</eventName>
<eventValue>352.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -581,13 +577,13 @@
<events>1</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_2__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_2__Live.getLastVisitsDetails_month.xml
index a6eb5e659f..3d746bcaf0 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_2__Live.getLastVisitsDetails_month.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_offsetAndLimit_2__Live.getLastVisitsDetails_month.xml
@@ -116,13 +116,13 @@
<events>0</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
@@ -207,18 +207,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>36</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 36</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -289,7 +285,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
+ <subtitle>Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
<eventName>Name6</eventName>
<eventValue>351.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisit__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisit__Live.getLastVisitsDetails_month.xml
index 9f28957f21..80a26df20a 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisit__Live.getLastVisitsDetails_month.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortByIdVisit__Live.getLastVisitsDetails_month.xml
@@ -189,18 +189,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>48</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 48</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -271,7 +267,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
+ <subtitle>Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
<eventName>Name8</eventName>
<eventValue>353.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -646,7 +642,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
+ <subtitle>Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
<eventName>Name7</eventName>
<eventValue>352.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -718,13 +714,13 @@
<events>1</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
@@ -873,13 +869,13 @@
<events>0</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
@@ -964,18 +960,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>36</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 36</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -1046,7 +1038,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
+ <subtitle>Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
<eventName>Name6</eventName>
<eventValue>351.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortDesc__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortDesc__Live.getLastVisitsDetails_month.xml
index 9f28957f21..80a26df20a 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortDesc__Live.getLastVisitsDetails_month.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_Live.getLastVisitsDetails_sortDesc__Live.getLastVisitsDetails_month.xml
@@ -189,18 +189,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>48</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 48</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -271,7 +267,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
+ <subtitle>Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
<eventName>Name8</eventName>
<eventValue>353.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -646,7 +642,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
+ <subtitle>Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
<eventName>Name7</eventName>
<eventValue>352.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -718,13 +714,13 @@
<events>1</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
@@ -873,13 +869,13 @@
<events>0</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
@@ -964,18 +960,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>36</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 36</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -1046,7 +1038,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
+ <subtitle>Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
<eventName>Name6</eventName>
<eventValue>351.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__Live.getLastVisitsDetails_month.xml
index ba4595c6ce..40c34f4bbf 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__Live.getLastVisitsDetails_month.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__Live.getLastVisitsDetails_month.xml
@@ -189,18 +189,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>48</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 48</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -271,7 +267,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
+ <subtitle>Category: &quot;Cat8', Action: &quot;Action8&quot;</subtitle>
<eventName>Name8</eventName>
<eventValue>353.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -646,7 +642,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
+ <subtitle>Category: &quot;Cat7', Action: &quot;Action7&quot;</subtitle>
<eventName>Name7</eventName>
<eventValue>352.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -718,13 +714,13 @@
<events>1</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
@@ -873,13 +869,13 @@
<events>0</events>
<continent>Europe</continent>
<continentCode>eur</continentCode>
- <country>Macedonia</country>
+ <country>North Macedonia</country>
<countryCode>mk</countryCode>
<countryFlag>plugins/Morpheus/icons/dist/flags/mk.png</countryFlag>
<region>Gevgelija</region>
<regionCode>18</regionCode>
<city>Stratford-upon-Avon</city>
- <location>Stratford-upon-Avon, Gevgelija, Macedonia</location>
+ <location>Stratford-upon-Avon, Gevgelija, North Macedonia</location>
<latitude />
<longitude />
<visitLocalTime>12:34:06</visitLocalTime>
@@ -964,18 +960,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>36</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 36</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -1046,7 +1038,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
+ <subtitle>Category: &quot;Cat6', Action: &quot;Action6&quot;</subtitle>
<eventName>Name6</eventName>
<eventValue>351.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -1421,7 +1413,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat5', Action: &quot;Action5&quot;</subtitle>
+ <subtitle>Category: &quot;Cat5', Action: &quot;Action5&quot;</subtitle>
<eventName>Name5</eventName>
<eventValue>350.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
@@ -1739,18 +1731,14 @@
<timeSpent>180</timeSpent>
<timeSpentPretty>3 min 0s</timeSpentPretty>
<siteSearchKeyword>Bring on the party</siteSearchKeyword>
+ <siteSearchCategory>CAT</siteSearchCategory>
+ <siteSearchCount>24</siteSearchCount>
<interactionPosition>2</interactionPosition>
<icon>plugins/Morpheus/images/search.png</icon>
<iconSVG>plugins/Morpheus/images/search.svg</iconSVG>
<title>Site Search</title>
- <subtitle>Bring on the party</subtitle>
+ <subtitle>Bring on the party - Search Category: CAT - Search Results Count: 24</subtitle>
- <customVariables>
- <row>
- <customVariablePageName4>Search Category</customVariablePageName4>
- <customVariablePageValue4>CAT</customVariablePageValue4>
- </row>
- </customVariables>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
<row>
@@ -1821,7 +1809,7 @@
<icon>plugins/Morpheus/images/event.png</icon>
<iconSVG>plugins/Morpheus/images/event.svg</iconSVG>
<title>Event</title>
- <subtitle>Event_Category: &quot;Cat4', Action: &quot;Action4&quot;</subtitle>
+ <subtitle>Category: &quot;Cat4', Action: &quot;Action4&quot;</subtitle>
<eventName>Name4</eventName>
<eventValue>349.678</eventValue>
<bandwidth_pretty>0 M</bandwidth_pretty>
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCity_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCity_month.xml
index 9e5a39e083..92c01a513d 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCity_month.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCity_month.xml
@@ -265,7 +265,7 @@
<logo>plugins/Morpheus/icons/dist/flags/gb.png</logo>
</row>
<row>
- <label>Stratford-upon-Avon, Gevgelija, Macedonia</label>
+ <label>Stratford-upon-Avon, Gevgelija, North Macedonia</label>
<nb_visits>2</nb_visits>
<nb_actions>5</nb_actions>
<max_actions>4</max_actions>
@@ -292,7 +292,7 @@
<city_name>Stratford-upon-Avon</city_name>
<region>18</region>
<country>mk</country>
- <country_name>Macedonia</country_name>
+ <country_name>North Macedonia</country_name>
<region_name>Gevgelija</region_name>
<logo>plugins/Morpheus/icons/dist/flags/mk.png</logo>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCountry_month.xml
index e660aa18c9..463fd1d3ad 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCountry_month.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getCountry_month.xml
@@ -233,7 +233,7 @@
<logoHeight>16</logoHeight>
</row>
<row>
- <label>Macedonia</label>
+ <label>North Macedonia</label>
<nb_visits>2</nb_visits>
<nb_actions>5</nb_actions>
<max_actions>4</max_actions>
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getRegion_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getRegion_month.xml
index ec82637033..1c233ab5b7 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getRegion_month.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest__UserCountry.getRegion_month.xml
@@ -155,7 +155,7 @@
<logo>plugins/Morpheus/icons/dist/flags/fr.png</logo>
</row>
<row>
- <label>Gevgelija, Macedonia</label>
+ <label>Gevgelija, North Macedonia</label>
<nb_visits>2</nb_visits>
<nb_actions>5</nb_actions>
<max_actions>4</max_actions>
@@ -181,7 +181,7 @@
<segment>regionCode==18;countryCode==mk</segment>
<region>18</region>
<country>mk</country>
- <country_name>Macedonia</country_name>
+ <country_name>North Macedonia</country_name>
<region_name>Gevgelija</region_name>
<logo>plugins/Morpheus/icons/dist/flags/mk.png</logo>
</row>
diff --git a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_continent__UserCountry.getCountry_month.xml b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_continent__UserCountry.getCountry_month.xml
index 9c995cf282..027fe1c6f5 100644
--- a/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_continent__UserCountry.getCountry_month.xml
+++ b/tests/PHPUnit/System/expected/test_ManyVisitorsOneWebsiteTest_segment_continent__UserCountry.getCountry_month.xml
@@ -117,7 +117,7 @@
<logoHeight>16</logoHeight>
</row>
<row>
- <label>Macedonia</label>
+ <label>North Macedonia</label>
<nb_visits>2</nb_visits>
<nb_actions>5</nb_actions>
<max_actions>4</max_actions>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml
index 5d30c8a96b..645c6f1534 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CorePluginsAdmin.getSystemSettings.xml
@@ -284,8 +284,8 @@
<availableValues>
<latest_stable>Latest stable release (Recommended)</latest_stable>
<latest_beta>Latest beta release</latest_beta>
- <latest_3x_stable>Latest stable 3.X (Long Term Support version)</latest_3x_stable>
- <latest_3x_beta>Latest beta 3.X (Long Term Support version)</latest_3x_beta>
+ <latest_4x_stable>Latest stable 3.X (Long Term Support version)</latest_4x_stable>
+ <latest_4x_beta>Latest beta 3.X (Long Term Support version)</latest_4x_beta>
</availableValues>
<description />
<inlineHelp>While our &lt;a target='_blank' rel='noreferrer noopener' href='https://matomo.org/participate/development-process/'&gt;development process&lt;/a&gt; includes thousands of automated tests, Beta Testers play a key role in achieving the &quot;No bug policy&quot; in Matomo.&lt;br/&gt;If Matomo is a critical part of your business, we recommend you use the latest stable release. If you use the latest beta and you find a bug or have a suggestion, please &lt;a target='_blank' rel='noreferrer noopener' href='https://developer.matomo.org/guides/core-team-workflow#influencing-piwik-development'&gt;see here&lt;/a&gt;.&lt;br /&gt;LTS (Long Term Support) versions receive only security and bug fixes.</inlineHelp>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CustomVariables.getReservedCustomVariableKeys.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CustomVariables.getReservedCustomVariableKeys.xml
index f10505afcc..17fcb0d88a 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CustomVariables.getReservedCustomVariableKeys.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__CustomVariables.getReservedCustomVariableKeys.xml
@@ -4,6 +4,6 @@
<row>_pkn</row>
<row>_pkc</row>
<row>_pkp</row>
- <row>_pk_scount</row>
<row>_pk_scat</row>
+ <row>_pk_scount</row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowserFamilies_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowserFamilies_day.xml
index 3134a830bd..4c991191a3 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowserFamilies_day.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowserFamilies_day.xml
@@ -9,6 +9,20 @@
<sum_visit_length>1622</sum_visit_length>
<bounce_count>1</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>42</revenue>
+ </row>
+ <row idgoal='2'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>1</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>43</revenue>
<logo>plugins/Morpheus/icons/dist/browsers/FF.png</logo>
</row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowsers_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowsers_day.xml
index a07764bd2f..499b1f2ee1 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowsers_day.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__DevicesDetection.getBrowsers_day.xml
@@ -9,6 +9,20 @@
<sum_visit_length>1622</sum_visit_length>
<bounce_count>1</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>42</revenue>
+ </row>
+ <row idgoal='2'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>1</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>43</revenue>
<logo>plugins/Morpheus/icons/dist/browsers/FF.png</logo>
<segment>browserCode==FF</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
index e552d62330..da3d21a6ab 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
@@ -117,6 +117,14 @@
<default_value />
</row>
<row>
+ <column_name>search_cat</column_name>
+ <default_value />
+ </row>
+ <row>
+ <column_name>search_count</column_name>
+ <default_value />
+ </row>
+ <row>
<column_name>time_spent</column_name>
<default_value />
</row>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowserFamilies_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowserFamilies_day.xml
index 37b45aa307..10df495e79 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowserFamilies_day.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowserFamilies_day.xml
@@ -10,6 +10,20 @@
<sum_visit_length>1622</sum_visit_length>
<bounce_count>1</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>42</revenue>
+ </row>
+ <row idgoal='2'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>1</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>43</revenue>
<logo>plugins/Morpheus/icons/dist/browsers/FF.png</logo>
</row>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowsers_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowsers_day.xml
index ce0cfc0c05..059fb9bd93 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowsers_day.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__DevicesDetection.getBrowsers_day.xml
@@ -10,6 +10,20 @@
<sum_visit_length>1622</sum_visit_length>
<bounce_count>1</bounce_count>
<nb_visits_converted>2</nb_visits_converted>
+ <goals>
+ <row idgoal='1'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>42</revenue>
+ </row>
+ <row idgoal='2'>
+ <nb_conversions>1</nb_conversions>
+ <nb_visits_converted>1</nb_visits_converted>
+ <revenue>1</revenue>
+ </row>
+ </goals>
+ <nb_conversions>2</nb_conversions>
+ <revenue>43</revenue>
<logo>plugins/Morpheus/icons/dist/browsers/FF.png</logo>
<segment>browserCode==FF</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml
index 5329fe47a5..9c3978b3c5 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits_withCookieSupport__Live.getLastVisitsDetails_day.xml
@@ -290,6 +290,8 @@
<timeSpent>108</timeSpent>
<timeSpentPretty>1 min 48s</timeSpentPretty>
<siteSearchKeyword>Banks Own The World</siteSearchKeyword>
+ <siteSearchCategory />
+ <siteSearchCount />
<generationTimeMilliseconds>812</generationTimeMilliseconds>
<generationTime>0.81s</generationTime>
<interactionPosition>3</interactionPosition>
diff --git a/tests/PHPUnit/System/expected/test_RowEvolution_processedRowLabel__API.getRowEvolution_day.xml b/tests/PHPUnit/System/expected/test_RowEvolution_processedRowLabel__API.getRowEvolution_day.xml
index bf05786f61..49bdac6c95 100644
--- a/tests/PHPUnit/System/expected/test_RowEvolution_processedRowLabel__API.getRowEvolution_day.xml
+++ b/tests/PHPUnit/System/expected/test_RowEvolution_processedRowLabel__API.getRowEvolution_day.xml
@@ -73,7 +73,6 @@
<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
<bounce_rate>Bounce Rate</bounce_rate>
- <conversion_rate>Conversion Rate</conversion_rate>
</columns>
</metadata>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_day.xml
index fb7aa48a2b..5afa37a28b 100644
--- a/tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_day.xml
+++ b/tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_day.xml
@@ -54,10 +54,20 @@
<exit_rate>0%</exit_rate>
</row>
</result>
+ <result prettyDate="Tuesday, January 5, 2010" />
+ <result prettyDate="Wednesday, January 6, 2010" />
+ <result prettyDate="Thursday, January 7, 2010" />
+ <result prettyDate="Friday, January 8, 2010" />
+ <result prettyDate="Saturday, January 9, 2010" />
</reportData>
<reportMetadata>
<result prettyDate="Sunday, January 3, 2010" />
<result prettyDate="Monday, January 4, 2010" />
+ <result prettyDate="Tuesday, January 5, 2010" />
+ <result prettyDate="Wednesday, January 6, 2010" />
+ <result prettyDate="Thursday, January 7, 2010" />
+ <result prettyDate="Friday, January 8, 2010" />
+ <result prettyDate="Saturday, January 9, 2010" />
</reportMetadata>
<reportTotal>
<nb_uniq_visitors>4</nb_uniq_visitors>
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_month.xml b/tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_month.xml
index 8086186a1f..d72ba864f0 100644
--- a/tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_month.xml
+++ b/tests/PHPUnit/System/expected/test_SiteSearch_Actions.getSiteSearchCategories_firstSite_lastN__API.getProcessedReport_month.xml
@@ -52,9 +52,21 @@
<exit_rate>0%</exit_rate>
</row>
</result>
+ <result prettyDate="February 2010" />
+ <result prettyDate="March 2010" />
+ <result prettyDate="April 2010" />
+ <result prettyDate="May 2010" />
+ <result prettyDate="June 2010" />
+ <result prettyDate="July 2010" />
</reportData>
<reportMetadata>
<result prettyDate="January 2010" />
+ <result prettyDate="February 2010" />
+ <result prettyDate="March 2010" />
+ <result prettyDate="April 2010" />
+ <result prettyDate="May 2010" />
+ <result prettyDate="June 2010" />
+ <result prettyDate="July 2010" />
</reportMetadata>
<reportTotal>
<nb_visits>4</nb_visits>
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_day.xml b/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_day.xml
index a91076f826..e3f6a3cea2 100644
--- a/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_day.xml
+++ b/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_day.xml
@@ -1,3 +1,57 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
+ <result idSite="1">
+ <result date="2010-01-03">
+ <row>
+ <label>Search Category</label>
+ <nb_visits>2</nb_visits>
+ <nb_actions>3</nb_actions>
+ <nb_pages_per_search>1.5</nb_pages_per_search>
+ </row>
+ </result>
+ <result date="2010-01-04">
+ <row>
+ <label>Bad No Result Category :(</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_pages_per_search>1</nb_pages_per_search>
+ </row>
+ <row>
+ <label>Category</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_pages_per_search>1</nb_pages_per_search>
+ </row>
+ </result>
+ <result date="2010-01-05" />
+ <result date="2010-01-06" />
+ <result date="2010-01-07" />
+ <result date="2010-01-08" />
+ <result date="2010-01-09" />
+ </result>
+ <result idSite="2">
+ <result date="2010-01-03">
+ <row>
+ <label>Bad No Result Category bis :(</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <nb_pages_per_search>1</nb_pages_per_search>
+ </row>
+ </result>
+ <result date="2010-01-04" />
+ <result date="2010-01-05" />
+ <result date="2010-01-06" />
+ <result date="2010-01-07" />
+ <result date="2010-01-08" />
+ <result date="2010-01-09" />
+ </result>
+ <result idSite="3">
+ <result date="2010-01-03" />
+ <result date="2010-01-04" />
+ <result date="2010-01-05" />
+ <result date="2010-01-06" />
+ <result date="2010-01-07" />
+ <result date="2010-01-08" />
+ <result date="2010-01-09" />
+ </result>
</results> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_month.xml b/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_month.xml
index a91076f826..37b984abe8 100644
--- a/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_month.xml
+++ b/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__Actions.getSiteSearchCategories_month.xml
@@ -1,3 +1,60 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
+ <result idSite="1">
+ <result date="2010-01">
+ <row>
+ <label>Search Category</label>
+ <nb_visits>2</nb_visits>
+ <nb_actions>3</nb_actions>
+ <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
+ <nb_pages_per_search>1.5</nb_pages_per_search>
+ </row>
+ <row>
+ <label>Bad No Result Category :(</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <nb_pages_per_search>1</nb_pages_per_search>
+ </row>
+ <row>
+ <label>Category</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <nb_pages_per_search>1</nb_pages_per_search>
+ </row>
+ </result>
+ <result date="2010-02" />
+ <result date="2010-03" />
+ <result date="2010-04" />
+ <result date="2010-05" />
+ <result date="2010-06" />
+ <result date="2010-07" />
+ </result>
+ <result idSite="2">
+ <result date="2010-01">
+ <row>
+ <label>Bad No Result Category bis :(</label>
+ <nb_visits>1</nb_visits>
+ <nb_actions>1</nb_actions>
+ <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
+ <nb_pages_per_search>1</nb_pages_per_search>
+ </row>
+ </result>
+ <result date="2010-02" />
+ <result date="2010-03" />
+ <result date="2010-04" />
+ <result date="2010-05" />
+ <result date="2010-06" />
+ <result date="2010-07" />
+ </result>
+ <result idSite="3">
+ <result date="2010-01" />
+ <result date="2010-02" />
+ <result date="2010-03" />
+ <result date="2010-04" />
+ <result date="2010-05" />
+ <result date="2010-06" />
+ <result date="2010-07" />
+ </result>
</results> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__CustomVariables.getCustomVariables_day.xml b/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__CustomVariables.getCustomVariables_day.xml
deleted file mode 100644
index 5b6b0bc255..0000000000
--- a/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__CustomVariables.getCustomVariables_day.xml
+++ /dev/null
@@ -1,197 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<results>
- <result idSite="1">
- <result date="2010-01-03">
- <row>
- <label>_pk_scount</label>
- <nb_visits>4</nb_visits>
- <nb_actions>6</nb_actions>
- <slots>
- <row>
- <scope>page</scope>
- <index>5</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scount</segment>
- <subtable>
- <row>
- <label>0</label>
- <nb_visits>2</nb_visits>
- <nb_actions>3</nb_actions>
- </row>
- <row>
- <label>10</label>
- <nb_visits>2</nb_visits>
- <nb_actions>3</nb_actions>
- </row>
- </subtable>
- </row>
- <row>
- <label>_pk_scat</label>
- <nb_visits>2</nb_visits>
- <nb_actions>3</nb_actions>
- <slots>
- <row>
- <scope>page</scope>
- <index>4</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scat</segment>
- <subtable>
- <row>
- <label>Search Category</label>
- <nb_visits>2</nb_visits>
- <nb_actions>3</nb_actions>
- </row>
- </subtable>
- </row>
- </result>
- <result date="2010-01-04">
- <row>
- <label>_pk_scount</label>
- <nb_visits>3</nb_visits>
- <nb_actions>3</nb_actions>
- <slots>
- <row>
- <scope>page</scope>
- <index>5</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scount</segment>
- <subtable>
- <row>
- <label>0</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- </row>
- <row>
- <label>5</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- </row>
- <row>
- <label>10</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- </row>
- </subtable>
- </row>
- <row>
- <label>_pk_scat</label>
- <nb_visits>2</nb_visits>
- <nb_actions>2</nb_actions>
- <slots>
- <row>
- <scope>page</scope>
- <index>4</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scat</segment>
- <subtable>
- <row>
- <label>Bad No Result Category :(</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- </row>
- <row>
- <label>Category</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- </row>
- </subtable>
- </row>
- </result>
- <result date="2010-01-05" />
- <result date="2010-01-06" />
- <result date="2010-01-07" />
- <result date="2010-01-08" />
- <result date="2010-01-09" />
- </result>
- <result idSite="2">
- <result date="2010-01-03">
- <row>
- <label>_pk_scount</label>
- <nb_visits>1</nb_visits>
- <nb_actions>2</nb_actions>
- <slots>
- <row>
- <scope>page</scope>
- <index>5</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scount</segment>
- <subtable>
- <row>
- <label>0</label>
- <nb_visits>1</nb_visits>
- <nb_actions>2</nb_actions>
- </row>
- </subtable>
- </row>
- <row>
- <label>_pk_scat</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- <slots>
- <row>
- <scope>page</scope>
- <index>4</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scat</segment>
- <subtable>
- <row>
- <label>Bad No Result Category bis :(</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- </row>
- </subtable>
- </row>
- </result>
- <result date="2010-01-04" />
- <result date="2010-01-05" />
- <result date="2010-01-06" />
- <result date="2010-01-07" />
- <result date="2010-01-08" />
- <result date="2010-01-09" />
- </result>
- <result idSite="3">
- <result date="2010-01-03">
- <row>
- <label>test cvar name</label>
- <nb_visits>1</nb_visits>
- <nb_actions>3</nb_actions>
- <nb_users>0</nb_users>
- <max_actions>3</max_actions>
- <sum_visit_length>541</sum_visit_length>
- <bounce_count>0</bounce_count>
- <nb_visits_converted>0</nb_visits_converted>
- <slots>
- <row>
- <scope>visit</scope>
- <index>1</index>
- </row>
- </slots>
- <segment>customVariableName==test+cvar+name</segment>
- <subtable>
- <row>
- <label>test cvar value</label>
- <nb_visits>1</nb_visits>
- <nb_actions>3</nb_actions>
- <nb_users>0</nb_users>
- <max_actions>3</max_actions>
- <sum_visit_length>541</sum_visit_length>
- <bounce_count>0</bounce_count>
- <nb_visits_converted>0</nb_visits_converted>
- </row>
- </subtable>
- </row>
- </result>
- <result date="2010-01-04" />
- <result date="2010-01-05" />
- <result date="2010-01-06" />
- <result date="2010-01-07" />
- <result date="2010-01-08" />
- <result date="2010-01-09" />
- </result>
-</results> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__CustomVariables.getCustomVariables_month.xml b/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__CustomVariables.getCustomVariables_month.xml
deleted file mode 100644
index 76eae7c657..0000000000
--- a/tests/PHPUnit/System/expected/test_SiteSearch_AllSites__CustomVariables.getCustomVariables_month.xml
+++ /dev/null
@@ -1,172 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<results>
- <result idSite="1">
- <result date="2010-01">
- <row>
- <label>_pk_scount</label>
- <nb_visits>7</nb_visits>
- <nb_actions>9</nb_actions>
- <sum_daily_nb_uniq_visitors>7</sum_daily_nb_uniq_visitors>
- <slots>
- <row>
- <scope>page</scope>
- <index>5</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scount</segment>
- <subtable>
- <row>
- <label>0</label>
- <nb_visits>3</nb_visits>
- <nb_actions>4</nb_actions>
- <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
- </row>
- <row>
- <label>10</label>
- <nb_visits>3</nb_visits>
- <nb_actions>4</nb_actions>
- <sum_daily_nb_uniq_visitors>3</sum_daily_nb_uniq_visitors>
- </row>
- <row>
- <label>5</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
- </row>
- </subtable>
- </row>
- <row>
- <label>_pk_scat</label>
- <nb_visits>4</nb_visits>
- <nb_actions>5</nb_actions>
- <sum_daily_nb_uniq_visitors>4</sum_daily_nb_uniq_visitors>
- <slots>
- <row>
- <scope>page</scope>
- <index>4</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scat</segment>
- <subtable>
- <row>
- <label>Search Category</label>
- <nb_visits>2</nb_visits>
- <nb_actions>3</nb_actions>
- <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
- </row>
- <row>
- <label>Bad No Result Category :(</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
- </row>
- <row>
- <label>Category</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
- </row>
- </subtable>
- </row>
- </result>
- <result date="2010-02" />
- <result date="2010-03" />
- <result date="2010-04" />
- <result date="2010-05" />
- <result date="2010-06" />
- <result date="2010-07" />
- </result>
- <result idSite="2">
- <result date="2010-01">
- <row>
- <label>_pk_scount</label>
- <nb_visits>1</nb_visits>
- <nb_actions>2</nb_actions>
- <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
- <slots>
- <row>
- <scope>page</scope>
- <index>5</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scount</segment>
- <subtable>
- <row>
- <label>0</label>
- <nb_visits>1</nb_visits>
- <nb_actions>2</nb_actions>
- <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
- </row>
- </subtable>
- </row>
- <row>
- <label>_pk_scat</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
- <slots>
- <row>
- <scope>page</scope>
- <index>4</index>
- </row>
- </slots>
- <segment>customVariableName==_pk_scat</segment>
- <subtable>
- <row>
- <label>Bad No Result Category bis :(</label>
- <nb_visits>1</nb_visits>
- <nb_actions>1</nb_actions>
- <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
- </row>
- </subtable>
- </row>
- </result>
- <result date="2010-02" />
- <result date="2010-03" />
- <result date="2010-04" />
- <result date="2010-05" />
- <result date="2010-06" />
- <result date="2010-07" />
- </result>
- <result idSite="3">
- <result date="2010-01">
- <row>
- <label>test cvar name</label>
- <nb_visits>1</nb_visits>
- <nb_actions>3</nb_actions>
- <max_actions>3</max_actions>
- <sum_visit_length>541</sum_visit_length>
- <bounce_count>0</bounce_count>
- <nb_visits_converted>0</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
- <sum_daily_nb_users>0</sum_daily_nb_users>
- <slots>
- <row>
- <scope>visit</scope>
- <index>1</index>
- </row>
- </slots>
- <segment>customVariableName==test+cvar+name</segment>
- <subtable>
- <row>
- <label>test cvar value</label>
- <nb_visits>1</nb_visits>
- <nb_actions>3</nb_actions>
- <max_actions>3</max_actions>
- <sum_visit_length>541</sum_visit_length>
- <bounce_count>0</bounce_count>
- <nb_visits_converted>0</nb_visits_converted>
- <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
- <sum_daily_nb_users>0</sum_daily_nb_users>
- </row>
- </subtable>
- </row>
- </result>
- <result date="2010-02" />
- <result date="2010-03" />
- <result date="2010-04" />
- <result date="2010-05" />
- <result date="2010-06" />
- <result date="2010-07" />
- </result>
-</results> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_day.xml b/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_day.xml
deleted file mode 100644
index d02e6fa4ee..0000000000
--- a/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_day.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<result>
- <website>Site 1 - Site search</website>
- <prettyDate>January 3 – 9, 2010</prettyDate>
- <metadata>
- <category>Visitors</category>
- <subcategory>Custom Variables</subcategory>
- <name>Custom Variables</name>
- <module>CustomVariables</module>
- <action>getCustomVariables</action>
- <dimension>Custom Variable name</dimension>
- <documentation>This report contains information about your Custom Variables. Click on a variable name to see the distribution of the values. &lt;br /&gt; For more information about Custom Variables in general, read the &lt;a href=&quot;https://matomo.org/docs/custom-variables/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Custom Variables documentation on matomo.org&lt;/a&gt;</documentation>
- <onlineGuideUrl>https://matomo.org/docs/custom-variables/</onlineGuideUrl>
- <dimensions>
- <CustomVariables_CustomVariableName>Custom Variable name</CustomVariables_CustomVariableName>
- <CustomVariables_CustomVariableValue>Custom Variable value</CustomVariables_CustomVariableValue>
- </dimensions>
- <metrics>
- <nb_visits>Visits</nb_visits>
- <nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
- <nb_actions>Actions</nb_actions>
- <nb_users>Users</nb_users>
- </metrics>
- <metricsDocumentation>
- <nb_visits>If a visitor comes to your website for the first time or if they visit a page more than 30 minutes after their last page view, this will be recorded as a new visit.</nb_visits>
- <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if they visit the website multiple times a day.</nb_uniq_visitors>
- <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
- <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
- <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
- <avg_time_on_site>The average duration of a visit.</avg_time_on_site>
- <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
- <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
- </metricsDocumentation>
- <processedMetrics>
- <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
- <avg_time_on_site>Avg. Time on Website</avg_time_on_site>
- <bounce_rate>Bounce Rate</bounce_rate>
- </processedMetrics>
- <actionToLoadSubTables>getCustomVariablesValuesFromNameId</actionToLoadSubTables>
- <metricsGoal>
- <nb_conversions>Conversions</nb_conversions>
- <revenue>Revenue</revenue>
- </metricsGoal>
- <processedMetricsGoal>
- <revenue_per_visit>Revenue per Visit</revenue_per_visit>
- </processedMetricsGoal>
- <imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=CustomVariables&amp;apiAction=getCustomVariables&amp;period=range&amp;date=2010-01-03,2010-01-09</imageGraphUrl>
- <imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=CustomVariables&amp;apiAction=getCustomVariables&amp;period=day&amp;date=2010-01-03,2010-01-09</imageGraphEvolutionUrl>
- <uniqueId>CustomVariables_getCustomVariables</uniqueId>
- </metadata>
- <columns>
- <label>Custom Variable name</label>
- <nb_visits>Visits</nb_visits>
- <nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
- <nb_actions>Actions</nb_actions>
- <nb_users>Users</nb_users>
- <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
- <avg_time_on_site>Avg. Time on Website</avg_time_on_site>
- <bounce_rate>Bounce Rate</bounce_rate>
- <revenue>Revenue</revenue>
- </columns>
- <reportData>
- <result prettyDate="Sunday, January 3, 2010">
- <row>
- <label>_pk_scount</label>
- <nb_visits>4</nb_visits>
- <nb_actions>6</nb_actions>
- <nb_actions_per_visit>1.5</nb_actions_per_visit>
- <avg_time_on_site>00:00:00</avg_time_on_site>
- <bounce_rate>0%</bounce_rate>
- <nb_uniq_visitors>0</nb_uniq_visitors>
- <nb_users>0</nb_users>
- <revenue>$0</revenue>
- </row>
- <row>
- <label>_pk_scat</label>
- <nb_visits>2</nb_visits>
- <nb_actions>3</nb_actions>
- <nb_actions_per_visit>1.5</nb_actions_per_visit>
- <avg_time_on_site>00:00:00</avg_time_on_site>
- <bounce_rate>0%</bounce_rate>
- <nb_uniq_visitors>0</nb_uniq_visitors>
- <nb_users>0</nb_users>
- <revenue>$0</revenue>
- </row>
- </result>
- <result prettyDate="Monday, January 4, 2010">
- <row>
- <label>_pk_scount</label>
- <nb_visits>3</nb_visits>
- <nb_actions>3</nb_actions>
- <nb_actions_per_visit>1</nb_actions_per_visit>
- <avg_time_on_site>00:00:00</avg_time_on_site>
- <bounce_rate>0%</bounce_rate>
- <nb_uniq_visitors>0</nb_uniq_visitors>
- <nb_users>0</nb_users>
- <revenue>$0</revenue>
- </row>
- <row>
- <label>_pk_scat</label>
- <nb_visits>2</nb_visits>
- <nb_actions>2</nb_actions>
- <nb_actions_per_visit>1</nb_actions_per_visit>
- <avg_time_on_site>00:00:00</avg_time_on_site>
- <bounce_rate>0%</bounce_rate>
- <nb_uniq_visitors>0</nb_uniq_visitors>
- <nb_users>0</nb_users>
- <revenue>$0</revenue>
- </row>
- </result>
- <result prettyDate="Tuesday, January 5, 2010" />
- <result prettyDate="Wednesday, January 6, 2010" />
- <result prettyDate="Thursday, January 7, 2010" />
- <result prettyDate="Friday, January 8, 2010" />
- <result prettyDate="Saturday, January 9, 2010" />
- </reportData>
- <reportMetadata>
- <result prettyDate="Sunday, January 3, 2010">
- <row>
- <slots>
- <row>
- <scope>page</scope>
- <index>5</index>
- </row>
- </slots>
-
- <segment>customVariableName==_pk_scount</segment>
- <idsubdatatable>3</idsubdatatable>
- </row>
- <row>
- <slots>
- <row>
- <scope>page</scope>
- <index>4</index>
- </row>
- </slots>
-
- <segment>customVariableName==_pk_scat</segment>
- <idsubdatatable>2</idsubdatatable>
- </row>
- </result>
- <result prettyDate="Monday, January 4, 2010">
- <row>
- <slots>
- <row>
- <scope>page</scope>
- <index>5</index>
- </row>
- </slots>
-
- <segment>customVariableName==_pk_scount</segment>
- <idsubdatatable>6</idsubdatatable>
- </row>
- <row>
- <slots>
- <row>
- <scope>page</scope>
- <index>4</index>
- </row>
- </slots>
-
- <segment>customVariableName==_pk_scat</segment>
- <idsubdatatable>5</idsubdatatable>
- </row>
- </result>
- <result prettyDate="Tuesday, January 5, 2010" />
- <result prettyDate="Wednesday, January 6, 2010" />
- <result prettyDate="Thursday, January 7, 2010" />
- <result prettyDate="Friday, January 8, 2010" />
- <result prettyDate="Saturday, January 9, 2010" />
- </reportMetadata>
- <reportTotal>
- <nb_uniq_visitors>11</nb_uniq_visitors>
- <nb_visits>11</nb_visits>
- <nb_actions>14</nb_actions>
- <nb_actions_per_visit>2.5</nb_actions_per_visit>
- </reportTotal>
-</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_month.xml b/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_month.xml
deleted file mode 100644
index 25d1860f9f..0000000000
--- a/tests/PHPUnit/System/expected/test_SiteSearch_CustomVariables.getCustomVariables_firstSite_lastN__API.getProcessedReport_month.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<result>
- <website>Site 1 - Site search</website>
- <prettyDate>January 1 – July 31, 2010</prettyDate>
- <metadata>
- <category>Visitors</category>
- <subcategory>Custom Variables</subcategory>
- <name>Custom Variables</name>
- <module>CustomVariables</module>
- <action>getCustomVariables</action>
- <dimension>Custom Variable name</dimension>
- <documentation>This report contains information about your Custom Variables. Click on a variable name to see the distribution of the values. &lt;br /&gt; For more information about Custom Variables in general, read the &lt;a href=&quot;https://matomo.org/docs/custom-variables/&quot; rel=&quot;noreferrer noopener&quot; target=&quot;_blank&quot;&gt;Custom Variables documentation on matomo.org&lt;/a&gt;</documentation>
- <onlineGuideUrl>https://matomo.org/docs/custom-variables/</onlineGuideUrl>
- <dimensions>
- <CustomVariables_CustomVariableName>Custom Variable name</CustomVariables_CustomVariableName>
- <CustomVariables_CustomVariableValue>Custom Variable value</CustomVariables_CustomVariableValue>
- </dimensions>
- <metrics>
- <nb_visits>Visits</nb_visits>
- <nb_actions>Actions</nb_actions>
- </metrics>
- <metricsDocumentation>
- <nb_visits>If a visitor comes to your website for the first time or if they visit a page more than 30 minutes after their last page view, this will be recorded as a new visit.</nb_visits>
- <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if they visit the website multiple times a day.</nb_uniq_visitors>
- <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
- <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
- <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
- <avg_time_on_site>The average duration of a visit.</avg_time_on_site>
- <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
- <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
- </metricsDocumentation>
- <processedMetrics>
- <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
- <avg_time_on_site>Avg. Time on Website</avg_time_on_site>
- <bounce_rate>Bounce Rate</bounce_rate>
- </processedMetrics>
- <actionToLoadSubTables>getCustomVariablesValuesFromNameId</actionToLoadSubTables>
- <metricsGoal>
- <nb_conversions>Conversions</nb_conversions>
- <revenue>Revenue</revenue>
- </metricsGoal>
- <processedMetricsGoal>
- <revenue_per_visit>Revenue per Visit</revenue_per_visit>
- </processedMetricsGoal>
- <imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=CustomVariables&amp;apiAction=getCustomVariables&amp;period=range&amp;date=2010-01-03,2010-07-03</imageGraphUrl>
- <imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=CustomVariables&amp;apiAction=getCustomVariables&amp;period=month&amp;date=2010-01-03,2010-07-03</imageGraphEvolutionUrl>
- <uniqueId>CustomVariables_getCustomVariables</uniqueId>
- </metadata>
- <columns>
- <label>Custom Variable name</label>
- <nb_visits>Visits</nb_visits>
- <nb_actions>Actions</nb_actions>
- <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
- <avg_time_on_site>Avg. Time on Website</avg_time_on_site>
- <bounce_rate>Bounce Rate</bounce_rate>
- <revenue>Revenue</revenue>
- </columns>
- <reportData>
- <result prettyDate="January 2010">
- <row>
- <label>_pk_scount</label>
- <nb_visits>7</nb_visits>
- <nb_actions>9</nb_actions>
- <nb_actions_per_visit>1.3</nb_actions_per_visit>
- <avg_time_on_site>00:00:00</avg_time_on_site>
- <bounce_rate>0%</bounce_rate>
- <revenue>$0</revenue>
- </row>
- <row>
- <label>_pk_scat</label>
- <nb_visits>4</nb_visits>
- <nb_actions>5</nb_actions>
- <nb_actions_per_visit>1.3</nb_actions_per_visit>
- <avg_time_on_site>00:00:00</avg_time_on_site>
- <bounce_rate>0%</bounce_rate>
- <revenue>$0</revenue>
- </row>
- </result>
- <result prettyDate="February 2010" />
- <result prettyDate="March 2010" />
- <result prettyDate="April 2010" />
- <result prettyDate="May 2010" />
- <result prettyDate="June 2010" />
- <result prettyDate="July 2010" />
- </reportData>
- <reportMetadata>
- <result prettyDate="January 2010">
- <row>
- <slots>
- <row>
- <scope>page</scope>
- <index>5</index>
- </row>
- </slots>
-
- <segment>customVariableName==_pk_scount</segment>
- <idsubdatatable>3</idsubdatatable>
- </row>
- <row>
- <slots>
- <row>
- <scope>page</scope>
- <index>4</index>
- </row>
- </slots>
-
- <segment>customVariableName==_pk_scat</segment>
- <idsubdatatable>2</idsubdatatable>
- </row>
- </result>
- <result prettyDate="February 2010" />
- <result prettyDate="March 2010" />
- <result prettyDate="April 2010" />
- <result prettyDate="May 2010" />
- <result prettyDate="June 2010" />
- <result prettyDate="July 2010" />
- </reportMetadata>
- <reportTotal>
- <nb_visits>11</nb_visits>
- <nb_actions>14</nb_actions>
- <sum_daily_nb_uniq_visitors>11</sum_daily_nb_uniq_visitors>
- <nb_actions_per_visit>1.3</nb_actions_per_visit>
- </reportTotal>
-</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_SiteSearch_NotLastNPeriods__CustomVariables.getCustomVariables_month.xml b/tests/PHPUnit/System/expected/test_SiteSearch_NotLastNPeriods__CustomVariables.getCustomVariables_month.xml
deleted file mode 100644
index c234bed59e..0000000000
--- a/tests/PHPUnit/System/expected/test_SiteSearch_NotLastNPeriods__CustomVariables.getCustomVariables_month.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<result /> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_month.original.html b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_month.original.html
index c6c7e47e56..6a80f1dcd3 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_month.original.html
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_graph__ScheduledReports.generateReport_month.original.html
@@ -45,7 +45,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_month.original.html b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_month.original.html
index aeaa249548..6177d60a84 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_month.original.html
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_overEach__ScheduledReports.generateReport_month.original.html
@@ -45,7 +45,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_month.original.html b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_month.original.html
index 1a77af62b7..f74ff4c95c 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_month.original.html
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_row_evolution_prevCustomN__ScheduledReports.generateReport_month.original.html
@@ -45,7 +45,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_and_graph__ScheduledReports.generateReport_month.original.html b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_and_graph__ScheduledReports.generateReport_month.original.html
index fee49e3f15..91b77d415a 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_and_graph__ScheduledReports.generateReport_month.original.html
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_and_graph__ScheduledReports.generateReport_month.original.html
@@ -385,7 +385,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -485,7 +485,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -571,7 +571,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -666,7 +666,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -757,7 +757,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAGQ0lEQVR4nO3dMWsbZwDHYdmxl5A9Q4YMt2YouGQsph+gEOgHKBT8ETJ0b9dkyFQoZOjYZPHSIWO69ULnFhFosZdAB2G6KEEZTJSrfLL+Pkt5Jd3zTLbuTnozvNIv995ZO5PJZAAAsMhu6QEAAJtBNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0XA1VVXNe7B10yVHAcBmEQ1LMxwOF25SDwBsLtFwNcPhcOaDv6qqS3IBALbGXukBrKMffvp95pHvvv184VHTemhWxfSRaW1Mt870h/IAYM2JhhZ//TMaj8fTX/f3909OTu7cuZMcO3PiofnreSU0lyrm7QkAa8jyRLv/GgaDwenp6XRT8wzBwk/6vAMUAwBrTjQs2XlSJBc85nsCwDqwPLF8zSsbkvMQyZ4AUJxoaHfz5s1Ltk5XKBbeZplcqZDvCQAFiYYWD76sTk9Ouh2bf/arBAA2i2ho8dUXdweDu92OvfxGyuZWt1wCsFl2JpNJ6TEAABvA3RMAQEQ0AAAR0QAAREQDABDp3d0TbliAIi7+aROTET6Z1unWYQ72Kxp8RxQU0fyi1+Yj834Flqh1unWbg5YngJUTBFDQEiegaAAAIqIBAPrimkuB/bqmAQD6aSnfqCwaAGDLLetaY8sTALDNlnh3Uu++sMqt4fDpNefd4MPUMxnh05iZgINrzMHeRQMA0I3lCQAgIhoAgIhoAAAiogEAiIgGACAiGgCASE+joa7r0kOAXjMHoaxuc7Cn0QAAXJVoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACCyV3oAxfz4yx+lhwD99ebNv/XrVc3Bo68/W9EzQ8/1Nxp+/e116SFAv/15tqInFg2wIpYnAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIh0jIaqqpY7DgBgzX2MhosdoAyAzVVVVevbmnc26Gx7lifG4/Hx8fHx8fF4PC49FqCwqqqGw2HyIJBbHA3nVV59cMkOrbtVDc395/288OXmOTo6+uaD/ChgK7XGgWKAa9pLdmrm+Uyqz9t0/vMlO3d7uXnevXs3Go1evHhxdnZ2eHj49OnT/f395J8GAISi5Yl5H9szn+hhxZ/HxKARFjNP1eF/Azdu3Hj27Nm9e/eePHly//59xQAASxedaWi1hquDjx8/fvXq1cuXL0sPBAC2UPcLIacnCdbH7u7uw4cPb9++XXogALCFPkbDTAQkJxI6d0PzcoeLlz50NhqN3r59e/3nAQAu+t/yRDMCrnSBwrydZ6pi1csZh4eHt27dWulLABth5nat8zef1geB3M5kMik9hgLquv7+579LjwJYieePHpQeAqy7uq4PDg6uetT2/HEnAGClRAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAET2Sg+gmOePHpQeAvRXXdcHBwelRwFcjTMNAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRnMpmUHgMAsAGcaQAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAyHs9lrYS3VZjqQAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGQ0lEQVR4nO3dMWsbZwDHYdmxl5A9Q4YMt2YouGQsph+gEOgHKBT8ETJ0b9dkyFQoZOjYZPHSIWO69ULnFhFosZdAB2G6KEEZTJSrfLL+Pkt5Jd3zTLbuTnozvNIv995ZO5PJZAAAsMhu6QEAAJtBNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0XA1VVXNe7B10yVHAcBmEQ1LMxwOF25SDwBsLtFwNcPhcOaDv6qqS3IBALbGXukBrKMffvp95pHvvv184VHTemhWxfSRaW1Mt870h/IAYM2JhhZ//TMaj8fTX/f3909OTu7cuZMcO3PiofnreSU0lyrm7QkAa8jyRLv/GgaDwenp6XRT8wzBwk/6vAMUAwBrTjQs2XlSJBc85nsCwDqwPLF8zSsbkvMQyZ4AUJxoaHfz5s1Ltk5XKBbeZplcqZDvCQAFiYYWD76sTk9Ouh2bf/arBAA2i2ho8dUXdweDu92OvfxGyuZWt1wCsFl2JpNJ6TEAABvA3RMAQEQ0AAAR0QAAREQDABDp3d0TbliAIi7+aROTET6Z1unWYQ72Kxp8RxQU0fyi1+Yj834Flqh1unWbg5YngJUTBFDQEiegaAAAIqIBAPrimkuB/bqmAQD6aSnfqCwaAGDLLetaY8sTALDNlnh3Uu++sMqt4fDpNefd4MPUMxnh05iZgINrzMHeRQMA0I3lCQAgIhoAgIhoAAAiogEAiIgGACAiGgCASE+joa7r0kOAXjMHoaxuc7Cn0QAAXJVoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACCyV3oAxfz4yx+lhwD99ebNv/XrVc3Bo68/W9EzQ8/1Nxp+/e116SFAv/15tqInFg2wIpYnAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIh0jIaqqpY7DgBgzX2MhosdoAyAzVVVVevbmnc26Gx7lifG4/Hx8fHx8fF4PC49FqCwqqqGw2HyIJBbHA3nVV59cMkOrbtVDc395/288OXmOTo6+uaD/ChgK7XGgWKAa9pLdmrm+Uyqz9t0/vMlO3d7uXnevXs3Go1evHhxdnZ2eHj49OnT/f395J8GAISi5Yl5H9szn+hhxZ/HxKARFjNP1eF/Azdu3Hj27Nm9e/eePHly//59xQAASxedaWi1hquDjx8/fvXq1cuXL0sPBAC2UPcLIacnCdbH7u7uw4cPb9++XXogALCFPkbDTAQkJxI6d0PzcoeLlz50NhqN3r59e/3nAQAu+t/yRDMCrnSBwrydZ6pi1csZh4eHt27dWulLABth5nat8zef1geB3M5kMik9hgLquv7+579LjwJYieePHpQeAqy7uq4PDg6uetT2/HEnAGClRAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAET2Sg+gmOePHpQeAvRXXdcHBwelRwFcjTMNAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRnMpmUHgMAsAGcaQAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAyHs9lrYS3VZjqQAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -827,7 +827,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAGVElEQVR4nO3dsY7bdADH8RxKB25kvaGDxRMcMwgeoFInHoAXQEgs7EVCSPQBEBtzX6EjC15ZqBeqnJBYEAMdbgjDSalxcs6vvsv983c+n6G62E76Hy72N3/bl7P1er0AANjnvdIDAADqIBoAgIhoAAAiogEAiIgGACAiGgCAyMlFQ9M0ty3cuWrkWQBwUk4uGkZ0Xbd3lXoA4GSdXDR0XTc48DdNM5ILAMCNZekBHMS3P/06WPLNFx/tfdamHvpVsVmyqY3N2kF/KA8A5m2e0fD763+ur683Dx89erRarS4uLpLnDiYe+g9vKqF/quK2LQFgfmZ7euLfnsVicXV1tVnVnyHYe6TPO0AxADBvs42GyW6SIrngMd8SAGZgnqcn7qh/ZUMyD5FsCQC1m200nJ+fj6zdnKHYe5tlcqVCviUA1Gue0fD0s+ZqtZr23PzYrxIAOCnzjIYnHz9eLB5Pe+74jZT9tW65BOCknK3X69JjAAAq4O4JACAiGgCAiGgAACKiAQCI1Hf3hBsWoDruT4YjFx5bK4sG3xEF1fGn1uHI5cdWpyeAA1L2MCeiATgUxQAzU9npCaAWigFqkf+BY9EAHEp/N6Qh4Gjl1zSIBuAgXLMM8+OaBgAgUtlMgy+WBID7lR9bfcslABBxegIAiIgGACAiGgCAiGgAACKiAQCIiAYAIFJrNLRtW3oIQMS7FWqx991aazQAAA9MNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAARJalBzBd+9ufpYcA7Pdq9WbxvncrVODV6s3l5dgGFUfDsx9/KT0EIPPyr9IjACKfPxlb6/QEABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRiNDRNc7/jAACO3Nto2O4AZQAAJ6jp6S9flhoQAHCEmqbpum7nw/2nJ24qY2dxDDbYudl2rQzWhq8DAJQVzTT0K2MkQLZ/Htl42n8HAJQSRcNth+3BET08um9iYvvfd3odAODe3RyU+w83P0+/psEcAADMz52uabjNoEQAgHl7Gw2DCEgmEiZ3Q/98xPalDwDAEfrf6Yl+BLzrBQoja/sPp44TAHgII8fus/V6XWJId9W27bOf/yg9CgCYlRfPn46s9d0TAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEFmWHsB0L54/LT0EYL+2bS8vL0uPAtivbdvxDcw0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBAZFl6ANN9/cPL0kOA6b7/6tPSQwB4NxVHQ/f679JDAIAT4vQEABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRZegBDTdN0XVd6FPBAmqbZ/Ow3HzhyE6Ohv6db2NnBJINEVszAkZs+02DvBnfkTQTU5d5OT9x8SNp8VNqedN1s0F+4c8v+QntVADgS93lNQ78Ydk669pcPImPn62y/FMyPRAZqMT0atmcI9u7ywn2iXScnRSIDtTjUNQ2DKyUBgNod6pZLH5hgL1MLQF0e4u802DPCTv1LgxdSGzh6B4mGfFdop8mJ8zsPVGRiNGzv6QZL8g3Gn2iXCgBHwndPAAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRZegDTffflJ6WHAAAnpOJo+PDxB6WHAAAnxOkJACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAImfr9br0GACACphpAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAIDIf8zREFioh5iYAAAAAElFTkSuQmCC"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGVElEQVR4nO3dsY7bdADH8RxKB25kvaGDxRMcMwgeoFInHoAXQEgs7EVCSPQBEBtzX6EjC15ZqBeqnJBYEAMdbgjDSalxcs6vvsv983c+n6G62E76Hy72N3/bl7P1er0AANjnvdIDAADqIBoAgIhoAAAiogEAiIgGACAiGgCAyMlFQ9M0ty3cuWrkWQBwUk4uGkZ0Xbd3lXoA4GSdXDR0XTc48DdNM5ILAMCNZekBHMS3P/06WPLNFx/tfdamHvpVsVmyqY3N2kF/KA8A5m2e0fD763+ur683Dx89erRarS4uLpLnDiYe+g9vKqF/quK2LQFgfmZ7euLfnsVicXV1tVnVnyHYe6TPO0AxADBvs42GyW6SIrngMd8SAGZgnqcn7qh/ZUMyD5FsCQC1m200nJ+fj6zdnKHYe5tlcqVCviUA1Gue0fD0s+ZqtZr23PzYrxIAOCnzjIYnHz9eLB5Pe+74jZT9tW65BOCknK3X69JjAAAq4O4JACAiGgCAiGgAACKiAQCI1Hf3hBsWoDruT4YjFx5bK4sG3xEF1fGn1uHI5cdWpyeAA1L2MCeiATgUxQAzU9npCaAWigFqkf+BY9EAHEp/N6Qh4Gjl1zSIBuAgXLMM8+OaBgAgUtlMgy+WBID7lR9bfcslABBxegIAiIgGACAiGgCAiGgAACKiAQCIiAYAIFJrNLRtW3oIQMS7FWqx991aazQAAA9MNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAARJalBzBd+9ufpYcA7Pdq9WbxvncrVODV6s3l5dgGFUfDsx9/KT0EIPPyr9IjACKfPxlb6/QEABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRiNDRNc7/jAACO3Nto2O4AZQAAJ6jp6S9flhoQAHCEmqbpum7nw/2nJ24qY2dxDDbYudl2rQzWhq8DAJQVzTT0K2MkQLZ/Htl42n8HAJQSRcNth+3BET08um9iYvvfd3odAODe3RyU+w83P0+/psEcAADMz52uabjNoEQAgHl7Gw2DCEgmEiZ3Q/98xPalDwDAEfrf6Yl+BLzrBQoja/sPp44TAHgII8fus/V6XWJId9W27bOf/yg9CgCYlRfPn46s9d0TAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEFmWHsB0L54/LT0EYL+2bS8vL0uPAtivbdvxDcw0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBAZFl6ANN9/cPL0kOA6b7/6tPSQwB4NxVHQ/f679JDAIAT4vQEABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRZegBDTdN0XVd6FPBAmqbZ/Ow3HzhyE6Ohv6db2NnBJINEVszAkZs+02DvBnfkTQTU5d5OT9x8SNp8VNqedN1s0F+4c8v+QntVADgS93lNQ78Ydk669pcPImPn62y/FMyPRAZqMT0atmcI9u7ywn2iXScnRSIDtTjUNQ2DKyUBgNod6pZLH5hgL1MLQF0e4u802DPCTv1LgxdSGzh6B4mGfFdop8mJ8zsPVGRiNGzv6QZL8g3Gn2iXCgBHwndPAAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRZegDTffflJ6WHAAAnpOJo+PDxB6WHAAAnxOkJACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAImfr9br0GACACphpAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAIDIf8zREFioh5iYAAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -918,7 +918,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAGQ0lEQVR4nO3dMWsbZwDHYdmxl5A9Q4YMt2YouGQsph+gEOgHKBT8ETJ0b9dkyFQoZOjYZPHSIWO69ULnFhFosZdAB2G6KEEZTJSrfLL+Pkt5Jd3zTLbuTnozvNIv995ZO5PJZAAAsMhu6QEAAJtBNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0XA1VVXNe7B10yVHAcBmEQ1LMxwOF25SDwBsLtFwNcPhcOaDv6qqS3IBALbGXukBrKMffvp95pHvvv184VHTemhWxfSRaW1Mt870h/IAYM2JhhZ//TMaj8fTX/f3909OTu7cuZMcO3PiofnreSU0lyrm7QkAa8jyRLv/GgaDwenp6XRT8wzBwk/6vAMUAwBrTjQs2XlSJBc85nsCwDqwPLF8zSsbkvMQyZ4AUJxoaHfz5s1Ltk5XKBbeZplcqZDvCQAFiYYWD76sTk9Ouh2bf/arBAA2i2ho8dUXdweDu92OvfxGyuZWt1wCsFl2JpNJ6TEAABvA3RMAQEQ0AAAR0QAAREQDABDp3d0TbliAIi7+aROTET6Z1unWYQ72Kxp8RxQU0fyi1+Yj834Flqh1unWbg5YngJUTBFDQEiegaAAAIqIBAPrimkuB/bqmAQD6aSnfqCwaAGDLLetaY8sTALDNlnh3Uu++sMqt4fDpNefd4MPUMxnh05iZgINrzMHeRQMA0I3lCQAgIhoAgIhoAAAiogEAiIgGACAiGgCASE+joa7r0kOAXjMHoaxuc7Cn0QAAXJVoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACCyV3oAxfz4yx+lhwD99ebNv/XrVc3Bo68/W9EzQ8/1Nxp+/e116SFAv/15tqInFg2wIpYnAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIh0jIaqqpY7DgBgzX2MhosdoAyAzVVVVevbmnc26Gx7lifG4/Hx8fHx8fF4PC49FqCwqqqGw2HyIJBbHA3nVV59cMkOrbtVDc395/288OXmOTo6+uaD/ChgK7XGgWKAa9pLdmrm+Uyqz9t0/vMlO3d7uXnevXs3Go1evHhxdnZ2eHj49OnT/f395J8GAISi5Yl5H9szn+hhxZ/HxKARFjNP1eF/Azdu3Hj27Nm9e/eePHly//59xQAASxedaWi1hquDjx8/fvXq1cuXL0sPBAC2UPcLIacnCdbH7u7uw4cPb9++XXogALCFPkbDTAQkJxI6d0PzcoeLlz50NhqN3r59e/3nAQAu+t/yRDMCrnSBwrydZ6pi1csZh4eHt27dWulLABth5nat8zef1geB3M5kMik9hgLquv7+579LjwJYieePHpQeAqy7uq4PDg6uetT2/HEnAGClRAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAET2Sg+gmOePHpQeAvRXXdcHBwelRwFcjTMNAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRnMpmUHgMAsAGcaQAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAyHs9lrYS3VZjqQAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGQ0lEQVR4nO3dMWsbZwDHYdmxl5A9Q4YMt2YouGQsph+gEOgHKBT8ETJ0b9dkyFQoZOjYZPHSIWO69ULnFhFosZdAB2G6KEEZTJSrfLL+Pkt5Jd3zTLbuTnozvNIv995ZO5PJZAAAsMhu6QEAAJtBNAAAEdEAAEREAwAQEQ0AQEQ0AAAR0XA1VVXNe7B10yVHAcBmEQ1LMxwOF25SDwBsLtFwNcPhcOaDv6qqS3IBALbGXukBrKMffvp95pHvvv184VHTemhWxfSRaW1Mt870h/IAYM2JhhZ//TMaj8fTX/f3909OTu7cuZMcO3PiofnreSU0lyrm7QkAa8jyRLv/GgaDwenp6XRT8wzBwk/6vAMUAwBrTjQs2XlSJBc85nsCwDqwPLF8zSsbkvMQyZ4AUJxoaHfz5s1Ltk5XKBbeZplcqZDvCQAFiYYWD76sTk9Ouh2bf/arBAA2i2ho8dUXdweDu92OvfxGyuZWt1wCsFl2JpNJ6TEAABvA3RMAQEQ0AAAR0QAAREQDABDp3d0TbliAIi7+aROTET6Z1unWYQ72Kxp8RxQU0fyi1+Yj834Flqh1unWbg5YngJUTBFDQEiegaAAAIqIBAPrimkuB/bqmAQD6aSnfqCwaAGDLLetaY8sTALDNlnh3Uu++sMqt4fDpNefd4MPUMxnh05iZgINrzMHeRQMA0I3lCQAgIhoAgIhoAAAiogEAiIgGACAiGgCASE+joa7r0kOAXjMHoaxuc7Cn0QAAXJVoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACCyV3oAxfz4yx+lhwD99ebNv/XrVc3Bo68/W9EzQ8/1Nxp+/e116SFAv/15tqInFg2wIpYnAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIh0jIaqqpY7DgBgzX2MhosdoAyAzVVVVevbmnc26Gx7lifG4/Hx8fHx8fF4PC49FqCwqqqGw2HyIJBbHA3nVV59cMkOrbtVDc395/288OXmOTo6+uaD/ChgK7XGgWKAa9pLdmrm+Uyqz9t0/vMlO3d7uXnevXs3Go1evHhxdnZ2eHj49OnT/f395J8GAISi5Yl5H9szn+hhxZ/HxKARFjNP1eF/Azdu3Hj27Nm9e/eePHly//59xQAASxedaWi1hquDjx8/fvXq1cuXL0sPBAC2UPcLIacnCdbH7u7uw4cPb9++XXogALCFPkbDTAQkJxI6d0PzcoeLlz50NhqN3r59e/3nAQAu+t/yRDMCrnSBwrydZ6pi1csZh4eHt27dWulLABth5nat8zef1geB3M5kMik9hgLquv7+579LjwJYieePHpQeAqy7uq4PDg6uetT2/HEnAGClRAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAET2Sg+gmOePHpQeAvRXXdcHBwelRwFcjTMNAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQGRnMpmUHgMAsAGcaQAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAyHs9lrYS3VZjqQAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -988,7 +988,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1079,7 +1079,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1174,7 +1174,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1265,7 +1265,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1335,7 +1335,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1426,7 +1426,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIW0lEQVR4nO3dzW8jZx3A8WcSJ1HSRVUpdNFu0aqyAFXiTSoHThQqcUKqtCe48w8AEhLixKVQhERPnBASB04ceuAf4IgQ5ICESl9irdQ2ZrUbJ9XS3c3bZjikcqdjx/7Fa8/jxJ/PIYo9Y/tZaTPznWfGdlGWZQIAGGcp9wAAgItBNAAAIaIBAAgRDQBAiGgAAEJEAwAQIhpmq91un3Xn0EUjHgUAeYmGbDqdzthF6gGA+SEaZqvT6dR2/O12e0QuAMDcauUewGXwyz/8s3bPz3/4jbGP6tdDtSr69/Rro7+01h/KA4CGiYYpeOe9e0dHR/2bKysr29vb169fjzy2NvFQvXlaCdVTFWetCQANcHpiOh5UpJS63W5/UXWGYOyePt4BigGAhomGzE6TInLBY3xNAJgFpyfyq17ZEJmHiKwJAFMnGqZjY2NjxNL+GYqxb7OMXKkQXxMApkg0TMHNl9rd7e3JHhvf96sEAPISDVPw8rdupHRjsseOfiNldam3XAKQV1GWZe4xAAAXgHdPAAAhogEACBENAECIaAAAQrx7YgxvWIBcvM0YGhPc2YmGUXxHFOTiE9OhMfGdndMTwNwR6DCfRAMwXxQDzC2nJ4A5ohigefFPHBYNwHypbrw0BDQgfk2DaADmiEuPYZ65pgEACDHTMIovlgTg0ovv7HzLJQAQ4vQEABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0hm5ubuYcAi6Xb7Xa73dyjgMUydmcnGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCWrkHcGFsvnE79xBggfR6eyml/37gwAaas7X98IUXRq0gGqJe+f3fcg8BAGbr+y+PWqriAYAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQEhD0dBut5t5IQBgRiaPhsEOUAYAcAm0K6r3t3INCACYQ+12u9PpDL05/dMTp1UytFBqKwxdbbBuakuDzwMATNdMZhqqVTIiWAZ/H7HyZC8HAEzLTKLhrN12bY8e3Lv3Y2Lw57meBwAY63QnW73Z/725axrMAQDA/Gv0moaz1MoFALhYJo+GWgREJhIm7obq+YjBSx8AgAY81umJagSc9wKFsU8Yf04AYFpG7IuLsixzDOmC2dzcfOVP7+YeBQDM1uuv3Ryx1HdPAAAhogEACBENAECIaAAAQkQDABAiGgCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIKSVewAXxuuv3cw9BFgg3W43pXTt2rXcA4EFsrm5OXoFMw0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACGnlHsCF8dPf/jX3EKDuNz/5Tu4hAAtENER13vsg9xAAICenJwCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhrdwDyOykLHv76VbvaGv30Vt39rd2HvznzsHW7tG9X3wp99AAYL4sUDQcn5Q7+8W7e0fv9I5v9Q6+fHXl7+8f/PEfezsPTo5PjnOPDgDm3ayiod1udzqdGT35BL7+u+3tvf3dBycn5Ud98LMXn97qHd7+8DDvwODxtdvt/u9z9XcHXDIfX9NQ3e6cdbN2Z8POGlLVWY/91/v3du4f9osBLo3TQO/L+0cKXG7nm2nIexBzukE8HUN1JqM6qnmb4YBZ8x8eaMzHMw3VY5TTXW/tZvrkfMPgwf3QI/7BO2tLB38fO20AADRvwmsaqgf0/cKoHfGngeP+yDTA6HX6KePoCqr6ke1PA5idCaPhcTZM/cIY/Dnxc471veevrLWKj/61ZUpF+srn1p55YjmdpNVWsdEqlooipZSKVCwvl6mY3UhgFmoRn3cwwGU1JBr6G50G9uWDJphLiFw6/sRycdoKS0vF6lKxtlxstJbWW0ufWW+llIqiSGVaWU6tpbT6qY205DOvAKDuE9Ew9NLrLN1w1uuOvRDyLH/+9/9q9zy9vvzG3YO/vPnhwLq7KaVfffv5CUYOzTO1ADRmyExDdQM02Tu4xj6kOoeRZT7jVFE2/5owZbU/UgEBzM7UPtypuuWqnmI47+ZsxPVctdmFx02NIrVWXLvAZSAUgGbUo2Fw61ObeBhcZ+hpgrHnDoauPGL9s1538s1l4XJHADiHRbni74vPXLmyurI4/14AmLpF+cKqt378+YfH5e376VbvsLP3qHP34deurR0Vrc9eOejdP/Hx0gAw1qJEQ0ppvVU892R67sm1l1JKaSOl9IOvple/+1TvoLjVO+zsPnr7zn5n5+Gbdw/e3jnIPFYAmD8LFA1DtZaKq+vp6rOr33w2pbSe0lO5RwQAc8o5fgAgRDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACBENAAAIaIBAAgRDQBAiGgAAEJEAwAQIhoAgBDRAACEiAYAIEQ0AAAhogEACBENAEBIK/cALoxf/+jF3EMAgJxEQ9QXbnw69xAAICenJwCAENEAAISIBgAgRDQAACGiAQAIEQ0AQIhoAABCirIsc48BALgAzDQAACGiAQAIEQ0AQIhoAABCRAMAECIaAIAQ0QAAhIgGACDk/8Gy+hpus53FAAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -1521,7 +1521,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1550,7 +1550,7 @@
&nbsp;Bounce Rate&nbsp;&nbsp;
</th>
<th style="border-bottom:1px solid rgb(231,231,231);font-size: 15px;text-align: left;font-weight:normal;padding:13px 0 13px 10px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif; text-align:right;">
- &nbsp;Conversion Rate&nbsp;&nbsp;
+ &nbsp;Revenue&nbsp;&nbsp;
</th>
</thead>
<tbody>
@@ -1576,7 +1576,7 @@
0%
</td>
<td style="padding:17px 15px; text-align:right;;border-bottom:1px solid rgb(231,231,231);font-size: 15px;font-variant-numeric: tabular-nums;padding:17px 15px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif;">
- 0%
+ $0
</td>
</tr>
@@ -1601,7 +1601,7 @@
100%
</td>
<td style="padding:17px 15px; text-align:right;;border-bottom:1px solid rgb(231,231,231);font-size: 15px;font-variant-numeric: tabular-nums;padding:17px 15px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif;">
- 0%
+ $0
</td>
</tr>
@@ -1626,7 +1626,7 @@
100%
</td>
<td style="padding:17px 15px; text-align:right;;border-bottom:1px solid rgb(231,231,231);font-size: 15px;font-variant-numeric: tabular-nums;padding:17px 15px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif;">
- 0%
+ $0
</td>
</tr>
</tbody>
@@ -1641,7 +1641,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1761,7 +1761,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1875,7 +1875,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -1970,7 +1970,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -2084,7 +2084,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -2247,7 +2247,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAALtUlEQVR4nO3dfWzcd30H8K8vtpO4dmrnQXlwQtKcQ5qmVdulnbROIB7Eg0B0Q2hCbBL7A3X7A6ZtUqdJZeNBaEhFAm2TBggJihDiDwR/VKoA8fRHK8SgaAiYaLPmmmSO7Xh1Hlw7Thw39v6w5F7s8/nTu+/Puatfr798v7t73+/8u59/b9/v+73rWFhYSAAAaynd6hUAANqD0gAAhCgNAECI0gAAhCgNAECI0gAAhNzi0lAul1dbWPOqOvcCAArVuu80VCqVNa/SHgBg3dzi0lCpVJYd+Mvlcp26AADcKp3r8Bif/eqvli157CMPrHmvpfZQ3SqWliy1jaVrl/UPzQMA8lqP0vDC8Mtzc3NLF7u6ukZGRgYHByP3XfbGQ/XFxZZQfapitVsCAM1bp9MTM1VSSqOjo0tXVb9DsOaRPt4DNAYAyKt1B0IuWqwUkQGP8VsCAA1Yj9MTTaoe2RB5HyJySwDgtVqn0tDT01Pn2qUzFGtOs4yMVIjfEgCIW4/S8P63lUdHRhq7b/zYryUAQKHWozQ8/OaDKR1s7L71J1JWX2vKJQAUqmNhYeFWrwMA0AZaffYEANAilAYAIERpAABClAYAIERpAABCbppyWXPKonmMAECqLg01vyXSV0cCAItePT2hDQAAdRjTAACE1P4Y6TVPQ4zc/F0S4+Pje/bsybleAECLWV4afK80AFDT8tkTwbowODhY5yIA8Prz6pgGMyMAgDpe/ZbL6s9jWLTYIXxOAwCQfDU2ABBkyiUAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAENJ5q1cAaGN/9ekfZEz7yiffnTENyE5pABp08szFictXMwa+PD27rXdzxkAgL6cnAICQ5e80lMvllFKlUlm2ZFH1cgBgQ7mpNJTL5UqlUt0SFpesdhEA2DhuOj2hEAAAqzGmAQAIaXD2xOTkZPXF6enpbdu25VgfoG3MzMzkDZyenu5YuJ43E8iowdIwOjpaffH06dPVIyGAjWBiInNpOH/+/NRW88ChdTW4fx47dqzORWBD2HwxpTMZ84aGhnxOA7QyYxoAgJDlUy6rf6hUKstmYJpeAQAb1k2loWYnUBQAgOT0BAAQpDQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACGda96iXC4v/VypVIpcGQCgda1RGsrlcnVRWHYRANg4nJ4AAEKUBgAgZO0xDUGf/vLPpq7M5kr78/cc/4Nju7/1vd///sWJXJn3HNn1wXcd++V/j33nh8/nyuzv2/LYI3906eVrf/f4T3JllkodT3zmPSmlRz71/RvzC7liH//7t+wa6PncE7+4cPlqrsw/eeuRh+4b/O6PT/76ufFcmW88tP3D77v7t//zf088+btcmb093Z/56Jtmrs195BPfy5XZ0dHxrccfTil97LM/mntlPlfsP//1Q/t39/3bN391/sKVXJnvfOiOtz74hqeePvXz34zmyjy07/ZHPnBvrrRqN27M/9mjT+ZK6+hI3/3C+1NKj37+p7PXb+SK/du/eGDoDQNf+vavh8+/nCvzzScOvPuPD//4P8/85Jdnc2Xu29X7Nx86cWZ08nNf+0WuzO6uTf/6j29PKX3wH7JtppTSN/7lvZu7Oz/+709fuTaXK/ORD9x7vLzz60/+7tT/XsqV+cDxvX/6tiPP/NfwU09nO1O/a6Dn0b/8w7GXpj/xxWdyZXZuKn3pn96VUvrwx59ayHYYSf/x2Ds6FurmrTam4dlnn62+2fPPP3/XXXdFHvKFF144dOhQV1dXQytc2/DwcH9/f19fX8bMl156aX5+fvfu3Rkzp6enL1y4cPDgwYyZr7zySqVSOXr0aMbMlNKpU6cOHDiwefPmjJnnzp3r6+u7/fbbM2ZOTEzMzc3t3bs3Y+bMzMz4+Pgdd9yRMXN+fv7kyZPHjh3LmJlSevHFF/fu3bt169aMmaOjo1u2bNm+fXvGzIsXL167dm3fvn0ZM69evTo2Nnb48OGMmSml55577ujRo6VSzrdgT58+vXv37p6enoyZY2NjXV1dO3fuzJg5OTk5NTW1f//+jJmzs7PDw8NDQ0MZM1NKJ0+eLJfLnZ3Z/ulNKZ09e3bHjh29vb0ZM8fHx0ul0q5duzJmTk1NXb58+cCBAxkz5+bmzpw5c+TIkciNG/ylP/jgg3Uu1nu8zs4777wz79Fo27ZtO3fuHBgYyJg5MjIyPz+fd8NMTk6eP38+7wF+bm6uu7v7/vvvz5iZUuru7h4aGsp7NOrv7+/v79+xY0fGzLGxsevXr+ftYVNTU+fOnct7gL9x40apVDpx4kTGzJTSli1bDh06dNttt2XM3L59e09PT966PD4+PjMzk7eHXblyZWBg4Pjx4xkzF913332bNm3KGNjT07N///68/9WcPXu2u7s7b12+cOHC5cuXq6fLNe/q1at9fX333HNPxsyUUqlUuvvuu/P+89nb27tnz568/9UMDw+XSqXBwcGMmZcuXZqYmAge4INmZ2e3bt16772h9w6NaQAAQtZ4p6FSqficBgAgRU5PKAoAQHJ6AgAIWmP2BADAopxTVlaqOR6iyUESq919cXnDJ1PWbVULevpL12bJXDmC+rXG1t9MDQSuFlvQqrbgpk+1XuRFZK62sNXWM8twqzrPtOFPzV+W2fxLdGXmsuRWXs+CNlML7qEb5di0UJjDhw+vvFhzYZOZq4U3GVvEqhb09JcuNvAbiKxnlsziYtdc+FozW3DT18wpInO1ha22ns1n1oytvipXZpMv+5qZzceuuZVbeTO14B66cY5Nr5MxDUWM1myXzEWt/11i67CGrf9LaMa6vSCbfKCVd29+zYvIrBPSzAtpfTZT8y/1+ndvLL+gvS977Hr+bS9iM93azGJPT7A+ijhYFjHV1vRdWp+9CepQGkLy/h1p8kzkyrSim3iuhyj0a9YzBvp4kuK08q6U7E2501p/VyqoIxbxTGvGNvlYK78pYvGHOplKwxqaHMNSU/XAk1y9ofrnFtwz28tqX7nSjGV/PTegttiVkr0pqyJ2pZRpbyriBVlE5mqx2Ucrp9gOpTTU0xZ/Mgr9971dtMUTX23s90bQFhso2Zva51k3uTd5g6Hhu79OBkIWoehTm62sXdazTbXL3+VcNvKulNpqVdtRA68ujaFmZvDuxX640y2ZYJorto0+AKD62laespxrsv7K2CZ3oZqZKxfmymz+uadar9Im17NmZgOxK++ed1dKmZ77arHV1xbxK23xzFy7Uip4MzWzN632gmxmVSOZuWKb3KGafPo+ERIACHF6AgAIURoAgJD/B/J2C+MFWR0XAAAAAElFTkSuQmCC"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAALtUlEQVR4nO3dfWzcd30H8K8vtpO4dmrnQXlwQtKcQ5qmVdulnbROIB7Eg0B0Q2hCbBL7A3X7A6ZtUqdJZeNBaEhFAm2TBggJihDiDwR/VKoA8fRHK8SgaAiYaLPmmmSO7Xh1Hlw7Thw39v6w5F7s8/nTu+/Puatfr798v7t73+/8u59/b9/v+73rWFhYSAAAaynd6hUAANqD0gAAhCgNAECI0gAAhCgNAECI0gAAhNzi0lAul1dbWPOqOvcCAArVuu80VCqVNa/SHgBg3dzi0lCpVJYd+Mvlcp26AADcKp3r8Bif/eqvli157CMPrHmvpfZQ3SqWliy1jaVrl/UPzQMA8lqP0vDC8Mtzc3NLF7u6ukZGRgYHByP3XfbGQ/XFxZZQfapitVsCAM1bp9MTM1VSSqOjo0tXVb9DsOaRPt4DNAYAyKt1B0IuWqwUkQGP8VsCAA1Yj9MTTaoe2RB5HyJySwDgtVqn0tDT01Pn2qUzFGtOs4yMVIjfEgCIW4/S8P63lUdHRhq7b/zYryUAQKHWozQ8/OaDKR1s7L71J1JWX2vKJQAUqmNhYeFWrwMA0AZaffYEANAilAYAIERpAABClAYAIERpAABCbppyWXPKonmMAECqLg01vyXSV0cCAItePT2hDQAAdRjTAACE1P4Y6TVPQ4zc/F0S4+Pje/bsybleAECLWV4afK80AFDT8tkTwbowODhY5yIA8Prz6pgGMyMAgDpe/ZbL6s9jWLTYIXxOAwCQfDU2ABBkyiUAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAEKI0AAAhSgMAENJ5q1cAaGN/9ekfZEz7yiffnTENyE5pABp08szFictXMwa+PD27rXdzxkAgL6cnAICQ5e80lMvllFKlUlm2ZFH1cgBgQ7mpNJTL5UqlUt0SFpesdhEA2DhuOj2hEAAAqzGmAQAIaXD2xOTkZPXF6enpbdu25VgfoG3MzMzkDZyenu5YuJ43E8iowdIwOjpaffH06dPVIyGAjWBiInNpOH/+/NRW88ChdTW4fx47dqzORWBD2HwxpTMZ84aGhnxOA7QyYxoAgJDlUy6rf6hUKstmYJpeAQAb1k2loWYnUBQAgOT0BAAQpDQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACFKAwAQojQAACGda96iXC4v/VypVIpcGQCgda1RGsrlcnVRWHYRANg4nJ4AAEKUBgAgZO0xDUGf/vLPpq7M5kr78/cc/4Nju7/1vd///sWJXJn3HNn1wXcd++V/j33nh8/nyuzv2/LYI3906eVrf/f4T3JllkodT3zmPSmlRz71/RvzC7liH//7t+wa6PncE7+4cPlqrsw/eeuRh+4b/O6PT/76ufFcmW88tP3D77v7t//zf088+btcmb093Z/56Jtmrs195BPfy5XZ0dHxrccfTil97LM/mntlPlfsP//1Q/t39/3bN391/sKVXJnvfOiOtz74hqeePvXz34zmyjy07/ZHPnBvrrRqN27M/9mjT+ZK6+hI3/3C+1NKj37+p7PXb+SK/du/eGDoDQNf+vavh8+/nCvzzScOvPuPD//4P8/85Jdnc2Xu29X7Nx86cWZ08nNf+0WuzO6uTf/6j29PKX3wH7JtppTSN/7lvZu7Oz/+709fuTaXK/ORD9x7vLzz60/+7tT/XsqV+cDxvX/6tiPP/NfwU09nO1O/a6Dn0b/8w7GXpj/xxWdyZXZuKn3pn96VUvrwx59ayHYYSf/x2Ds6FurmrTam4dlnn62+2fPPP3/XXXdFHvKFF144dOhQV1dXQytc2/DwcH9/f19fX8bMl156aX5+fvfu3Rkzp6enL1y4cPDgwYyZr7zySqVSOXr0aMbMlNKpU6cOHDiwefPmjJnnzp3r6+u7/fbbM2ZOTEzMzc3t3bs3Y+bMzMz4+Pgdd9yRMXN+fv7kyZPHjh3LmJlSevHFF/fu3bt169aMmaOjo1u2bNm+fXvGzIsXL167dm3fvn0ZM69evTo2Nnb48OGMmSml55577ujRo6VSzrdgT58+vXv37p6enoyZY2NjXV1dO3fuzJg5OTk5NTW1f//+jJmzs7PDw8NDQ0MZM1NKJ0+eLJfLnZ3Z/ulNKZ09e3bHjh29vb0ZM8fHx0ul0q5duzJmTk1NXb58+cCBAxkz5+bmzpw5c+TIkciNG/ylP/jgg3Uu1nu8zs4777wz79Fo27ZtO3fuHBgYyJg5MjIyPz+fd8NMTk6eP38+7wF+bm6uu7v7/vvvz5iZUuru7h4aGsp7NOrv7+/v79+xY0fGzLGxsevXr+ftYVNTU+fOnct7gL9x40apVDpx4kTGzJTSli1bDh06dNttt2XM3L59e09PT966PD4+PjMzk7eHXblyZWBg4Pjx4xkzF913332bNm3KGNjT07N///68/9WcPXu2u7s7b12+cOHC5cuXq6fLNe/q1at9fX333HNPxsyUUqlUuvvuu/P+89nb27tnz568/9UMDw+XSqXBwcGMmZcuXZqYmAge4INmZ2e3bt16772h9w6NaQAAQtZ4p6FSqficBgAgRU5PKAoAQHJ6AgAIWmP2BADAopxTVlaqOR6iyUESq919cXnDJ1PWbVULevpL12bJXDmC+rXG1t9MDQSuFlvQqrbgpk+1XuRFZK62sNXWM8twqzrPtOFPzV+W2fxLdGXmsuRWXs+CNlML7qEb5di0UJjDhw+vvFhzYZOZq4U3GVvEqhb09JcuNvAbiKxnlsziYtdc+FozW3DT18wpInO1ha22ns1n1oytvipXZpMv+5qZzceuuZVbeTO14B66cY5Nr5MxDUWM1myXzEWt/11i67CGrf9LaMa6vSCbfKCVd29+zYvIrBPSzAtpfTZT8y/1+ndvLL+gvS977Hr+bS9iM93azGJPT7A+ijhYFjHV1vRdWp+9CepQGkLy/h1p8kzkyrSim3iuhyj0a9YzBvp4kuK08q6U7E2501p/VyqoIxbxTGvGNvlYK78pYvGHOplKwxqaHMNSU/XAk1y9ofrnFtwz28tqX7nSjGV/PTegttiVkr0pqyJ2pZRpbyriBVlE5mqx2Ucrp9gOpTTU0xZ/Mgr9971dtMUTX23s90bQFhso2Zva51k3uTd5g6Hhu79OBkIWoehTm62sXdazTbXL3+VcNvKulNpqVdtRA68ujaFmZvDuxX640y2ZYJorto0+AKD62laespxrsv7K2CZ3oZqZKxfmymz+uadar9Im17NmZgOxK++ed1dKmZ77arHV1xbxK23xzFy7Uip4MzWzN632gmxmVSOZuWKb3KGafPo+ERIACHF6AgAIURoAgJD/B/J2C+MFWR0XAAAAAElFTkSuQmCC"
height="200"
width="700"
margin="0 auto"/>
@@ -2844,7 +2844,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3441,7 +3441,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAJXklEQVR4nO3dzW8beR0HYLdKkzY06TZIfVUJkoMqVeplS8WNw/4BoBV/AgfuXJA4IsQVIXFZEEckLgvitDdOqNKqaAWXvoiabihpNxVNJUpfoqKag2EyGc+Mv4kdz2/s5zmNx2P3N5+O7U/mxT7W7/c7AACjHG96AABAOygNAECI0gAAhCgNAECI0gAAhCgNAEDI9EpDt9utmll6V82jAIDpS2JPQ6/XG3mX9gAAzZpeaej1eoUP/m63W1MXAICkLEz26X7yqz8V5vzwu18f+aisPeRbRTYnaxvZvYX+oXkAwBRMuDT89dG/3r59m908ceLE1tbW5cuXI48t7HjI3xy0hPyhiqolAYAjMvnDE69yOp3O48ePs7vyewhGftLHe4DGAABTkMSJkAODShE54TG+JAAwKRM+PDGm/JkNkf0QkSUBgImYfGlYXl6uuTc7QjHyMsvImQrxJQGAMU24NHz4Qffx1tbhHhv/7NcSAGD6JlwavvXN9U5n/XCPrb+QMn+vSy4BYPqO9fv9pscAALRAQldPAAApUxoAgBClAQAIURoAgBClAQAIKS8NvqEZACgoKQ0aAwAwrFgafNkiAFBqX2nQGACAKntfI13VGLb2/5bE9vb2hQsXjnxcAEBi9v32RP5sBnsdAIC88t+e0BgAgALf0wAAhCgNAECIn8YGAELsaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQhaaHgAAJOfps5dNDyEV5778pWxaaQCAff58b/tHH91qehSp+O1PP8ymHZ4AAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEIW8je63W423ev1pj4YACBde6Wh2+3mi0LhJgAw5/YOT6gIAEAN5zQAACHlpcGxCQCgYKFwe3AuZL4x3L17N7/Aw4cP8+dLfvT7z49wdK3yvW9/teouKQ3URASQjkf/+HfTQ0jI/fv3s+ni1RPDOxguXbqUv7m6urq6ujqY/vUn9z9/8upoBtk+L/+z/LWvvDc8/wc/u/XFMyl1OkPbEkCanr161un8velRpCL/1l159UTmzJkzVTcXFxePYHhttby8vLKyMjz/+HEnjvxPaT4AqVk+5S+9Pfm37srvaei4ngIAyNkrDSoCAFDDnnMAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABCFpoeAHQ6nc4fPt1segip+OAb61V3SSkjpQgpjVQTEaWUBpr3xT9f/vw3nzU9ilRUvYt98se//fLjv0x5MMl6/9r591ZODs//8S9ufXZ3e/rjSVbp5vSd7/+u35/+WFKkNByUwxMAQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQMhC/ka3282me73e1AcDAKRrrzR0u918USjcBADmnMMTAECI0gAAhCgNAEDIsX6/P5iqOqfh9u3b+Qfcu3fv2rVr0xxivd3d3UePHm1sbDQ9kKTt7Ozs7u5evHix6YEkbXNzc21tbWVlpemBJO3OnTtJvQMk6MWLFzs7O+vr600PJGlPnjxZWlpaW1treiBJe/DgwZUrV5aWlpoeyJ6FkUvcvHmz5mbjXr9+vbKycv369aYHkrTt7e03b954F6t3+vTpc+fOnT17tumBJO3du3c3btxoehRJe/78+dOnT69evdr0QJK2ubl58uTJ8+fPNz2QpC0uLm5sbJw6darpgexxeAIACNnb09Dr9XxPAwBQZd/hCUUBAKji8AQAELJ39QQAQI2Z3dOQPz+DevOW1WTXt9XpHcXgWx3IBMlhHNKr0ngyoy+5nIJBCoVvieg4x+L/SreSOQyn/udR/FpKDZvQmAoBFqKbt20veMr8vMVSY5YuMkiiNFAv28i8CDkcm9D4anKbq0iV9YOascRSKQ2DCz4HUQ4msmo23NEKC+TfEIefubBY/j+s7f95VdtiaasdzqH0CQvLJJVV6UZSOtT8Q4ZnZnNGbkWzlF6NmpF39kc9vI3NZCAR9bEUlhxMzGQO9a+RbJ/xgTaqvNlLL/Iqyy/ZSSyZVEpDlZrPxUJAw0sOJtq+hR1UzbZYs8xgYgayCq7+8MI1Qc12evH3mtJXX+nNwURLA4mTQ15hNYdfOKVqNqrSp538uBOT/kdbW0+EPHRGWY+bk01wHDOf1ZGuVFvSi49tzLVoSyBVujmDOYdbi7bnMBh/IYpxnu0Q/3qnVekdKLH0P9oS2tOQrfNkV3j8zbp1hlc5mG1bsspeFaV/zYy5FjOf3vjmM5BDvy/NWA6doZPWaw4ujG820qvZI3VoTSWTUGk4CoVdPc0OZmpKt8jSfYB5rcgqf8AvU1ip8f8grprZ9vQmSCBBc5LDEa3mnKR3CA0mk9bhicGRsPGfpz7E4MG2dqla5ZHbUxuzileE0oYR/4dmMr0DOej70cwHEjTDOYz/ETVvL6sx1ze+5HSSSX1PQ+Evy5o4evtPOs12n85wP42scmHPYX6vfv0DW6p09UvXN/7w+UlvYGRc8xZI0JzkMPIlNrxkdl5k6TMMz5yx9Cb4ppRCMnP6NdLtKqrNktU4pFcgkAE5jEN6VaaQTFqHJ6bDBhcnq3FIr0AgA3IYh/SqTCeZOd3TAAAc1DzuaQAADkFpAABC/gvoza7vmZK9ggAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJXklEQVR4nO3dzW8beR0HYLdKkzY06TZIfVUJkoMqVeplS8WNw/4BoBV/AgfuXJA4IsQVIXFZEEckLgvitDdOqNKqaAWXvoiabihpNxVNJUpfoqKag2EyGc+Mv4kdz2/s5zmNx2P3N5+O7U/mxT7W7/c7AACjHG96AABAOygNAECI0gAAhCgNAECI0gAAhCgNAEDI9EpDt9utmll6V82jAIDpS2JPQ6/XG3mX9gAAzZpeaej1eoUP/m63W1MXAICkLEz26X7yqz8V5vzwu18f+aisPeRbRTYnaxvZvYX+oXkAwBRMuDT89dG/3r59m908ceLE1tbW5cuXI48t7HjI3xy0hPyhiqolAYAjMvnDE69yOp3O48ePs7vyewhGftLHe4DGAABTkMSJkAODShE54TG+JAAwKRM+PDGm/JkNkf0QkSUBgImYfGlYXl6uuTc7QjHyMsvImQrxJQGAMU24NHz4Qffx1tbhHhv/7NcSAGD6JlwavvXN9U5n/XCPrb+QMn+vSy4BYPqO9fv9pscAALRAQldPAAApUxoAgBClAQAIURoAgBClAQAIKS8NvqEZACgoKQ0aAwAwrFgafNkiAFBqX2nQGACAKntfI13VGLb2/5bE9vb2hQsXjnxcAEBi9v32RP5sBnsdAIC88t+e0BgAgALf0wAAhCgNAECIn8YGAELsaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQpQGACBEaQAAQhaaHgAAJOfps5dNDyEV5778pWxaaQCAff58b/tHH91qehSp+O1PP8ymHZ4AAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEKUBgAgRGkAAEIW8je63W423ev1pj4YACBde6Wh2+3mi0LhJgAw5/YOT6gIAEAN5zQAACHlpcGxCQCgYKFwe3AuZL4x3L17N7/Aw4cP8+dLfvT7z49wdK3yvW9/teouKQ3URASQjkf/+HfTQ0jI/fv3s+ni1RPDOxguXbqUv7m6urq6ujqY/vUn9z9/8upoBtk+L/+z/LWvvDc8/wc/u/XFMyl1OkPbEkCanr161un8velRpCL/1l159UTmzJkzVTcXFxePYHhttby8vLKyMjz/+HEnjvxPaT4AqVk+5S+9Pfm37srvaei4ngIAyNkrDSoCAFDDnnMAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABClAYAIERpAABCFpoeAHQ6nc4fPt1segip+OAb61V3SSkjpQgpjVQTEaWUBpr3xT9f/vw3nzU9ilRUvYt98se//fLjv0x5MMl6/9r591ZODs//8S9ufXZ3e/rjSVbp5vSd7/+u35/+WFKkNByUwxMAQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQIjSAACEKA0AQMhC/ka3282me73e1AcDAKRrrzR0u918USjcBADmnMMTAECI0gAAhCgNAEDIsX6/P5iqOqfh9u3b+Qfcu3fv2rVr0xxivd3d3UePHm1sbDQ9kKTt7Ozs7u5evHix6YEkbXNzc21tbWVlpemBJO3OnTtJvQMk6MWLFzs7O+vr600PJGlPnjxZWlpaW1treiBJe/DgwZUrV5aWlpoeyJ6FkUvcvHmz5mbjXr9+vbKycv369aYHkrTt7e03b954F6t3+vTpc+fOnT17tumBJO3du3c3btxoehRJe/78+dOnT69evdr0QJK2ubl58uTJ8+fPNz2QpC0uLm5sbJw6darpgexxeAIACNnb09Dr9XxPAwBQZd/hCUUBAKji8AQAELJ39QQAQI2Z3dOQPz+DevOW1WTXt9XpHcXgWx3IBMlhHNKr0ngyoy+5nIJBCoVvieg4x+L/SreSOQyn/udR/FpKDZvQmAoBFqKbt20veMr8vMVSY5YuMkiiNFAv28i8CDkcm9D4anKbq0iV9YOascRSKQ2DCz4HUQ4msmo23NEKC+TfEIefubBY/j+s7f95VdtiaasdzqH0CQvLJJVV6UZSOtT8Q4ZnZnNGbkWzlF6NmpF39kc9vI3NZCAR9bEUlhxMzGQO9a+RbJ/xgTaqvNlLL/Iqyy/ZSSyZVEpDlZrPxUJAw0sOJtq+hR1UzbZYs8xgYgayCq7+8MI1Qc12evH3mtJXX+nNwURLA4mTQ15hNYdfOKVqNqrSp538uBOT/kdbW0+EPHRGWY+bk01wHDOf1ZGuVFvSi49tzLVoSyBVujmDOYdbi7bnMBh/IYpxnu0Q/3qnVekdKLH0P9oS2tOQrfNkV3j8zbp1hlc5mG1bsspeFaV/zYy5FjOf3vjmM5BDvy/NWA6doZPWaw4ujG820qvZI3VoTSWTUGk4CoVdPc0OZmpKt8jSfYB5rcgqf8AvU1ip8f8grprZ9vQmSCBBc5LDEa3mnKR3CA0mk9bhicGRsPGfpz7E4MG2dqla5ZHbUxuzileE0oYR/4dmMr0DOej70cwHEjTDOYz/ETVvL6sx1ze+5HSSSX1PQ+Evy5o4evtPOs12n85wP42scmHPYX6vfv0DW6p09UvXN/7w+UlvYGRc8xZI0JzkMPIlNrxkdl5k6TMMz5yx9Cb4ppRCMnP6NdLtKqrNktU4pFcgkAE5jEN6VaaQTFqHJ6bDBhcnq3FIr0AgA3IYh/SqTCeZOd3TAAAc1DzuaQAADkFpAABC/gvoza7vmZK9ggAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -3659,7 +3659,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3761,7 +3761,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -3815,7 +3815,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -3960,7 +3960,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAHHUlEQVR4nO3dv6ojVQDH8Vy5C7ogC1bCFlsMIojdFWxE0QcQ7jP4AiLY2K8ggvsAYme9r7CljWltNI3LXQQbsViLLWIxMJudP8kvuUlmcvL5sFyS2UlyEgjnmzOZey+Wy+UMAGCT18YeAABwGkQDABARDQBARDQAABHRAABERAMAELkcewBTUVVVd+NisTj+SABgmkTDS9smQlVVqgKA8+HwBAAQOa+Vhm9/+rW15ZsvPlh/k3o5YfXgRb26UG9pba+vNssPvbfqvbfW/vnGmWMoABzLeUXD70//ffHiRXP1zp07Nzc39+/fr692v9awOtM3G+ur9dy/2ge9u3WvJtvzjd2rAHAg5xUNs9ns+fPnzeV79+49e/asiYahqTecklu7bXVvrYm/Nw5ambLt8ADgls4uGo6p94yM299D9zgIAByBaDiU7kGEHe5k/XKFdADgmM4uGu7evXuERznO9wx6j2IAwIGc1ymX159VH73/ZvPvw3dfP87jblxmaJ1S0SwhtG7YPWUDAI7mvFYaPv/4wWz2YOh/h86eGNKd1If+a82evfs0j9t7fuaakzYB4HAulsvl2GMAAE7AeR2eAAB2JhoAgIhoAAAiogEAiJRz9oQTCmCytj01CTiO7i8JXD+ZFhIN/oYTTJy3JExN9w8vb5xMHZ4AgHO0Q8oXstIATJwDiFAA0QAcXKsSHECEE+XwBAAQEQ0AQEQ0AAfnT7NCGcr5g1W+ZgVT5h0KU9Oq+fqNuf6tWk40AAAH5fAEABARDQBARDQAABHRAABERAMAEBENAECktGiYz+djDwEY5B0KU7bxHVpaNAAAByIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAil2MPYP/mv/019hCAfn/c/Dd7wzuU8l299/bYQziIAqPh4Y+/jD0EYNiTv8ceARzc40fXYw/hIByeAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIj3RUFXVVnex7f63vyEAcHyDKw0jzuhiAgAm6LJ1vaqqxWIxm83qnwDAblY/A5cxq7ajoVHXQ/Oz3tg8597FgO6r0yRI63LvrZqbND9XH7p1tYxXH4BStWa9oUnwtAxGQ6M78XdfiNnAq7OaHUPF0Lrz7s692VHGqw8AJ2Tz2RMHnZtN/ABwKl5Zabjlx/feYxZrlhkAgBOy+fBEbs0BCN0AwFlpfS2vDLf95U5Dr8iaV6q8FxEAuhYrxh7Lfuyy0tA6i2HoTIfZqydw5osNq/e5w/AAYFKKWW6/WC6X9aUyntJ8Pn/4859jjwKAs/b40fWs8zsFpm8+n19dXa3ZYZ/faQAAGqfSCrmX32ko77kBAHvkr1wCABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABC5HHsA+/f40fXYQwD6zefzq6ursUcB7MhKAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAARC7HHsD+ff3Dk7GHsKPvv/p07CEAwKACo2Hx9J+xhwAABXJ4AgCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiKTRUFXVvh5yj3cFABzNCaw0nFtkVFV1bk8ZgJMQRUNVVYvF4tBDYealBmDCLrfau57Sms/B9fTWbGyuNvs381/3o3Nrdhy6eX21/tnaocjJtcgnBUAZtouG2auT/epM37qwukN3Y3LntdbNfRAHgLFs/Z2G3jnbRA4AxdscDZP6cF8vPPieIAAc3wmcPdGyWCxWv1cBABzHsaOhd7JXAAAwfbt8EbK53D1s0VoDqHdonXDRnAqxfmP35t0TN8rTPMHVE0YAYAo2REPv6QytfTbu0NrYXN64MfzfkhT/BAE4Xaf3nQYAYBQboiFZRQAAzoGVBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIpdjD2D/vvvyk7GHAAAFKjAa3nnw1thDAIACOTwBAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBA5GK5XI49BgDgBFhpAAAiogEAiIgGACAiGgCAiGgAACKiAQCIiAYAICIaAIDI/0Kfh8kbiFPgAAAAAElFTkSuQmCC"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4037,7 +4037,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4110,7 +4110,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIoklEQVR4nO3dv6/jSAEH8CxsBcU2SBTb4QZRnQgtDTXNVjR0dEj8A1ci7trtkCjotqHZihJRIpAwokJIdz6JO+2TEHfNSbdXXBGKIOPnH8k3eS+xPfl8tHpK/Mb2xHnZ+XpmHD/Z7XYbAIBjvjZ3BQCAdRAaAICI0AAARIQGACAiNAAAEaHhf6qqOml58tsHqu673I6G+73avgBYkadzV2Ddmqa52varqrr07oY7BYCWnobVaJpGHwAAM9LTENmf5Xfb7P3pePfsv9ei78v3ztpHy593Zj+szFQ1pnY3Vb3Dlez9dvh4qmIArN1thYb3f/vX3pJ3f/aDcN1eE3v0ab61M8YdpvY+VY3zdnfGWocPCwCrdlvDEx988vk/Pvqs/ffBJ5+/efMmXPdA43dq09grH447dNca3d1UNaZ219vv4fZ+WMlh78uQxABQktvqadhsNm/fvm0fP3v27O7u7vnz59evRjg74UBX/0nzG86bDDG61uFhl24iOWOPACzZzYWGhQjb1Klip46GTG2nTQCjvRTnNfzdmQ2iA0BJbmt4ogxLmCgw7FroaZrG5R4Ahbm50PCNju7y0RYubJ6HkwNGi3WvRBjOD0gqf9Jmw90d6GaYWutAn4SUAFCw2xqeePGj6m565uOwmcxP6LvrTs00HC1z6o7yzT58d2es9ZDXBcDCPdntdnPXoUBLGEFYTjUAKMPNDU+U7cAllADwQLc1PFG83pDEvJUBoDCGJwCAiOEJACAiNAAAEaEBAIgIDQBApJyrJ3ynECzW8KtCfUhhCYb3CTrcmBYSGg7f1hmYnY8kLE17w8LekqmnG8MTAHCbzojyhfQ0AAtnABEKIDQAF9dLCQYQYaUMTwAAEaEBAIgIDcDFDS+5BNaonBtWmWYFS+YTCkvTS/P7D+bhj2o5oQEAuCjDEwBARGgAACJCAwAQERoAgIjQAABEhAYAIFJaaKjreu4qAJN8QmHJjn5CSwsNAMCFCA0AQERoAAAiQgMAEHk6dwUe39//+e+5qwCM++juy69/0yeU8r3z3W/PXYWLKDA0/PI3f5q7CsC0P/5n7hrAxb1++WLuKlyE4QkAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCIjISGqqpO2sSp5R++IgBwfZM9DTO26MIEACxQ/y6XVVU1TbPZbPY/AYDzdM+By2hVJ2+NvU8P7c/9wvY1j3YGDI9OG0F6j0fXaldpf3Z33XtaxtEHoFS9Vm+qEVyXydDQGjb8wwOxmTg63dgxlRh6Gx8WHo0dZRx9AFiR41dPXLRt1vADwFrc62l44On76JjFgW4GAGBFjg9P5A4MQMgNANyU3rS8Mjz0y52mjsiBI1XeQQSAoaZj7ro8jnN6GnpXMUxd6bC5fwFn3tnQ3eYZ1QOARSmmu/3JbrfbPyrjJdV1/d6rj+euBQA37fXLF5vBdwosX13X2+32QIHHnNMAALTWkhVy/5/TUN5rAwAekbtcAgARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAECnw1tj7u5gDC1TX9Xa7nbsWwJn0NAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiBT4NdK//t3f5q4CMO7TTz/7y4c+oaR+/pPvz10F7ikwNPzhz/+auwrAtA+/mLsGrIbQsDSGJwCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACByJDRUVRUuDD1kXQBgRmlPg8YeAG7cobtcVlXVNM3VqgIAQ92zVq3SvKJbY+/fsP3P9g1r38WpJfvMMSzW3ey+QHcL7bptse7WeuumrxKAdfKf/6JEoaHXtG/uv23t49G2f7hw9GmXPxEAWKAzr54IW/EkFrS9EcIBACzZZE/DGU14OFlSOAAg1B3m3pjTMLdoeCLRG4k4UHI42AEAowxYL8o8X+40TI4n/R24/hMAri/taWib+ammvZcDwg2Obm20M6p3IYbcAABX9mS32w2XXr//57H2WNf1e68+fvh2AJjd65cvNr6n4Yrqut5utwcKPNqchocwRgXAFA3EcozPabjyO+QPAgCWz10uAYCI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiCzi1tiPa3//dWCB6rrebrdz1wI4k54GACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AACRAr9G+qfv/n7uKpzp1fs/nrsKADCpwNDw9suv5q4CABTI8AQAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABE0tBQVdVj7fIRNwUAXM0KehpuLWRUVXVrLxmAVYhCQ1VVTdNcuipsHGoAFuy0W2Pvm7T2PHjfvLUL26dt+bb9G54691rHqdX3T/c/ewWKbFyLfFEAlOG00LC539h3W/reg26B4cJk43u91Z2IA8BcTp7TMNpma8gBoHjHQ8OiTu73HQ/mCQLA9a3g6omepmm68yoAgOu4dmgYbewlAABYvnMmQraPh8MWvT6AfYHeBRftpRCHFw5XH164UZ72BXYvGAGAJTgSGkYvZ+iVOVqgt7B9fHRh+NuSFP8CAViv9c1pAABmcSQ0JL0IAMAt0NMAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBA5OncFXh8v/rFD+euAgAUqMDQ8L3vfGvuKgBAgQxPAAARoQEAiAgNAEBEaAAAIk92u93cdQAAVkBPAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIv8FBJ7v/3BcLhAAAAAASUVORK5CYII="
height="200"
width="700"
margin="0 auto"/>
@@ -4206,7 +4206,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAIIUlEQVR4nO3dvY4jWRkG4B7UCSQjbTphXUJzBUSIbEJSkLgIAoSQIN0cAREh2hDtDZAgHJCQrGqDXs0kCIF2pBFEJmipVFM/x6/LP+VTfh6NWu5yVZ3P3dM+r885Zb/a7/cPAACHfGftAgCAOggNAEBEaAAAIkIDABARGgCAiNBwd5qmOWp7cu+Jmk9drqFxu1drC2ADHtcugDq0bXu18zdNc+nmxo0CcJCRBm5O27bGAABukJEGPvHyKr/fZ7+8HO+/+h/06C/7D161T+6/7JX9uJi5MuaamyuvXOTg3vHtucIAtkpo2Kbf/P5vgy0//+n3w2MHXezBb/OzLZh3mGt9roxlzS04qvxjAdgk0xPb9NU33/7j6391/7765tt3796FxxY6v2O7xsH+4bxD/6jJ5ubKmGtu0G65vx8XOR59GZMYgHtgpGGzPn782N1+/fr1+/fv37x5c/0ywtUJhaH+o9Y3LFsMMXlUedqln0gWtAhQI6GBywr71Lndjp0NmTtPlwAmRymWdfz9lQ2iA3APTE9wu25hocB4aGGgbVuXewB3QmjYrO/19LdP9nBh9zxeHDC5W/9KhPH6gKT4o04bNlcYZpg7qjAmISUAd8j0xDa9/UHzfn7l47ibzF/Q94+dW2k4uc+xDeWnPb25BUed8rgAKvVqv9+vXQMVu4UZhNspA2DbTE9QpcIllABciOkJqjSYkli3GIA7YXoCAIiYngAAIkIDABARGgCAiNAAAERcPVEf7ykEx3JdLpSFPYvQUJnyxzoDY97zG8rynsX0BLBlgjWckdAAbJbEAOdlegLYJokBQvkn8AkNwGb5jBJI5GsahAZgmywZhrOzpgEAiBhpqEw+8wQAibxn8SmXAEDE9AQAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDbXa7XZrlwB18McCoYN/LEIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQORx7QJY7su/fL12CVCB5+cP//yvPxY47Pn5w9NTaQehoWK//dPf1y4BKvHXf69dAdThZz8u3Wt6AgCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAyBGhoWmaxc2ccuy657905QBQi8fCff3+sm3byxdTquTYAgad/ZXrX1AwANyIuQAwGxoq6vbmSu1vvPLDqeVHBwADgx6z/+10aCh0sV366HaYzCOFUYru5ON9Jgt92e3l64md8dz5u68HH064ZXDmuT0H2wHglpWmJ8b6ne6gry1snDxDIcgMlE94FnNVjWvrbpd/DoVjxw/83I8GAC7iuNBw3hf6t6Nc1Sk13+bjBYA5/THyh3BNQy58rXyhxJDMpDxcoPMeTzGcZQIFANZ19JqGo4Td5BVmGcYtXujMg0mHfnM3O5oCACeafp+GwdBErnzUUaet960dltWQ3AaAFc2ONBSmNA7uVji2G284eODk7RNfxM+dv/xwyud5Mb5EYnENALCiQlf4ar/fr1HSeWxgLmDxQ9jtdr/+4/PZ6wHgnn3x+dvCvWdY08CxbuetNgEgV3doqLTHrbRsAO6cT7kEACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAkce1C2C5Lz5/u3YJUIHdbvf09LR2FVCB3W5X3sFIAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAij2sXwHI/+cWf1y6BoT/86kdrlwBwKUJDxf7z4X9rlwDAHTE9AQBEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARIQGACAiNAAAEaEBAIjUHRqapmmaZu0qAOAuVBwamqZp27Zt2yQ33Ei2uJEyAGCBx7ULOIO2bdcuIVVRqZyinw790oHNqDU0vDwpd0/NL+MN3dfxXd2WwTN4d1S3c//8k1v628t9Q1dMv6G5A8c7j29ThcGvzG8Q2IxaQ8NkB9zf0n+a7u88NtlDz3X23cZxK3nfoFPZNr9NYKsqXtMwtuzJ+nJP8f1BjoOtDHbODwSA66h1pKGs63QX97jhisXFCxutiLwTYh+wJdsMDQ9TCwVygwmLg60sLo8NOzG2AtygTU1PXMdcjJjcXl5OMTiwv3NyIDerux547UIAzmmbIw3jax8KExbjCxnG7/0wuMKiO9WyK+sWH0gVpD1gqyoODf1A8PBp1zv5lD33PB7ufNQ55/YZ1BzuTHUmL9AFqF3FoeHKjA0Q8t8D2Kp7Dw1HzSlctBIAuHEWQgIAEaEBAIgIDQBARGgAACJCAwAQERoAgIjQAABEhAYAICI0AAARoQEAiAgNAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQERoAAAiQgMAEBEaAICI0AAARB7XLoDlfvfLH65dAgB3RGio2Gevv7t2CQDcEdMTAEBEaAAAIkIDABARGgCAiNAAAESEBgAgIjQAAJFX+/1+7RoAgAoYaQAAIkIDABARGgCAiNAAAESEBgAgIjQAABGhAQCICA0AQOT/WEMrHR6Q7DYAAAAASUVORK5CYII="
height="200"
width="700"
margin="0 auto"/>
@@ -4279,7 +4279,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4511,7 +4511,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4621,7 +4621,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4731,7 +4731,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -4918,7 +4918,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5068,7 +5068,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5226,7 +5226,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -5376,7 +5376,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5490,7 +5490,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5593,7 +5593,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,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"
height="200"
width="700"
margin="0 auto"/>
@@ -5694,7 +5694,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,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"
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGbUlEQVR4nO3dsW7rVADHYRelS+8btMMd/AiXmYEHQOoz8BbssN4diY0R3ZkXYCPS3VGEBKoHrsSAVJYOZogUGcc5+SdNazv5vqFSbCc+jlSdX2ynvWrbtgIA2OezsQcAAMyDaAAAIqIBAIiIBgAgIhoAgIhoAAAiooGSuq53LRxcVXgWAHMnGjjSarXau0o9AJwT0UDJarXqTfx1XRdyAYAzthh7AIzvux9+7S355uvP9z5rUw/dqtgs2dTGZm2vP5QHwOyIBqrf/vzn6elp8/D6+vrh4eHu7i55bu/EQ/fhuhK6lyp2bQnALLg8QVVV1b8dVVU1TbNZ1T1DsHemzztAMQDMjmjgWdZJkdzwmG8JwDS5PMFzde9sSM5DJFsCMEGigaqqqpubm8LazRWKvV+zTO5UyLcEYFJEA9X9l3Xz8HDcc/O5XyUAzJ1ooPrqi7dV9fa455a/SNld6yuXAHN31bbt2GMAAGbAtycAgIhoAAAiogEAiIgGACDi2xNnzhcWoMcvBRSUvx4vGs6Z/xEFPX4poGDvX/p3eQK4IBIBdkkaWjQAwKULz7qJBuBCuTYBa/nvgnsagIvjX61CT/duhkJDiAbgsjjBAD353cEuTwAXRDHAczjTcM78Y0nY1vtSmd8LyPkvlwBAxOUJACAiGgCAiGgAACKiAQCIiAYAICIaAICIaLgIy+Vy7CHAtDRN0zTN2KOAadk7WYgGACAiGgCAiGgAACKiAQCIiAYAICIaAICIaAAAIqIBAIiIBgAgIhoAgIhoAAAiogEAiIgGACAiGgCAiGgAACKiAQCILMYeAK/k+58+jj0EmJDHx8eqqt68+WvsgcCEfPr097t3pQ1Ew6X4+Zffxx4CAPPm8gQAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEDkNNFQ1/VJXmfcXYy+RwCYsgmdaThikr6cef1yjhSAyZpQNBxhtVqNPQQAOFu9j6yLwrr1lNxduJmkNwt3Tdu9Z21v31uyfrj+me+3ruv1i5d3MTjU9bN6D7s/Bw8qPJbuiwweafLOHPTmlEcOAIfaPsm96K7rTaKDC9cPuzPcrllqcJtdr9Cb8AZftrDB9qrBw0mU593kWHqbJdsXhr33zRncKQA8R+9z8tqcLk8UZsQTTpbllwp3NMrkrRgAOIldn0IX24vClyssTGavUe7sO2iE+VPKx3LokSbbuy8SgBdSOG99TDT0TpVvlh80E++68+BFHfFZfO9TysdyxJEmg3RSAYCX052wuhPZ8OWJM/sgu/dwJnu8zjoA8MpWHdX/P6Yuuht1T8Vv7tXfPpewfWfEEQPafoXuTgf3e/QuyrvbtcGgQ9+NQ9+rXQd+2jcHAI5w1bbt4IozuxX/JIcz3/dkuVx+++MfY48CgKn78P6++7A38e38Ow0znR27zuxwAOCV9WbPRWHd3J38cM7s/QGAg8zp7zQAACMSDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABEFmMPgFfy4f392EOACWmapqqq29vbsQcCE7JcLssbONMAAEREAwAQEQ0AQEQ0AAAR0QAAREQDABARDQBARDQAABHRAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AAAR0QAARK7ath17DADADDjTAABERAMAEBENAEBENAAAEdEAAEREAwAQEQ0AQEQ0AACR/wBHeHscBDk8LAAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -5762,7 +5762,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
@@ -5836,7 +5836,7 @@
</h2>
<img alt=""
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArwAAADICAIAAACF9KXqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEfklEQVR4nO3cS1biQABA0ehxJ+x/SayFHtCHTufHE+IHuHckEqoqTuqRCG+n02nYw+FwOB6Pew01DMM9o+24mIebHQC+yPvhcDhv0heTh/f71IDnHfeGTffqLLufFwC8lPefXsD38e4fAO7xMQzD8XhcvKI+fmu+uOMuvne//PL8kvPD8R2HyQHz114Oni/gvM75auezLK4kLmA86WTGxTEXB9yYBQAe0cfaE5ONeXGf3t4jLzcaJkdODhiPOdmeFxew2DfzWcYP136+esrz38/HWRw8zggAD+Tv7YnJ2/rfLG7AO+7T20MtPqsSAHg+/640rN2k+Kxf/g+Jlzy67UwfJa0AYHertyduM7ksf8MB32DjNse237B4APgp/3164uabFM+3g37FGT3fXwmAl7J6pWHxwwtrB4yv+c+3xvGzvUuuLmBjlo3DNj7UsHhGG0uaDFgWCQCP622vb4R8PuX+hU9GAPA6dv6fhkfnsgEArHGlAQBIXuhrpAGAe4gGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBAIhoAgEQ0AACJaAAAEtEAACSiAQBIRAMAkIgGACARDQBA8gczQRugNvGghAAAAABJRU5ErkJggg=="
height="200"
width="700"
margin="0 auto"/>
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_only__ScheduledReports.generateReport_month.original.html b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_only__ScheduledReports.generateReport_month.original.html
index 92f265bb8f..734045e760 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_only__ScheduledReports.generateReport_month.original.html
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_html_tables_only__ScheduledReports.generateReport_month.original.html
@@ -1452,7 +1452,7 @@
&nbsp;Bounce Rate&nbsp;&nbsp;
</th>
<th style="border-bottom:1px solid rgb(231,231,231);font-size: 15px;text-align: left;font-weight:normal;padding:13px 0 13px 10px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif; text-align:right;">
- &nbsp;Conversion Rate&nbsp;&nbsp;
+ &nbsp;Revenue&nbsp;&nbsp;
</th>
</thead>
<tbody>
@@ -1478,7 +1478,7 @@
0%
</td>
<td style="padding:17px 15px; text-align:right;;border-bottom:1px solid rgb(231,231,231);font-size: 15px;font-variant-numeric: tabular-nums;padding:17px 15px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif;">
- 0%
+ $0
</td>
</tr>
@@ -1503,7 +1503,7 @@
100%
</td>
<td style="padding:17px 15px; text-align:right;;border-bottom:1px solid rgb(231,231,231);font-size: 15px;font-variant-numeric: tabular-nums;padding:17px 15px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif;">
- 0%
+ $0
</td>
</tr>
@@ -1528,7 +1528,7 @@
100%
</td>
<td style="padding:17px 15px; text-align:right;;border-bottom:1px solid rgb(231,231,231);font-size: 15px;font-variant-numeric: tabular-nums;padding:17px 15px;color:#0d0d0d;font-family:-apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, Oxygen-Sans, Cantarell, &#039;Helvetica Neue&#039;, sans-serif;">
- 0%
+ $0
</td>
</tr>
</tbody>
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_csv__ScheduledReports.generateReport_month.original.csv b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_csv__ScheduledReports.generateReport_month.original.csv
index 8c490ef098..04dccee3f6 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_csv__ScheduledReports.generateReport_month.original.csv
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_csv__ScheduledReports.generateReport_month.original.csv
@@ -60,10 +60,10 @@ Unknown,8,40,0%,5,00:15:01,0%
Windows XP,3,3,0%,1,00:00:00,100%
Browsers
-label,nb_visits,nb_actions,conversion_rate,nb_actions_per_visit,avg_time_on_site,bounce_rate
-Unknown,8,40,0%,5,00:15:01,0%
-Firefox,2,2,0%,1,00:00:00,100%
-Opera,1,1,0%,1,00:00:00,100%
+label,nb_visits,nb_actions,nb_actions_per_visit,avg_time_on_site,bounce_rate,revenue
+Unknown,8,40,5,00:15:01,0%,$0
+Firefox,2,2,1,00:00:00,100%,$0
+Opera,1,1,1,00:00:00,100%,$0
Browser version
label,nb_visits,nb_actions,conversion_rate,nb_actions_per_visit,avg_time_on_site,bounce_rate
diff --git a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_month.original.pdf b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_month.original.pdf
index bfdcd7e14e..c1be215e53 100644
--- a/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_month.original.pdf
+++ b/tests/PHPUnit/System/expected/test_TwoVisitors_twoWebsites_differentDays_schedrep_in_pdf_tables_only__ScheduledReports.generateReport_month.original.pdf
Binary files differ
diff --git a/tests/PHPUnit/System/expected/test_UserId_VisitorId__Live.getLastVisitsDetails_month.xml b/tests/PHPUnit/System/expected/test_UserId_VisitorId__Live.getLastVisitsDetails_month.xml
index 5e4528ba74..c97c185e95 100644
--- a/tests/PHPUnit/System/expected/test_UserId_VisitorId__Live.getLastVisitsDetails_month.xml
+++ b/tests/PHPUnit/System/expected/test_UserId_VisitorId__Live.getLastVisitsDetails_month.xml
@@ -193,8 +193,6 @@
<serverTimePretty>Mar 6, 2010 16:28:33</serverTimePretty>
<pageId>9</pageId>
<bandwidth />
- <timeSpent>0</timeSpent>
- <timeSpentPretty>0s</timeSpentPretty>
<interactionPosition>2</interactionPosition>
<title>second pageview - by this user id</title>
<subtitle>http://example.org/home</subtitle>
@@ -203,6 +201,15 @@
<timestamp>1267892913</timestamp>
<bandwidth_pretty>0 M</bandwidth_pretty>
</row>
+ </actionDetails>
+ <lastActionDateTime>2010-03-06 16:28:33</lastActionDateTime>
+ <userId>new-email@example.com</userId>
+ <actions>2</actions>
+ </row>
+ <row>
+ <idVisit>6</idVisit>
+ <visitorId>5e15b4d842cc294d</visitorId>
+ <actionDetails>
<row>
<type>action</type>
<url>http://example.org/home</url>
@@ -214,7 +221,7 @@
<bandwidth />
<timeSpent>721</timeSpent>
<timeSpentPretty>12 min 1s</timeSpentPretty>
- <interactionPosition>3</interactionPosition>
+ <interactionPosition>1</interactionPosition>
<title>pageview - should not be tracked by our user id but in a new visit</title>
<subtitle>http://example.org/home</subtitle>
<icon />
@@ -264,10 +271,10 @@
</actionDetails>
<lastActionDateTime>2010-03-06 16:40:33</lastActionDateTime>
<userId>new-email@example.com</userId>
- <actions>3</actions>
+ <actions>1</actions>
</row>
<row>
- <idVisit>6</idVisit>
+ <idVisit>7</idVisit>
<visitorId>7dcebef4faef4325</visitorId>
<actionDetails>
<row>
@@ -293,7 +300,7 @@
<actions>1</actions>
</row>
<row>
- <idVisit>7</idVisit>
+ <idVisit>8</idVisit>
<visitorId>6ccebef4faef4969</visitorId>
<actionDetails>
<row>
diff --git a/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_day.xml b/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_day.xml
index 1699c7276f..1182688069 100644
--- a/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_day.xml
+++ b/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_day.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_uniq_visitors>5</nb_uniq_visitors>
+ <nb_uniq_visitors>6</nb_uniq_visitors>
<nb_users>2</nb_users>
- <nb_visits>5</nb_visits>
+ <nb_visits>6</nb_visits>
<nb_actions>10</nb_actions>
<nb_visits_converted>1</nb_visits_converted>
- <bounce_count>2</bounce_count>
- <sum_visit_length>1983</sum_visit_length>
+ <bounce_count>3</bounce_count>
+ <sum_visit_length>1984</sum_visit_length>
<max_actions>3</max_actions>
- <bounce_rate>40%</bounce_rate>
- <nb_actions_per_visit>2</nb_actions_per_visit>
- <avg_time_on_site>397</avg_time_on_site>
+ <bounce_rate>50%</bounce_rate>
+ <nb_actions_per_visit>1.7</nb_actions_per_visit>
+ <avg_time_on_site>331</avg_time_on_site>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_month.xml b/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_month.xml
index b7d4779601..80bd26deb9 100644
--- a/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_month.xml
+++ b/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_month.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_uniq_visitors>7</nb_uniq_visitors>
+ <nb_uniq_visitors>8</nb_uniq_visitors>
<nb_users>3</nb_users>
- <nb_visits>7</nb_visits>
+ <nb_visits>8</nb_visits>
<nb_actions>12</nb_actions>
<nb_visits_converted>1</nb_visits_converted>
- <bounce_count>4</bounce_count>
- <sum_visit_length>1983</sum_visit_length>
+ <bounce_count>5</bounce_count>
+ <sum_visit_length>1984</sum_visit_length>
<max_actions>3</max_actions>
- <bounce_rate>57%</bounce_rate>
- <nb_actions_per_visit>1.7</nb_actions_per_visit>
- <avg_time_on_site>283</avg_time_on_site>
+ <bounce_rate>63%</bounce_rate>
+ <nb_actions_per_visit>1.5</nb_actions_per_visit>
+ <avg_time_on_site>248</avg_time_on_site>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_week.xml b/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_week.xml
index 1699c7276f..1182688069 100644
--- a/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_week.xml
+++ b/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_week.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_uniq_visitors>5</nb_uniq_visitors>
+ <nb_uniq_visitors>6</nb_uniq_visitors>
<nb_users>2</nb_users>
- <nb_visits>5</nb_visits>
+ <nb_visits>6</nb_visits>
<nb_actions>10</nb_actions>
<nb_visits_converted>1</nb_visits_converted>
- <bounce_count>2</bounce_count>
- <sum_visit_length>1983</sum_visit_length>
+ <bounce_count>3</bounce_count>
+ <sum_visit_length>1984</sum_visit_length>
<max_actions>3</max_actions>
- <bounce_rate>40%</bounce_rate>
- <nb_actions_per_visit>2</nb_actions_per_visit>
- <avg_time_on_site>397</avg_time_on_site>
+ <bounce_rate>50%</bounce_rate>
+ <nb_actions_per_visit>1.7</nb_actions_per_visit>
+ <avg_time_on_site>331</avg_time_on_site>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_year.xml b/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_year.xml
index bc04ea29ab..85fcbcddf5 100644
--- a/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_year.xml
+++ b/tests/PHPUnit/System/expected/test_UserId_VisitorId__VisitsSummary.get_year.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_visits>7</nb_visits>
+ <nb_visits>8</nb_visits>
<nb_actions>12</nb_actions>
<nb_visits_converted>1</nb_visits_converted>
- <bounce_count>4</bounce_count>
- <sum_visit_length>1983</sum_visit_length>
+ <bounce_count>5</bounce_count>
+ <sum_visit_length>1984</sum_visit_length>
<max_actions>3</max_actions>
- <bounce_rate>57%</bounce_rate>
- <nb_actions_per_visit>1.7</nb_actions_per_visit>
- <avg_time_on_site>283</avg_time_on_site>
+ <bounce_rate>63%</bounce_rate>
+ <nb_actions_per_visit>1.5</nb_actions_per_visit>
+ <avg_time_on_site>248</avg_time_on_site>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__Goals.get_day.xml b/tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__Goals.get_day.xml
index c61ad5dc70..ad0c558925 100644
--- a/tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__Goals.get_day.xml
+++ b/tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__Goals.get_day.xml
@@ -3,11 +3,11 @@
<nb_conversions>1</nb_conversions>
<nb_visits_converted>1</nb_visits_converted>
<revenue>0</revenue>
- <conversion_rate>50%</conversion_rate>
+ <conversion_rate>33.33%</conversion_rate>
<nb_conversions_new_visit>1</nb_conversions_new_visit>
<nb_visits_converted_new_visit>1</nb_visits_converted_new_visit>
<revenue_new_visit>0</revenue_new_visit>
- <conversion_rate_new_visit>50%</conversion_rate_new_visit>
+ <conversion_rate_new_visit>33.33%</conversion_rate_new_visit>
<nb_conversions_returning_visit>0</nb_conversions_returning_visit>
<nb_visits_converted_returning_visit>0</nb_visits_converted_returning_visit>
<revenue_returning_visit>0</revenue_returning_visit>
diff --git a/tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__VisitsSummary.get_day.xml b/tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__VisitsSummary.get_day.xml
index 52352bd106..cc9e9c2329 100644
--- a/tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__VisitsSummary.get_day.xml
+++ b/tests/PHPUnit/System/expected/test_UserId_VisitorId_segmentUserId__VisitsSummary.get_day.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<result>
- <nb_uniq_visitors>2</nb_uniq_visitors>
+ <nb_uniq_visitors>3</nb_uniq_visitors>
<nb_users>1</nb_users>
- <nb_visits>2</nb_visits>
+ <nb_visits>3</nb_visits>
<nb_actions>4</nb_actions>
<nb_visits_converted>1</nb_visits_converted>
- <bounce_count>1</bounce_count>
- <sum_visit_length>1081</sum_visit_length>
- <max_actions>3</max_actions>
- <bounce_rate>50%</bounce_rate>
- <nb_actions_per_visit>2</nb_actions_per_visit>
- <avg_time_on_site>541</avg_time_on_site>
+ <bounce_count>2</bounce_count>
+ <sum_visit_length>1082</sum_visit_length>
+ <max_actions>2</max_actions>
+ <bounce_rate>67%</bounce_rate>
+ <nb_actions_per_visit>1.3</nb_actions_per_visit>
+ <avg_time_on_site>361</avg_time_on_site>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
index 77bebb2118..289c0cd59e 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
@@ -554,7 +554,6 @@
<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
<bounce_rate>Bounce Rate</bounce_rate>
- <conversion_rate>Conversion Rate</conversion_rate>
</processedMetrics>
<relatedReports>
<row>
@@ -563,6 +562,13 @@
<action>getBrowserVersions</action>
</row>
</relatedReports>
+ <metricsGoal>
+ <nb_conversions>Conversions</nb_conversions>
+ <revenue>Revenue</revenue>
+ </metricsGoal>
+ <processedMetricsGoal>
+ <revenue_per_visit>Revenue per Visit</revenue_per_visit>
+ </processedMetricsGoal>
<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getBrowsers&amp;period=day&amp;date=2009-01-04</imageGraphUrl>
<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getBrowsers&amp;period=day&amp;date=2008-12-06,2009-01-04</imageGraphEvolutionUrl>
<uniqueId>DevicesDetection_getBrowsers</uniqueId>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml
index f1619e0897..57315251c6 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportPagesMetadata.xml
@@ -1855,6 +1855,35 @@
<isReport>1</isReport>
</row>
<row>
+ <name>Browsers</name>
+ <category>
+ <id>Goals by User location</id>
+ <name>Goals by User location</name>
+ <order>99</order>
+ <icon />
+ </category>
+ <subcategory>
+ <id>Goals by User location</id>
+ <name>Goals by User location</name>
+ <order>99</order>
+ </subcategory>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <order>208</order>
+ <parameters>
+ <forceView>1</forceView>
+ <viewDataTable>tableGoals</viewDataTable>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <documentationForGoalsPage>1</documentationForGoalsPage>
+ <idGoal>1</idGoal>
+ </parameters>
+ <uniqueId>widgetDevicesDetectiongetBrowsersforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal1</uniqueId>
+ <isWide>0</isWide>
+ <viewDataTable>tableGoals</viewDataTable>
+ <isReport>1</isReport>
+ </row>
+ <row>
<name>Visits per server time</name>
<category>
<id>Goals by User attribute</id>
@@ -2462,6 +2491,35 @@
<isReport>1</isReport>
</row>
<row>
+ <name>Browsers</name>
+ <category>
+ <id>Goals by User location</id>
+ <name>Goals by User location</name>
+ <order>99</order>
+ <icon />
+ </category>
+ <subcategory>
+ <id>Goals by User location</id>
+ <name>Goals by User location</name>
+ <order>99</order>
+ </subcategory>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <order>208</order>
+ <parameters>
+ <forceView>1</forceView>
+ <viewDataTable>tableGoals</viewDataTable>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <documentationForGoalsPage>1</documentationForGoalsPage>
+ <idGoal>2</idGoal>
+ </parameters>
+ <uniqueId>widgetDevicesDetectiongetBrowsersforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal2</uniqueId>
+ <isWide>0</isWide>
+ <viewDataTable>tableGoals</viewDataTable>
+ <isReport>1</isReport>
+ </row>
+ <row>
<name>Visits per server time</name>
<category>
<id>Goals by User attribute</id>
@@ -3069,6 +3127,35 @@
<isReport>1</isReport>
</row>
<row>
+ <name>Browsers</name>
+ <category>
+ <id>Goals by User location</id>
+ <name>Goals by User location</name>
+ <order>99</order>
+ <icon />
+ </category>
+ <subcategory>
+ <id>Goals by User location</id>
+ <name>Goals by User location</name>
+ <order>99</order>
+ </subcategory>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <order>208</order>
+ <parameters>
+ <forceView>1</forceView>
+ <viewDataTable>tableGoals</viewDataTable>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <documentationForGoalsPage>1</documentationForGoalsPage>
+ <idGoal>3</idGoal>
+ </parameters>
+ <uniqueId>widgetDevicesDetectiongetBrowsersforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal3</uniqueId>
+ <isWide>0</isWide>
+ <viewDataTable>tableGoals</viewDataTable>
+ <isReport>1</isReport>
+ </row>
+ <row>
<name>Visits per server time</name>
<category>
<id>Goals by User attribute</id>
@@ -3731,6 +3818,35 @@
<isReport>1</isReport>
</row>
<row>
+ <name>Browsers</name>
+ <category>
+ <id>Goals by User location</id>
+ <name>Goals by User location</name>
+ <order>99</order>
+ <icon />
+ </category>
+ <subcategory>
+ <id>Goals by User location</id>
+ <name>Goals by User location</name>
+ <order>99</order>
+ </subcategory>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <order>208</order>
+ <parameters>
+ <forceView>1</forceView>
+ <viewDataTable>tableGoals</viewDataTable>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <documentationForGoalsPage>1</documentationForGoalsPage>
+ <idGoal>0</idGoal>
+ </parameters>
+ <uniqueId>widgetDevicesDetectiongetBrowsersforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoal0</uniqueId>
+ <isWide>0</isWide>
+ <viewDataTable>tableGoals</viewDataTable>
+ <isReport>1</isReport>
+ </row>
+ <row>
<name>Visits per server time</name>
<category>
<id>Goals by User attribute</id>
@@ -4520,6 +4636,36 @@
<isReport>1</isReport>
</row>
<row>
+ <name>Browsers</name>
+ <category>
+ <id>Sales by User location</id>
+ <name>Sales by User location</name>
+ <order>99</order>
+ <icon />
+ </category>
+ <subcategory>
+ <id>Sales by User location</id>
+ <name>Sales by User location</name>
+ <order>99</order>
+ </subcategory>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <order>208</order>
+ <parameters>
+ <forceView>1</forceView>
+ <viewDataTable>tableGoals</viewDataTable>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <documentationForGoalsPage>1</documentationForGoalsPage>
+ <idGoal>ecommerceOrder</idGoal>
+ <segmented_visitor_log_segment_suffix>visitEcommerceStatus==ordered</segmented_visitor_log_segment_suffix>
+ </parameters>
+ <uniqueId>widgetDevicesDetectiongetBrowsersforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrdersegmented_visitor_log_segment_suffixvisitEcommerceStatus3D3Dordered</uniqueId>
+ <isWide>0</isWide>
+ <viewDataTable>tableGoals</viewDataTable>
+ <isReport>1</isReport>
+ </row>
+ <row>
<name>Visits per server time</name>
<category>
<id>Sales by User attribute</id>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml
index d3d5264cab..6641184d2a 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getSegmentsMetadata.xml
@@ -565,6 +565,12 @@
<row>
<type>dimension</type>
<category>Actions</category>
+ <name>Category (Site Search)</name>
+ <segment>siteSearchCategory</segment>
+ </row>
+ <row>
+ <type>dimension</type>
+ <category>Actions</category>
<name>Clicked Outlink</name>
<segment>outlinkUrl</segment>
</row>
@@ -635,6 +641,12 @@
<row>
<type>dimension</type>
<category>Actions</category>
+ <name>Keyword count (Site Search)</name>
+ <segment>siteSearchCount</segment>
+ </row>
+ <row>
+ <type>dimension</type>
+ <category>Actions</category>
<name>Page Title</name>
<segment>pageTitle</segment>
</row>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml
index d1ef5a13c9..577ea12963 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getWidgetMetadata.xml
@@ -2144,6 +2144,36 @@
<isReport>1</isReport>
</row>
<row>
+ <name>Sales by User location: Browsers</name>
+ <category>
+ <id>Goals_Ecommerce</id>
+ <name>Ecommerce</name>
+ <order>20</order>
+ <icon>icon-reporting-ecommerce</icon>
+ </category>
+ <subcategory>
+ <id>Ecommerce_Sales</id>
+ <name>Sales</name>
+ <order>15</order>
+ </subcategory>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <order>208</order>
+ <parameters>
+ <forceView>1</forceView>
+ <viewDataTable>tableGoals</viewDataTable>
+ <module>DevicesDetection</module>
+ <action>getBrowsers</action>
+ <documentationForGoalsPage>1</documentationForGoalsPage>
+ <idGoal>ecommerceOrder</idGoal>
+ <segmented_visitor_log_segment_suffix>visitEcommerceStatus==ordered</segmented_visitor_log_segment_suffix>
+ </parameters>
+ <uniqueId>widgetDevicesDetectiongetBrowsersforceView1viewDataTabletableGoalsdocumentationForGoalsPage1idGoalecommerceOrdersegmented_visitor_log_segment_suffixvisitEcommerceStatus3D3Dordered</uniqueId>
+ <isWide>0</isWide>
+ <viewDataTable>tableGoals</viewDataTable>
+ <isReport>1</isReport>
+ </row>
+ <row>
<name>Sales by User location: Device model</name>
<category>
<id>Goals_Ecommerce</id>
diff --git a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_day.xml b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_day.xml
index a91076f826..106f23f16b 100644
--- a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_day.xml
+++ b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_day.xml
@@ -1,3 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
+ <result date="2009-01-04" />
+ <result date="2009-01-05" />
+ <result date="2009-01-06" />
+ <result date="2009-01-07" />
+ <result date="2009-01-08" />
+ <result date="2009-01-09" />
+ <result date="2009-01-10" />
</results> \ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_week.xml b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_week.xml
index a91076f826..867400a47a 100644
--- a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_week.xml
+++ b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__Actions.getSiteSearchCategories_week.xml
@@ -1,3 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<results>
+ <result date="2008-12-29,2009-01-04" />
+ <result date="2009-01-05,2009-01-11" />
+ <result date="2009-01-12,2009-01-18" />
+ <result date="2009-01-19,2009-01-25" />
+ <result date="2009-01-26,2009-02-01" />
+ <result date="2009-02-02,2009-02-08" />
+ <result date="2009-02-09,2009-02-15" />
</results> \ 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 a234c57a46..57c2419562 100644
--- a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__CorePluginsAdmin.getSystemSettings.xml
+++ b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__CorePluginsAdmin.getSystemSettings.xml
@@ -322,8 +322,8 @@
<availableValues>
<latest_stable>Latest stable release (Recommended)</latest_stable>
<latest_beta>Latest beta release</latest_beta>
- <latest_3x_stable>Latest stable 3.X (Long Term Support version)</latest_3x_stable>
- <latest_3x_beta>Latest beta 3.X (Long Term Support version)</latest_3x_beta>
+ <latest_4x_stable>Latest stable 3.X (Long Term Support version)</latest_4x_stable>
+ <latest_4x_beta>Latest beta 3.X (Long Term Support version)</latest_4x_beta>
</availableValues>
<description />
<inlineHelp>While our development process includes thousands of automated tests, Beta Testers play a key role in achieving the &quot;No bug policy&quot; in Matomo.&lt;br/&gt;If Matomo is a critical part of your business, we recommend you use the latest stable release. If you use the latest beta and you find a bug or have a suggestion, please &lt;a target='_blank' rel='noreferrer noopener' href='https://developer.matomo.org/guides/core-team-workflow#influencing-piwik-development'&gt;see here&lt;/a&gt;.&lt;br /&gt;LTS (Long Term Support) versions receive only security and bug fixes.</inlineHelp>
diff --git a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
index e552d62330..da3d21a6ab 100644
--- a/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
+++ b/tests/PHPUnit/System/expected/test_noVisit_PeriodIsLast__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
@@ -117,6 +117,14 @@
<default_value />
</row>
<row>
+ <column_name>search_cat</column_name>
+ <default_value />
+ </row>
+ <row>
+ <column_name>search_count</column_name>
+ <default_value />
+ </row>
+ <row>
<column_name>time_spent</column_name>
<default_value />
</row>
diff --git a/tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml b/tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml
index a234c57a46..57c2419562 100644
--- a/tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml
+++ b/tests/PHPUnit/System/expected/test_noVisit__CorePluginsAdmin.getSystemSettings.xml
@@ -322,8 +322,8 @@
<availableValues>
<latest_stable>Latest stable release (Recommended)</latest_stable>
<latest_beta>Latest beta release</latest_beta>
- <latest_3x_stable>Latest stable 3.X (Long Term Support version)</latest_3x_stable>
- <latest_3x_beta>Latest beta 3.X (Long Term Support version)</latest_3x_beta>
+ <latest_4x_stable>Latest stable 3.X (Long Term Support version)</latest_4x_stable>
+ <latest_4x_beta>Latest beta 3.X (Long Term Support version)</latest_4x_beta>
</availableValues>
<description />
<inlineHelp>While our development process includes thousands of automated tests, Beta Testers play a key role in achieving the &quot;No bug policy&quot; in Matomo.&lt;br/&gt;If Matomo is a critical part of your business, we recommend you use the latest stable release. If you use the latest beta and you find a bug or have a suggestion, please &lt;a target='_blank' rel='noreferrer noopener' href='https://developer.matomo.org/guides/core-team-workflow#influencing-piwik-development'&gt;see here&lt;/a&gt;.&lt;br /&gt;LTS (Long Term Support) versions receive only security and bug fixes.</inlineHelp>
diff --git a/tests/PHPUnit/System/expected/test_noVisit__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml b/tests/PHPUnit/System/expected/test_noVisit__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
index e552d62330..da3d21a6ab 100644
--- a/tests/PHPUnit/System/expected/test_noVisit__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
+++ b/tests/PHPUnit/System/expected/test_noVisit__PrivacyManager.getAvailableLinkVisitActionColumnsToAnonymize.xml
@@ -117,6 +117,14 @@
<default_value />
</row>
<row>
+ <column_name>search_cat</column_name>
+ <default_value />
+ </row>
+ <row>
+ <column_name>search_count</column_name>
+ <default_value />
+ </row>
+ <row>
<column_name>time_spent</column_name>
<default_value />
</row>
diff --git a/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getAll_range.xml b/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getAll_range.xml
index d758a762ff..22ff810189 100644
--- a/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getAll_range.xml
+++ b/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getAll_range.xml
@@ -6,6 +6,10 @@
<nb_actions>9</nb_actions>
<nb_pageviews>9</nb_pageviews>
<revenue>0</revenue>
+ <visits_evolution>200%</visits_evolution>
+ <actions_evolution>200%</actions_evolution>
+ <pageviews_evolution>200%</pageviews_evolution>
+ <revenue_evolution>0%</revenue_evolution>
<idsite>1</idsite>
<group />
<main_url>http://piwik.net</main_url>
@@ -16,6 +20,10 @@
<nb_actions>2</nb_actions>
<nb_pageviews>2</nb_pageviews>
<revenue>0</revenue>
+ <visits_evolution>100%</visits_evolution>
+ <actions_evolution>100%</actions_evolution>
+ <pageviews_evolution>100%</pageviews_evolution>
+ <revenue_evolution>0%</revenue_evolution>
<idsite>2</idsite>
<group />
<main_url>http://piwik.net</main_url>
diff --git a/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getOne_range.xml b/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getOne_range.xml
index 148c3cd10d..e9115ba10c 100644
--- a/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getOne_range.xml
+++ b/tests/PHPUnit/System/expected/test_oneVisitor_oneWebsite_severalDays_DateRange__MultiSites.getOne_range.xml
@@ -2,6 +2,10 @@
<result>
<nb_visits>6</nb_visits>
<nb_actions>9</nb_actions>
+ <visits_evolution>200%</visits_evolution>
+ <actions_evolution>200%</actions_evolution>
+ <pageviews_evolution>200%</pageviews_evolution>
+ <revenue_evolution>0%</revenue_evolution>
<nb_pageviews>9</nb_pageviews>
<revenue>0</revenue>
</result> \ No newline at end of file
diff --git a/tests/PHPUnit/Unit/API/ApiRendererTest.php b/tests/PHPUnit/Unit/API/ApiRendererTest.php
index 243e5e9de5..427991fdac 100644
--- a/tests/PHPUnit/Unit/API/ApiRendererTest.php
+++ b/tests/PHPUnit/Unit/API/ApiRendererTest.php
@@ -15,9 +15,9 @@ use Piwik\Plugin\Manager;
* @group Core
* @group Only2
*/
-class ApiRendererTest extends \PHPUnit_Framework_TestCase
+class ApiRendererTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
Manager::getInstance()->loadPlugins(array('API'));
}
@@ -40,12 +40,11 @@ class ApiRendererTest extends \PHPUnit_Framework_TestCase
$this->assertInstanceOf('Piwik\Plugins\API\Renderer\Original', $renderer);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage General_ExceptionInvalidRendererFormat
- */
public function test_factory_shouldThrowAnException_IfInvalidFormatGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('General_ExceptionInvalidRendererFormat');
+
ApiRenderer::factory('phpi', array());
}
}
diff --git a/tests/PHPUnit/Unit/API/DataTableGenericFilterTest.php b/tests/PHPUnit/Unit/API/DataTableGenericFilterTest.php
index 4edfb79642..13257567b9 100644
--- a/tests/PHPUnit/Unit/API/DataTableGenericFilterTest.php
+++ b/tests/PHPUnit/Unit/API/DataTableGenericFilterTest.php
@@ -12,7 +12,7 @@ namespace Piwik\Tests\Unit\API;
use Piwik\API\DataTableGenericFilter;
use Piwik\DataTable;
-class DataTableGenericFilterTest extends \PHPUnit_Framework_TestCase
+class DataTableGenericFilterTest extends \PHPUnit\Framework\TestCase
{
public function test_genericFiltersToDisableMetadata_shouldBeRespected()
{
diff --git a/tests/PHPUnit/Unit/API/ResponseBuilderTest.php b/tests/PHPUnit/Unit/API/ResponseBuilderTest.php
index 6f1fafc520..d4c0a37fdf 100644
--- a/tests/PHPUnit/Unit/API/ResponseBuilderTest.php
+++ b/tests/PHPUnit/Unit/API/ResponseBuilderTest.php
@@ -17,9 +17,9 @@ use Piwik\Plugin\Manager;
/**
* @group Core
*/
-class ResponseBuilderTest extends \PHPUnit_Framework_TestCase
+class ResponseBuilderTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
Manager::getInstance()->loadPlugins(array('API'));
}
diff --git a/tests/PHPUnit/Unit/Archive/ChunkTest.php b/tests/PHPUnit/Unit/Archive/ChunkTest.php
index 27c1037137..c755ac2674 100644
--- a/tests/PHPUnit/Unit/Archive/ChunkTest.php
+++ b/tests/PHPUnit/Unit/Archive/ChunkTest.php
@@ -14,7 +14,7 @@ use Piwik\Archive\Chunk;
* @group ChunkTest
* @group Archive
*/
-class ChunkTest extends \PHPUnit_Framework_TestCase
+class ChunkTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Chunk
@@ -23,7 +23,7 @@ class ChunkTest extends \PHPUnit_Framework_TestCase
private $recordName = 'Actions_ActionsUrl';
- public function setUp()
+ public function setUp(): void
{
$this->chunk = new Chunk();
}
diff --git a/tests/PHPUnit/Unit/Archive/DataCollectionTest.php b/tests/PHPUnit/Unit/Archive/DataCollectionTest.php
index 48161f4758..a4b5b8f8e0 100644
--- a/tests/PHPUnit/Unit/Archive/DataCollectionTest.php
+++ b/tests/PHPUnit/Unit/Archive/DataCollectionTest.php
@@ -17,7 +17,7 @@ use Piwik\Segment;
* @group DataCollectionTest
* @group Archive
*/
-class DataCollectionTest extends \PHPUnit_Framework_TestCase
+class DataCollectionTest extends \PHPUnit\Framework\TestCase
{
private $site1 = 1;
private $site2 = 2;
diff --git a/tests/PHPUnit/Unit/Archiver/RequestTest.php b/tests/PHPUnit/Unit/Archiver/RequestTest.php
index 6ae658e10b..85363472fb 100644
--- a/tests/PHPUnit/Unit/Archiver/RequestTest.php
+++ b/tests/PHPUnit/Unit/Archiver/RequestTest.php
@@ -13,9 +13,9 @@ namespace Piwik\Tests\Unit\Archiver;
use Piwik\Archiver\Request;
use Piwik\Date;
-class RequestTest extends \PHPUnit_Framework_TestCase
+class RequestTest extends \PHPUnit\Framework\TestCase
{
- protected function tearDown()
+ protected function tearDown(): void
{
parent::tearDown();
Date::$now = null;
diff --git a/tests/PHPUnit/Unit/AssetManager/UIAssetCacheBusterTest.php b/tests/PHPUnit/Unit/AssetManager/UIAssetCacheBusterTest.php
index aebe7d4322..5404cca2dc 100644
--- a/tests/PHPUnit/Unit/AssetManager/UIAssetCacheBusterTest.php
+++ b/tests/PHPUnit/Unit/AssetManager/UIAssetCacheBusterTest.php
@@ -8,17 +8,17 @@
namespace Piwik\Tests\Unit\AssetManager;
-use PHPUnit_Framework_TestCase;
+use PHPUnit\Framework\TestCase;
use Piwik\AssetManager\UIAssetCacheBuster;
-class UIAssetCacheBusterTest extends PHPUnit_Framework_TestCase
+class UIAssetCacheBusterTest extends TestCase
{
/**
* @var UIAssetCacheBuster
*/
private $cacheBuster;
- public function setUp()
+ public function setUp(): void
{
$this->cacheBuster = UIAssetCacheBuster::getInstance();
}
diff --git a/tests/PHPUnit/Unit/AssetManager/UIAssetCatalogSorterTest.php b/tests/PHPUnit/Unit/AssetManager/UIAssetCatalogSorterTest.php
index 279d056537..8aa94acda0 100644
--- a/tests/PHPUnit/Unit/AssetManager/UIAssetCatalogSorterTest.php
+++ b/tests/PHPUnit/Unit/AssetManager/UIAssetCatalogSorterTest.php
@@ -8,12 +8,12 @@
namespace Piwik\Tests\Unit\AssetManager;
-use PHPUnit_Framework_TestCase;
+use PHPUnit\Framework\TestCase;
use Piwik\AssetManager\UIAsset\OnDiskUIAsset;
use Piwik\AssetManager\UIAssetCatalog;
use Piwik\AssetManager\UIAssetCatalogSorter;
-class UIAssetCatalogSorterTest extends PHPUnit_Framework_TestCase
+class UIAssetCatalogSorterTest extends TestCase
{
/**
* @group Core
diff --git a/tests/PHPUnit/Unit/AssetManagerTest.php b/tests/PHPUnit/Unit/AssetManagerTest.php
index 0e60782cb4..787d470798 100644
--- a/tests/PHPUnit/Unit/AssetManagerTest.php
+++ b/tests/PHPUnit/Unit/AssetManagerTest.php
@@ -14,7 +14,7 @@ use Piwik\Config;
/**
* @group AssetManager
*/
-class AssetManagerTest extends \PHPUnit_Framework_TestCase
+class AssetManagerTest extends \PHPUnit\Framework\TestCase
{
public function testIsMergedAssetsDisabled()
diff --git a/tests/PHPUnit/Unit/CacheTest.php b/tests/PHPUnit/Unit/CacheTest.php
index c56964d54e..48e665c483 100644
--- a/tests/PHPUnit/Unit/CacheTest.php
+++ b/tests/PHPUnit/Unit/CacheTest.php
@@ -13,13 +13,13 @@ use Piwik\Cache;
/**
* @group Cache
*/
-class CacheTest extends \PHPUnit_Framework_TestCase
+class CacheTest extends \PHPUnit\Framework\TestCase
{
public function test_getLazyCache_shouldCreateAnInstanceOfLazy()
{
$cache = Cache::getLazyCache();
- $this->assertTrue($cache instanceof Cache\Lazy);
+ $this->assertTrue($cache instanceof \Matomo\Cache\Lazy);
}
public function test_getLazyCache_shouldAlwaysReturnTheSameInstance()
@@ -34,7 +34,7 @@ class CacheTest extends \PHPUnit_Framework_TestCase
{
$cache = Cache::getEagerCache();
- $this->assertTrue($cache instanceof Cache\Eager);
+ $this->assertTrue($cache instanceof \Matomo\Cache\Eager);
}
public function test_getEagerCache_shouldAlwaysReturnTheSameInstance()
@@ -49,7 +49,7 @@ class CacheTest extends \PHPUnit_Framework_TestCase
{
$cache = Cache::getTransientCache();
- $this->assertTrue($cache instanceof Cache\Transient);
+ $this->assertTrue($cache instanceof \Matomo\Cache\Transient);
}
public function test_getTransientCache_shouldAlwaysReturnTheSameInstance()
diff --git a/tests/PHPUnit/Unit/Category/CategoryListTest.php b/tests/PHPUnit/Unit/Category/CategoryListTest.php
index f2b9545b45..32392b2ac4 100644
--- a/tests/PHPUnit/Unit/Category/CategoryListTest.php
+++ b/tests/PHPUnit/Unit/Category/CategoryListTest.php
@@ -16,14 +16,14 @@ use Piwik\Category\Category;
* @group CategoryList
* @group CategoryListTest
*/
-class CategoryListTest extends \PHPUnit_Framework_TestCase
+class CategoryListTest extends \PHPUnit\Framework\TestCase
{
/**
* @var CategoryList
*/
private $categoryList;
- public function setUp()
+ public function setUp(): void
{
$this->categoryList = new CategoryList();
}
@@ -40,12 +40,11 @@ class CategoryListTest extends \PHPUnit_Framework_TestCase
$this->assertSame(array('myTest' => $category), $this->categoryList->getCategories());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Category myTest already exists
- */
public function test_addCategory_shouldThrowException_IfAddingSameCategoryIdTwice()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Category myTest already exists');
+
$this->addCategory('myTest');
$this->addCategory('myTest');
}
diff --git a/tests/PHPUnit/Unit/Category/CategoryTest.php b/tests/PHPUnit/Unit/Category/CategoryTest.php
index 315ffd2051..6d475c08a3 100644
--- a/tests/PHPUnit/Unit/Category/CategoryTest.php
+++ b/tests/PHPUnit/Unit/Category/CategoryTest.php
@@ -16,14 +16,14 @@ use Piwik\Category\Subcategory;
* @group Category
* @group CategoryTest
*/
-class CategoryTest extends \PHPUnit_Framework_TestCase
+class CategoryTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Category
*/
private $category;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->category = new Category();
@@ -76,12 +76,11 @@ class CategoryTest extends \PHPUnit_Framework_TestCase
$this->assertSame(array($subcategory1, $subcategory2), $this->category->getSubcategories());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Subcategory id1 already exists
- */
public function test_addSubcategory_ShouldThrowException_WhenAddingSubcategoryWithSameIdTwice()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Subcategory id1 already exists');
+
$subcategory1 = $this->createSubcategory('id1', 'name1');
$subcategory2 = $this->createSubcategory('id1', 'name2');
diff --git a/tests/PHPUnit/Unit/Category/SubcategoryTest.php b/tests/PHPUnit/Unit/Category/SubcategoryTest.php
index 9ce2aca372..073118087f 100644
--- a/tests/PHPUnit/Unit/Category/SubcategoryTest.php
+++ b/tests/PHPUnit/Unit/Category/SubcategoryTest.php
@@ -16,14 +16,14 @@ use Piwik\Category\Subcategory;
* @group Subcategory
* @group SubcategoryTest
*/
-class SubcategoryTest extends \PHPUnit_Framework_TestCase
+class SubcategoryTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Subcategory
*/
private $subcategory;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->subcategory = new Subcategory();
diff --git a/tests/PHPUnit/Unit/CommonTest.php b/tests/PHPUnit/Unit/CommonTest.php
index 051d67fdb0..a09c68aa73 100644
--- a/tests/PHPUnit/Unit/CommonTest.php
+++ b/tests/PHPUnit/Unit/CommonTest.php
@@ -9,7 +9,7 @@
namespace Piwik\Tests\Unit;
use Exception;
-use PHPUnit_Framework_TestCase;
+use PHPUnit\Framework\TestCase;
use Piwik\Application\Environment;
use Piwik\Common;
use Piwik\Container\StaticContainer;
@@ -22,7 +22,7 @@ use Piwik\Tests\Framework\Mock\FakeLogger;
* @backupGlobals enabled
* @group Common
*/
-class CommonTest extends PHPUnit_Framework_TestCase
+class CommonTest extends TestCase
{
public function test_getProcessId()
{
@@ -120,13 +120,9 @@ class CommonTest extends PHPUnit_Framework_TestCase
*/
public function testGetRequestVarEmptyVarName()
{
- try {
- $_GET[''] = 1;
- Common::getRequestVar('');
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+ $_GET[''] = 1;
+ Common::getRequestVar('');
}
/**
@@ -134,12 +130,8 @@ class CommonTest extends PHPUnit_Framework_TestCase
*/
public function testGetRequestVarNoDefaultNoTypeNoValue()
{
- try {
- Common::getRequestVar('test');
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+ Common::getRequestVar('test');
}
/**
@@ -168,11 +160,11 @@ class CommonTest extends PHPUnit_Framework_TestCase
/**
* nodefault Withtype WithValue => exception cos type not matching
- * @expectedException \Exception
- * @expectedExceptionMessage The parameter 'test' isn't set in the Request
*/
public function testGetRequestVarNoDefaultWithTypeWithValue()
{
+ $this->expectException(Exception::class);
+ $this->expectDeprecationMessage("The parameter 'test' isn't set in the Request");
$_GET['test'] = false;
Common::getRequestVar('test', null, 'string');
}
@@ -182,13 +174,8 @@ class CommonTest extends PHPUnit_Framework_TestCase
*/
public function testGetRequestVarNoDefaultWithTypeWithValue2()
{
- try {
- Common::getRequestVar('test', null, 'string');
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
-
+ $this->expectException(Exception::class);
+ Common::getRequestVar('test', null, 'string');
}
/**
@@ -285,17 +272,12 @@ class CommonTest extends PHPUnit_Framework_TestCase
"WHITE SPACE",
);
foreach ($notvalid as $toTest) {
- $this->assertFalse(Filesystem::isValidFilename($toTest), $toTest . " valid but shouldn't!");
+ self::assertFalse(Filesystem::isValidFilename($toTest), $toTest . " valid but shouldn't!");
}
}
public function testSafeUnserialize()
{
- if (PHP_MAJOR_VERSION < 7) {
- $this->markTestSkipped('secure unserialize tests are for PHP7 only');
- return;
- }
-
// should unserialize an allowed class
$this->assertTrue(Common::safe_unserialize('O:12:"Piwik\Common":0:{}', ['Piwik\Common']) instanceof Common);
@@ -304,8 +286,8 @@ class CommonTest extends PHPUnit_Framework_TestCase
// strings not unserializable should return false and trigger a debug log
$logger = $this->createFakeLogger();
- $this->assertFalse(Common::safe_unserialize('{1:somebroken}'));
- $this->assertContains('Unable to unserialize a string: unserialize(): Error at offset 0 of 14 bytes', $logger->output);
+ self::assertFalse(Common::safe_unserialize('{1:somebroken}'));
+ self::assertStringContainsString('Unable to unserialize a string: unserialize(): Error at offset 0 of 14 bytes', $logger->output);
}
private function createFakeLogger()
diff --git a/tests/PHPUnit/Unit/Config/IniFileChainCacheTest.php b/tests/PHPUnit/Unit/Config/IniFileChainCacheTest.php
index 79d5c8ca30..a87fbca4a8 100644
--- a/tests/PHPUnit/Unit/Config/IniFileChainCacheTest.php
+++ b/tests/PHPUnit/Unit/Config/IniFileChainCacheTest.php
@@ -45,7 +45,7 @@ class IniFileChainCacheTest extends IniFileChainTest
private $testHost = 'mytest.matomo.org';
- public function setUp()
+ public function setUp(): void
{
$GLOBALS['ENABLE_CONFIG_PHP_CACHE'] = true;
$_SERVER['HTTP_HOST'] = $this->testHost;
@@ -59,7 +59,7 @@ class IniFileChainCacheTest extends IniFileChainTest
Config::setSetting('General', 'trusted_hosts', array($this->testHost, 'foonot.exists'));
}
- public function tearDown()
+ public function tearDown(): void
{
$this->cache->doDelete(IniFileChain::CONFIG_CACHE_KEY);
unset($GLOBALS['ENABLE_CONFIG_PHP_CACHE']);
diff --git a/tests/PHPUnit/Unit/Config/IniFileChainTest.php b/tests/PHPUnit/Unit/Config/IniFileChainTest.php
index 2d6c56a6d6..a9fa00c589 100644
--- a/tests/PHPUnit/Unit/Config/IniFileChainTest.php
+++ b/tests/PHPUnit/Unit/Config/IniFileChainTest.php
@@ -7,13 +7,13 @@
*/
namespace Piwik\Tests\Unit\Config;
-use PHPUnit_Framework_TestCase;
+use PHPUnit\Framework\TestCase;
use Piwik\Config\IniFileChain;
/**
* @group Core
*/
-class IniFileChainTest extends PHPUnit_Framework_TestCase
+class IniFileChainTest extends TestCase
{
/**
* Data provider for testCompareElements
diff --git a/tests/PHPUnit/Unit/ConfigTest.php b/tests/PHPUnit/Unit/ConfigTest.php
index fa3b757fb6..8938724fae 100644
--- a/tests/PHPUnit/Unit/ConfigTest.php
+++ b/tests/PHPUnit/Unit/ConfigTest.php
@@ -8,10 +8,9 @@
namespace Piwik\Tests\Unit;
-use PHPUnit_Framework_TestCase;
+use PHPUnit\Framework\TestCase;
use Piwik\Application\Kernel\GlobalSettingsProvider;
use Piwik\Config;
-use Piwik\Tests\Framework\Mock\TestConfig;
class DumpConfigTestMockIniFileChain extends Config\IniFileChain
{
@@ -52,7 +51,7 @@ class DumpConfigTestMockConfig extends Config
/**
* @group Core
*/
-class ConfigTest extends \PHPUnit_Framework_TestCase
+class ConfigTest extends TestCase
{
public function testUserConfigOverwritesSectionGlobalConfigValue()
{
diff --git a/tests/PHPUnit/Unit/ConsoleTest.php b/tests/PHPUnit/Unit/ConsoleTest.php
index 548b113b1d..6c74d2cf62 100644
--- a/tests/PHPUnit/Unit/ConsoleTest.php
+++ b/tests/PHPUnit/Unit/ConsoleTest.php
@@ -13,7 +13,7 @@ use Piwik\Version;
/**
* @group Console
*/
-class ConsoleTest extends \PHPUnit_Framework_TestCase
+class ConsoleTest extends \PHPUnit\Framework\TestCase
{
public function testIsApplicationNameAndVersionCorrect()
{
diff --git a/tests/PHPUnit/Unit/Container/IniConfigDefinitionSourceTest.php b/tests/PHPUnit/Unit/Container/IniConfigDefinitionSourceTest.php
index e9ccce608e..32b0918668 100644
--- a/tests/PHPUnit/Unit/Container/IniConfigDefinitionSourceTest.php
+++ b/tests/PHPUnit/Unit/Container/IniConfigDefinitionSourceTest.php
@@ -12,7 +12,7 @@ use DI\Definition\ValueDefinition;
use Piwik\Application\Kernel\GlobalSettingsProvider;
use Piwik\Container\IniConfigDefinitionSource;
-class IniConfigDefinitionSourceTest extends \PHPUnit_Framework_TestCase
+class IniConfigDefinitionSourceTest extends \PHPUnit\Framework\TestCase
{
/**
* @test
@@ -77,7 +77,7 @@ class IniConfigDefinitionSourceTest extends \PHPUnit_Framework_TestCase
$this->assertTrue($definition instanceof ValueDefinition);
$this->assertEquals('ini.General', $definition->getName());
- $this->assertInternalType('array', $definition->getValue());
+ self::assertIsArray($definition->getValue());
$this->assertEquals(array('foo' => 'bar'), $definition->getValue());
}
@@ -103,10 +103,11 @@ class IniConfigDefinitionSourceTest extends \PHPUnit_Framework_TestCase
}
/**
- * @return \PHPUnit_Framework_MockObject_MockObject|GlobalSettingsProvider
+ * @return \PHPUnit\Framework\MockObject\MockObject|GlobalSettingsProvider
*/
private function createConfig()
{
- return $this->getMock('Piwik\Application\Kernel\GlobalSettingsProvider', array(), array(), '', false);
+ return $this->getMockBuilder('Piwik\Application\Kernel\GlobalSettingsProvider')
+ ->disableOriginalConstructor()->getMock();
}
}
diff --git a/tests/PHPUnit/Unit/ContextTest.php b/tests/PHPUnit/Unit/ContextTest.php
index e297b8feaa..6bda7a08c2 100644
--- a/tests/PHPUnit/Unit/ContextTest.php
+++ b/tests/PHPUnit/Unit/ContextTest.php
@@ -12,7 +12,7 @@ namespace Piwik\Tests\Unit;
use Piwik\Context;
use Piwik\Tracker;
-class ContextTest extends \PHPUnit_Framework_TestCase
+class ContextTest extends \PHPUnit\Framework\TestCase
{
/**
diff --git a/tests/PHPUnit/Unit/CookieTest.php b/tests/PHPUnit/Unit/CookieTest.php
index 65e114c5e2..738229e520 100644
--- a/tests/PHPUnit/Unit/CookieTest.php
+++ b/tests/PHPUnit/Unit/CookieTest.php
@@ -10,7 +10,7 @@ namespace Piwik\Tests\Unit;
use Piwik\Cookie;
-class CookieTest extends \PHPUnit_Framework_TestCase
+class CookieTest extends \PHPUnit\Framework\TestCase
{
/**
* Dataprovider for testJsonSerialize
@@ -44,7 +44,7 @@ class CookieTest extends \PHPUnit_Framework_TestCase
*
* @dataProvider getJsonSerializeData
*/
- public function testJsonSerialize($testData, $id)
+ public function testJsonSerialize($id, $testData)
{
$this->assertEquals($testData, json_decode(json_encode($testData), $assoc = true), $id);
}
diff --git a/tests/PHPUnit/Unit/CronArchive/FixedSiteIdsTest.php b/tests/PHPUnit/Unit/CronArchive/FixedSiteIdsTest.php
index 87c72cb572..6349db258a 100644
--- a/tests/PHPUnit/Unit/CronArchive/FixedSiteIdsTest.php
+++ b/tests/PHPUnit/Unit/CronArchive/FixedSiteIdsTest.php
@@ -13,14 +13,14 @@ use Piwik\CronArchive\FixedSiteIds;
/**
* @group Core
*/
-class FixedSiteIdsTest extends \PHPUnit_Framework_TestCase
+class FixedSiteIdsTest extends \PHPUnit\Framework\TestCase
{
/**
* @var FixedSiteIds
*/
private $fixedSiteIds;
- public function setUp()
+ public function setUp(): void
{
$this->fixedSiteIds = new FixedSiteIds(array(1,2,5,9));
}
diff --git a/tests/PHPUnit/Unit/CronArchive/SegmentArchivingRequestUrlProviderTest.php b/tests/PHPUnit/Unit/CronArchive/SegmentArchivingRequestUrlProviderTest.php
index 861fe641d1..63896a96fc 100644
--- a/tests/PHPUnit/Unit/CronArchive/SegmentArchivingRequestUrlProviderTest.php
+++ b/tests/PHPUnit/Unit/CronArchive/SegmentArchivingRequestUrlProviderTest.php
@@ -14,13 +14,13 @@ use Piwik\CronArchive\SegmentArchivingRequestUrlProvider;
/**
* @group Core
*/
-class SegmentArchivingRequestUrlProviderTest extends \PHPUnit_Framework_TestCase
+class SegmentArchivingRequestUrlProviderTest extends \PHPUnit\Framework\TestCase
{
const TEST_NOW = '2015-03-01';
private $mockSegmentEntries;
- public function setUp()
+ public function setUp(): void
{
Config::getInstance()->General['enabled_periods_API'] = 'day,week,month,year,range';
@@ -247,7 +247,7 @@ class SegmentArchivingRequestUrlProviderTest extends \PHPUnit_Framework_TestCase
private function createUrlProviderToTest($processNewSegmentsFrom)
{
- $mockSegmentEditorModel = $this->getMock('Piwik\Plugins\SegmentEditor\Model', array('getAllSegmentsAndIgnoreVisibility'));
+ $mockSegmentEditorModel = $this->createPartialMock('Piwik\Plugins\SegmentEditor\Model', array('getAllSegmentsAndIgnoreVisibility'));
$mockSegmentEditorModel->expects($this->any())->method('getAllSegmentsAndIgnoreVisibility')->will($this->returnValue($this->mockSegmentEntries));
return new SegmentArchivingRequestUrlProvider($processNewSegmentsFrom, $mockSegmentEditorModel, null, Date::factory(self::TEST_NOW));
diff --git a/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php b/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php
index 97dffe41c0..0107bd4642 100644
--- a/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php
+++ b/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php
@@ -13,11 +13,11 @@ use Piwik\DataAccess\ArchiveTableCreator;
/**
* @group Core
*/
-class ArchiveTableCreatorTest extends \PHPUnit_Framework_TestCase
+class ArchiveTableCreatorTest extends \PHPUnit\Framework\TestCase
{
private $tables;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -33,7 +33,7 @@ class ArchiveTableCreatorTest extends \PHPUnit_Framework_TestCase
);
}
- public function tearDown()
+ public function tearDown(): void
{
ArchiveTableCreator::clear();
diff --git a/tests/PHPUnit/Unit/DataAccess/ArchiveWriterTest.php b/tests/PHPUnit/Unit/DataAccess/ArchiveWriterTest.php
index 04b0579180..3814c0ffc1 100644
--- a/tests/PHPUnit/Unit/DataAccess/ArchiveWriterTest.php
+++ b/tests/PHPUnit/Unit/DataAccess/ArchiveWriterTest.php
@@ -18,7 +18,7 @@ use Piwik\Segment;
* @group Archive
* @group Core
*/
-class ArchiveWriterTest extends \PHPUnit_Framework_TestCase
+class ArchiveWriterTest extends \PHPUnit\Framework\TestCase
{
private $recordName = 'Actions_Action_url';
@@ -97,7 +97,10 @@ class ArchiveWriterTest extends \PHPUnit_Framework_TestCase
private function assertInsertBlobRecordInsertedRecordsInBulk($expectedBlobs, $blobs)
{
- $writer = $this->getMock('Piwik\DataAccess\ArchiveWriter', array('insertRecord', 'compress'), array(), '', false);
+ $writer = $this->getMockBuilder('Piwik\DataAccess\ArchiveWriter')
+ ->disableOriginalConstructor()
+ ->onlyMethods(array('insertRecord', 'compress'))
+ ->getMock();
$writer->expects($this->exactly(count($expectedBlobs)))
->method('compress')
->will($this->returnArgument(0));
@@ -114,7 +117,10 @@ class ArchiveWriterTest extends \PHPUnit_Framework_TestCase
private function assertInsertBlobRecordInsertedASingleRecord($expectedBlob, $blob)
{
- $writer = $this->getMock('Piwik\DataAccess\ArchiveWriter', array('insertRecord', 'compress'), array(), '', false);
+ $writer = $this->getMockBuilder('Piwik\DataAccess\ArchiveWriter')
+ ->disableOriginalConstructor()
+ ->onlyMethods(array('insertRecord', 'compress'))
+ ->getMock();
$writer->expects($this->once())
->method('compress')
->will($this->returnArgument(0));
diff --git a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
index 0e2d305aff..e16796c9bb 100644
--- a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
+++ b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinGeneratorTest.php
@@ -16,14 +16,14 @@ use Piwik\Tracker\Visit;
/**
* @group Core
*/
-class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
+class JoinGeneratorTest extends \PHPUnit\Framework\TestCase
{
/**
* @var JoinGenerator
*/
private $generator;
- public function setUp()
+ public function setUp(): void
{
$this->generator = $this->makeTables(array(
'log_visit',
@@ -100,14 +100,14 @@ class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
}
/**
- * @expectedException \Exception
- * @expectedExceptionMessage Table 'log_visit' can't be joined for segmentation
- *
* Note: the exception reports `log_visit` and not `log_custom` as it resolves the dependencies as so resolves
* from `log_custom` to `log_visit` but is then not able to find a way to join `log_visit` with `log_action`
*/
public function test_generate_getJoinString_CustomVisitTableCantBeJoinedWithAction()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Table \'log_visit\' can\'t be joined for segmentation');
+
$generator = $this->generate(array('log_action', 'log_custom'));
$generator->getJoinString();
}
@@ -161,12 +161,11 @@ class JoinGeneratorTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($expected, $generator->getJoinString());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Please reorganize the joined tables as the table log_conversion in {"0":"log_visit","1":"log_conversion","2":"log_link_visit_action","3":{"table":"log_conversion","joinOn":"log_link_visit_action.idvisit2 = log_conversion.idvisit2"}} cannot be joined correctly.
- */
public function test_generate_getJoinString_manuallyJoinedAlreadyWithCustomConditionInArrayInverted()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Please reorganize the joined tables as the table log_conversion in {"0":"log_visit","1":"log_conversion","2":"log_link_visit_action","3":{"table":"log_conversion","joinOn":"log_link_visit_action.idvisit2 = log_conversion.idvisit2"}} cannot be joined correctly.');
+
$generator = $this->generate(array(
'log_visit',
'log_conversion',
diff --git a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
index 039b3818c7..a5961697e8 100644
--- a/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
+++ b/tests/PHPUnit/Unit/DataAccess/LogQueryBuilder/JoinTablesTest.php
@@ -15,14 +15,14 @@ use Piwik\Tracker\Visit;
/**
* @group Core
*/
-class JoinTablesTest extends \PHPUnit_Framework_TestCase
+class JoinTablesTest extends \PHPUnit\Framework\TestCase
{
/**
* @var JoinTables
*/
private $tables;
- public function setUp()
+ public function setUp(): void
{
$this->tables = $this->makeTables(array(
'log_visit',
@@ -30,12 +30,11 @@ class JoinTablesTest extends \PHPUnit_Framework_TestCase
'log_action'));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Table 'log_foo_bar_baz' can't be used for segmentation
- */
public function test_construct_shouldThrowException_IfTableIsNotPossibleToJoin()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Table \'log_foo_bar_baz\' can\'t be used for segmentation');
+
$this->makeTables(array('log_visit', 'log_foo_bar_baz'));
}
@@ -72,12 +71,11 @@ class JoinTablesTest extends \PHPUnit_Framework_TestCase
$this->assertTrue($this->tables->hasJoinedTable($table));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Table 'log_foo_bar_baz' can't be used for segmentation
- */
public function test_addTableToJoin_shouldCheckIfTableCanBeUsedForSegmentation()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Table \'log_foo_bar_baz\' can\'t be used for segmentation');
+
$table = 'log_foo_bar_baz';
$this->assertFalse($this->tables->hasJoinedTable($table));
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterByLabelMappingTest.php b/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterByLabelMappingTest.php
index 9ecc4bf387..3690ef16a2 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterByLabelMappingTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterByLabelMappingTest.php
@@ -16,7 +16,7 @@ use Piwik\DataTable\Row;
* @group DataTable
* @group Filter
*/
-class AddSegmentByLabelMappingTest extends \PHPUnit_Framework_TestCase
+class AddSegmentByLabelMappingTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'AddSegmentByLabelMapping';
@@ -25,7 +25,7 @@ class AddSegmentByLabelMappingTest extends \PHPUnit_Framework_TestCase
*/
private $table;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterBySegmentValueTest.php b/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterBySegmentValueTest.php
index a52c8c17d4..9dcfa9ebc0 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterBySegmentValueTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterBySegmentValueTest.php
@@ -22,7 +22,7 @@ use Piwik\Plugins\VisitsSummary\Reports\Get;
* @group Filter
* @group Core
*/
-class AddSegmentBySegmentValueTest extends \PHPUnit_Framework_TestCase
+class AddSegmentBySegmentValueTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'AddSegmentBySegmentValue';
@@ -33,7 +33,7 @@ class AddSegmentBySegmentValueTest extends \PHPUnit_Framework_TestCase
private $report;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterTest.php b/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterTest.php
index b2b28ea136..531f533195 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentFilterTest.php
@@ -16,7 +16,7 @@ use Piwik\DataTable\Row;
* @group DataTable
* @group Filter
*/
-class AddSegmentByLabelTest extends \PHPUnit_Framework_TestCase
+class AddSegmentByLabelTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'AddSegmentByLabel';
@@ -25,7 +25,7 @@ class AddSegmentByLabelTest extends \PHPUnit_Framework_TestCase
*/
private $table;
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
$this->addRow(array('label' => 'http://piwik.org/test'));
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentValueTest.php b/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentValueTest.php
index 2a9ff9856b..7f7848ab73 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentValueTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/AddSegmentValueTest.php
@@ -16,7 +16,7 @@ use Piwik\DataTable\Row;
* @group DataTable
* @group Filter
*/
-class AddSegmentValueTest extends \PHPUnit_Framework_TestCase
+class AddSegmentValueTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'AddSegmentValue';
@@ -25,7 +25,7 @@ class AddSegmentValueTest extends \PHPUnit_Framework_TestCase
*/
private $table;
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
$this->addRow(array('label' => 'http://piwik.org/test'));
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/AddSummaryRowTest.php b/tests/PHPUnit/Unit/DataTable/Filter/AddSummaryRowTest.php
index 31b41ab330..116a3ee34f 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/AddSummaryRowTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/AddSummaryRowTest.php
@@ -14,7 +14,7 @@ use Piwik\DataTable\Row;
/**
* @group DataTableTest
*/
-class DataTable_Filter_AddSummaryRowTest extends \PHPUnit_Framework_TestCase
+class DataTable_Filter_AddSummaryRowTest extends \PHPUnit\Framework\TestCase
{
/**
* @group AddSummaryRow
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/ColumnCallbackDeleteMetadataTest.php b/tests/PHPUnit/Unit/DataTable/Filter/ColumnCallbackDeleteMetadataTest.php
index c10965a81e..cf2258715c 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/ColumnCallbackDeleteMetadataTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/ColumnCallbackDeleteMetadataTest.php
@@ -16,7 +16,7 @@ use Piwik\DataTable\Row;
* @group DataTable
* @group Filter
*/
-class ColumnCallbackDeleteMetadataTest extends \PHPUnit_Framework_TestCase
+class ColumnCallbackDeleteMetadataTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'ColumnCallbackDeleteMetadata';
@@ -25,7 +25,7 @@ class ColumnCallbackDeleteMetadataTest extends \PHPUnit_Framework_TestCase
*/
private $table;
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
$this->addRowWithMetadata(array('test' => '1'));
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/ColumnDeleteTest.php b/tests/PHPUnit/Unit/DataTable/Filter/ColumnDeleteTest.php
index 5f7d788f9a..03d67c5ebf 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/ColumnDeleteTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/ColumnDeleteTest.php
@@ -11,7 +11,7 @@ namespace Piwik\Tests\Unit\DataTable\Filter;
use Piwik\DataTable;
use Piwik\DataTable\Row;
-class ColumnDeleteTest extends \PHPUnit_Framework_TestCase
+class ColumnDeleteTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'ColumnDelete';
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/ExcludeLowPopulationTest.php b/tests/PHPUnit/Unit/DataTable/Filter/ExcludeLowPopulationTest.php
index b55cfebfdf..3daace8e4c 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/ExcludeLowPopulationTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/ExcludeLowPopulationTest.php
@@ -15,7 +15,7 @@ use Piwik\DataTable\Row;
/**
* @group DataTableTest
*/
-class DataTable_Filter_ExcludeLowPopulationTest extends \PHPUnit_Framework_TestCase
+class DataTable_Filter_ExcludeLowPopulationTest extends \PHPUnit\Framework\TestCase
{
protected function getTestDataTable()
{
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/LimitTest.php b/tests/PHPUnit/Unit/DataTable/Filter/LimitTest.php
index 93eea95aef..044f0a4168 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/LimitTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/LimitTest.php
@@ -15,7 +15,7 @@ use Piwik\DataTable\Row;
/**
* @group DataTableTest
*/
-class DataTable_Filter_LimitTest extends \PHPUnit_Framework_TestCase
+class DataTable_Filter_LimitTest extends \PHPUnit\Framework\TestCase
{
/**
* Returns table used for the tests
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/PatternRecursiveTest.php b/tests/PHPUnit/Unit/DataTable/Filter/PatternRecursiveTest.php
index a2c225108e..64f4db037b 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/PatternRecursiveTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/PatternRecursiveTest.php
@@ -14,7 +14,7 @@ use Piwik\DataTable\Row;
/**
* @group DataTableTest
*/
-class DataTable_Filter_PatternRecursiveTest extends \PHPUnit_Framework_TestCase
+class DataTable_Filter_PatternRecursiveTest extends \PHPUnit\Framework\TestCase
{
/**
* Returns a data table for testing
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/PatternTest.php b/tests/PHPUnit/Unit/DataTable/Filter/PatternTest.php
index 194f467d01..ede4a5b450 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/PatternTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/PatternTest.php
@@ -15,7 +15,7 @@ use Piwik\DataTable\Row;
* @group DataTableTest
* @group Core
*/
-class PatternTest extends \PHPUnit_Framework_TestCase
+class PatternTest extends \PHPUnit\Framework\TestCase
{
/**
* Dataprovider for testFilterPattern
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/PrependSegmentFilterTest.php b/tests/PHPUnit/Unit/DataTable/Filter/PrependSegmentFilterTest.php
index d76188d4b6..d128ff7615 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/PrependSegmentFilterTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/PrependSegmentFilterTest.php
@@ -16,7 +16,7 @@ use Piwik\DataTable\Row;
* @group DataTable
* @group Filter
*/
-class PrependSegmentTest extends \PHPUnit_Framework_TestCase
+class PrependSegmentTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'PrependSegment';
@@ -25,7 +25,7 @@ class PrependSegmentTest extends \PHPUnit_Framework_TestCase
*/
private $table;
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
$this->addRowWithMetadata(array('test' => '1'));
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/PrependValueToMetadataTest.php b/tests/PHPUnit/Unit/DataTable/Filter/PrependValueToMetadataTest.php
index d52c937052..7d26799a3d 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/PrependValueToMetadataTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/PrependValueToMetadataTest.php
@@ -16,7 +16,7 @@ use Piwik\DataTable\Row;
* @group DataTable
* @group Filter
*/
-class PrependValueToMetadataTest extends \PHPUnit_Framework_TestCase
+class PrependValueToMetadataTest extends \PHPUnit\Framework\TestCase
{
private $filter = 'PrependValueToMetadata';
@@ -25,7 +25,7 @@ class PrependValueToMetadataTest extends \PHPUnit_Framework_TestCase
*/
private $table;
- public function setUp()
+ public function setUp(): void
{
$this->table = new DataTable();
$this->addRowWithMetadata(array('test' => '1'));
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/RangeCheckTest.php b/tests/PHPUnit/Unit/DataTable/Filter/RangeCheckTest.php
index beed36f85c..1873ade1ee 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/RangeCheckTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/RangeCheckTest.php
@@ -16,7 +16,7 @@ use Piwik\Plugins\CoreHome\Columns\Metrics\VisitsPercent;
/**
* @group DataTableTest
*/
-class DataTable_Filter_RangeCheckTest extends \PHPUnit_Framework_TestCase
+class DataTable_Filter_RangeCheckTest extends \PHPUnit\Framework\TestCase
{
public function testRangeCheckNormalDataTable()
{
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/SortTest.php b/tests/PHPUnit/Unit/DataTable/Filter/SortTest.php
index 85d2d4c6c9..0605514694 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/SortTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/SortTest.php
@@ -17,7 +17,7 @@ use Piwik\DataTable\Row;
* @group Core
* @group sort
*/
-class SortTest extends \PHPUnit_Framework_TestCase
+class SortTest extends \PHPUnit\Framework\TestCase
{
public function testNormalSortDescending()
diff --git a/tests/PHPUnit/Unit/DataTable/Filter/TruncateTest.php b/tests/PHPUnit/Unit/DataTable/Filter/TruncateTest.php
index d7701faee9..29104c71b6 100644
--- a/tests/PHPUnit/Unit/DataTable/Filter/TruncateTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Filter/TruncateTest.php
@@ -15,14 +15,14 @@ use Piwik\DataTable\Row;
/**
* @group DataTableTest
*/
-class DataTable_Filter_TruncateTest extends \PHPUnit_Framework_TestCase
+class DataTable_Filter_TruncateTest extends \PHPUnit\Framework\TestCase
{
public function testUnrelatedDataTableNotFiltered()
{
// remark: this unit test would become invalid and would need to be rewritten if
// Truncate filter stops calling getRowsCount() on the DataTable being filtered.
- $mockedDataTable = $this->getMock('\Piwik\DataTable', array('getRowsCount'));
+ $mockedDataTable = $this->createPartialMock('\Piwik\DataTable', array('getRowsCount'));
$mockedDataTable->expects($this->never())->method('getRowsCount');
$dataTableBeingFiltered = new DataTable();
@@ -46,7 +46,7 @@ class DataTable_Filter_TruncateTest extends \PHPUnit_Framework_TestCase
// remark: this unit test would become invalid and would need to be rewritten if
// Truncate filter stops calling getIdSubDataTable() on rows associated with a SubDataTable
- $rowBeingFiltered = $this->getMock('\Piwik\DataTable\Row', array('getIdSubDataTable'));
+ $rowBeingFiltered = $this->createPartialMock('\Piwik\DataTable\Row', array('getIdSubDataTable'));
$rowBeingFiltered->expects($this->never())->method('getIdSubDataTable');
$dataTableBeingFiltered->addRow($rowBeingFiltered);
diff --git a/tests/PHPUnit/Unit/DataTable/ManagerTest.php b/tests/PHPUnit/Unit/DataTable/ManagerTest.php
index dd48d98340..7c482a585d 100644
--- a/tests/PHPUnit/Unit/DataTable/ManagerTest.php
+++ b/tests/PHPUnit/Unit/DataTable/ManagerTest.php
@@ -12,14 +12,14 @@ use Piwik\DataTable\Row;
* @group ManagerTest
* @group Core
*/
-class ManagerTest extends \PHPUnit_Framework_TestCase
+class ManagerTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Manager
*/
private $manager;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->manager = new Manager();
@@ -30,12 +30,11 @@ class ManagerTest extends \PHPUnit_Framework_TestCase
return new DataTable();
}
- /**
- * @expectedException \Piwik\DataTable\TableNotFoundException
- * @expectedExceptionMessage table id 1 not found in memory
- */
public function test_getTable_shouldThrowException_IfTableIdDoesNotExist()
{
+ $this->expectException(\Piwik\DataTable\TableNotFoundException::class);
+ $this->expectExceptionMessage('table id 1 not found in memory');
+
$this->manager->getTable(1);
}
diff --git a/tests/PHPUnit/Unit/DataTable/MapTest.php b/tests/PHPUnit/Unit/DataTable/MapTest.php
index 3598b75f57..615c2a6c93 100644
--- a/tests/PHPUnit/Unit/DataTable/MapTest.php
+++ b/tests/PHPUnit/Unit/DataTable/MapTest.php
@@ -11,9 +11,9 @@ use Piwik\Tests\Framework\Mock\TestConfig;
/**
* @group DataTableTest
*/
-class Test_DataTable_Map extends \PHPUnit_Framework_TestCase
+class Test_DataTable_Map extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Manager::getInstance()->deleteAll();
diff --git a/tests/PHPUnit/Unit/DataTable/Renderer/CSVTest.php b/tests/PHPUnit/Unit/DataTable/Renderer/CSVTest.php
index f951cd6336..efadd0be40 100644
--- a/tests/PHPUnit/Unit/DataTable/Renderer/CSVTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Renderer/CSVTest.php
@@ -17,9 +17,9 @@ use Piwik\DataTable\Simple;
/**
* @group DataTableTest
*/
-class DataTable_Renderer_CSVTest extends \PHPUnit_Framework_TestCase
+class DataTable_Renderer_CSVTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Manager::getInstance()->deleteAll();
diff --git a/tests/PHPUnit/Unit/DataTable/Renderer/ConsoleTest.php b/tests/PHPUnit/Unit/DataTable/Renderer/ConsoleTest.php
index 486beca9f0..817e8b86df 100644
--- a/tests/PHPUnit/Unit/DataTable/Renderer/ConsoleTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Renderer/ConsoleTest.php
@@ -16,9 +16,9 @@ use Piwik\DataTable\Row;
/**
* @group DataTableTest
*/
-class DataTable_Renderer_ConsoleTest extends \PHPUnit_Framework_TestCase
+class DataTable_Renderer_ConsoleTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Manager::getInstance()->deleteAll();
diff --git a/tests/PHPUnit/Unit/DataTable/Renderer/JSONTest.php b/tests/PHPUnit/Unit/DataTable/Renderer/JSONTest.php
index 4e0eae5431..12df8d4daf 100644
--- a/tests/PHPUnit/Unit/DataTable/Renderer/JSONTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Renderer/JSONTest.php
@@ -17,9 +17,9 @@ use Piwik\DataTable\Simple;
/**
* @group DataTableTest
*/
-class DataTable_Renderer_JSONTest extends \PHPUnit_Framework_TestCase
+class DataTable_Renderer_JSONTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Manager::getInstance()->deleteAll();
diff --git a/tests/PHPUnit/Unit/DataTable/Renderer/PHPTest.php b/tests/PHPUnit/Unit/DataTable/Renderer/PHPTest.php
index 860f625d68..863a9b91e1 100644
--- a/tests/PHPUnit/Unit/DataTable/Renderer/PHPTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Renderer/PHPTest.php
@@ -17,9 +17,9 @@ use Piwik\DataTable\Simple;
/**
* @group DataTableTest
*/
-class DataTable_Renderer_PHPTest extends \PHPUnit_Framework_TestCase
+class DataTable_Renderer_PHPTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Manager::getInstance()->deleteAll();
diff --git a/tests/PHPUnit/Unit/DataTable/Renderer/XMLTest.php b/tests/PHPUnit/Unit/DataTable/Renderer/XMLTest.php
index 11a0524464..8670d05425 100644
--- a/tests/PHPUnit/Unit/DataTable/Renderer/XMLTest.php
+++ b/tests/PHPUnit/Unit/DataTable/Renderer/XMLTest.php
@@ -17,9 +17,9 @@ use Piwik\DataTable\Simple;
/**
* @group DataTableTest
*/
-class DataTable_Renderer_XMLTest extends \PHPUnit_Framework_TestCase
+class DataTable_Renderer_XMLTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
Manager::getInstance()->deleteAll();
diff --git a/tests/PHPUnit/Unit/DataTable/RowTest.php b/tests/PHPUnit/Unit/DataTable/RowTest.php
index 0a9afa0ba6..33445df8cf 100644
--- a/tests/PHPUnit/Unit/DataTable/RowTest.php
+++ b/tests/PHPUnit/Unit/DataTable/RowTest.php
@@ -14,14 +14,14 @@ use Piwik\DataTable\Row;
/**
* @group DataTableTest
*/
-class RowTest extends \PHPUnit_Framework_TestCase
+class RowTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Row
*/
private $row;
- public function setUp()
+ public function setUp(): void
{
$this->row = new Row();
}
@@ -421,12 +421,11 @@ class RowTest extends \PHPUnit_Framework_TestCase
$this->assertSame(array('my_array' => $arrayValue), $this->row->getMetadata());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Trying to sum unsupported operands for column mycol in row with label = row1: array + integer
- */
public function test_sumRow_throwsIfAddingUnsupportedTypes()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Trying to sum unsupported operands for column mycol in row with label = row1: array + integer');
+
$row1 = new Row();
$row1->addColumn('label', 'row1');
$row1->addColumn('mycol', ['a']);
diff --git a/tests/PHPUnit/Unit/DataTable/SimpleTest.php b/tests/PHPUnit/Unit/DataTable/SimpleTest.php
index 58d0159153..e95a1ee0e6 100644
--- a/tests/PHPUnit/Unit/DataTable/SimpleTest.php
+++ b/tests/PHPUnit/Unit/DataTable/SimpleTest.php
@@ -13,7 +13,7 @@ use Piwik\DataTable;
use Piwik\DataTable\Row;
use Piwik\DataTable\Simple;
-class SimpleTest extends \PHPUnit_Framework_TestCase
+class SimpleTest extends \PHPUnit\Framework\TestCase
{
public function test_serialize_includesAllRequiredData()
{
diff --git a/tests/PHPUnit/Unit/DataTableTest.php b/tests/PHPUnit/Unit/DataTableTest.php
index fbc1f5adee..fae8bee986 100644
--- a/tests/PHPUnit/Unit/DataTableTest.php
+++ b/tests/PHPUnit/Unit/DataTableTest.php
@@ -21,7 +21,7 @@ use Symfony\Component\VarDumper\Cloner\Data;
* @group DataTable
* @group Core
*/
-class DataTableTest extends \PHPUnit_Framework_TestCase
+class DataTableTest extends \PHPUnit\Framework\TestCase
{
public function testApplyFilter()
{
@@ -396,12 +396,11 @@ class DataTableTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(array(5, 145), $finalRow->getColumn('test_int'));
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Unknown operation 'foobarinvalid'
- */
public function testSumRow_ShouldThrowExceptionIfInvalidOperationIsGiven()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Unknown operation \'foobarinvalid\'');
+
$row1 = new Row(array(Row::COLUMNS => array('test_int' => 145)));
$finalRow = new Row(array(Row::COLUMNS => array('test_int' => 5)));
$finalRow->sumRow($row1, $copyMetadata = true, $operation = array('test_int' => 'fooBarInvalid'));
@@ -442,11 +441,11 @@ class DataTableTest extends \PHPUnit_Framework_TestCase
/**
* Test serialize with an infinite recursion (a row linked to a table in the parent hierarchy)
* After 100 recursion must throw an exception
- *
- * @expectedException \Exception
*/
public function testSerializeWithInfiniteRecursion()
{
+ $this->expectException(\Exception::class);
+
$table = new DataTable;
$table->addRowFromArray(array(Row::COLUMNS => array('visits' => 245, 'visitors' => 245),
Row::DATATABLE_ASSOCIATED => $table));
@@ -938,7 +937,7 @@ class DataTableTest extends \PHPUnit_Framework_TestCase
public function testUnrelatedDataTableNotDestructed()
{
- $mockedDataTable = $this->getMock('\Piwik\DataTable', array('__destruct'));
+ $mockedDataTable = $this->createPartialMock('\Piwik\DataTable', array('__destruct'));
$mockedDataTable->expects($this->never())->method('__destruct');
$rowBeingDestructed = new Row();
@@ -982,7 +981,9 @@ class DataTableTest extends \PHPUnit_Framework_TestCase
*/
public function testSubDataTableIsDestructed()
{
- $mockedDataTable = $this->getMock('\Piwik\DataTable', array('__destruct'));
+ $mockedDataTable = $this->getMockBuilder('\Piwik\DataTable')
+ ->onlyMethods(['__destruct'])
+ ->getMock();
$mockedDataTable->expects($this->once())->method('__destruct');
$rowBeingDestructed = new Row();
diff --git a/tests/PHPUnit/Unit/DateTest.php b/tests/PHPUnit/Unit/DateTest.php
index 5b1f59ec24..abd6f2653a 100644
--- a/tests/PHPUnit/Unit/DateTest.php
+++ b/tests/PHPUnit/Unit/DateTest.php
@@ -12,13 +12,13 @@ use Exception;
use Piwik\Container\StaticContainer;
use Piwik\Date;
use Piwik\SettingsServer;
-use Piwik\Translate;
+use Piwik\Tests\Framework\Fixture;
/**
*/
-class DateTest extends \PHPUnit_Framework_TestCase
+class DateTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -26,7 +26,7 @@ class DateTest extends \PHPUnit_Framework_TestCase
date_default_timezone_set('UTC');
}
- public function tearDown()
+ public function tearDown(): void
{
Date::$now = null;
date_default_timezone_set('UTC');
@@ -77,12 +77,8 @@ class DateTest extends \PHPUnit_Framework_TestCase
*/
public function testInvalidDateThrowsException()
{
- try {
- Date::factory('0001-01-01');
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+ Date::factory('0001-01-01');
}
public function getTimezoneOffsets()
@@ -404,14 +400,14 @@ class DateTest extends \PHPUnit_Framework_TestCase
*/
public function testGetLocalizedTimeFormats($language, $use12HourClock, $time, $shouldBe)
{
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language);
StaticContainer::get('Piwik\Intl\Data\Provider\DateTimeFormatProvider')->forceTimeFormat($use12HourClock);
$date = Date::factory($time);
$this->assertEquals($shouldBe, $date->getLocalized(Date::TIME_FORMAT));
- Translate::reset();
+ Fixture::resetTranslations();
}
/**
@@ -466,21 +462,19 @@ class DateTest extends \PHPUnit_Framework_TestCase
];
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Date::factoryInTimezone() should not be used with
- */
public function test_factoryInTimezone_doesNotWorkWithNormalDates()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Date::factoryInTimezone() should not be used with');
+
Date::factoryInTimezone('2012-02-03', 'America/Toronto');
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Date::factoryInTimezone() should not be used with
- */
public function test_factoryInTimezone_doesNotWorkWithTimestamps()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Date::factoryInTimezone() should not be used with');
+
Date::factoryInTimezone(time(), 'America/Toronto');
}
}
diff --git a/tests/PHPUnit/Unit/DbHelperTest.php b/tests/PHPUnit/Unit/DbHelperTest.php
index ddce87246d..b085335bf8 100644
--- a/tests/PHPUnit/Unit/DbHelperTest.php
+++ b/tests/PHPUnit/Unit/DbHelperTest.php
@@ -17,7 +17,7 @@ use Piwik\DbHelper;
* @group Core_Unit
* @group DbHelper
*/
-class DbHelperTest extends \PHPUnit_Framework_TestCase
+class DbHelperTest extends \PHPUnit\Framework\TestCase
{
/**
diff --git a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
index 3724ed5116..91669bb861 100644
--- a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
+++ b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
@@ -16,7 +16,7 @@ use ReflectionClass;
* @group DeprecatedMethodsTest
* @group Core
*/
-class DeprecatedMethodsTest extends \PHPUnit_Framework_TestCase
+class DeprecatedMethodsTest extends \PHPUnit\Framework\TestCase
{
public function test_deprecations()
{
@@ -82,10 +82,10 @@ class DeprecatedMethodsTest extends \PHPUnit_Framework_TestCase
$this->assertDeprecatedMethodIsRemovedInPiwik4('Piwik\Updates', 'getMigrationQueries');
$this->assertDeprecatedMethodIsRemovedInPiwik4('Piwik\Updater', 'executeMigrationQueries');
- // THIS IS A REMINDER FOR PIWIK 4: We need to rename getColumnType() to getDbColumnType() and $columnType to $dbColumnType
- $this->assertDeprecatedMethodIsRemovedInPiwik4('Piwik\Columns\Dimension', 'getType');
$this->assertDeprecatedMethodIsRemovedInPiwik4('Piwik\SettingsPiwik', 'isPiwikInstalled');
$this->assertDeprecatedMethodIsRemovedInPiwik4('Piwik\Piwik', 'doAsSuperUser');
+
+ $this->assertDeprecatedMethodIsRemovedInPiwikVersion('4.0.0-rc1', \Piwik\Plugins\Marketplace\tests\System\Api\ClientTest::class, 'skipTestUntilFirstRelease');
}
diff --git a/tests/PHPUnit/Unit/FactoryTest.php b/tests/PHPUnit/Unit/FactoryTest.php
index 7440079040..b19e8f4700 100644
--- a/tests/PHPUnit/Unit/FactoryTest.php
+++ b/tests/PHPUnit/Unit/FactoryTest.php
@@ -13,7 +13,7 @@ use Piwik\BaseFactory;
/**
* @group Core
*/
-class FactoryTest extends \PHPUnit_Framework_TestCase
+class FactoryTest extends \PHPUnit\Framework\TestCase
{
public function testCreatingExistingClassSucceeds()
{
@@ -23,12 +23,11 @@ class FactoryTest extends \PHPUnit_Framework_TestCase
$this->assertInstanceOf('Piwik\Timer', $instance);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Invalid class ID
- */
public function testCreatingInvalidClassThrows()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Invalid class ID');
+
BaseFactory::factory("This\\Class\\Does\\Not\\Exist");
}
}
diff --git a/tests/PHPUnit/Unit/FilesystemTest.php b/tests/PHPUnit/Unit/FilesystemTest.php
index bd77e6958d..a815ec551c 100644
--- a/tests/PHPUnit/Unit/FilesystemTest.php
+++ b/tests/PHPUnit/Unit/FilesystemTest.php
@@ -15,18 +15,18 @@ use Piwik\Tests\Framework\TestCase\SystemTestCase;
/**
* @group Core
*/
-class FilesystemTest extends \PHPUnit_Framework_TestCase
+class FilesystemTest extends \PHPUnit\Framework\TestCase
{
private $testPath;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->testPath = PIWIK_INCLUDE_PATH . '/tmp/filesystemtest';
Filesystem::mkdir($this->testPath);
}
- public function tearDown()
+ public function tearDown(): void
{
Filesystem::unlinkRecursive($this->testPath, true);
@@ -44,9 +44,7 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
$input = array('xyz/1.gif', 'x/xyz.gif', 'xxyyzzgg');
$result = Filesystem::sortFilesDescByPathLength($input);
- if (SystemTestCase::isPhp7orLater()) {
- $input = array('x/xyz.gif', 'xyz/1.gif', 'xxyyzzgg');
- }
+ $input = array('x/xyz.gif', 'xyz/1.gif', 'xxyyzzgg');
$this->assertEquals($input, $result);
}
@@ -175,6 +173,7 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
$target = $this->createEmptyTarget();
Filesystem::unlinkTargetFilesNotPresentInSource($source, $target);
+ $this->assertTrue(true);
}
public function test_unlinkTargetFilesNotPresentInSource_shouldUnlinkAllTargetFiles_IfSourceIsEmpty()
@@ -190,7 +189,7 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
// make sure there is no longer a difference
$result = Filesystem::directoryDiff($source, $target);
- $this->assertEquals(array(), $result);
+ $this->assertEquals([], $result);
$result = Filesystem::directoryDiff($target, $source);
$this->assertEquals(array(), $result);
@@ -350,12 +349,11 @@ class FilesystemTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(1, $size);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Invalid unit given
- */
public function test_getFileSize_ShouldThrowException_IfInvalidUnit()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Invalid unit given');
+
Filesystem::getFileSize(__FILE__, 'iV');
}
diff --git a/tests/PHPUnit/Unit/Http/RouterTest.php b/tests/PHPUnit/Unit/Http/RouterTest.php
index 45871b8e1c..cfbc89d24a 100644
--- a/tests/PHPUnit/Unit/Http/RouterTest.php
+++ b/tests/PHPUnit/Unit/Http/RouterTest.php
@@ -13,7 +13,7 @@ use Piwik\Http\Router;
/**
* @group Core
*/
-class RouterTest extends \PHPUnit_Framework_TestCase
+class RouterTest extends \PHPUnit\Framework\TestCase
{
/**
* @dataProvider urlProvider
diff --git a/tests/PHPUnit/Unit/IPTest.php b/tests/PHPUnit/Unit/IPTest.php
index bc422e21ea..9355741aef 100644
--- a/tests/PHPUnit/Unit/IPTest.php
+++ b/tests/PHPUnit/Unit/IPTest.php
@@ -16,7 +16,7 @@ use Piwik\IP;
/**
* @group Core
*/
-class IPTest extends \PHPUnit_Framework_TestCase
+class IPTest extends \PHPUnit\Framework\TestCase
{
/**
* Dataprovider for long2ip test
diff --git a/tests/PHPUnit/Unit/LegacyAutoLoaderTest.php b/tests/PHPUnit/Unit/LegacyAutoLoaderTest.php
new file mode 100644
index 0000000000..5387daff25
--- /dev/null
+++ b/tests/PHPUnit/Unit/LegacyAutoLoaderTest.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link https://matomo.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+namespace Piwik\Tests\Unit;
+
+/**
+ * @group Core
+ * @group LegacyAutoLoader
+ */
+class LegacyAutoLoaderTest extends \PHPUnit\Framework\TestCase
+{
+ public function testPackageClassWorks()
+ {
+ $class = new \Piwik\Ini\IniWriter();
+
+ $this->assertInstanceOf(\Matomo\Ini\IniWriter::class, $class);
+ }
+
+ public function testPackageClassStaticMethodWorks()
+ {
+ $ip = '123.13.12.123';
+
+ $binary = \Piwik\Network\IPUtils::stringToBinaryIP($ip);
+
+ $this->assertEquals($ip, \Matomo\Network\IPUtils::binaryToStringIP($binary));
+ }
+
+ public function testManuallyRequiredClassWorks()
+ {
+ require_once PIWIK_INCLUDE_PATH . '/tests/resources/MatomoDummyClass.php';
+
+ $class = new \Piwik\DummyClass();
+
+ $this->assertInstanceOf(\Matomo\DummyClass::class, $class);
+ }
+
+ public function testNotExistingMatomoClassStillFails()
+ {
+ $this->expectException(\Error::class);
+
+ $class = new \Matomo\ClassNotFound();
+ }
+
+ public function testNotExistingPiwikClassStillFails()
+ {
+ $this->expectException(\Error::class);
+
+ $class = new \Piwik\ClassNotFound();
+ }
+}
diff --git a/tests/PHPUnit/Unit/Mail/EmailStylesTest.php b/tests/PHPUnit/Unit/Mail/EmailStylesTest.php
index d7f6519450..5b79fc6e6b 100644
--- a/tests/PHPUnit/Unit/Mail/EmailStylesTest.php
+++ b/tests/PHPUnit/Unit/Mail/EmailStylesTest.php
@@ -12,7 +12,7 @@ namespace Piwik\Tests\Unit\Mail;
use Piwik\Mail\EmailStyles;
-class EmailStylesTest extends \PHPUnit_Framework_TestCase
+class EmailStylesTest extends \PHPUnit\Framework\TestCase
{
/**
* @dataProvider getTestDataForRgbToHex
diff --git a/tests/PHPUnit/Unit/Metrics/Formatter/HtmlTest.php b/tests/PHPUnit/Unit/Metrics/Formatter/HtmlTest.php
index 9543e2f493..656200e030 100644
--- a/tests/PHPUnit/Unit/Metrics/Formatter/HtmlTest.php
+++ b/tests/PHPUnit/Unit/Metrics/Formatter/HtmlTest.php
@@ -9,14 +9,13 @@ namespace Piwik\Tests\Unit\Metrics\Formatter;
use Piwik\Container\StaticContainer;
use Piwik\Metrics\Formatter\Html;
-use Piwik\NumberFormatter;
-use Piwik\Translate;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Plugins\SitesManager\API as SitesManagerAPI;
/**
* @group Core
*/
-class HtmlTest extends \PHPUnit_Framework_TestCase
+class HtmlTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Html
@@ -25,7 +24,7 @@ class HtmlTest extends \PHPUnit_Framework_TestCase
private $sitesInfo;
- public function setUp()
+ public function setUp(): void
{
$this->sitesInfo = array(
1 => array(
@@ -36,13 +35,13 @@ class HtmlTest extends \PHPUnit_Framework_TestCase
$this->formatter = new Html();
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$this->setSiteManagerApiMock();
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::reset();
+ Fixture::resetTranslations();
$this->unsetSiteManagerApiMock();
}
@@ -97,7 +96,7 @@ class HtmlTest extends \PHPUnit_Framework_TestCase
{
$sitesInfo = $this->sitesInfo;
- $mock = $this->getMock('stdClass', array('getSiteFromId'));
+ $mock = $this->getMockBuilder('stdClass')->addMethods(['getSiteFromId'])->getMock();
$mock->expects($this->any())->method('getSiteFromId')->willReturnCallback(function ($idSite) use ($sitesInfo) {
return $sitesInfo[$idSite];
});
diff --git a/tests/PHPUnit/Unit/Metrics/FormatterTest.php b/tests/PHPUnit/Unit/Metrics/FormatterTest.php
index 78240b85ff..2e62fbc9d1 100644
--- a/tests/PHPUnit/Unit/Metrics/FormatterTest.php
+++ b/tests/PHPUnit/Unit/Metrics/FormatterTest.php
@@ -10,13 +10,13 @@ namespace Piwik\Tests\Unit\Metrics;
use Piwik\Container\StaticContainer;
use Piwik\Metrics\Formatter;
use Piwik\NumberFormatter;
-use Piwik\Translate;
+use Piwik\Tests\Framework\Fixture;
use Piwik\Plugins\SitesManager\API as SitesManagerAPI;
/**
* @group Core
*/
-class FormatterTest extends \PHPUnit_Framework_TestCase
+class FormatterTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Formatter
@@ -25,7 +25,7 @@ class FormatterTest extends \PHPUnit_Framework_TestCase
private $sitesInfo;
- public function setUp()
+ public function setUp(): void
{
$this->sitesInfo = array(
1 => array(
@@ -52,13 +52,13 @@ class FormatterTest extends \PHPUnit_Framework_TestCase
$this->formatter = new Formatter();
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
$this->setSiteManagerApiMock();
}
- public function tearDown()
+ public function tearDown(): void
{
- Translate::reset();
+ Fixture::resetTranslations();
NumberFormatter::getInstance()->clearCache();
$this->unsetSiteManagerApiMock();
}
@@ -225,7 +225,7 @@ class FormatterTest extends \PHPUnit_Framework_TestCase
{
$sitesInfo = $this->sitesInfo;
- $mock = $this->getMock('stdClass', array('getSiteFromId'));
+ $mock = $this->getMockBuilder('stdClass')->addMethods(['getSiteFromId'])->getMock();
$mock->expects($this->any())->method('getSiteFromId')->willReturnCallback(function ($idSite) use ($sitesInfo) {
return $sitesInfo[$idSite];
});
diff --git a/tests/PHPUnit/Unit/Metrics/SorterTest.php b/tests/PHPUnit/Unit/Metrics/SorterTest.php
index 9c1b3540f6..8006fb9576 100644
--- a/tests/PHPUnit/Unit/Metrics/SorterTest.php
+++ b/tests/PHPUnit/Unit/Metrics/SorterTest.php
@@ -30,7 +30,7 @@ class SorterTest extends UnitTestCase
*/
private $config;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Unit/NonceTest.php b/tests/PHPUnit/Unit/NonceTest.php
index 48393482ed..d4ebec3c33 100644
--- a/tests/PHPUnit/Unit/NonceTest.php
+++ b/tests/PHPUnit/Unit/NonceTest.php
@@ -14,7 +14,7 @@ use Piwik\Nonce;
/**
* @backupGlobals enabled
*/
-class NonceTest extends \PHPUnit_Framework_TestCase
+class NonceTest extends \PHPUnit\Framework\TestCase
{
/**
* Dataprovider for acceptable origins test
diff --git a/tests/PHPUnit/Unit/Period/BasePeriodTest.php b/tests/PHPUnit/Unit/Period/BasePeriodTest.php
index b10c541c99..f90473aaab 100644
--- a/tests/PHPUnit/Unit/Period/BasePeriodTest.php
+++ b/tests/PHPUnit/Unit/Period/BasePeriodTest.php
@@ -8,21 +8,21 @@
namespace Piwik\Tests\Unit\Period;
-use Piwik\Translate;
+use Piwik\Tests\Framework\Fixture;
-abstract class BasePeriodTest extends \PHPUnit_Framework_TestCase
+abstract class BasePeriodTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
- Translate::loadAllTranslations();
+ Fixture::loadAllTranslations();
}
- public function tearDown()
+ public function tearDown(): void
{
parent::tearDown();
- Translate::reset();
+ Fixture::resetTranslations();
}
} \ No newline at end of file
diff --git a/tests/PHPUnit/Unit/Period/DayTest.php b/tests/PHPUnit/Unit/Period/DayTest.php
index cf4d4ff59d..0cc544398b 100644
--- a/tests/PHPUnit/Unit/Period/DayTest.php
+++ b/tests/PHPUnit/Unit/Period/DayTest.php
@@ -19,14 +19,9 @@ class DayTest extends BasePeriodTest
*/
public function testInvalidDate()
{
- try {
- new Day('Invalid Date');
- } catch (\Exception $e) {
- return;
- } catch (\Throwable $e) {
- return;
- }
- $this->fail('Expected Exception not raised');
+ $this->expectException(\TypeError::class);
+
+ new Day('Invalid Date');
}
/**
@@ -200,16 +195,12 @@ class DayTest extends BasePeriodTest
*/
public function testAddSubperiodFails()
{
+ $this->expectException(\Exception::class);
+
// create the period
$period = new Day(Date::factory("2007-12-31"));
- try {
- $period->addSubperiod('');
- } catch (\Exception $e) {
- return;
- }
- // expected string
- $this->fail('Exception not raised');
+ $period->addSubperiod('');
}
public function getLocalizedShortStrings()
diff --git a/tests/PHPUnit/Unit/Period/RangeTest.php b/tests/PHPUnit/Unit/Period/RangeTest.php
index 5ad22916fa..b90f6618c3 100644
--- a/tests/PHPUnit/Unit/Period/RangeTest.php
+++ b/tests/PHPUnit/Unit/Period/RangeTest.php
@@ -21,6 +21,35 @@ use Piwik\Period\Year;
*/
class RangeTest extends BasePeriodTest
{
+ /**
+ * @dataProvider getDateXPeriodsAgoProvider
+ */
+ public function testGetDateXPeriodsAgo($expected, $subXPeriods, $date, $period)
+ {
+ $result = Range::getDateXPeriodsAgo($subXPeriods, $date, $period);
+ $day = [$expected,$expected];
+ if ($period === 'range') {
+ $day = [$expected, false];
+ }
+ $this->assertEquals($day, $result);
+ }
+
+ public function getDateXPeriodsAgoProvider()
+ {
+ return [
+ ['2019-05-14', '1', '2019-05-15', 'day'],
+ ['2018-05-15', '1', '2019-05-15', 'year'],
+ ['2019-05-08', '1', '2019-05-15', 'week'],
+ ['2019-04-15', '1', '2019-05-15', 'month'],
+ ['2019-02-15', '3', '2019-05-15', 'month'],
+ ['2018-05-15', '365', '2019-05-15', 'day'],
+ ['2018-05-15', '1', '2019-05-15', 'year'],
+ ['2017-05-15', '2', '2019-05-15', 'year'],
+ ['2019-06-04,2019-06-09', '1', '2019-06-10,2019-06-15', 'range'],
+ ['2019-06-10,2019-06-12', '1', '2019-06-13,2019-06-15', 'range'],
+ ];
+ }
+
// test range 1
public function testRangeToday()
{
@@ -1136,16 +1165,13 @@ class RangeTest extends BasePeriodTest
public function testCustomRangeBeforeIsAfterYearRight()
{
- try {
- $range = new Range('range', '2007-02-09,2007-02-01');
- $this->assertEquals(0, $range->getNumberOfSubperiods());
- $this->assertEquals(array(), $range->toString());
-
- $range->getPrettyString();
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $range = new Range('range', '2007-02-09,2007-02-01');
+ $this->assertEquals(0, $range->getNumberOfSubperiods());
+ $this->assertEquals(array(), $range->toString());
+
+ $range->getPrettyString();
}
public function testCustomRangeLastN()
@@ -1189,13 +1215,10 @@ class RangeTest extends BasePeriodTest
public function testInvalidRangeThrows()
{
- try {
- $range = new Range('range', '0001-01-01,today');
- $range->getLocalizedLongString();
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $range = new Range('range', '0001-01-01,today');
+ $range->getLocalizedLongString();
}
public function testGetLocalizedShortString()
diff --git a/tests/PHPUnit/Unit/PeriodTest.php b/tests/PHPUnit/Unit/PeriodTest.php
index bacee84d61..6e4f16f7b2 100644
--- a/tests/PHPUnit/Unit/PeriodTest.php
+++ b/tests/PHPUnit/Unit/PeriodTest.php
@@ -19,7 +19,7 @@ use Piwik\Translation\Translator;
/**
* @group Core
*/
-class PeriodTest extends \PHPUnit_Framework_TestCase
+class PeriodTest extends \PHPUnit\Framework\TestCase
{
public function testGetId()
{
@@ -37,19 +37,19 @@ class PeriodTest extends \PHPUnit_Framework_TestCase
{
$period = new Day(Date::today());
$label = $period->getLabel();
- $this->assertInternalType('string', $label);
+ self::assertIsString($label);
$this->assertNotEmpty($label);
$period = new Week(Date::today());
$label = $period->getLabel();
- $this->assertInternalType('string', $label);
+ self::assertIsString($label);
$this->assertNotEmpty($label);
$period = new Month(Date::today());
$label = $period->getLabel();
- $this->assertInternalType('string', $label);
+ self::assertIsString($label);
$this->assertNotEmpty($label);
$period = new Year(Date::today());
$label = $period->getLabel();
- $this->assertInternalType('string', $label);
+ self::assertIsString($label);
$this->assertNotEmpty($label);
}
@@ -65,15 +65,18 @@ class PeriodTest extends \PHPUnit_Framework_TestCase
Period::checkDateFormat('previous30');
Period::checkDateFormat('+1 day');
Period::checkDateFormat('next Thursday');
+
+ $this->assertTrue(true);
}
/**
- * @expectedException \Exception
- * @expectedExceptionMessage Date format must be: YYYY-MM-DD, or 'today' or 'yesterday' or any keyword supported by the strtotime function (see http://php.net/strtotime for more information):
* @dataProvider getInvalidDateFormats
*/
public function testValidate_InvalidDates($invalidDateFormat)
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Date format must be: YYYY-MM-DD, or \'today\' or \'yesterday\' or any keyword supported by the strtotime function (see http://php.net/strtotime for more information):');
+
Period::checkDateFormat($invalidDateFormat);
}
@@ -148,12 +151,13 @@ class PeriodTest extends \PHPUnit_Framework_TestCase
}
/**
- * @expectedException \Exception
- * @expectedExceptionMessage is a date before first website was online. Try date that's after
* @dataProvider getInvalidDatesBeforeFirstWebsite
*/
public function testValidate_InvalidDatesBeforeFirstWebsite($invalidDatesBeforeFirstWebsite)
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('is a date before first website was online. Try date that\'s after');
+
Period::checkDateFormat($invalidDatesBeforeFirstWebsite);
}
diff --git a/tests/PHPUnit/Unit/Plugin/ComponentFactoryTest.php b/tests/PHPUnit/Unit/Plugin/ComponentFactoryTest.php
index 57f0718c6c..628155c18a 100644
--- a/tests/PHPUnit/Unit/Plugin/ComponentFactoryTest.php
+++ b/tests/PHPUnit/Unit/Plugin/ComponentFactoryTest.php
@@ -7,21 +7,20 @@
*/
namespace Piwik\Tests\Core\Plugin;
-use PHPUnit_Framework_TestCase;
+use PHPUnit\Framework\TestCase;
use Piwik\Config;
use Piwik\Plugin\ComponentFactory;
use Piwik\Plugin\Manager as PluginManager;
use Piwik\Plugin\Report;
-use Piwik\Tests\Framework\Mock\TestConfig;
/**
* @group Core
*/
-class ComponentFactoryTest extends PHPUnit_Framework_TestCase
+class ComponentFactoryTest extends TestCase
{
const REPORT_CLASS_NAME = 'Piwik\\Plugin\\Report';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Unit/RankingQueryTest.php b/tests/PHPUnit/Unit/RankingQueryTest.php
index 5f62ddb19b..b47c2fa7bf 100644
--- a/tests/PHPUnit/Unit/RankingQueryTest.php
+++ b/tests/PHPUnit/Unit/RankingQueryTest.php
@@ -10,7 +10,7 @@ namespace Piwik\Tests\Unit;
use Piwik\RankingQuery;
-class RankingQueryTest extends \PHPUnit_Framework_TestCase
+class RankingQueryTest extends \PHPUnit\Framework\TestCase
{
/**
* @group Core
diff --git a/tests/PHPUnit/Unit/Report/ReportWidgetConfigTest.php b/tests/PHPUnit/Unit/Report/ReportWidgetConfigTest.php
index fae97efb37..d301beea72 100644
--- a/tests/PHPUnit/Unit/Report/ReportWidgetConfigTest.php
+++ b/tests/PHPUnit/Unit/Report/ReportWidgetConfigTest.php
@@ -16,14 +16,14 @@ use Piwik\Report\ReportWidgetConfig;
* @group ReportWidgetConfig
* @group ReportWidgetConfigTest
*/
-class ReportWidgetConfigTest extends \PHPUnit_Framework_TestCase
+class ReportWidgetConfigTest extends \PHPUnit\Framework\TestCase
{
/**
* @var ReportWidgetConfig
*/
private $config;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->config = new ReportWidgetConfig();
@@ -216,13 +216,14 @@ class ReportWidgetConfigTest extends \PHPUnit_Framework_TestCase
{
$this->config->enable();
$this->config->checkIsEnabled();
+
+ $this->assertTrue(true);
}
- /**
- * @expectedException \Exception
- */
public function test_checkIsEnabled_shouldThrowException_IfDisabled()
{
+ $this->expectException(\Exception::class);
+
$this->config->disable();
$this->config->checkIsEnabled();
}
diff --git a/tests/PHPUnit/Unit/Report/ReportWidgetFactoryTest.php b/tests/PHPUnit/Unit/Report/ReportWidgetFactoryTest.php
index cb997f0e52..339f66e696 100644
--- a/tests/PHPUnit/Unit/Report/ReportWidgetFactoryTest.php
+++ b/tests/PHPUnit/Unit/Report/ReportWidgetFactoryTest.php
@@ -42,14 +42,14 @@ class GetBasicReport extends Report
* @group ReportWidgetFactory
* @group ReportWidgetFactoryTest
*/
-class ReportWidgetFactoryTest extends \PHPUnit_Framework_TestCase
+class ReportWidgetFactoryTest extends \PHPUnit\Framework\TestCase
{
/**
* @var ReportWidgetFactory
*/
private $factory;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/PHPUnit/Unit/Scheduler/Schedule/DailyTest.php b/tests/PHPUnit/Unit/Scheduler/Schedule/DailyTest.php
index cbea2fe0ad..7af354eb45 100644
--- a/tests/PHPUnit/Unit/Scheduler/Schedule/DailyTest.php
+++ b/tests/PHPUnit/Unit/Scheduler/Schedule/DailyTest.php
@@ -15,7 +15,7 @@ use Piwik\Scheduler\Schedule\Schedule;
/**
* @group Scheduler
*/
-class DailyTest extends \PHPUnit_Framework_TestCase
+class DailyTest extends \PHPUnit\Framework\TestCase
{
private static $_JANUARY_01_1971_09_00_00;
private static $_JANUARY_01_1971_09_10_00;
@@ -23,7 +23,7 @@ class DailyTest extends \PHPUnit_Framework_TestCase
private static $_JANUARY_02_1971_00_00_00;
private static $_JANUARY_02_1971_09_00_00;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
self::$_JANUARY_01_1971_09_00_00 = mktime(9, 00, 00, 1, 1, 1971);
@@ -38,14 +38,10 @@ class DailyTest extends \PHPUnit_Framework_TestCase
*/
public function testSetHourScheduledTimeDailyNegative()
{
- try {
- $dailySchedule = Schedule::factory('daily');
- $dailySchedule->setHour(-1);
-
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $dailySchedule = Schedule::factory('daily');
+ $dailySchedule->setHour(-1);
}
/**
@@ -53,13 +49,10 @@ class DailyTest extends \PHPUnit_Framework_TestCase
*/
public function testSetHourScheduledTimeDailyOver24()
{
- try {
- $dailySchedule = Schedule::factory('daily');
- $dailySchedule->setHour(25);
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $dailySchedule = Schedule::factory('daily');
+ $dailySchedule->setHour(25);
}
/**
@@ -67,13 +60,10 @@ class DailyTest extends \PHPUnit_Framework_TestCase
*/
public function testSetDayScheduledTimeDaily()
{
- try {
- $dailySchedule = Schedule::factory('daily');
- $dailySchedule->setDay(1);
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $dailySchedule = Schedule::factory('daily');
+ $dailySchedule->setDay(1);
}
/**
@@ -167,7 +157,7 @@ class DailyTest extends \PHPUnit_Framework_TestCase
*/
private function getDailyMock($currentTime)
{
- $mock = $this->getMock('Piwik\Scheduler\Schedule\Daily', array('getTime'));
+ $mock = $this->createPartialMock('Piwik\Scheduler\Schedule\Daily', array('getTime'));
$mock->expects($this->any())
->method('getTime')
->will($this->returnValue($currentTime));
diff --git a/tests/PHPUnit/Unit/Scheduler/Schedule/HourlyTest.php b/tests/PHPUnit/Unit/Scheduler/Schedule/HourlyTest.php
index 9929e42fa2..dfaf39da64 100644
--- a/tests/PHPUnit/Unit/Scheduler/Schedule/HourlyTest.php
+++ b/tests/PHPUnit/Unit/Scheduler/Schedule/HourlyTest.php
@@ -14,13 +14,13 @@ use Piwik\Scheduler\Schedule\Hourly;
/**
* @group Scheduler
*/
-class HourlyTest extends \PHPUnit_Framework_TestCase
+class HourlyTest extends \PHPUnit\Framework\TestCase
{
private static $_JANUARY_01_1971_09_00_00;
private static $_JANUARY_01_1971_09_10_00;
private static $_JANUARY_01_1971_10_00_00;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
self::$_JANUARY_01_1971_09_00_00 = mktime(9, 00, 00, 1, 1, 1971);
@@ -34,13 +34,10 @@ class HourlyTest extends \PHPUnit_Framework_TestCase
*/
public function testSetHourScheduledTimeHourly()
{
- try {
- $hourlySchedule = new Hourly();
- $hourlySchedule->setHour(0);
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $hourlySchedule = new Hourly();
+ $hourlySchedule->setHour(0);
}
/**
@@ -49,13 +46,10 @@ class HourlyTest extends \PHPUnit_Framework_TestCase
*/
public function testSetDayScheduledTimeHourly()
{
- try {
- $hourlySchedule = new Hourly();
- $hourlySchedule->setDay(1);
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $hourlySchedule = new Hourly();
+ $hourlySchedule->setDay(1);
}
/**
@@ -73,7 +67,7 @@ class HourlyTest extends \PHPUnit_Framework_TestCase
* Expected :
* getRescheduledTime returns Friday January 1 1971 10:00:00 GMT
*/
- $mock = $this->getMock('Piwik\Scheduler\Schedule\Hourly', array('getTime'));
+ $mock = $this->createPartialMock('Piwik\Scheduler\Schedule\Hourly', array('getTime'));
$mock->expects($this->any())
->method('getTime')
->will($this->returnValue(self::$_JANUARY_01_1971_09_00_00));
@@ -88,7 +82,7 @@ class HourlyTest extends \PHPUnit_Framework_TestCase
* Expected :
* getRescheduledTime returns Friday January 1 1971 10:00:00 GMT
*/
- $mock = $this->getMock('Piwik\Scheduler\Schedule\Hourly', array('getTime'));
+ $mock = $this->createPartialMock('Piwik\Scheduler\Schedule\Hourly', array('getTime'));
$mock->expects($this->any())
->method('getTime')
->will($this->returnValue(self::$_JANUARY_01_1971_09_10_00));
diff --git a/tests/PHPUnit/Unit/Scheduler/Schedule/MonthlyTest.php b/tests/PHPUnit/Unit/Scheduler/Schedule/MonthlyTest.php
index 85918d51ad..cd90ebb002 100644
--- a/tests/PHPUnit/Unit/Scheduler/Schedule/MonthlyTest.php
+++ b/tests/PHPUnit/Unit/Scheduler/Schedule/MonthlyTest.php
@@ -13,7 +13,7 @@ use Piwik\Scheduler\Schedule\Monthly;
/**
* @group Scheduler
*/
-class MonthlyTest extends \PHPUnit_Framework_TestCase
+class MonthlyTest extends \PHPUnit\Framework\TestCase
{
public static $_JANUARY_01_1971_09_00_00; // initialized below class definition
public static $_JANUARY_02_1971_09_00_00;
@@ -25,47 +25,51 @@ class MonthlyTest extends \PHPUnit_Framework_TestCase
public static $_FEBRUARY_21_1971_09_00_00;
public static $_FEBRUARY_28_1971_00_00_00;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
}
/**
* Tests invalid call to setHour on Monthly
- * @expectedException \Exception
*/
public function testSetHourScheduledTimeMonthlyNegative()
{
+ $this->expectException(\Exception::class);
+
$monthlySchedule = new Monthly();
$monthlySchedule->setHour(-1);
}
/**
* Tests invalid call to setHour on Monthly
- * @expectedException \Exception
*/
public function testSetHourScheduledTimMonthlyOver24()
{
+ $this->expectException(\Exception::class);
+
$monthlySchedule = new Monthly();
$monthlySchedule->setHour(25);
}
/**
* Tests invalid call to setDay on Monthly
- * @expectedException \Exception
*/
public function testSetDayScheduledTimeMonthlyDay0()
{
+ $this->expectException(\Exception::class);
+
$monthlySchedule = new Monthly();
$monthlySchedule->setDay(0);
}
/**
* Tests invalid call to setDay on Monthly
- * @expectedException \Exception
*/
public function testSetDayScheduledTimeMonthlyOver31()
{
+ $this->expectException(\Exception::class);
+
$monthlySchedule = new Monthly();
$monthlySchedule->setDay(32);
}
@@ -239,10 +243,11 @@ class MonthlyTest extends \PHPUnit_Framework_TestCase
* _Monthly
*
* @dataProvider getInvalidDayOfWeekData
- * @expectedException \Exception
*/
public function testMonthlyDayOfWeekInvalid($day, $week)
{
+ $this->expectException(\Exception::class);
+
$mock = $this->getMonthlyMock(self::$_JANUARY_15_1971_09_00_00);
$mock->setDayOfWeek($day, $week);
}
@@ -271,7 +276,7 @@ class MonthlyTest extends \PHPUnit_Framework_TestCase
*/
private function getMonthlyMock($currentTime)
{
- $mock = $this->getMock('Piwik\Scheduler\Schedule\Monthly', array('getTime'));
+ $mock = $this->createPartialMock('Piwik\Scheduler\Schedule\Monthly', array('getTime'));
$mock->expects($this->any())
->method('getTime')
->will($this->returnValue($currentTime));
diff --git a/tests/PHPUnit/Unit/Scheduler/Schedule/WeeklyTest.php b/tests/PHPUnit/Unit/Scheduler/Schedule/WeeklyTest.php
index a194200375..41f418fb51 100644
--- a/tests/PHPUnit/Unit/Scheduler/Schedule/WeeklyTest.php
+++ b/tests/PHPUnit/Unit/Scheduler/Schedule/WeeklyTest.php
@@ -14,7 +14,7 @@ use Piwik\Scheduler\Schedule\Weekly;
/**
* @group Scheduler
*/
-class WeeklyTest extends \PHPUnit_Framework_TestCase
+class WeeklyTest extends \PHPUnit\Framework\TestCase
{
public static $_JANUARY_01_1971_09_10_00; // initialized below class declaration
public static $_JANUARY_04_1971_00_00_00;
@@ -24,7 +24,7 @@ class WeeklyTest extends \PHPUnit_Framework_TestCase
public static $_JANUARY_15_1971_00_00_00;
public static $_JANUARY_08_1971_00_00_00;
- public static function setUpBeforeClass()
+ public static function setUpBeforeClass(): void
{
parent::setUpBeforeClass();
}
@@ -34,13 +34,10 @@ class WeeklyTest extends \PHPUnit_Framework_TestCase
*/
public function testSetHourScheduledTimeWeeklyNegative()
{
- try {
- $weeklySchedule = new Weekly();
- $weeklySchedule->setHour(-1);
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $weeklySchedule = new Weekly();
+ $weeklySchedule->setHour(-1);
}
/**
@@ -48,13 +45,10 @@ class WeeklyTest extends \PHPUnit_Framework_TestCase
*/
public function testSetHourScheduledTimeWeeklyOver24()
{
- try {
- $weeklySchedule = new Weekly();
- $weeklySchedule->setHour(25);
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $weeklySchedule = new Weekly();
+ $weeklySchedule->setHour(25);
}
/**
@@ -62,13 +56,10 @@ class WeeklyTest extends \PHPUnit_Framework_TestCase
*/
public function testSetDayScheduledTimeWeeklyDay0()
{
- try {
- $weeklySchedule = new Weekly();
- $weeklySchedule->setDay(0);
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $weeklySchedule = new Weekly();
+ $weeklySchedule->setDay(0);
}
/**
@@ -76,13 +67,10 @@ class WeeklyTest extends \PHPUnit_Framework_TestCase
*/
public function testSetDayScheduledTimeWeeklyOver7()
{
- try {
- $weeklySchedule = new Weekly();
- $weeklySchedule->setDay(8);
- } catch (Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised');
+ $this->expectException(Exception::class);
+
+ $weeklySchedule = new Weekly();
+ $weeklySchedule->setDay(8);
}
/**
@@ -182,7 +170,7 @@ class WeeklyTest extends \PHPUnit_Framework_TestCase
*/
private function getWeeklyMock($currentTime)
{
- $mock = $this->getMock('Piwik\Scheduler\Schedule\Weekly', array('getTime'));
+ $mock = $this->createPartialMock('Piwik\Scheduler\Schedule\Weekly', array('getTime'));
$mock->expects($this->any())
->method('getTime')
->will($this->returnValue($currentTime));
diff --git a/tests/PHPUnit/Unit/Scheduler/SchedulerTest.php b/tests/PHPUnit/Unit/Scheduler/SchedulerTest.php
index c9e0e2b922..76ebe1b37f 100644
--- a/tests/PHPUnit/Unit/Scheduler/SchedulerTest.php
+++ b/tests/PHPUnit/Unit/Scheduler/SchedulerTest.php
@@ -20,7 +20,7 @@ use ReflectionProperty;
/**
* @group Scheduler
*/
-class SchedulerTest extends \PHPUnit_Framework_TestCase
+class SchedulerTest extends \PHPUnit\Framework\TestCase
{
private static function getTestTimetable()
{
@@ -51,7 +51,7 @@ class SchedulerTest extends \PHPUnit_Framework_TestCase
{
self::stubPiwikOption($timetable);
- $taskLoader = $this->getMock('Piwik\Scheduler\TaskLoader');
+ $taskLoader = $this->createMock('Piwik\Scheduler\TaskLoader');
$scheduler = new Scheduler($taskLoader, new NullLogger());
$this->assertEquals($expectedTime, $scheduler->getScheduledTimeForMethod($className, $methodName, $methodParameter));
@@ -84,7 +84,7 @@ class SchedulerTest extends \PHPUnit_Framework_TestCase
{
$now = time();
- $dailySchedule = $this->getMock('Piwik\Scheduler\Schedule\Daily', array('getTime'));
+ $dailySchedule = $this->createPartialMock('Piwik\Scheduler\Schedule\Daily', array('getTime'));
$dailySchedule->expects($this->any())
->method('getTime')
->will($this->returnValue($now));
@@ -171,7 +171,7 @@ class SchedulerTest extends \PHPUnit_Framework_TestCase
*/
public function testRun($expectedTimetable, $expectedExecutedTasks, $timetableBeforeTaskExecution, $configuredTasks)
{
- $taskLoader = $this->getMock('Piwik\Scheduler\TaskLoader');
+ $taskLoader = $this->createMock('Piwik\Scheduler\TaskLoader');
$taskLoader->expects($this->atLeastOnce())
->method('loadTasks')
->willReturn($configuredTasks);
@@ -204,7 +204,7 @@ class SchedulerTest extends \PHPUnit_Framework_TestCase
*/
public function testRunTaskNow($expectedTimetable, $expectedExecutedTasks, $timetableBeforeTaskExecution, $configuredTasks)
{
- $taskLoader = $this->getMock('Piwik\Scheduler\TaskLoader');
+ $taskLoader = $this->createMock('Piwik\Scheduler\TaskLoader');
$taskLoader->expects($this->atLeastOnce())
->method('loadTasks')
->willReturn($configuredTasks);
diff --git a/tests/PHPUnit/Unit/Scheduler/TaskTest.php b/tests/PHPUnit/Unit/Scheduler/TaskTest.php
index 0f7a187266..4dc2d7464f 100644
--- a/tests/PHPUnit/Unit/Scheduler/TaskTest.php
+++ b/tests/PHPUnit/Unit/Scheduler/TaskTest.php
@@ -14,7 +14,7 @@ use Piwik\Scheduler\Task;
/**
* @group Scheduler
*/
-class TaskTest extends \PHPUnit_Framework_TestCase
+class TaskTest extends \PHPUnit\Framework\TestCase
{
public function testGetClassName()
{
diff --git a/tests/PHPUnit/Unit/Scheduler/TimetableTest.php b/tests/PHPUnit/Unit/Scheduler/TimetableTest.php
index 7ed937460c..63b769a0ea 100644
--- a/tests/PHPUnit/Unit/Scheduler/TimetableTest.php
+++ b/tests/PHPUnit/Unit/Scheduler/TimetableTest.php
@@ -18,14 +18,14 @@ use ReflectionProperty;
/**
* @group Scheduler
*/
-class TimetableTest extends \PHPUnit_Framework_TestCase
+class TimetableTest extends \PHPUnit\Framework\TestCase
{
private $timetable = array(
'CoreAdminHome.purgeOutdatedArchives' => 1355529607,
'PrivacyManager.deleteReportData_1' => 1322229607,
);
- public function tearDown()
+ public function tearDown(): void
{
self::resetPiwikOption();
}
diff --git a/tests/PHPUnit/Unit/Segment/SegmentExpressionTest.php b/tests/PHPUnit/Unit/Segment/SegmentExpressionTest.php
index 3d7f5fa2c7..3003f56716 100644
--- a/tests/PHPUnit/Unit/Segment/SegmentExpressionTest.php
+++ b/tests/PHPUnit/Unit/Segment/SegmentExpressionTest.php
@@ -14,7 +14,7 @@ use Piwik\Segment\SegmentExpression;
* @group SegmentExpressionTest
* @group Segment
*/
-class SegmentExpressionTest extends \PHPUnit_Framework_TestCase
+class SegmentExpressionTest extends \PHPUnit\Framework\TestCase
{
/**
* Dataprovider for testSegmentSqlSimpleNoOperation
@@ -136,14 +136,11 @@ class SegmentExpressionTest extends \PHPUnit_Framework_TestCase
*/
public function testBogusFiltersExpectExceptionThrown($bogus)
{
- try {
- $segment = new SegmentExpression($bogus);
- $segment->parseSubExpressions();
- $segment->getSql();
- } catch (\Exception $e) {
- return;
- }
- $this->fail('Expected exception not raised for:' . var_export($segment->getSql(), true));
+ $this->expectException(\Exception::class);
+
+ $segment = new SegmentExpression($bogus);
+ $segment->parseSubExpressions();
+ $segment->getSql();
}
/**
diff --git a/tests/PHPUnit/Unit/Session/SessionFingerprintTest.php b/tests/PHPUnit/Unit/Session/SessionFingerprintTest.php
index bcaae8c7f2..62c50bd062 100644
--- a/tests/PHPUnit/Unit/Session/SessionFingerprintTest.php
+++ b/tests/PHPUnit/Unit/Session/SessionFingerprintTest.php
@@ -13,7 +13,7 @@ namespace Piwik\Tests\Unit\Session;
use Piwik\Date;
use Piwik\Session\SessionFingerprint;
-class SessionFingerprintTest extends \PHPUnit_Framework_TestCase
+class SessionFingerprintTest extends \PHPUnit\Framework\TestCase
{
const TEST_TIME_VALUE = 4567;
@@ -22,14 +22,14 @@ class SessionFingerprintTest extends \PHPUnit_Framework_TestCase
*/
private $testInstance;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->testInstance = new SessionFingerprint();
}
- public function tearDown()
+ public function tearDown(): void
{
Date::$now = null;
diff --git a/tests/PHPUnit/Unit/Session/SessionInitializerTest.php b/tests/PHPUnit/Unit/Session/SessionInitializerTest.php
index 858d6bd47b..b000437f4d 100644
--- a/tests/PHPUnit/Unit/Session/SessionInitializerTest.php
+++ b/tests/PHPUnit/Unit/Session/SessionInitializerTest.php
@@ -14,11 +14,11 @@ use Piwik\AuthResult;
use Piwik\Session\SessionFingerprint;
use Piwik\Session\SessionInitializer;
-class SessionInitializerTest extends \PHPUnit_Framework_TestCase
+class SessionInitializerTest extends \PHPUnit\Framework\TestCase
{
private $oldUnitTestValue;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -26,27 +26,22 @@ class SessionInitializerTest extends \PHPUnit_Framework_TestCase
\Zend_Session::$_unitTestEnabled = true;
}
- public function tearDown()
+ public function tearDown(): void
{
\Zend_Session::$_unitTestEnabled = $this->oldUnitTestValue;
parent::tearDown();
}
- /**
- * @dataProvider getTestDataForInitSession
- * @expectedExceptionMessage Login_LoginPasswordNotCorrect
- */
- public function test_initSession_Throws_IfAuthenticationFailed($rememberMe)
+ public function test_initSession_Throws_IfAuthenticationFailed()
{
+ $this->expectExceptionMessage('Login_LoginPasswordNotCorrect');
+
$sessionInitializer = new TestSessionInitializer();
- $sessionInitializer->initSession($this->makeMockAuth(AuthResult::SUCCESS));
+ $sessionInitializer->initSession($this->makeMockAuth(AuthResult::FAILURE));
}
- /**
- * @dataProvider getTestDataForInitSession
- */
- public function test_initSession_InitializesTheSessionCorrectly_IfAuthenticationSucceeds($rememberMe)
+ public function test_initSession_InitializesTheSessionCorrectly_IfAuthenticationSucceeds()
{
$sessionInitializer = new TestSessionInitializer();
$sessionInitializer->initSession($this->makeMockAuth(AuthResult::SUCCESS));
@@ -54,14 +49,6 @@ class SessionInitializerTest extends \PHPUnit_Framework_TestCase
$this->assertSessionCreatedCorrectly();
}
- public function getTestDataForInitSession()
- {
- return [
- [true],
- [false],
- ];
- }
-
private function makeMockAuth($resultCode)
{
return new MockAuth($resultCode);
diff --git a/tests/PHPUnit/Unit/Tracker/RequestSetTest.php b/tests/PHPUnit/Unit/Tracker/RequestSetTest.php
index 86fde960f2..be87334388 100644
--- a/tests/PHPUnit/Unit/Tracker/RequestSetTest.php
+++ b/tests/PHPUnit/Unit/Tracker/RequestSetTest.php
@@ -15,7 +15,7 @@ use Piwik\Tracker\RequestSet;
* @group RequestSetTest
* @group Tracker
*/
-class RequestSetTest extends \PHPUnit_Framework_TestCase
+class RequestSetTest extends \PHPUnit\Framework\TestCase
{
/**
* @var TestRequestSet
@@ -23,7 +23,7 @@ class RequestSetTest extends \PHPUnit_Framework_TestCase
private $requestSet;
private $time;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -209,7 +209,7 @@ class RequestSetTest extends \PHPUnit_Framework_TestCase
public function test_intertnalFakeEnvironment_shouldActuallyReturnAValue()
{
$myEnv = $this->getFakeEnvironment();
- $this->assertInternalType('array', $myEnv);
+ self::assertIsArray($myEnv);
$this->assertNotEmpty($myEnv);
}
@@ -360,44 +360,6 @@ class RequestSetTest extends \PHPUnit_Framework_TestCase
$this->assertTrue(empty($_SERVER['HTTP_REFERER']));
}
- public function test_getRedirectUrl_ShouldReturnEmptyString_IfNoUrlSet()
- {
- $this->assertEquals('', $this->requestSet->getRedirectUrl());
- }
-
- public function test_getRedirectUrl_ShouldReturnTrue_IfAUrlSetIsSetViaGET()
- {
- $_GET['redirecturl'] = 'whatsoever';
- $this->assertEquals('whatsoever', $this->requestSet->getRedirectUrl());
- unset($_GET['redirecturl']);
- }
-
- public function test_getRedirectUrl_ShouldReturnTrue_IfAUrlSetIsSetViaPOST()
- {
- $_POST['redirecturl'] = 'whatsoeverPOST';
- $this->assertEquals('whatsoeverPOST', $this->requestSet->getRedirectUrl());
- unset($_POST['redirecturl']);
- }
-
- public function test_hasRedirectUrl_ShouldReturnFalse_IfNoUrlSet()
- {
- $this->assertFalse($this->requestSet->hasRedirectUrl());
- }
-
- public function test_hasRedirectUrl_ShouldReturnTrue_IfAUrlSetIsSetViaGET()
- {
- $_GET['redirecturl'] = 'whatsoever';
- $this->assertTrue($this->requestSet->hasRedirectUrl());
- unset($_GET['redirecturl']);
- }
-
- public function test_hasRedirectUrl_ShouldReturnTrue_IfAUrlSetIsSetViaPOST()
- {
- $_POST['redirecturl'] = 'whatsoever';
- $this->assertTrue($this->requestSet->hasRedirectUrl());
- unset($_POST['redirecturl']);
- }
-
/**
* @param int $numRequests
* @return Request[]
@@ -427,15 +389,6 @@ class RequestSetTest extends \PHPUnit_Framework_TestCase
class TestRequestSet extends RequestSet
{
- public function getRedirectUrl()
- {
- return parent::getRedirectUrl();
- }
-
- public function hasRedirectUrl()
- {
- return parent::hasRedirectUrl();
- }
public function getAllSiteIdsWithinRequest()
{
diff --git a/tests/PHPUnit/Unit/Tracker/RequestTest.php b/tests/PHPUnit/Unit/Tracker/RequestTest.php
index 81eded4f3b..365b4bc828 100644
--- a/tests/PHPUnit/Unit/Tracker/RequestTest.php
+++ b/tests/PHPUnit/Unit/Tracker/RequestTest.php
@@ -9,7 +9,7 @@
namespace Piwik\Tests\Unit\Tracker;
use Piwik\Cookie;
-use Piwik\Network\IPUtils;
+use Matomo\Network\IPUtils;
use Piwik\Piwik;
use Piwik\Plugins\CustomVariables\CustomVariables;
use Piwik\Tests\Framework\TestCase\UnitTestCase;
@@ -29,7 +29,7 @@ class RequestTest extends UnitTestCase
private $request;
private $time;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -284,12 +284,11 @@ class RequestTest extends UnitTestCase
$this->assertEquals('05:20:17', $request->getLocalTime());
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage Requested parameter myCustomFaKeParaM is not a known Tracking API Parameter
- */
public function test_getParam_shouldThrowException_IfTryingToAccessInvalidParam()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('Requested parameter myCustomFaKeParaM is not a known Tracking API Parameter');
+
$this->request->getParam('myCustomFaKeParaM');
}
@@ -433,7 +432,7 @@ class RequestTest extends UnitTestCase
private function assertCookieContains($needle, Cookie $cookie)
{
- $this->assertContains($needle, $cookie . '');
+ self::assertStringContainsString($needle, $cookie . '');
}
public function test_getLocalTime()
diff --git a/tests/PHPUnit/Unit/Tracker/ResponseTest.php b/tests/PHPUnit/Unit/Tracker/ResponseTest.php
index 996ecdefa2..c5583a49b9 100644
--- a/tests/PHPUnit/Unit/Tracker/ResponseTest.php
+++ b/tests/PHPUnit/Unit/Tracker/ResponseTest.php
@@ -33,14 +33,14 @@ class TestResponse extends Response {
* @group Plugins
* @group Tracker
*/
-class ResponseTest extends \PHPUnit_Framework_TestCase
+class ResponseTest extends \PHPUnit\Framework\TestCase
{
/**
* @var TestResponse
*/
private $response;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->response = new TestResponse();
@@ -65,8 +65,8 @@ class ResponseTest extends \PHPUnit_Framework_TestCase
$content = $this->response->getOutput();
- $this->assertContains('<title>Matomo &rsaquo; Error</title>', $content);
- $this->assertContains('<p>My Custom Message', $content);
+ self::assertStringContainsString('<title>Matomo &rsaquo; Error</title>', $content);
+ self::assertStringContainsString('<p>My Custom Message', $content);
}
public function test_outputResponse_shouldOutputStandardApiResponse()
@@ -143,7 +143,7 @@ class ResponseTest extends \PHPUnit_Framework_TestCase
public function test_getMessageFromException_ShouldReturnMessageAndTrace_InCaseIsCli()
{
$message = $this->response->getMessageFromException(new Exception('Test Message', 8150));
- $this->assertStringStartsWith("Test Message\n#0 [internal function]", $message);
+ $this->assertStringStartsWith("Test Message\n#0 ", $message);
}
public function test_getMessageFromException_ShouldOnlyReturnMessage_InCaseIsNotCli()
diff --git a/tests/PHPUnit/Unit/TrackerTest.php b/tests/PHPUnit/Unit/TrackerTest.php
index 7a0e11d112..1040f4f2dc 100644
--- a/tests/PHPUnit/Unit/TrackerTest.php
+++ b/tests/PHPUnit/Unit/TrackerTest.php
@@ -17,7 +17,7 @@ use Piwik\Tracker;
* @group TrackerTest
* @group Tracker
*/
-class TrackerTest extends \PHPUnit_Framework_TestCase
+class TrackerTest extends \PHPUnit\Framework\TestCase
{
/**
* @var TestTracker
@@ -36,7 +36,7 @@ class TrackerTest extends \PHPUnit_Framework_TestCase
private $time;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
@@ -157,12 +157,11 @@ class TrackerTest extends \PHPUnit_Framework_TestCase
$this->assertFalse($this->handler->isOnException);
}
- /**
- * @expectedException \Exception
- * @expectedExceptionMessage My Exception During Process
- */
public function test_track_shouldNotCatchAnyException_IfExceptionWasThrown()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage('My Exception During Process');
+
$this->handler->enableTriggerExceptionInProcess();
$this->tracker->track($this->handler, $this->requestSet);
}
diff --git a/tests/PHPUnit/Unit/TranslateTest.php b/tests/PHPUnit/Unit/TranslateTest.php
index c96a375435..0d282b3b64 100644
--- a/tests/PHPUnit/Unit/TranslateTest.php
+++ b/tests/PHPUnit/Unit/TranslateTest.php
@@ -8,12 +8,12 @@
namespace Piwik\Tests\Unit;
-use Piwik\Translate;
+use Piwik\Container\StaticContainer;
/**
* @group Translation
*/
-class TranslateTest extends \PHPUnit_Framework_TestCase
+class TranslateTest extends \PHPUnit\Framework\TestCase
{
/**
* Dataprovider for testClean
@@ -42,6 +42,6 @@ class TranslateTest extends \PHPUnit_Framework_TestCase
*/
public function testClean($data, $expected)
{
- $this->assertEquals($expected, Translate::clean($data));
+ $this->assertEquals($expected, StaticContainer::get('Piwik\Translation\Translator')->clean($data));
}
} \ No newline at end of file
diff --git a/tests/PHPUnit/Unit/Translation/FilesTest.php b/tests/PHPUnit/Unit/Translation/FilesTest.php
index b154b9a8b8..f1a34bb304 100644
--- a/tests/PHPUnit/Unit/Translation/FilesTest.php
+++ b/tests/PHPUnit/Unit/Translation/FilesTest.php
@@ -15,7 +15,7 @@ use Piwik\Translation\Translator;
* @group Translation
* @group langfiles
*/
-class FilesTest extends \PHPUnit_Framework_TestCase
+class FilesTest extends \PHPUnit\Framework\TestCase
{
/**
* @dataProvider getTranslationFiles
diff --git a/tests/PHPUnit/Unit/Translation/Loader/DevelopmentLoaderTest.php b/tests/PHPUnit/Unit/Translation/Loader/DevelopmentLoaderTest.php
index 308c30a70e..f12d62f934 100644
--- a/tests/PHPUnit/Unit/Translation/Loader/DevelopmentLoaderTest.php
+++ b/tests/PHPUnit/Unit/Translation/Loader/DevelopmentLoaderTest.php
@@ -13,7 +13,7 @@ use Piwik\Translation\Loader\DevelopmentLoader;
/**
* @group Translation
*/
-class DevelopmentLoaderTest extends \PHPUnit_Framework_TestCase
+class DevelopmentLoaderTest extends \PHPUnit\Framework\TestCase
{
private $translations = array(
'General' => array(
diff --git a/tests/PHPUnit/Unit/Translation/Loader/JsonFileLoaderTest.php b/tests/PHPUnit/Unit/Translation/Loader/JsonFileLoaderTest.php
index aa64725966..fa6549df50 100644
--- a/tests/PHPUnit/Unit/Translation/Loader/JsonFileLoaderTest.php
+++ b/tests/PHPUnit/Unit/Translation/Loader/JsonFileLoaderTest.php
@@ -13,7 +13,7 @@ use Piwik\Translation\Loader\JsonFileLoader;
/**
* @group Translation
*/
-class JsonFileLoaderTest extends \PHPUnit_Framework_TestCase
+class JsonFileLoaderTest extends \PHPUnit\Framework\TestCase
{
public function test_shouldLoadJsonFile()
{
diff --git a/tests/PHPUnit/Unit/Translation/Loader/LoaderCacheTest.php b/tests/PHPUnit/Unit/Translation/Loader/LoaderCacheTest.php
index 9aa552e1a1..03350e6e87 100644
--- a/tests/PHPUnit/Unit/Translation/Loader/LoaderCacheTest.php
+++ b/tests/PHPUnit/Unit/Translation/Loader/LoaderCacheTest.php
@@ -8,18 +8,18 @@
namespace Piwik\Tests\Unit\Translation\Loader;
-use Piwik\Cache\Backend\ArrayCache;
-use Piwik\Cache\Lazy;
+use Matomo\Cache\Backend\ArrayCache;
+use Matomo\Cache\Lazy;
use Piwik\Translation\Loader\LoaderCache;
/**
* @group Translation
*/
-class LoaderCacheTest extends \PHPUnit_Framework_TestCase
+class LoaderCacheTest extends \PHPUnit\Framework\TestCase
{
public function test_shouldNotLoad_ifInCache()
{
- $cache = $this->getMock('Piwik\Cache\Lazy', array(), array(), '', false);
+ $cache = $this->getMockBuilder('Matomo\Cache\Lazy')->disableOriginalConstructor()->getMock();
$cache->expects($this->any())
->method('fetch')
->willReturn(array('translations!'));
@@ -35,7 +35,7 @@ class LoaderCacheTest extends \PHPUnit_Framework_TestCase
public function test_shouldLoad_ifNotInCache()
{
- $cache = $this->getMock('Piwik\Cache\Lazy', array(), array(), '', false);
+ $cache = $this->getMockBuilder('Matomo\Cache\Lazy')->disableOriginalConstructor()->getMock();
$cache->expects($this->any())
->method('fetch')
->willReturn(null);
diff --git a/tests/PHPUnit/Unit/Translation/TranslatorTest.php b/tests/PHPUnit/Unit/Translation/TranslatorTest.php
index 0605afebc8..031a50b3d5 100644
--- a/tests/PHPUnit/Unit/Translation/TranslatorTest.php
+++ b/tests/PHPUnit/Unit/Translation/TranslatorTest.php
@@ -14,7 +14,7 @@ use Piwik\Translation\Translator;
/**
* @group Translation
*/
-class TranslatorTest extends \PHPUnit_Framework_TestCase
+class TranslatorTest extends \PHPUnit\Framework\TestCase
{
public function test_translate_shouldReturnTranslationId_ifNoTranslationFound()
{
diff --git a/tests/PHPUnit/Unit/TwigTest.php b/tests/PHPUnit/Unit/TwigTest.php
index ebf2e512f9..a2cc56de55 100644
--- a/tests/PHPUnit/Unit/TwigTest.php
+++ b/tests/PHPUnit/Unit/TwigTest.php
@@ -13,7 +13,7 @@ require_once(PIWIK_INCLUDE_PATH . '/core/Twig.php');
/**
* @group Twig
*/
-class TwigTest extends \PHPUnit_Framework_TestCase
+class TwigTest extends \PHPUnit\Framework\TestCase
{
/**
* @dataProvider getTruncateTests
diff --git a/tests/PHPUnit/Unit/UrlHelperTest.php b/tests/PHPUnit/Unit/UrlHelperTest.php
index 150b0b33ff..8b5f47d60c 100644
--- a/tests/PHPUnit/Unit/UrlHelperTest.php
+++ b/tests/PHPUnit/Unit/UrlHelperTest.php
@@ -8,11 +8,9 @@
namespace Piwik\Tests\Unit;
-use Piwik\Tests\Framework\TestCase\SystemTestCase;
use Piwik\UrlHelper;
-use Spyc;
-class UrlHelperTest extends \PHPUnit_Framework_TestCase
+class UrlHelperTest extends \PHPUnit\Framework\TestCase
{
/**
* Dataprovider for testIsUrl
diff --git a/tests/PHPUnit/Unit/UrlTest.php b/tests/PHPUnit/Unit/UrlTest.php
index b91d978594..797050677e 100644
--- a/tests/PHPUnit/Unit/UrlTest.php
+++ b/tests/PHPUnit/Unit/UrlTest.php
@@ -15,7 +15,7 @@ use Piwik\Url;
* @backupGlobals enabled
* @group Core
*/
-class UrlTest extends \PHPUnit_Framework_TestCase
+class UrlTest extends \PHPUnit\Framework\TestCase
{
public function testAllMethods()
{
diff --git a/tests/PHPUnit/Unit/Validator/CharacterLengthTest.php b/tests/PHPUnit/Unit/Validator/CharacterLengthTest.php
index 67e3ae4d3d..6992d17d0b 100644
--- a/tests/PHPUnit/Unit/Validator/CharacterLengthTest.php
+++ b/tests/PHPUnit/Unit/Validator/CharacterLengthTest.php
@@ -15,7 +15,7 @@ use Piwik\Validators\CharacterLength;
* @group CharacterLength
* @group CharacterLengthTest
*/
-class CharacterLengthTest extends \PHPUnit_Framework_TestCase
+class CharacterLengthTest extends \PHPUnit\Framework\TestCase
{
public function test_validate_successValueNotEmpty()
{
@@ -24,32 +24,28 @@ class CharacterLengthTest extends \PHPUnit_Framework_TestCase
$this->validate('mytest', 6, 6);
$this->validate('', 0, 6);
$this->validate('testwewe', 0, 10);
+
+ $this->assertTrue(true);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorCharacterTooShort
- */
public function test_validate_failValueIsTooShort()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorCharacterTooShort');
$this->validate('myte', 5);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorCharacterTooLong
- */
public function test_validate_failValueIsTooLong()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorCharacterTooLong');
$this->validate('mytestfoo', null, 4);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorCharacterTooLong
- */
public function test_validate_failValueIsTooNotInRange()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorCharacterTooLong');
$this->validate('mytestfoobar', 5, 8);
}
diff --git a/tests/PHPUnit/Unit/Validator/DateTimeTest.php b/tests/PHPUnit/Unit/Validator/DateTimeTest.php
index b430efd786..607cebf736 100644
--- a/tests/PHPUnit/Unit/Validator/DateTimeTest.php
+++ b/tests/PHPUnit/Unit/Validator/DateTimeTest.php
@@ -15,7 +15,7 @@ use Piwik\Validators\DateTime;
* @group DateTime
* @group DateTimeTest
*/
-class DateTimeTest extends \PHPUnit_Framework_TestCase
+class DateTimeTest extends \PHPUnit\Framework\TestCase
{
public function test_validate_successValueNotEmpty()
{
@@ -23,21 +23,25 @@ class DateTimeTest extends \PHPUnit_Framework_TestCase
$this->validate('2014-05-06T10:13:14');
$this->validate('2014-05-06 10:13:14Z');
$this->validate('2014-05-06T10:13:14Z');
+
+ $this->assertTrue(true);
}
public function test_validate_successValueMayBeEmpty()
{
$this->validate(false);
$this->validate('');
+
+ $this->assertTrue(true);
}
/**
* @dataProvider getWrongFormat
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorInvalidDateTimeFormat
*/
public function test_validate_failInvalidFormat($date)
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorInvalidDateTimeFormat');
$this->validate($date);
}
@@ -56,12 +60,10 @@ class DateTimeTest extends \PHPUnit_Framework_TestCase
);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ExceptionInvalidDateFormat
- */
public function test_validate_invalidDate()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ExceptionInvalidDateFormat');
$this->validate('2014-15-26 90:43:32');
}
diff --git a/tests/PHPUnit/Unit/Validator/EmailTest.php b/tests/PHPUnit/Unit/Validator/EmailTest.php
index 3be89d7092..3a5f701e79 100644
--- a/tests/PHPUnit/Unit/Validator/EmailTest.php
+++ b/tests/PHPUnit/Unit/Validator/EmailTest.php
@@ -15,7 +15,7 @@ use Piwik\Validators\Email;
* @group Email
* @group EmailTest
*/
-class EmailTest extends \PHPUnit_Framework_TestCase
+class EmailTest extends \PHPUnit\Framework\TestCase
{
/**
* @dataProvider getValidEmails
@@ -37,11 +37,12 @@ class EmailTest extends \PHPUnit_Framework_TestCase
/**
* @dataProvider getFailedEmails
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage ValidatorErrorNotEmailLike
*/
public function test_validate_failValueIsNotValidEmail($email)
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('ValidatorErrorNotEmailLike');
+
$this->validate($email);
}
diff --git a/tests/PHPUnit/Unit/Validator/IpRangesTest.php b/tests/PHPUnit/Unit/Validator/IpRangesTest.php
index 37e0382a42..6d7b244048 100644
--- a/tests/PHPUnit/Unit/Validator/IpRangesTest.php
+++ b/tests/PHPUnit/Unit/Validator/IpRangesTest.php
@@ -15,7 +15,7 @@ use Piwik\Validators\IpRanges;
* @group IpRanges
* @group IpRangesTest
*/
-class IpRangesTest extends \PHPUnit_Framework_TestCase
+class IpRangesTest extends \PHPUnit\Framework\TestCase
{
public function test_validate_success()
{
@@ -28,14 +28,14 @@ class IpRangesTest extends \PHPUnit_Framework_TestCase
$this->validate(false);
$this->validate('');
$this->validate(null);
+
+ $this->assertTrue(true);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage SitesManager_ExceptionInvalidIPFormat
- */
public function test_validate_failNotValidIpRange()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('SitesManager_ExceptionInvalidIPFormat');
$this->validate(array('127.0.0.1', 'foo'));
}
diff --git a/tests/PHPUnit/Unit/Validator/NotEmptyTest.php b/tests/PHPUnit/Unit/Validator/NotEmptyTest.php
index 78f30fe8f9..188932bebf 100644
--- a/tests/PHPUnit/Unit/Validator/NotEmptyTest.php
+++ b/tests/PHPUnit/Unit/Validator/NotEmptyTest.php
@@ -15,7 +15,7 @@ use Piwik\Validators\NotEmpty;
* @group NotEmpty
* @group NotEmptyTest
*/
-class NotEmptyTest extends \PHPUnit_Framework_TestCase
+class NotEmptyTest extends \PHPUnit\Framework\TestCase
{
public function test_validate_successValueNotEmpty()
{
@@ -27,11 +27,12 @@ class NotEmptyTest extends \PHPUnit_Framework_TestCase
/**
* @dataProvider getFailValues
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorEmptyValue
*/
public function test_validate_failValueIsEmpty($value)
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorEmptyValue');
+
$this->validate($value);
}
diff --git a/tests/PHPUnit/Unit/Validator/NumberRangeTest.php b/tests/PHPUnit/Unit/Validator/NumberRangeTest.php
index dc7787a0b2..a906109771 100644
--- a/tests/PHPUnit/Unit/Validator/NumberRangeTest.php
+++ b/tests/PHPUnit/Unit/Validator/NumberRangeTest.php
@@ -15,7 +15,7 @@ use Piwik\Validators\NumberRange;
* @group NumberRange
* @group NumberRangeTest
*/
-class NumberRangeTest extends \PHPUnit_Framework_TestCase
+class NumberRangeTest extends \PHPUnit\Framework\TestCase
{
public function test_validate_successValueNotEmpty()
{
@@ -29,50 +29,42 @@ class NumberRangeTest extends \PHPUnit_Framework_TestCase
$this->validate('5', 4);
$this->validate('5', null, '6');
$this->validate('-5', -10, '-4');
+
+ $this->assertTrue(true);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorNumberTooLow
- */
public function test_validate_failValueIsTooLow()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorNumberTooLow');
$this->validate(3, 5);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorNumberTooHigh
- */
public function test_validate_failValueIsTooHigh()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorNumberTooHigh');
$this->validate(10, null, 8);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorNumberTooHigh
- */
public function test_validate_failValueIsTooNotInRange()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorNumberTooHigh');
$this->validate(10, 5, 8);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorNumberTooLow
- */
public function test_validate_failValueIsTooNotInRangeFloat()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorNumberTooLow');
$this->validate(5.43, 5.44, 8);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorNotANumber
- */
public function test_validate_failValueIsNotNumber()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorNotANumber');
$this->validate('foo');
}
diff --git a/tests/PHPUnit/Unit/Validator/UrlLikeTest.php b/tests/PHPUnit/Unit/Validator/UrlLikeTest.php
index 9ed96de226..76f8caf061 100644
--- a/tests/PHPUnit/Unit/Validator/UrlLikeTest.php
+++ b/tests/PHPUnit/Unit/Validator/UrlLikeTest.php
@@ -15,7 +15,7 @@ use Piwik\Validators\UrlLike;
* @group UrlLike
* @group UrlLikeTest
*/
-class UrlLikeTest extends \PHPUnit_Framework_TestCase
+class UrlLikeTest extends \PHPUnit\Framework\TestCase
{
/**
* @dataProvider getValidUrls
@@ -52,11 +52,12 @@ class UrlLikeTest extends \PHPUnit_Framework_TestCase
/**
* @dataProvider getFailedUrls
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage ValidatorErrorNotUrlLike
*/
public function test_validate_failValueIsNotUrlLike($url)
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('ValidatorErrorNotUrlLike');
+
$this->validate($url);
}
diff --git a/tests/PHPUnit/Unit/Validator/WhiteListedValueTest.php b/tests/PHPUnit/Unit/Validator/WhiteListedValueTest.php
index 1fc98b4a5c..b4ebdcf870 100644
--- a/tests/PHPUnit/Unit/Validator/WhiteListedValueTest.php
+++ b/tests/PHPUnit/Unit/Validator/WhiteListedValueTest.php
@@ -6,7 +6,7 @@
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
-namespace Piwik\Tests\Unit\Translation\Loader;
+namespace Piwik\Tests\Unit\Validator;
use Piwik\Validators\WhitelistedValue;
@@ -15,7 +15,7 @@ use Piwik\Validators\WhitelistedValue;
* @group WhiteListedValue
* @group WhiteListedValueTest
*/
-class WhiteListedValueTest extends \PHPUnit_Framework_TestCase
+class WhiteListedValueTest extends \PHPUnit\Framework\TestCase
{
public function test_validate_successValueNotEmpty()
{
@@ -23,15 +23,17 @@ class WhiteListedValueTest extends \PHPUnit_Framework_TestCase
$this->validate('bar');
$this->validate('baz');
$this->validate('lorem');
+
+ $this->assertTrue(true);
}
/**
* @dataProvider getInvalidValues
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage General_ValidatorErrorXNotWhitelisted
*/
public function test_validate_failInvalidFormat($date)
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('General_ValidatorErrorXNotWhitelisted');
$this->validate($date);
}
@@ -46,12 +48,10 @@ class WhiteListedValueTest extends \PHPUnit_Framework_TestCase
);
}
- /**
- * @expectedException \Piwik\Validators\Exception
- * @expectedExceptionMessage The whitelisted values need to be an array
- */
public function test_construct_throwsExceptionIfParamIsNotAnArray()
{
+ $this->expectException(\Piwik\Validators\Exception::class);
+ $this->expectExceptionMessage('The whitelisted values need to be an array');
new WhitelistedValue('foobar');
}
diff --git a/tests/PHPUnit/Unit/VersionTest.php b/tests/PHPUnit/Unit/VersionTest.php
index 196071a3e8..ebd791e7c0 100644
--- a/tests/PHPUnit/Unit/VersionTest.php
+++ b/tests/PHPUnit/Unit/VersionTest.php
@@ -10,14 +10,14 @@ namespace Piwik\Tests\Unit;
use Piwik\Version;
-class VersionTest extends \PHPUnit_Framework_TestCase
+class VersionTest extends \PHPUnit\Framework\TestCase
{
/**
* @var Version
*/
private $version;
- public function setUp()
+ public function setUp(): void
{
$this->version = new Version();
}
diff --git a/tests/PHPUnit/Unit/Widget/WidgetConfigTest.php b/tests/PHPUnit/Unit/Widget/WidgetConfigTest.php
index b8134230ce..9e8b441a41 100644
--- a/tests/PHPUnit/Unit/Widget/WidgetConfigTest.php
+++ b/tests/PHPUnit/Unit/Widget/WidgetConfigTest.php
@@ -15,14 +15,14 @@ use Piwik\Widget\WidgetConfig;
* @group WidgetConfig
* @group WidgetConfigTest
*/
-class WidgetConfigTest extends \PHPUnit_Framework_TestCase
+class WidgetConfigTest extends \PHPUnit\Framework\TestCase
{
/**
* @var WidgetConfig
*/
private $config;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->config = new WidgetConfig();
@@ -189,13 +189,14 @@ class WidgetConfigTest extends \PHPUnit_Framework_TestCase
{
$this->config->enable();
$this->config->checkIsEnabled();
+
+ $this->assertTrue(true);
}
- /**
- * @expectedException \Exception
- */
public function test_checkIsEnabled_shouldThrowException_IfDisabled()
{
+ $this->expectException(\Exception::class);
+
$this->config->disable();
$this->config->checkIsEnabled();
}
diff --git a/tests/PHPUnit/Unit/Widget/WidgetContainerConfigTest.php b/tests/PHPUnit/Unit/Widget/WidgetContainerConfigTest.php
index 8387058546..c74d402c64 100644
--- a/tests/PHPUnit/Unit/Widget/WidgetContainerConfigTest.php
+++ b/tests/PHPUnit/Unit/Widget/WidgetContainerConfigTest.php
@@ -16,7 +16,7 @@ use Piwik\Widget\WidgetContainerConfig;
* @group WidgetContainerConfig
* @group WidgetContainerConfigTest
*/
-class WidgetContainerConfigTest extends \PHPUnit_Framework_TestCase
+class WidgetContainerConfigTest extends \PHPUnit\Framework\TestCase
{
/**
* @var WidgetContainerConfig
@@ -25,7 +25,7 @@ class WidgetContainerConfigTest extends \PHPUnit_Framework_TestCase
private $id = 'MyTestContainer';
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->config = new WidgetContainerConfig();
@@ -216,13 +216,14 @@ class WidgetContainerConfigTest extends \PHPUnit_Framework_TestCase
{
$this->config->enable();
$this->config->checkIsEnabled();
+
+ $this->assertTrue(true);
}
- /**
- * @expectedException \Exception
- */
public function test_checkIsEnabled_shouldThrowException_IfDisabled()
{
+ $this->expectException(\Exception::class);
+
$this->config->disable();
$this->config->checkIsEnabled();
}
diff --git a/tests/PHPUnit/Unit/Widget/WidgetsListTest.php b/tests/PHPUnit/Unit/Widget/WidgetsListTest.php
index ed0a77e517..f2dc9bd3a6 100644
--- a/tests/PHPUnit/Unit/Widget/WidgetsListTest.php
+++ b/tests/PHPUnit/Unit/Widget/WidgetsListTest.php
@@ -17,14 +17,14 @@ use Piwik\Widget\WidgetsList;
* @group WidgetsList
* @group WidgetsListTest
*/
-class WidgetsListTest extends \PHPUnit_Framework_TestCase
+class WidgetsListTest extends \PHPUnit\Framework\TestCase
{
/**
* @var WidgetsList
*/
private $list;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
$this->list = new WidgetsList();
diff --git a/tests/PHPUnit/bootstrap.php b/tests/PHPUnit/bootstrap.php
index 1fae5acbf9..c5bc17aa18 100644
--- a/tests/PHPUnit/bootstrap.php
+++ b/tests/PHPUnit/bootstrap.php
@@ -45,8 +45,6 @@ $GLOBALS['MATOMO_PLUGIN_DIRS'] = array(
require_once PIWIK_INCLUDE_PATH . '/core/bootstrap.php';
-require_once PIWIK_INCLUDE_PATH . '/libs/PiwikTracker/PiwikTracker.php';
-
if (getenv('PIWIK_USE_XHPROF') == 1) {
\Piwik\Profiler::setupProfilerXHProf();
}
@@ -127,7 +125,7 @@ function prepareTestDatabaseConfig(Config $config)
$config->forceSave();
}
-if (!SettingsPiwik::isPiwikInstalled()) {
+if (!SettingsPiwik::isMatomoInstalled()) {
throw new Exception('Piwik needs to be installed in order to run the tests');
}
diff --git a/tests/PHPUnit/phpunit.xml.dist b/tests/PHPUnit/phpunit.xml.dist
index 7fc355465f..37c283e87f 100644
--- a/tests/PHPUnit/phpunit.xml.dist
+++ b/tests/PHPUnit/phpunit.xml.dist
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd"
+ xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/8.5/phpunit.xsd"
backupGlobals="true"
backupStaticAttributes="false"
bootstrap="bootstrap.php"
@@ -10,7 +10,6 @@
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
forceCoversAnnotation="false"
- mapTestClassNameToCoveredClassName="false"
processIsolation="false"
stopOnError="false"
stopOnFailure="false"
diff --git a/tests/UI/expected-screenshots/Comparison_segmented_visitorlog.png b/tests/UI/expected-screenshots/Comparison_segmented_visitorlog.png
index b16c49db5c..0143bbd3e6 100644
--- a/tests/UI/expected-screenshots/Comparison_segmented_visitorlog.png
+++ b/tests/UI/expected-screenshots/Comparison_segmented_visitorlog.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:46c3b902b2adf995997a53befdeff626f22dd899d4b7a48d68a2870ff6d5c7d9
-size 402427
+oid sha256:a2c444a6346d473478d736bf795daa423f63c8b4b117d24143b295bb5b7433e6
+size 402422
diff --git a/tests/UI/expected-screenshots/EmptySite_emptySiteDashboard_ignored.png b/tests/UI/expected-screenshots/EmptySite_emptySiteDashboard_ignored.png
index 6227ee5ac4..c5887844a3 100644
--- a/tests/UI/expected-screenshots/EmptySite_emptySiteDashboard_ignored.png
+++ b/tests/UI/expected-screenshots/EmptySite_emptySiteDashboard_ignored.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1dc530a77af566327479dc0742309f4886135418056434f3b16a1f9dce57f5ad
-size 367560
+oid sha256:8600371e3bf5fd49444da27e21a8d65d3562ca024141b998857008f2b0ee339d
+size 367151
diff --git a/tests/UI/expected-screenshots/OneClickUpdate_update_success.png b/tests/UI/expected-screenshots/OneClickUpdate_update_success.png
index 6e3c494ebb..1034d7367e 100644
--- a/tests/UI/expected-screenshots/OneClickUpdate_update_success.png
+++ b/tests/UI/expected-screenshots/OneClickUpdate_update_success.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:73e1130c2f80bfab81a0e430d1cece5b2b26b4e5d4c9d11f47ecca1e2940b9c3
-size 224408
+oid sha256:828e997926e09b348a2dccd3c73ed6d957284df67770a5fc7048853dbf596b80
+size 57481
diff --git a/tests/UI/expected-screenshots/ReportExporting_VisitsSummary.get_exported.php.txt b/tests/UI/expected-screenshots/ReportExporting_VisitsSummary.get_exported.php.txt
index 24fa5ca819..d6dea55c6f 100644
--- a/tests/UI/expected-screenshots/ReportExporting_VisitsSummary.get_exported.php.txt
+++ b/tests/UI/expected-screenshots/ReportExporting_VisitsSummary.get_exported.php.txt
@@ -1 +1 @@
-a:5:{i:2008;a:0:{}i:2009;a:0:{}i:2010;a:0:{}i:2011;a:0:{}i:2012;a:9:{s:9:"nb_visits";d:311;s:10:"nb_actions";d:708;s:19:"nb_visits_converted";d:245;s:12:"bounce_count";d:166;s:16:"sum_visit_length";d:96791;s:11:"max_actions";d:20;s:11:"bounce_rate";s:3:"53%";s:20:"nb_actions_per_visit";d:2.2999999999999998;s:16:"avg_time_on_site";s:9:"5 min 11s";}} \ No newline at end of file
+a:5:{i:2008;a:0:{}i:2009;a:0:{}i:2010;a:0:{}i:2011;a:0:{}i:2012;a:9:{s:9:"nb_visits";d:311;s:10:"nb_actions";d:708;s:19:"nb_visits_converted";d:245;s:12:"bounce_count";d:166;s:16:"sum_visit_length";d:96791;s:11:"max_actions";d:20;s:11:"bounce_rate";s:3:"53%";s:20:"nb_actions_per_visit";d:2.3;s:16:"avg_time_on_site";s:9:"5 min 11s";}} \ No newline at end of file
diff --git a/tests/UI/expected-screenshots/Theme_demo.png b/tests/UI/expected-screenshots/Theme_demo.png
index 9bfde372d0..08e0db8587 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:11f3aca0e458741236c61bfbb9fee9ebf578a00a9ce131b7faf8b24e63cb1b10
-size 1424326
+oid sha256:e61f62b35eb19e7eb3f9e7143b3cb07c59616782d78bdcffc77b4f7cc6f4f339
+size 1663932
diff --git a/tests/UI/expected-screenshots/Theme_home.png b/tests/UI/expected-screenshots/Theme_home.png
index 60b54a76ef..da175a9337 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:dade0276d633a0b5e02b20194aafdadbd141fffbeaec659a75cd9aff722e9459
-size 708905
+oid sha256:6e8a2409ad99268e956e02bda8e0297757ec5bde50f206bf1c2059c7a6bd6b47
+size 708722
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_admin_diagnostics_configfile.png b/tests/UI/expected-screenshots/UIIntegrationTest_admin_diagnostics_configfile.png
index 04b84372b2..03ffb96887 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_admin_diagnostics_configfile.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_admin_diagnostics_configfile.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1541e3be9d9bd63c8f43bce5a775770438d51edd28db485526ea2b7719a00a50
-size 4392052
+oid sha256:0d5ab1fb97f68102fca57d3bc55235b6a5e63733c4b5bedde9b2cdb1da7f77dc
+size 4224819
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_admin_home.png b/tests/UI/expected-screenshots/UIIntegrationTest_admin_home.png
index c42fddec26..fd84c142c7 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:e8f8ad570e5617fbab6e2d1056109782a9e31a13b585c4542b92d415f1209129
-size 150860
+oid sha256:d46b4323d224df365e7a63ba1e0ef49cd78ee4ac9cf9463ff6b613f64405b40d
+size 150549
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins.png b/tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins.png
index 9e60c45c1b..7d98a7052c 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:df47ad156b15f39ac8abbd31c6a2237ee997f5a15d580207beb86ee9e82175e2
-size 1080664
+oid sha256:619789492b017aa0c09f0f3be3afcf4a9c9ecb04fe39a262139a08587a44dcf7
+size 1045326
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins_no_internet.png b/tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins_no_internet.png
index 641b023b33..9b18e70a8e 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins_no_internet.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_admin_plugins_no_internet.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:495f6a2ac2be037469644931efd6157409fd21af17ed17c359a12cb8b4cd72e6
-size 1082346
+oid sha256:c86eef4fbee1cdc7f90a2e1b30573e591965ec02d07f9da24cbbada501c9a6b0
+size 1057122
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_admin_settings_general.png b/tests/UI/expected-screenshots/UIIntegrationTest_admin_settings_general.png
index 5df8af21f3..99889e4023 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:897f2a94a6c40124829adb89eb7c116055c7b05e82a19f3d05fc189ac583f844
-size 1032341
+oid sha256:6053c2c3643079e9e79c2e6cfc18a434228e0f00406cf0dd00b1584b50edd138
+size 1031610
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_api_error.png b/tests/UI/expected-screenshots/UIIntegrationTest_api_error.png
index c42fddec26..fd84c142c7 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_api_error.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_api_error.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e8f8ad570e5617fbab6e2d1056109782a9e31a13b585c4542b92d415f1209129
-size 150860
+oid sha256:d46b4323d224df365e7a63ba1e0ef49cd78ee4ac9cf9463ff6b613f64405b40d
+size 150549
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png b/tests/UI/expected-screenshots/UIIntegrationTest_api_listing.png
index 453a2aa9c0..95c558ba9c 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:fba29ae0960d5f150636b462d060d3407573d9aa31e4467e98b5d80a38e94ecb
-size 4943071
+oid sha256:7260e83828e9510616e2786fad99724630a22013444115be8f8fa28c392d362c
+size 4944235
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard1.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard1.png
index abc4ba33c6..9768b47eeb 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:3f4b30c413f8d14158978bd5ecb9d5311a10fa7e1cc3cc2413737869c3040ff1
-size 632864
+oid sha256:f1a11ec8692c42b949fd1a009b0eb27b5d728c97c0288725d11ee8b9ce796cdb
+size 632545
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard2.png
index 9d294eab88..827bac097f 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:8c2ac6f6c6eea5b7917a0a036e65843ead2ec427fc487dc9264f11a6bf523342
-size 1566536
+oid sha256:c266e66c4faeb80cba4a71b5263eddf6955295f38ef517be46838597ab734309
+size 1565814
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard3.png
index d55685aff4..3b8f077fd8 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:5e5a27128984cb7c82f5070341de4a8522845d0f132b3294cd9e3c262f23efab
-size 755474
+oid sha256:9146b42a09a9d8b6a601a46471addfc38b4097a5cc5a43f9ef9673bceecc6a30
+size 767449
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard4.png b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard4.png
index 843cc3c566..c2a2b0c409 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_dashboard4.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_dashboard4.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:989b3cb936090b8ef49f917b84020c0c8dc0c00adcc37955fab2b34d0218535d
-size 302600
+oid sha256:79953bb970caa7dab38ccbc42c7cd1c8ec116bd48684bd893ed4cae4301013b4
+size 313021
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png
index 4acb42b53f..4329757954 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5caa18ba95021c95ffb7bce61ae9434c6651c216c00158d703877554d86db331
-size 499349
+oid sha256:4bb7d263038ade7d53af8cda07d482efef3dc741626380832f112de561bab741
+size 499294
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log_segmented.png b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log_segmented.png
index b1067b5191..e2b9cf6263 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log_segmented.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_log_segmented.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5d702f5f3de5a07cf27146c4bf0d62937672ab76f793dbbb0163ac98ad3b9165
-size 61920
+oid sha256:84a67bdeb17c8b0fdad09f9170bdebb5f3325c2d459ebfcd35fcc648fc5e5552
+size 61896
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_sales.png b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_sales.png
index dadb2b16fa..c003897296 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_sales.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_ecommerce_sales.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:43f50d9cb6862443e316b839f15894d9ed49bb9b4862fbaf31aa9d34b7e433d5
-size 90220
+oid sha256:7ab85bd580f2fcc4c32737f90942fd16efdbbb1701facf90dce18724a0133f58
+size 92009
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_exampleui_sparklines.png b/tests/UI/expected-screenshots/UIIntegrationTest_exampleui_sparklines.png
index c366db17b0..64fd96fd0a 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_exampleui_sparklines.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_exampleui_sparklines.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:067010b2d3c1108216abfc1b7ebe5d5ee28db78f02a7ea6dca8c7d8e61f34ada
-size 18661
+oid sha256:869d432103137a73ecbe2c157ab4d67f825e0cbece6f608c1b6ab73ac1ec004a
+size 18659
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_fatal_error_safemode.png b/tests/UI/expected-screenshots/UIIntegrationTest_fatal_error_safemode.png
index 38ba20c78f..78060930e5 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_fatal_error_safemode.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_fatal_error_safemode.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:84920bd97bb2dab3b76ba599cb1465f78c56a1901b017805b558917bdcea33ca
-size 171185
+oid sha256:ac1678906d338d217ca6567eec3c780dac9d80e50fc4daf699880b54016d77f3
+size 170399
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal.png b/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal.png
index 20a5af248f..9592492741 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e439083c025e42be66b76e0c1ae33b684742926780a5dce5994176af48a9bab3
-size 194323
+oid sha256:aae12be978bce7c4e98410b126aa8772c5010c9073117c5c3d4b9be9353f2c47
+size 196043
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal_updated.png b/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal_updated.png
index b26cee5e54..f08d6937ec 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal_updated.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_goals_individual_goal_updated.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e4d9877a20f530b2d6350059d1773fcfd0c2f7d2e1545788f3802aacbc619426
-size 195018
+oid sha256:92c77f3c5e7ad2578f3864ca1c839b0b930a91b873c28982da7a32e258f50eb7
+size 196734
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_goals_overview.png b/tests/UI/expected-screenshots/UIIntegrationTest_goals_overview.png
index 11c0b6390c..692668570f 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_goals_overview.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_goals_overview.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:24e0cb4b7f6182e7e431883d740bd7725d388c60f1249569533eb07b550d6067
-size 159264
+oid sha256:3a4a311ffc5fa277858856346fb7950969707709d99f0d6178048b5702d2046c
+size 160989
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_referrers_overview.png b/tests/UI/expected-screenshots/UIIntegrationTest_referrers_overview.png
index d9f4b74aab..3556f64c0a 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_referrers_overview.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_referrers_overview.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:340529ce6e100c7329782c7e2bcd35cd082288168e6c5209266fd8dcc670e935
-size 65240
+oid sha256:0607427de69b5291b2b223dc1280cac86885d71bdde35d7bcc4cb7401a52e25a
+size 65245
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_segmented_visitorlog.png b/tests/UI/expected-screenshots/UIIntegrationTest_segmented_visitorlog.png
index cb85fa908a..f3d5270ff6 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_segmented_visitorlog.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_segmented_visitorlog.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0fa3ca6d2c31ea1df28fe2ac8bd8fd8eac8197f0f0ffd3642dac6d6d3051ec82
-size 377305
+oid sha256:1b7ca48581626674bef127e465760e2fe5d22a85801ff7d96bdaeddaf3d33ee1
+size 379471
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 1d7968a8b7..ce96524e93 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:e6caa6649c5549365ebd679de458a6c40180c596f34ddb818240dc14e2dc87d0
-size 557454
+oid sha256:1a1aac069dc89607a7af49cfbf3b0cbe73efa9b9e2b4058f8d9eb627ee7ee009
+size 557455
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_popup.png b/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_popup.png
index 4808855692..41a8af6fb6 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_popup.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_visitor_profile_popup.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:845f67a04dd390eadd1346cfcebe05297dc648e1ee642f12adadb89d01608d56
-size 185263
+oid sha256:bd66aa14cc29d4917ac5bbcda1ae99aaeac188d485b22d944c8eca55666cb0c5
+size 184802
diff --git a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png
index be33f3f06c..d17add0934 100644
--- a/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png
+++ b/tests/UI/expected-screenshots/UIIntegrationTest_widgetize_ecommercelog.png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:84ea64405f8850fa5edfd77bffed6a7813028e2bfc96241f516210e237b7ad38
-size 485635
+oid sha256:64cd903c8e7c86e364bc239022d2cf0a669ba8d69f87ebf92d38849b4b7745be
+size 485536
diff --git a/tests/UI/specs/EmptySite_spec.js b/tests/UI/specs/EmptySite_spec.js
index 0a0f10e593..96974a5437 100644
--- a/tests/UI/specs/EmptySite_spec.js
+++ b/tests/UI/specs/EmptySite_spec.js
@@ -28,7 +28,9 @@ describe("EmptySite", function () {
});
it('should be possible to ignore this screen for one hour', async function () {
- await page.click('.ignoreSitesWithoutData');
+ await page.evaluate(function() {
+ $('.ignoreSitesWithoutData').click();
+ });
await page.waitFor('.widget');
await page.waitForNetworkIdle();
diff --git a/tests/UI/specs/OneClickUpdate_spec.js b/tests/UI/specs/OneClickUpdate_spec.js
index 5332fa529c..7ddaa4b934 100644
--- a/tests/UI/specs/OneClickUpdate_spec.js
+++ b/tests/UI/specs/OneClickUpdate_spec.js
@@ -67,6 +67,9 @@ describe("OneClickUpdate", function () {
await submitButton.click();
await page.waitForNetworkIdle();
await page.waitFor(250);
+
+ await page.click('.footer a');
+ await page.waitForNetworkIdle();
} else {
break;
}
diff --git a/tests/javascript/index.php b/tests/javascript/index.php
index 900aa2dcbe..98d9861422 100644
--- a/tests/javascript/index.php
+++ b/tests/javascript/index.php
@@ -21,8 +21,8 @@ try {
$mysql = false;
}
-use \Piwik\Plugins\CustomPiwikJs\TrackerUpdater;
-use \Piwik\Plugins\CustomPiwikJs\TrackingCode\JsTestPluginTrackerFiles;
+use \Piwik\Plugins\CustomJsTracker\TrackerUpdater;
+use \Piwik\Plugins\CustomJsTracker\TrackingCode\JsTestPluginTrackerFiles;
$targetFileName = '/tests/resources/matomo.test.js';
$sourceFile = PIWIK_DOCUMENT_ROOT . TrackerUpdater::DEVELOPMENT_PIWIK_JS;
@@ -547,95 +547,95 @@ function PiwikTest() {
var tracker = Piwik.getTracker(), dummy;
- equal( typeof JSON_PIWIK.stringify, 'function', 'JSON.stringify function' );
- equal( typeof JSON_PIWIK.stringify(dummy), 'undefined', 'undefined' );
+ equal( typeof Piwik.JSON.stringify, 'function', 'JSON.stringify function' );
+ equal( typeof Piwik.JSON.stringify(dummy), 'undefined', 'undefined' );
- equal( JSON_PIWIK.stringify(null), 'null', 'null' );
- equal( JSON_PIWIK.stringify(true), 'true', 'true' );
- equal( JSON_PIWIK.stringify(false), 'false', 'false' );
- ok( JSON_PIWIK.stringify(0) === '0', 'Number 0' );
- ok( JSON_PIWIK.stringify(1) === '1', 'Number 1' );
- ok( JSON_PIWIK.stringify(-1) === '-1', 'Number -1' );
- ok( JSON_PIWIK.stringify(42) === '42', 'Number 42' );
+ equal( Piwik.JSON.stringify(null), 'null', 'null' );
+ equal( Piwik.JSON.stringify(true), 'true', 'true' );
+ equal( Piwik.JSON.stringify(false), 'false', 'false' );
+ ok( Piwik.JSON.stringify(0) === '0', 'Number 0' );
+ ok( Piwik.JSON.stringify(1) === '1', 'Number 1' );
+ ok( Piwik.JSON.stringify(-1) === '-1', 'Number -1' );
+ ok( Piwik.JSON.stringify(42) === '42', 'Number 42' );
- ok( JSON_PIWIK.stringify(1.0) === '1.0'
- || JSON_PIWIK.stringify(1.0) === '1', 'float 1.0' );
+ ok( Piwik.JSON.stringify(1.0) === '1.0'
+ || Piwik.JSON.stringify(1.0) === '1', 'float 1.0' );
- equal( JSON_PIWIK.stringify(1.1), '1.1', 'float 1.1' );
- equal( JSON_PIWIK.stringify(""), '""', 'empty string' );
- equal( JSON_PIWIK.stringify('"'), '"' + '\\' + '"' + '"', 'string "' );
- equal( JSON_PIWIK.stringify('\\'), '"' + '\\\\' + '"', 'string \\' );
+ equal( Piwik.JSON.stringify(1.1), '1.1', 'float 1.1' );
+ equal( Piwik.JSON.stringify(""), '""', 'empty string' );
+ equal( Piwik.JSON.stringify('"'), '"' + '\\' + '"' + '"', 'string "' );
+ equal( Piwik.JSON.stringify('\\'), '"' + '\\\\' + '"', 'string \\' );
- equal( JSON_PIWIK.stringify("1"), '"1"', 'string "1"' );
- equal( JSON_PIWIK.stringify("ABC"), '"ABC"', 'string ABC' );
- equal( JSON_PIWIK.stringify("\x40\x41\x42\x43"), '"@ABC"', '\\x hex string @ABC' );
+ equal( Piwik.JSON.stringify("1"), '"1"', 'string "1"' );
+ equal( Piwik.JSON.stringify("ABC"), '"ABC"', 'string ABC' );
+ equal( Piwik.JSON.stringify("\x40\x41\x42\x43"), '"@ABC"', '\\x hex string @ABC' );
- ok( JSON_PIWIK.stringify("\u60a8\u597d") == '"您好"'
- || JSON_PIWIK.stringify("\u60a8\u597d") == '"\\u60a8\\u597d"', '\\u Unicode string 您好' );
+ ok( Piwik.JSON.stringify("\u60a8\u597d") == '"您好"'
+ || Piwik.JSON.stringify("\u60a8\u597d") == '"\\u60a8\\u597d"', '\\u Unicode string 您好' );
- ok( JSON_PIWIK.stringify("ßéàêö您好") == '"ßéàêö您好"'
- || JSON_PIWIK.stringify("ßéàêö您好") == '"\\u00df\\u00e9\\u00e0\\u00ea\\u00f6\\u60a8\\u597d"', 'string non-ASCII text' );
+ ok( Piwik.JSON.stringify("ßéàêö您好") == '"ßéàêö您好"'
+ || Piwik.JSON.stringify("ßéàêö您好") == '"\\u00df\\u00e9\\u00e0\\u00ea\\u00f6\\u60a8\\u597d"', 'string non-ASCII text' );
- equal( JSON_PIWIK.stringify("20060228T08:00:00"), '"20060228T08:00:00"', 'string "20060228T08:00:00"' );
+ equal( Piwik.JSON.stringify("20060228T08:00:00"), '"20060228T08:00:00"', 'string "20060228T08:00:00"' );
var d = new Date();
d.setTime(1240013340000);
- ok( JSON_PIWIK.stringify(d) === '"2009-04-18T00:09:00Z"'
- || JSON_PIWIK.stringify(d) === '"2009-04-18T00:09:00.000Z"', 'Date');
+ ok( Piwik.JSON.stringify(d) === '"2009-04-18T00:09:00Z"'
+ || Piwik.JSON.stringify(d) === '"2009-04-18T00:09:00.000Z"', 'Date');
- equal( JSON_PIWIK.stringify([1, 2, 3]), '[1,2,3]', 'Array of numbers' );
- equal( JSON_PIWIK.stringify({'key' : 'value'}), '{"key":"value"}', 'Object (members)' );
- equal( JSON_PIWIK.stringify(
+ equal( Piwik.JSON.stringify([1, 2, 3]), '[1,2,3]', 'Array of numbers' );
+ equal( Piwik.JSON.stringify({'key' : 'value'}), '{"key":"value"}', 'Object (members)' );
+ equal( Piwik.JSON.stringify(
[ {'domains' : ['example.com', 'example.ca']},
{'names' : ['Sean', 'Cathy'] } ]
), '[{"domains":["example.com","example.ca"]},{"names":["Sean","Cathy"]}]', 'Nested members' );
equal( typeof eval('('+dummy+')'), 'undefined', 'eval undefined' );
- equal( typeof JSON_PIWIK.parse, 'function', 'JSON.parse function' );
+ equal( typeof Piwik.JSON.parse, 'function', 'JSON.parse function' );
// these throw a SyntaxError
-// equal( typeof JSON_PIWIK.parse('undefined'), 'undefined', 'undefined' );
-// equal( typeof JSON_PIWIK.parse(dummy), 'undefined', 'undefined' );
-// equal( JSON_PIWIK.parse('undefined'), dummy, 'undefined' );
-// equal( JSON_PIWIK.parse('undefined'), undefined, 'undefined' );
+// equal( typeof Piwik.JSON.parse('undefined'), 'undefined', 'undefined' );
+// equal( typeof Piwik.JSON.parse(dummy), 'undefined', 'undefined' );
+// equal( Piwik.JSON.parse('undefined'), dummy, 'undefined' );
+// equal( Piwik.JSON.parse('undefined'), undefined, 'undefined' );
- strictEqual( JSON_PIWIK.parse('null'), null, 'null' );
- strictEqual( JSON_PIWIK.parse('true'), true, 'true' );
- strictEqual( JSON_PIWIK.parse('false'), false, 'false' );
+ strictEqual( Piwik.JSON.parse('null'), null, 'null' );
+ strictEqual( Piwik.JSON.parse('true'), true, 'true' );
+ strictEqual( Piwik.JSON.parse('false'), false, 'false' );
- equal( JSON_PIWIK.parse('0'), 0, 'Number 0' );
- equal( JSON_PIWIK.parse('1'), 1, 'Number 1' );
- equal( JSON_PIWIK.parse('-1'), -1, 'Number -1' );
- equal( JSON_PIWIK.parse('42'), 42, 'Number 42' );
+ equal( Piwik.JSON.parse('0'), 0, 'Number 0' );
+ equal( Piwik.JSON.parse('1'), 1, 'Number 1' );
+ equal( Piwik.JSON.parse('-1'), -1, 'Number -1' );
+ equal( Piwik.JSON.parse('42'), 42, 'Number 42' );
- ok( JSON_PIWIK.parse('1.0') === 1.0
- || JSON_PIWIK.parse('1.0') === 1, 'float 1.0' );
+ ok( Piwik.JSON.parse('1.0') === 1.0
+ || Piwik.JSON.parse('1.0') === 1, 'float 1.0' );
- equal( JSON_PIWIK.parse('1.1'), 1.1, 'float 1.1' );
- equal( JSON_PIWIK.parse('""'), "", 'empty string' );
- equal( JSON_PIWIK.parse('"' + '\\' + '"' + '"'), '"', 'string "' );
- equal( JSON_PIWIK.parse('"\\\\"'), '\\', 'string \\' );
+ equal( Piwik.JSON.parse('1.1'), 1.1, 'float 1.1' );
+ equal( Piwik.JSON.parse('""'), "", 'empty string' );
+ equal( Piwik.JSON.parse('"' + '\\' + '"' + '"'), '"', 'string "' );
+ equal( Piwik.JSON.parse('"\\\\"'), '\\', 'string \\' );
- equal( JSON_PIWIK.parse('"1"'), "1", 'string "1"' );
- equal( JSON_PIWIK.parse('"ABC"'), "ABC", 'string ABC' );
- equal( JSON_PIWIK.parse('"@ABC"'), "\x40\x41\x42\x43", 'Hex string @ABC' );
+ equal( Piwik.JSON.parse('"1"'), "1", 'string "1"' );
+ equal( Piwik.JSON.parse('"ABC"'), "ABC", 'string ABC' );
+ equal( Piwik.JSON.parse('"@ABC"'), "\x40\x41\x42\x43", 'Hex string @ABC' );
- ok( JSON_PIWIK.parse('"您好"') == "\u60a8\u597d"
- && JSON_PIWIK.parse('"\\u60a8\\u597d"') == "您好", 'Unicode string 您好' );
+ ok( Piwik.JSON.parse('"您好"') == "\u60a8\u597d"
+ && Piwik.JSON.parse('"\\u60a8\\u597d"') == "您好", 'Unicode string 您好' );
- ok( JSON_PIWIK.parse('"ßéàêö您好"') == "ßéàêö您好"
- && JSON_PIWIK.parse('"\\u00df\\u00e9\\u00e0\\u00ea\\u00f6\\u60a8\\u597d"') == "ßéàêö您好", 'string non-ASCII text' );
+ ok( Piwik.JSON.parse('"ßéàêö您好"') == "ßéàêö您好"
+ && Piwik.JSON.parse('"\\u00df\\u00e9\\u00e0\\u00ea\\u00f6\\u60a8\\u597d"') == "ßéàêö您好", 'string non-ASCII text' );
- equal( JSON_PIWIK.parse('"20060228T08:00:00"'), "20060228T08:00:00", 'string "20060228T08:00:00"' );
+ equal( Piwik.JSON.parse('"20060228T08:00:00"'), "20060228T08:00:00", 'string "20060228T08:00:00"' );
// these aren't converted back to Date objects
- equal( JSON_PIWIK.parse('"2009-04-18T00:09:00Z"'), "2009-04-18T00:09:00Z", 'string "2009-04-18T00:09:00Z"' );
- equal( JSON_PIWIK.parse('"2009-04-18T00:09:00.000Z"'), "2009-04-18T00:09:00.000Z", 'string "2009-04-18T00:09:00.000Z"' );
+ equal( Piwik.JSON.parse('"2009-04-18T00:09:00Z"'), "2009-04-18T00:09:00Z", 'string "2009-04-18T00:09:00Z"' );
+ equal( Piwik.JSON.parse('"2009-04-18T00:09:00.000Z"'), "2009-04-18T00:09:00.000Z", 'string "2009-04-18T00:09:00.000Z"' );
- deepEqual( JSON_PIWIK.parse('[1,2,3]'), [1, 2, 3], 'Array of numbers' );
- deepEqual( JSON_PIWIK.parse('{"key":"value"}'), {'key' : 'value'}, 'Object (members)' );
- deepEqual( JSON_PIWIK.parse('[{"domains":["example.com","example.ca"]},{"names":["Sean","Cathy"]}]'),
+ deepEqual( Piwik.JSON.parse('[1,2,3]'), [1, 2, 3], 'Array of numbers' );
+ deepEqual( Piwik.JSON.parse('{"key":"value"}'), {'key' : 'value'}, 'Object (members)' );
+ deepEqual( Piwik.JSON.parse('[{"domains":["example.com","example.ca"]},{"names":["Sean","Cathy"]}]'),
[ {'domains' : ['example.com', 'example.ca']}, {'names' : ['Sean', 'Cathy'] } ], 'Nested members' );
});
@@ -1784,7 +1784,7 @@ function PiwikTest() {
});
test("ContentTrackerInternals", function() {
- expect(151);
+ expect(111);
var tracker = Piwik.getTracker();
var actual, expected, trackerUrl;
@@ -1801,7 +1801,7 @@ function PiwikTest() {
message += ', ';
}
- strictEqual(actual.indexOf(expectedStartsWith), 0, message + actual + ' should start with ' + expectedStartsWith);
+ strictEqual(actual.indexOf(expectedStartsWith), 0, message + " " + actual + ' should start with ' + expectedStartsWith);
var expectedString = '&idsite=1&rec=1';
strictEqual(actual.indexOf(expectedString), expectedStartsWith.length, 'did not find ' + expectedString + ' in ' + actual);
@@ -1855,39 +1855,6 @@ function PiwikTest() {
expected = 'c_i=CustomInteraction%3A%2F%2F&c_n=My%20Ad&c_p=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_t=' + originEncoded + '%2Fanylink';
assertTrackingRequest(actual, expected, 'should automatically find parent and search for content from there');
-
- actual = tracker.buildContentInteractionTrackingRedirectUrl();
- strictEqual(actual, undefined, 'nothing set');
-
- actual = tracker.buildContentInteractionTrackingRedirectUrl('/path?a=b');
- assertTrackingRequest(actual, 'matomo.php?redirecturl=' + encodeWrapper(origin + '/path?a=b') + '&c_t=%2Fpath%3Fa%3Db',
- 'should build redirect url including domain when absolute path. Target should also fallback to passed url if not set');
-
- actual = tracker.buildContentInteractionTrackingRedirectUrl('path?a=b');
- assertTrackingRequest(actual, 'matomo.php?redirecturl=' + toEncodedAbsoluteUrl('path?a=b') + '&c_t=path%3Fa%3Db',
- 'should build redirect url including domain when relative path. Target should also fallback to passed url if not set');
-
- actual = tracker.buildContentInteractionTrackingRedirectUrl('#test', 'click', 'name', 'piece', 'target');
- assertTrackingRequest(actual, 'matomo.php?redirecturl=' + toEncodedAbsoluteUrl('#test') + '&c_i=click&c_n=name&c_p=piece&c_t=target', 'all params set');
-
- trackerUrl = tracker.getTrackerUrl();
- tracker.setTrackerUrl('matomo.php?test=1');
-
- actual = tracker.buildContentInteractionTrackingRedirectUrl('#test', 'click', 'name', 'piece', 'target');
- assertTrackingRequest(actual, 'matomo.php?test=1&redirecturl=' + toEncodedAbsoluteUrl('#test') + '&c_i=click&c_n=name&c_p=piece&c_t=target', 'should use & if tracker url already contains question mark');
-
- tracker.setTrackerUrl('matomo.php');
- actual = tracker.buildContentInteractionTrackingRedirectUrl('matomo.php?redirecturl=http://www.example.com', 'click', 'name', 'piece', 'target');
- strictEqual(actual, 'matomo.php?redirecturl=http://www.example.com', 'should return unmodified url if it is already a tracker url so users can set matomo.php link in href');
-
- actual = tracker.buildContentInteractionTrackingRedirectUrl('http://www.example.com', 'click', 'name');
- assertTrackingRequest(actual, 'matomo.php?redirecturl=' + encodeWrapper('http://www.example.com') + '&c_i=click&c_n=name&c_t=http%3A%2F%2Fwww.example.com', 'should not change url if absolute');
-
- actual = tracker.buildContentInteractionTrackingRedirectUrl(origin, 'something', 'name', undefined, 'target');
- assertTrackingRequest(actual, 'matomo.php?redirecturl=' + originEncoded + '&c_i=something&c_n=name&c_t=target', 'should not change url if same domain');
-
- tracker.setTrackerUrl(trackerUrl);
-
ok('test wasContentImpressionAlreadyTracked()');
actual = tracker.wasContentImpressionAlreadyTracked(impression);
strictEqual(actual, false, 'wasContentImpressionAlreadyTracked, content impression was not tracked before');
@@ -1964,16 +1931,10 @@ function PiwikTest() {
actual = (tracker.trackContentImpressionClickInteraction(_s('#ex108')))({target: _s('#ex108')});
assertTrackingRequest(actual, 'c_i=click&c_n=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_p=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_t=http%3A%2F%2Fad.example.com', 'trackContentImpressionClickInteraction, is outlink but should use xhr as link tracking not enabled');
actual = (tracker.trackContentImpressionClickInteraction(_s('#ex109')))({target: _s('#ex109')});
- strictEqual(actual, 'href', 'trackContentImpressionClickInteraction, is internal download but should use href as link tracking not enabled');
- assertTrackingRequest($(_s('#ex109')).attr('href'), 'matomo.php?redirecturl=' + toEncodedAbsoluteUrl('/file.pdf') + '&c_i=click&c_n=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_p=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_t=' + originEncoded + '%2Ffile.pdf', 'trackContentImpressionClickInteraction, the href download link should be replaced with a redirect link to tracker');
+ assertTrackingRequest(actual, 'c_i=click&c_n=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_p=http%3A%2F%2Fwww.example.com%2Fpath%2Fxyz.jpg&c_t='+originEncoded+'%2Ffile.pdf', 'trackContentImpressionClickInteraction, is internal download but should use href as link tracking not enabled');
actual = (tracker.trackContentImpressionClickInteraction(_s('#ex110')))({target: _s('#ex110')});
- strictEqual(actual, 'href', 'trackContentImpressionClickInteraction, should be tracked using redirect');
- assertTrackingRequest($(_s('#ex110')).attr('href'), 'matomo.php?redirecturl=' + toEncodedAbsoluteUrl('/example') + '&c_i=click&c_n=MyName&c_p=img.jpg&c_t=' + originEncoded + '%2Fexample', 'trackContentImpressionClickInteraction, the href link should be replaced with a redirect link to tracker');
-
- actual = (tracker.trackContentImpressionClickInteraction(_s('#ex111')))({target: _s('#ex111')});
- strictEqual(actual, 'href', 'trackContentImpressionClickInteraction, should detect it is a link to same page');
- strictEqual($(_s('#ex111')).attr('href'), 'matomo.php?xyz=makesnosense', 'trackContentImpressionClickInteraction, a tracking link should not be changed');
+ assertTrackingRequest(actual, 'c_i=click&c_n=MyName&c_p=img.jpg&c_t=' + originEncoded + '%2Fexample', 'trackContentImpressionClickInteraction, should be tracked using redirect');
actual = (tracker.trackContentImpressionClickInteraction(_s('#ex112')))({target: _s('#ex112')});
assertTrackingRequest(actual, 'c_i=click&c_n=img.jpg&c_p=img.jpg&c_t=' + toEncodedAbsoluteUrl('#example'), 'trackContentImpressionClickInteraction, a link that is an anchor should be tracked as XHR and no redirect');
@@ -2082,47 +2043,6 @@ function PiwikTest() {
strictEqual(actual.length, 1, 'getVisibleImpressions, two hidden ones before a visible ones to make sure removing hidden content block from array works and does not ignore one');
assertTrackingRequest(actual[0], 'c_n=' + toEncodedAbsolutePath('img115.jpg') + '&c_p=' + toEncodedAbsoluteUrl('img115.jpg') + '&c_t=http%3A%2F%2Fwww.example.com');
-
- ok('test replaceHrefIfInternalLink()')
-
- var trackerUrl = tracker.getTrackerUrl();
- tracker.setTrackerUrl('matomo.php');
-
- strictEqual(tracker.replaceHrefIfInternalLink(), false, 'no content node set');
- strictEqual(tracker.replaceHrefIfInternalLink(_s('#ex117')), false, 'should be ignored');
- $(_s('#ignoreInternalLink')).removeClass('piwikContentIgnoreInteraction'); // now it should be no longer ignored and as it is an intenral link replaced
- strictEqual(tracker.replaceHrefIfInternalLink(_s('#ex117')), true, 'should be replaced as is internal link');
- assertTrackingRequest($(_s('#ignoreInternalLink')).attr('href'), 'matomo.php?redirecturl=' + toEncodedAbsoluteUrl('/internallink') + '&c_i=click&c_n=Unknown&c_p=Unknown&c_t=' + originEncoded + '%2Finternallink', 'internal link should be replaced');
- strictEqual($(_s('#ignoreInternalLink')).attr('data-content-target'), origin + '/internallink', 'we need to set data-content-target when link is set otherwise a replace would not be found');
-
- strictEqual(tracker.replaceHrefIfInternalLink(_s('#ex122')), true, 'should be replaced');
- strictEqual($(_s('#replacedLinkWithTarget')).attr('data-content-target'), '/test', 'should replace href but not a data-content-target if already exists');
-
- strictEqual(tracker.replaceHrefIfInternalLink(_s('#ex118')), true, 'should not replace already replaced link');
- strictEqual($(_s('#ex118')).attr('href'), 'matomo.php?test=5', 'link should not be replaced');
-
- strictEqual(tracker.replaceHrefIfInternalLink(_s('#ex119')), false, 'anchor link should not be replaced');
- strictEqual($(_s('#ex119')).attr('href'), '#test', 'link should not replace anchor link');
-
- strictEqual(tracker.replaceHrefIfInternalLink(_s('#ex120')), false, 'external link should not be replaced');
- strictEqual($(_s('#ex120')).attr('href'), 'http://www.example.com', 'should not replace external link');
-
- strictEqual(tracker.replaceHrefIfInternalLink(_s('#ex121')), true, 'should replace download link if link tracking not enabled');
- assertTrackingRequest($(_s('#ex121')).attr('href'), 'matomo.php?redirecturl=' + toEncodedAbsoluteUrl('/download.pdf') + '&c_i=click&c_n=Unknown&c_p=Unknown&c_t=' + originEncoded + '%2Fdownload.pdf', 'should replace download link as link tracking disabled');
-
- $(_s('#ex121')).attr('href', '/download.pdf'); // reset link
- tracker.enableLinkTracking();
-
- strictEqual(tracker.replaceHrefIfInternalLink(_s('#ex121')), false, 'should not replace download link');
- strictEqual($(_s('#ex121')).attr('href'), '/download.pdf', 'should not replace download link');
-
- strictEqual(tracker.replaceHrefIfInternalLink(_s('#ex123')), false, 'should not replace a link that has no href');
- strictEqual($(_s('#ex123')).attr('href'), undefined, 'should still not have a href attribute');
-
-
-
- tracker.setTrackerUrl(trackerUrl);
-
removeContentTrackingFixture();
});
@@ -2149,7 +2069,7 @@ function PiwikTest() {
});
test("API methods", function() {
- expect(110);
+ expect(111);
equal( typeof Piwik.addPlugin, 'function', 'addPlugin' );
equal( typeof Piwik.addPlugin, 'function', 'addTracker' );
@@ -2193,6 +2113,7 @@ function PiwikTest() {
equal( typeof tracker.setLinkTrackingTimer, 'function', 'setLinkTrackingTimer' );
equal( typeof tracker.getLinkTrackingTimer, 'function', 'getLinkTrackingTimer' );
equal( typeof tracker.alwaysUseSendBeacon, 'function', 'alwaysUseSendBeacon' );
+ equal( typeof tracker.disableAlwaysUseSendBeacon, 'function', 'disableAlwaysUseSendBeacon' );
equal( typeof tracker.setDownloadExtensions, 'function', 'setDownloadExtensions' );
equal( typeof tracker.addDownloadExtensions, 'function', 'addDownloadExtensions' );
equal( typeof tracker.removeDownloadExtensions, 'function', 'removeDownloadExtensions' );
@@ -4789,7 +4710,7 @@ if ($mysql) {
});
test("trackingContentInteractionInteractive", function() {
- expect(18);
+ expect(15);
function assertTrackingRequest(actual, expectedStartsWith, message)
{
@@ -4873,20 +4794,6 @@ if ($mysql) {
var token5 = '5' + token;
resetTracker(tracker, token5);
preventClickDefault('#internalLink');
- var expectedLink = toAbsoluteUrl('matomo.php') + '?redirecturl=' + toEncodedAbsoluteUrl('/anylink5') + '&c_i=click&c_n=My%20Ad%205&c_p=http%3A%2F%2Fimg5.example.com%2Fpath%2Fxyz.jpg&c_t=' + originEncoded + '%2Fanylink5&idsite=1&rec=1';
- var newHref = _s('#internalLink').href;
- strictEqual(0, newHref.indexOf(expectedLink), 'replaced href is replaced: ' + newHref); // make sure was already replace by trackContentImpressions()
- strictEqual(_s('#internalLink').wasContentTargetAttrReplaced, true, 'has to be marked as replaced so we know we have to update content target again in case the url changes meanwhile');
- // now we are going to change the link to see whether it will be replaced again
- tracker.getContent().setHrefAttribute(_s('#internalLink'), '/newlink');
-
- wait(300);
-
- triggerEvent(_s('#internalLink'), 'click'); // should replace href php
- newHref = _s('#internalLink').href;
- expectedLink = toAbsoluteUrl('matomo.php') + '?redirecturl=' + toEncodedAbsoluteUrl('/newlink') + '&c_i=click&c_n=My%20Ad%205&c_p=http%3A%2F%2Fimg5.example.com%2Fpath%2Fxyz.jpg&c_t=' + originEncoded + '%2Fnewlink&idsite=1&rec=1';
- strictEqual(0, newHref.indexOf(expectedLink), 'replaced href2 is replaced again: ' + newHref); // make sure was already replace by trackContentImpressions()
-
wait(300);
stop();
diff --git a/tests/lib/screenshot-testing/support/app.js b/tests/lib/screenshot-testing/support/app.js
index 1290ac4b81..ba809d1e71 100644
--- a/tests/lib/screenshot-testing/support/app.js
+++ b/tests/lib/screenshot-testing/support/app.js
@@ -236,10 +236,17 @@ Application.prototype.loadTestModules = function () {
message += "\n" + indent + indent + "Url to reproduce: " + url + "\n";
if (message.indexOf('Generated screenshot') === -1) {
- if (!fs.existsSync(path.join(PIWIK_INCLUDE_PATH, 'tests/UI/processed-ui-screenshots'))) {
- fsExtra.mkdirsSync(path.join(PIWIK_INCLUDE_PATH, 'tests/UI/processed-ui-screenshots'));
+
+ var processedPath = path.join(PIWIK_INCLUDE_PATH, 'tests/UI/processed-ui-screenshots');
+
+ if (options.plugin) {
+ processedPath = path.join(PIWIK_INCLUDE_PATH, 'plugins', options.plugin, 'tests/UI/processed-ui-screenshots');
+ }
+
+ if (!fs.existsSync(processedPath)) {
+ fsExtra.mkdirsSync(processedPath);
}
- const failurePath = path.join(PIWIK_INCLUDE_PATH, 'tests/UI/processed-ui-screenshots', test.title.replace(/(\s|[^a-zA-Z0-9_])+/g, '_') + '_failure.png');
+ const failurePath = path.join(processedPath, test.title.replace(/(\s|[^a-zA-Z0-9_])+/g, '_') + '_failure.png');
message += indent + indent + "Screenshot of failure: " + failurePath + "\n";
diff --git a/tests/lib/screenshot-testing/support/test-environment.js b/tests/lib/screenshot-testing/support/test-environment.js
index 5034673c05..28499420de 100644
--- a/tests/lib/screenshot-testing/support/test-environment.js
+++ b/tests/lib/screenshot-testing/support/test-environment.js
@@ -190,8 +190,8 @@ TestingEnvironment.prototype.setupFixture = function (fixtureClass, done) {
args.push('--plugins=' + options['plugin']);
}
- if (options['piwik-domain'] || options['matomo-domain']) {
- args.push('--piwik-domain=' + (options['piwik-domain'] || options['matomo-domain']));
+ if (options['matomo-domain']) {
+ args.push('--matomo-domain=' + options['matomo-domain']);
}
if (options['enable-logging']) {
@@ -258,8 +258,8 @@ TestingEnvironment.prototype.teardownFixture = function (fixtureClass, done) {
var args = [fixtureClass || DEFAULT_UI_TEST_FIXTURE_NAME, "--teardown", '--server-global=' + JSON.stringify(config.phpServer)];
- if (options['piwik-domain']) {
- args.push('--piwik-domain=' + options['piwik-domain']);
+ if (options['matomo-domain']) {
+ args.push('--matomo-domain=' + options['matomo-domain']);
}
this.executeConsoleCommand('tests:setup-fixture', args, function (code) {
diff --git a/tests/resources/MatomoDummyClass.php b/tests/resources/MatomoDummyClass.php
new file mode 100644
index 0000000000..5ca637c4b6
--- /dev/null
+++ b/tests/resources/MatomoDummyClass.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace Matomo;
+
+class DummyClass {
+
+} \ No newline at end of file
diff --git a/tests/resources/custompluginsdir/CustomDirPlugin/plugin.json b/tests/resources/custompluginsdir/CustomDirPlugin/plugin.json
index 2d4b3c19a2..ab0ee06dc5 100644
--- a/tests/resources/custompluginsdir/CustomDirPlugin/plugin.json
+++ b/tests/resources/custompluginsdir/CustomDirPlugin/plugin.json
@@ -4,7 +4,7 @@
"version": "0.1.0",
"theme": false,
"require": {
- "piwik": ">=3.8.1-stable,<4.0.0-b1"
+ "piwik": ">=4.0.0-b1,<5.0.0-b1"
},
"authors": [
{
diff --git a/tests/resources/custompluginsdir/CustomDirPlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php b/tests/resources/custompluginsdir/CustomDirPlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php
index f5d58969d0..0e347b16e4 100644
--- a/tests/resources/custompluginsdir/CustomDirPlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php
+++ b/tests/resources/custompluginsdir/CustomDirPlugin/tests/Fixtures/SimpleFixtureTrackFewVisits.php
@@ -14,12 +14,12 @@ class SimpleFixtureTrackFewVisits extends Fixture
public $dateTime = '2013-01-23 01:23:45';
public $idSite = 1;
- public function setUp()
+ public function setUp(): void
{
$this->setUpWebsite();
}
- public function tearDown()
+ public function tearDown(): void
{
// empty
}
diff --git a/tests/resources/custompluginsdir/CustomDirPlugin/tests/Integration/SystemSettingsTest.php b/tests/resources/custompluginsdir/CustomDirPlugin/tests/Integration/SystemSettingsTest.php
index 3e9537b85a..a930a56798 100644
--- a/tests/resources/custompluginsdir/CustomDirPlugin/tests/Integration/SystemSettingsTest.php
+++ b/tests/resources/custompluginsdir/CustomDirPlugin/tests/Integration/SystemSettingsTest.php
@@ -23,7 +23,7 @@ class SystemSettingsTest extends IntegrationTestCase
*/
private $settings;
- public function setUp()
+ public function setUp(): void
{
parent::setUp();
diff --git a/tests/resources/custompluginsdir/CustomDirPlugin/tests/Unit/CustomClassTest.php b/tests/resources/custompluginsdir/CustomDirPlugin/tests/Unit/CustomClassTest.php
index c9454dd109..00c6b06f7f 100644
--- a/tests/resources/custompluginsdir/CustomDirPlugin/tests/Unit/CustomClassTest.php
+++ b/tests/resources/custompluginsdir/CustomDirPlugin/tests/Unit/CustomClassTest.php
@@ -14,14 +14,14 @@ use Piwik\Plugins\CustomDirPlugin\CustomClass;
* @group CustomClassTest
* @group Plugins
*/
-class CustomClassTest extends \PHPUnit_Framework_TestCase
+class CustomClassTest extends \PHPUnit\Framework\TestCase
{
- public function setUp()
+ public function setUp(): void
{
// set up here if needed
}
- public function tearDown()
+ public function tearDown(): void
{
// tear down here if needed
}