WP Security Audit Log - Version 4.1.4

Version Description

(2020-10-07) =

Release notes: WP Activity Log 4.1.4: New activity log for Yoast SEO extenion & improved coverage

  • New features

    • Activity Log for Yoast SEO extension.
    • Plugin detects plugin updates done via a zip file (new feature in WordPress 5.5)
  • New Yoast SEO activity log event IDs

    • ID 8826: user has enabled / disabled the Redirect Attachment URLs in the Yoast SEO plugin.
    • ID 8827: Usage tracking has been enabled / dsabled.
    • ID 8828: The REST API: head endpoint setting was enabled / disabled.
    • ID 8829: The social profile URL was added / modified / deleted.
    • ID 8830: User changed the taxonomies settings to show in search results.
    • ID 8831: Chaged the SEO title template for a taxonomy type.
    • ID 8832: Changed the meta description template for a taxonomy type.
    • ID 8833: Enabled or disabled the display of Author or Date archives.
    • ID 8834: Configured the plugin to show the Author or Date archived in the search results.
    • ID 8835: Changed the SEO title template for the Author or Date archive pages.
    • ID 8836: Changed the Meta description template for the Author or Date archive pages.
    • ID 8837: Enabled / disabled the setting to show SEO settings for specific taxonomy types.

Refer to the complete list of activity log event IDs for more detailed information.

  • Improvements

    • Improved the overall coverage and how events of changes in Yoast SEO plugin and YoastSEO metabox are reported.
    • Implemented a single email class that is now used by all email features in the plugin.
    • Updated Freemius SDK to the latest version (2.4.0).
    • Improved the detection mechanism of installed third party plugins used for the activity log extensions notifications.
    • Consolidated all activity log extensions code - now all third party plugins extensions use the same code.
    • Improved the plugin's activation process on multisite network.
    • Plugin only shows file changes notifications if the Website File Changes Monitor plugin is installed.
    • Plugin prompts user to save unsaved changes in settings page before switching pages.
    • Improved plugin & activity log permissions on multisite network.
    • System information file updated to retrieve settings from the wp_options table.
    • Removed all the obsolete event IDs from the Enable/Disable events section.
    • Updated a number of filters/hooks calls that were calling deprecated ones.
    • Removed all the obsolete code which was used for the old wp_wsal_options table.
    • The handling of disabled event IDs is now done more efficiently, via filters.
    • Improved the session db adaptor which was causing errors in specific edge cases.
    • Branded the notifications for third party plugins extensions and improved the text.
    • Improved the first-time install wizard CSS to correctly display the list of required extensions for third party plugins.
    • Removed event ID 2106 (plugin updated post) and ID 8823 (Yoast SEO date snippet) because they were made redundant.
    • Moved all remaining bbPress code to the Activity Log for bbPress extension.
    • Added check to prevent identical search filters from being saved.
  • Bug fixes

    • Removed the old version check from the wp_wsal_options table.
    • Reset plugin settings was not deleting all the settings.
    • Reports UI was not loading in a mixed content environment.
    • Unkown object was reported in event ID 6034 (user purged activity log).
    • Custom login page message was not shown in specific edge cases.
    • Addressed a number of errors that were appearing during WooCommerce setup.
    • List of IP addresses in event ID 1005 (users has multiple logged in sessions) was incorrect.
    • Plugin was generating an error when changing the WooCommerce store address on a multisite network.
    • Event ID 1000 reported twice on websites using the OptimizeMember plugin.
    • Third party plugins detection was not detecting all plugins on multisite network.
    • Built-in email notifications couldn't be disabled after they were enabled.
    • Notifications to install third party plugin extensions were shown in sub sites on a multisite network.
    • Event ID 1000 (user login) was reported even when user was excluded from the logs.
    • Data picker obscured by autocomplete in notifications.
    • Fixed conflict with MyCred plugin (widget sensor was killing ongoing widget requests).

Refer to the complete plugin changelog for more detailed information about what was new, improved and fixed in previous versions of the WP Activity Log plugin.

Download this release

Release Info

Developer WPWhiteSecurity
Plugin Icon 128x128 WP Security Audit Log
Version 4.1.4
Comparing to
See all releases

Code changes from version 4.1.3.2 to 4.1.4

Files changed (50) hide show
  1. classes/Adapters/MySQL/OptionAdapter.php +0 -204
  2. classes/AlertManager.php +24 -10
  3. classes/Connector/MySQLDB.php +0 -6
  4. classes/Helpers/Options.php +1 -6
  5. classes/Models/Occurrence.php +4 -12
  6. classes/Models/Option.php +0 -199
  7. classes/Sensors/Content.php +49 -10
  8. classes/Sensors/Database.php +36 -4
  9. classes/Sensors/LogInOut.php +11 -2
  10. classes/Sensors/MainWP.php +419 -0
  11. classes/Sensors/Menus.php +12 -10
  12. classes/Sensors/MetaData.php +0 -8
  13. classes/Sensors/PluginsThemes.php +82 -884
  14. classes/Sensors/System.php +17 -29
  15. classes/Sensors/UserProfile.php +0 -1
  16. classes/Sensors/Widgets.php +4 -4
  17. classes/Sensors/YoastSEO.php +0 -823
  18. classes/Settings.php +13 -49
  19. classes/ThirdPartyExtensions/AbstractExtension.php +25 -0
  20. classes/ThirdPartyExtensions/BBPressExtension.php +39 -0
  21. classes/ThirdPartyExtensions/GravityFormsExtension.php +38 -0
  22. classes/ThirdPartyExtensions/WPFormsExtension.php +39 -0
  23. classes/ThirdPartyExtensions/WooCommerceExtension.php +69 -0
  24. classes/ThirdPartyExtensions/YoastSeoExtension.php +48 -0
  25. classes/Uninstall.php +28 -32
  26. classes/Update/Task/MoveSettingsToOptionsTable.php +0 -227
  27. classes/Utilities/Emailer.php +7 -4
  28. classes/Utilities/PluginInstallAndActivate.php +8 -33
  29. classes/Utilities/PluginInstallerAction.php +2 -2
  30. classes/Utilities/RequestUtils.php +25 -0
  31. classes/ViewManager.php +23 -5
  32. classes/Views/AuditLog.php +154 -126
  33. classes/Views/Help.php +1 -1
  34. classes/Views/Settings.php +60 -67
  35. classes/Views/SetupWizard.php +23 -20
  36. classes/Views/ToggleAlerts.php +37 -35
  37. classes/WidgetManager.php +2 -2
  38. css/auditlog.css +23 -0
  39. css/dist/{wsal-wizard.build.css → wsal-wizard.css} +16 -45
  40. css/dist/wsal-wizard.min.css +1 -0
  41. css/src/wsal-wizard.scss +16 -0
  42. defaults.php +4 -41
  43. img/addons/gravityforms.png +0 -0
  44. js/auditlog.js +22 -2
  45. js/dist/wsal-wizard.js +42 -10539
  46. js/dist/wsal-wizard.min.js +1 -39
  47. js/settings.js +46 -7
  48. js/src/wsal-wizard.js +0 -7
  49. languages/wp-security-audit-log.pot +2901 -5011
  50. readme.txt +58 -74
classes/Adapters/MySQL/OptionAdapter.php DELETED
@@ -1,204 +0,0 @@
1
- <?php
2
- /**
3
- * Adapter: Option.
4
- *
5
- * MySQL database Option class.
6
- *
7
- * @package Wsal
8
- */
9
-
10
- // Exit if accessed directly.
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- /**
16
- * MySQL database Option class.
17
- *
18
- * MySQL wsal_options table used for to store the plugin settings and Add-Ons settings.
19
- *
20
- * @package Wsal
21
- */
22
- class WSAL_Adapters_MySQL_Option extends WSAL_Adapters_MySQL_ActiveRecord {
23
-
24
- /**
25
- * Contains the table name.
26
- *
27
- * @var string
28
- */
29
- protected $_table = 'wsal_options';
30
-
31
- /**
32
- * Contains primary key column name, override as required.
33
- *
34
- * @var string
35
- */
36
- protected $_idkey = 'id';
37
-
38
- /**
39
- * Option id.
40
- *
41
- * @var int
42
- */
43
- public $id = 0;
44
-
45
- /**
46
- * Option name.
47
- *
48
- * @var string
49
- */
50
- public $option_name = '';
51
-
52
- /**
53
- * Option name max length.
54
- *
55
- * @var int
56
- */
57
- public static $option_name_maxlength = 100;
58
-
59
- /**
60
- * Option value.
61
- *
62
- * @var mixed
63
- */
64
- public $option_value = '';
65
-
66
- /**
67
- * Method: Constructor.
68
- *
69
- * @param array $conn - Connection array.
70
- */
71
- public function __construct( $conn ) {
72
- parent::__construct( $conn );
73
- }
74
-
75
- /**
76
- * Returns the model class for adapter.
77
- *
78
- * @return WSAL_Models_Occurrence
79
- */
80
- public function GetModel() {
81
- return new WSAL_Models_Option();
82
- }
83
-
84
- /**
85
- * Get option by name.
86
- *
87
- * @param string $name - Option name.
88
- * @return string|null - Option value.
89
- */
90
- public function GetNamedOption( $name ) {
91
- if ( $this->IsInstalled() ) {
92
- return $this->Load( 'option_name = %s', array( $name ) );
93
- } else {
94
- return null;
95
- }
96
- }
97
-
98
- /**
99
- * Get options by prefix (notifications stored in json format).
100
- *
101
- * @param string $opt_prefix - Prefix.
102
- * @return array|null - Options.
103
- */
104
- public function GetNotificationsSetting( $opt_prefix ) {
105
- if ( $this->IsInstalled() ) {
106
- return $this->LoadArray( 'option_name LIKE %s', array( $opt_prefix . '%' ) );
107
- } else {
108
- return null;
109
- }
110
- }
111
-
112
- /**
113
- * Get option by id (notifications stored in json format).
114
- *
115
- * @param int $id - Option ID.
116
- * @return string|null - Option.
117
- */
118
- public function GetNotification( $id ) {
119
- if ( $this->IsInstalled() ) {
120
- return $this->Load( 'id = %d', array( $id ) );
121
- } else {
122
- return null;
123
- }
124
- }
125
-
126
- /**
127
- * Delete option by name.
128
- *
129
- * @param string $name - Option name.
130
- * @return boolean.
131
- */
132
- public function DeleteByName( $name ) {
133
- if ( ! empty( $name ) ) {
134
- $sql = 'DELETE FROM ' . $this->GetTable() . " WHERE option_name = '" . $name . "'";
135
- // Execute query.
136
- return parent::DeleteQuery( $sql );
137
- } else {
138
- return false;
139
- }
140
- }
141
-
142
- /**
143
- * Delete options start with prefix.
144
- *
145
- * @param string $opt_prefix - Prefix.
146
- * @return boolean.
147
- */
148
- public function DeleteByPrefix( $opt_prefix ) {
149
- if ( ! empty( $opt_prefix ) ) {
150
- $sql = 'DELETE FROM ' . $this->GetTable() . " WHERE option_name LIKE '" . $opt_prefix . "%'";
151
- // Execute query.
152
- return parent::DeleteQuery( $sql );
153
- } else {
154
- return false;
155
- }
156
- }
157
-
158
- /**
159
- * Number of options start with prefix.
160
- *
161
- * @param string $opt_prefix - Prefix.
162
- * @return integer Indicates the number of items.
163
- */
164
- public function CountNotifications( $opt_prefix ) {
165
- $_wpdb = $this->connection;
166
- $sql = 'SELECT COUNT(id) FROM ' . $this->GetTable() . " WHERE option_name LIKE '" . $opt_prefix . "%'";
167
- return (int) $_wpdb->get_var( $sql );
168
- }
169
-
170
- /**
171
- * Create relevant indexes on the option table.
172
- */
173
- public function create_indexes() {
174
- $db_connection = $this->get_connection();
175
- // check if an index exists.
176
- if ( $db_connection->query( 'SELECT COUNT(1) IndexIsThere FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema=DATABASE() AND table_name="' . $this->GetTable() . '" AND index_name="option_name"' ) ) {
177
- // query succeeded, does index exist?
178
- $index_exists = ( isset( $db_connection->last_result[0]->IndexIsThere ) ) ? $db_connection->last_result[0]->IndexIsThere : false;
179
- }
180
- // if no index exists then make one.
181
- if ( ! $index_exists ) {
182
- $db_connection->query( 'CREATE INDEX option_name ON ' . $this->GetTable() . ' (option_name)' );
183
- }
184
- }
185
-
186
- /**
187
- * Renames option,
188
- *
189
- * @param $old_name
190
- * @param $new_name
191
- *
192
- * @return false|int
193
- * @since 4.1.3
194
- */
195
- public function Rename( $old_name, $new_name ) {
196
- return parent::UpdateQuery(
197
- $this->GetTable(), [
198
- 'option_name' => $new_name
199
- ], [
200
- 'option_name' => $old_name
201
- ]
202
- );
203
- }
204
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/AlertManager.php CHANGED
@@ -321,8 +321,17 @@ final class WSAL_AlertManager {
321
  * @param callable $cond - A future condition callback (receives an object of type WSAL_AlertManager as parameter).
322
  */
323
  public function TriggerIf( $type, $data, $cond = null ) {
324
- $username = wp_get_current_user()->user_login;
325
- $roles = $this->plugin->settings()->GetCurrentUserRoles();
 
 
 
 
 
 
 
 
 
326
 
327
  if ( $this->CheckEnableUserRoles( $username, $roles ) ) {
328
  $this->_pipeline[] = array(
@@ -381,12 +390,17 @@ final class WSAL_AlertManager {
381
  * Method: True if at the end of request an alert of this type will be triggered.
382
  *
383
  * @param integer $type - Alert type ID.
 
384
  * @return boolean
385
  */
386
- public function WillTrigger( $type ) {
 
387
  foreach ( $this->_pipeline as $item ) {
388
  if ( $item['type'] == $type ) {
389
- return true;
 
 
 
390
  }
391
  }
392
  return false;
@@ -396,10 +410,11 @@ final class WSAL_AlertManager {
396
  * Method: True if an alert has been or will be triggered in this request, false otherwise.
397
  *
398
  * @param int $type - Alert type ID.
 
399
  * @return boolean
400
  */
401
- public function WillOrHasTriggered( $type ) {
402
- return in_array( $type, $this->_triggered_types ) || $this->WillTrigger( $type );
403
  }
404
 
405
  /**
@@ -862,7 +877,7 @@ final class WSAL_AlertManager {
862
  */
863
  public function log_temp_alerts() {
864
  // Get temporary alerts.
865
- $temp_alerts = $this->plugin->GetGlobalSetting('temp_alerts', array() );
866
 
867
  if ( empty( $temp_alerts ) ) {
868
  return;
@@ -1116,14 +1131,13 @@ final class WSAL_AlertManager {
1116
  'system-setting' => __( 'System Setting', 'wp-security-audit-log' ),
1117
  'mainwp-network' => __( 'MainWP Network', 'wp-security-audit-log' ),
1118
  'mainwp' => __( 'MainWP', 'wp-security-audit-log' ),
1119
- 'yoast-seo' => __( 'Yoast SEO', 'wp-security-audit-log' ),
1120
- 'yoast-seo-metabox' => __( 'Yoast SEO Meta Box', 'wp-security-audit-log' ),
1121
  'category' => __( 'Category', 'wp-security-audit-log' ),
1122
  'custom-field' => __( 'Custom Field', 'wp-security-audit-log' ),
1123
  'widget' => __( 'Widget', 'wp-security-audit-log' ),
1124
  'menu' => __( 'Menu', 'wp-security-audit-log' ),
1125
  'theme' => __( 'Theme', 'wp-security-audit-log' ),
1126
- 'activity-logs' => __( 'Activity Logs', 'wp-security-audit-log' ),
 
1127
  'multisite-network' => __( 'Multisite Network', 'wp-security-audit-log' ),
1128
  'ip-address' => __( 'IP Address', 'wp-security-audit-log' ),
1129
  );
321
  * @param callable $cond - A future condition callback (receives an object of type WSAL_AlertManager as parameter).
322
  */
323
  public function TriggerIf( $type, $data, $cond = null ) {
324
+ $username = null;
325
+ $roles = [];
326
+ if ( 1000 === $type ) {
327
+ // when event 1000 is triggered, the user is not logged in
328
+ // we need to extract the username and user roles from the event data
329
+ $username = array_key_exists( 'Username', $data ) ? $data['Username'] : null;
330
+ $roles = array_key_exists( 'CurrentUserRoles', $data ) ? $data['CurrentUserRoles'] : [];
331
+ } else {
332
+ $username = wp_get_current_user()->user_login;
333
+ $roles = $this->plugin->settings()->GetCurrentUserRoles();
334
+ }
335
 
336
  if ( $this->CheckEnableUserRoles( $username, $roles ) ) {
337
  $this->_pipeline[] = array(
390
  * Method: True if at the end of request an alert of this type will be triggered.
391
  *
392
  * @param integer $type - Alert type ID.
393
+ * @param int $count - A minimum number of event occurrences.
394
  * @return boolean
395
  */
396
+ public function WillTrigger( $type, $count = 1 ) {
397
+ $number_found = 0;
398
  foreach ( $this->_pipeline as $item ) {
399
  if ( $item['type'] == $type ) {
400
+ $number_found++;
401
+ if ($count == 1 || $number_found == $count) {
402
+ return true;
403
+ }
404
  }
405
  }
406
  return false;
410
  * Method: True if an alert has been or will be triggered in this request, false otherwise.
411
  *
412
  * @param int $type - Alert type ID.
413
+ * @param int $count - A minimum number of event occurrences.
414
  * @return boolean
415
  */
416
+ public function WillOrHasTriggered( $type, $count = 1 ) {
417
+ return in_array( $type, $this->_triggered_types ) || $this->WillTrigger( $type, $count );
418
  }
419
 
420
  /**
877
  */
878
  public function log_temp_alerts() {
879
  // Get temporary alerts.
880
+ $temp_alerts = $this->plugin->GetGlobalSetting( 'temp_alerts', array() );
881
 
882
  if ( empty( $temp_alerts ) ) {
883
  return;
1131
  'system-setting' => __( 'System Setting', 'wp-security-audit-log' ),
1132
  'mainwp-network' => __( 'MainWP Network', 'wp-security-audit-log' ),
1133
  'mainwp' => __( 'MainWP', 'wp-security-audit-log' ),
 
 
1134
  'category' => __( 'Category', 'wp-security-audit-log' ),
1135
  'custom-field' => __( 'Custom Field', 'wp-security-audit-log' ),
1136
  'widget' => __( 'Widget', 'wp-security-audit-log' ),
1137
  'menu' => __( 'Menu', 'wp-security-audit-log' ),
1138
  'theme' => __( 'Theme', 'wp-security-audit-log' ),
1139
+ 'activity-log' => __( 'Activity log', 'wp-security-audit-log' ),
1140
+ 'wp-activity-log' => __( 'WP Activity Log', 'wp-security-audit-log' ),
1141
  'multisite-network' => __( 'Multisite Network', 'wp-security-audit-log' ),
1142
  'ip-address' => __( 'IP Address', 'wp-security-audit-log' ),
1143
  );
classes/Connector/MySQLDB.php CHANGED
@@ -36,7 +36,6 @@ class WSAL_Connector_MySQLDB extends WSAL_Connector_AbstractConnector implements
36
  public function __construct( $connection_config = null ) {
37
  $this->connectionConfig = $connection_config;
38
  parent::__construct( 'MySQL' );
39
- require_once $this->getAdaptersDirectory() . '/OptionAdapter.php';
40
  }
41
 
42
  /**
@@ -191,11 +190,6 @@ class WSAL_Connector_MySQLDB extends WSAL_Connector_AbstractConnector implements
191
  continue;
192
  }
193
 
194
- if ( $is_external_database && $class instanceof WSAL_Adapters_MySQL_Option ) {
195
- // options table should only ever exist only in local database
196
- continue;
197
- }
198
-
199
  if ( ! $is_external_database && $class instanceof WSAL_Adapters_MySQL_TmpUser ) {
200
  // exclude the tmp_users table for local database
201
  continue;
36
  public function __construct( $connection_config = null ) {
37
  $this->connectionConfig = $connection_config;
38
  parent::__construct( 'MySQL' );
 
39
  }
40
 
41
  /**
190
  continue;
191
  }
192
 
 
 
 
 
 
193
  if ( ! $is_external_database && $class instanceof WSAL_Adapters_MySQL_TmpUser ) {
194
  // exclude the tmp_users table for local database
195
  continue;
classes/Helpers/Options.php CHANGED
@@ -101,11 +101,6 @@ class Options {
101
  }
102
 
103
  $actual_option_name = $option_name;
104
- if (preg_match( '/\A' .preg_quote(\WpSecurityAuditLog::OPT_PRFX) . '/', $option_name)) {
105
- // remove legacy prefix
106
- $actual_option_name = substr($option_name, strlen(\WpSecurityAuditLog::OPT_PRFX));
107
- }
108
-
109
  if (!preg_match( '/\A' .preg_quote($this->prefix) . '/', $option_name)) {
110
  // prepend prefix if not already present
111
  $actual_option_name = $this->prefix . $option_name;
@@ -148,7 +143,7 @@ class Options {
148
  public function GetNotificationsSetting( $opt_prefix ) {
149
  global $wpdb;
150
  $prepared_query = $wpdb->prepare(
151
- "SELECT * FROM {$wpdb->options} WHERE option_name LIKE %s;",
152
  $opt_prefix . '%%'
153
  );
154
  return $wpdb->get_results($prepared_query);
101
  }
102
 
103
  $actual_option_name = $option_name;
 
 
 
 
 
104
  if (!preg_match( '/\A' .preg_quote($this->prefix) . '/', $option_name)) {
105
  // prepend prefix if not already present
106
  $actual_option_name = $this->prefix . $option_name;
143
  public function GetNotificationsSetting( $opt_prefix ) {
144
  global $wpdb;
145
  $prepared_query = $wpdb->prepare(
146
+ "SELECT * FROM {$wpdb->base_prefix}options WHERE option_name LIKE %s;",
147
  $opt_prefix . '%%'
148
  );
149
  return $wpdb->get_results($prepared_query);
classes/Models/Occurrence.php CHANGED
@@ -196,23 +196,15 @@ class WSAL_Models_Occurrence extends WSAL_Models_ActiveRecord {
196
  * @since 4.0.2
197
  */
198
  $addon_event_codes = array(
199
- 'wpforms' => array(
200
- 'name' => __( 'WPForms', 'wp-security-audit-log' ),
201
- 'event_ids' => array( 5500, 5501, 5502, 5503, 5504, 5505, 5506 ),
202
- ),
203
- 'bbpress' => array(
204
- 'name' => __( 'BBPress', 'wp-security-audit-log' ),
205
- 'event_ids' => array( 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 8020, 8021, 8022, 8023 ),
206
- ),
207
- 'woocommerce' => array(
208
- 'name' => __( 'WooCommerce', 'wp-security-audit-log' ),
209
- 'event_ids' => array( 9000, 9001, 9003, 9004, 9005, 9006, 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 9015, 9072, 9073, 9077, 9016, 9017, 9018, 9019, 9020, 9021, 9022, 9023, 9024, 9025, 9026, 9042, 9043, 9044, 9045, 9046, 9105, 9047, 9048, 9049, 9050, 9051, 9027, 9028, 9029, 9030, 9031, 9032, 9033, 9034, 9085, 9086, 9087, 9088, 9089, 9090, 9091, 9092, 9093, 9094, 9074, 9075, 9076, 9078, 9079, 9080, 9081, 9082, 9002, 9052, 9053, 9054, 9055, 9056, 9057, 9058, 9059, 9060, 9061, 9062, 9063, 9064, 9065, 9066, 9067, 9068, 9069, 9070, 9071, 9035, 9036, 9037, 9038, 9039, 9040, 9041, 9083, 9084, 9101, 9102, 9103, 9104 ),
210
- ),
211
  'wfcm' => array(
212
  'name' => __( 'WFCM', 'wp-security-audit-log' ),
213
  'event_ids' => array( 6028, 6029, 6030, 6031, 6032, 6033 ),
214
  ),
215
  );
 
 
 
 
216
  $installer_nonce = wp_create_nonce( 'wsal-install-addon' );
217
  foreach ( $addon_event_codes as $key => $addon ) {
218
  $f1 = in_array( $this->alert_id, $addon['event_ids'], true );
196
  * @since 4.0.2
197
  */
198
  $addon_event_codes = array(
 
 
 
 
 
 
 
 
 
 
 
 
199
  'wfcm' => array(
200
  'name' => __( 'WFCM', 'wp-security-audit-log' ),
201
  'event_ids' => array( 6028, 6029, 6030, 6031, 6032, 6033 ),
202
  ),
203
  );
204
+
205
+ // Filter to allow items to be added elsewhere.
206
+ $addon_event_codes = apply_filters( 'wsal_addon_event_codes', $addon_event_codes );
207
+
208
  $installer_nonce = wp_create_nonce( 'wsal-install-addon' );
209
  foreach ( $addon_event_codes as $key => $addon ) {
210
  $f1 = in_array( $this->alert_id, $addon['event_ids'], true );
classes/Models/Option.php DELETED
@@ -1,199 +0,0 @@
1
- <?php
2
- /**
3
- * Class: Options Model Class
4
- *
5
- * Option Model gets and sets the options of the wsal_options table in the database.
6
- *
7
- * @package Wsal
8
- */
9
-
10
- // Exit if accessed directly.
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- /**
16
- * WordPress options are always loaded from the default WordPress database.
17
- *
18
- * Option Model gets and sets the options of the wsal_options table in the database.
19
- *
20
- * @package Wsal
21
- *
22
- * @deprecated 4.1.3
23
- * @see \WSAL\Helpers\Options
24
- */
25
- class WSAL_Models_Option extends WSAL_Models_ActiveRecord {
26
-
27
- /**
28
- * Option ID.
29
- *
30
- * @var int
31
- */
32
- public $id = '';
33
-
34
- /**
35
- * Option Name.
36
- *
37
- * @var string
38
- */
39
- public $option_name = '';
40
-
41
- /**
42
- * Option Value.
43
- *
44
- * @var string
45
- */
46
- public $option_value = '';
47
-
48
- /**
49
- * Model Name.
50
- *
51
- * @var string
52
- */
53
- protected $adapterName = 'Option';
54
-
55
- /**
56
- * Options are always stored in WPDB. This setting ensures that.
57
- *
58
- * @var bool
59
- */
60
- protected $useDefaultAdapter = true;
61
-
62
- /**
63
- * Option Cache.
64
- *
65
- * @var array
66
- */
67
- private $option_cache = array();
68
-
69
- /**
70
- * Sets Option record.
71
- *
72
- * @param string $name - Option name.
73
- * @param mixed $value - Option value.
74
- *
75
- * @return bool|int|void
76
- */
77
- public function SetOptionValue( $name, $value ) {
78
- $option = $this->getAdapter()->GetNamedOption( $name );
79
- if ( $option == null ) {
80
- return;
81
- }
82
-
83
- $this->id = $option['id'];
84
- $this->option_name = $name;
85
-
86
- // Serialize if $value is array or object.
87
- $value = maybe_serialize( $value );
88
- $this->option_value = $value;
89
-
90
- // Replace the value present in the option cache.
91
- if ( array_key_exists( $name, $this->option_cache ) ) {
92
- $this->option_cache[ $name ]['option_value'] = $value;
93
- }
94
-
95
- return $this->Save();
96
- }
97
-
98
- /**
99
- * Gets Option record.
100
- *
101
- * @param string $name - Option name.
102
- * @param mixed $default - (Optional) Default value.
103
- * @return mixed option value
104
- */
105
- public function GetOptionValue( $name, $default = array() ) {
106
- if ( array_key_exists( $name, $this->option_cache ) ) {
107
- $this->option_value = ! empty( $this->option_cache[ $name ] ) ? $this->option_cache[ $name ]['option_value'] : null;
108
- } else {
109
- $option = $this->getAdapter()->GetNamedOption( $name );
110
- $this->option_cache[ $name ] = $option;
111
- $this->option_value = ( ! empty( $option ) ) ? $option['option_value'] : null;
112
- }
113
-
114
- if ( empty( $this->option_value ) ) {
115
- // $this->_state = self::STATE_LOADED;
116
- $this->option_value = $default;
117
- }
118
-
119
- // Unserialize if $value is array or object.
120
- $this->option_value = maybe_unserialize( $this->option_value );
121
- // return $this->IsLoaded() ? $this->option_value : $default;
122
- return $this->option_value;
123
- }
124
-
125
- /**
126
- * Save Option record.
127
- *
128
- * @see WSAL_Adapters_MySQL_ActiveRecord::Save()
129
- * @return integer|boolean Either the number of modified/inserted rows or false on failure.
130
- */
131
- public function Save() {
132
- $this->_state = self::STATE_UNKNOWN;
133
-
134
- $update_id = $this->getId();
135
- $result = $this->getAdapter()->Save( $this );
136
-
137
- if ( false !== $result ) {
138
- $this->_state = ( ! empty( $update_id ) ) ? self::STATE_UPDATED : self::STATE_CREATED;
139
- }
140
- return $result;
141
- }
142
-
143
- /**
144
- * Get options by prefix (notifications stored in json format).
145
- *
146
- * @see WSAL_Adapters_MySQL_Option::GetNotificationsSetting()
147
- * @param string $opt_prefix - Prefix.
148
- * @return array|null options
149
- */
150
- public function GetNotificationsSetting( $opt_prefix ) {
151
- return $this->getAdapter()->GetNotificationsSetting( $opt_prefix );
152
- }
153
-
154
- /**
155
- * Get option by id (notifications stored in json format).
156
- *
157
- * @see WSAL_Adapters_MySQL_Option::GetNotification()
158
- * @param int $id - Option ID.
159
- * @return string|null option
160
- */
161
- public function GetNotification( $id ) {
162
- return $this->LoadData(
163
- $this->getAdapter()->GetNotification( $id )
164
- );
165
- }
166
-
167
- /**
168
- * Delete option by name.
169
- *
170
- * @see WSAL_Adapters_MySQL_Option::DeleteByName()
171
- * @param string $name - Option name.
172
- * @return boolean
173
- */
174
- public function DeleteByName( $name ) {
175
- return $this->getAdapter()->DeleteByName( $name );
176
- }
177
-
178
- /**
179
- * Delete options start with prefix.
180
- *
181
- * @see WSAL_Adapters_MySQL_Option::DeleteByPrefix()
182
- * @param string $opt_prefix - Prefix.
183
- * @return boolean
184
- */
185
- public function DeleteByPrefix( $opt_prefix ) {
186
- return $this->getAdapter()->DeleteByPrefix( $opt_prefix );
187
- }
188
-
189
- /**
190
- * Number of options start with prefix.
191
- *
192
- * @see WSAL_Adapters_MySQL_Option::CountNotifications()
193
- * @param string $opt_prefix - Prefix.
194
- * @return integer Indicates the number of items.
195
- */
196
- public function CountNotifications( $opt_prefix ) {
197
- return $this->getAdapter()->CountNotifications( $opt_prefix );
198
- }
199
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/Sensors/Content.php CHANGED
@@ -16,6 +16,10 @@ if ( ! defined( 'ABSPATH' ) ) {
16
  /**
17
  * WordPress contents (posts, pages and custom posts).
18
  *
 
 
 
 
19
  * @package Wsal
20
  */
21
  class WSAL_Sensors_Content extends WSAL_AbstractSensor {
@@ -225,10 +229,12 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
225
  }
226
 
227
  // Support for Admin Columns Pro plugin and its add-on.
228
- if ( isset( $_POST['_ajax_nonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['_ajax_nonce'] ) ), 'ac-ajax' ) ) {
229
- if ( isset( $_POST['action'] ) && 'acp_editing_single_request' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) {
230
- return;
231
- }
 
 
232
  }
233
 
234
  if ( 'post_tag' === $taxonomy ) {
@@ -279,6 +285,19 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
279
  }
280
 
281
  $event_data = $this->get_post_event_data( $post ); // Get event data.
 
 
 
 
 
 
 
 
 
 
 
 
 
282
  $this->plugin->alerts->Trigger( $event, $event_data ); // Log event.
283
  }
284
  }
@@ -795,8 +814,26 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
795
  $event_data['PublishingDate'] = $new_post->post_date;
796
  $this->plugin->alerts->Trigger( $event, $event_data );
797
  } else {
798
- // NOTE: this triggers if NOT firing event 5019.
799
- $this->plugin->alerts->TriggerIf( $event, $event_data, array( $this, 'plugin_not_created_post' ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
800
  }
801
  }
802
  }
@@ -1217,10 +1254,12 @@ class WSAL_Sensors_Content extends WSAL_AbstractSensor {
1217
  /**
1218
  * Post modified content.
1219
  *
1220
- * @param integer $post_id – Post ID.
1221
- * @param stdClass $oldpost – Old post.
1222
- * @param stdClass $newpost – New post.
1223
- * @param int $modified – Set to 0 if no changes done to the post.
 
 
1224
  */
1225
  public function check_modification_change( $post_id, $oldpost, $newpost, $modified ) {
1226
  if ( $this->check_other_sensors( $oldpost ) ) {
16
  /**
17
  * WordPress contents (posts, pages and custom posts).
18
  *
19
+ * Apart from some other events, the following were migrated from plugins & themes sensor:
20
+ * 5019 A plugin created a post
21
+ * 5025 A plugin deleted a post
22
+ *
23
  * @package Wsal
24
  */
25
  class WSAL_Sensors_Content extends WSAL_AbstractSensor {
229
  }
230
 
231
  // Support for Admin Columns Pro plugin and its add-on.
232
+ if ( ! isset( $_POST['_ajax_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['_ajax_nonce'] ) ), 'ac-ajax' ) ) {
233
+ return;
234
+ }
235
+
236
+ if ( isset( $_POST['action'] ) && 'acp_editing_single_request' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) {
237
+ return;
238
  }
239
 
240
  if ( 'post_tag' === $taxonomy ) {
285
  }
286
 
287
  $event_data = $this->get_post_event_data( $post ); // Get event data.
288
+
289
+ // check if this was initiated by a plugin
290
+ $request_params = WSAL_Utilities_RequestUtils::get_filtered_request_data();
291
+ if ( empty( $request_params['action'] ) && isset( $request_params['page'] ) ) {
292
+ $event = 5025;
293
+ $event_data = array(
294
+ 'PostID' => $post->ID,
295
+ 'PostType' => $post->post_type,
296
+ 'PostTitle' => $post->post_title,
297
+ 'Username' => 'Plugins',
298
+ );
299
+ }
300
+
301
  $this->plugin->alerts->Trigger( $event, $event_data ); // Log event.
302
  }
303
  }
814
  $event_data['PublishingDate'] = $new_post->post_date;
815
  $this->plugin->alerts->Trigger( $event, $event_data );
816
  } else {
817
+
818
+ // so far we assume that the action is initiated by a user, let's check if it was actually initiated
819
+ // by a plugin
820
+ $request_params = WSAL_Utilities_RequestUtils::get_filtered_request_data();
821
+ if ( array_key_exists( 'plugin', $request_params ) && !empty( $request_params['plugin'] ) ) {
822
+ // event initiated by a plugin
823
+ $plugin_name = $request_params['plugin'];
824
+ $plugin_data = get_plugin_data( trailingslashit( WP_PLUGIN_DIR ) . $plugin_name );
825
+ $event_data = array(
826
+ 'PluginName' => ( $plugin_data && isset( $plugin_data['Name'] ) ) ? $plugin_data['Name'] : false,
827
+ 'PostID' => $new_post->ID,
828
+ 'PostType' => $new_post->post_type,
829
+ 'PostTitle' => $new_post->post_title,
830
+ 'PostStatus' => $new_post->post_status,
831
+ 'Username' => 'Plugins',
832
+ $editor_link['name'] => $editor_link['value'],
833
+ );
834
+ }
835
+
836
+ $this->plugin->alerts->Trigger( $event, $event_data );
837
  }
838
  }
839
  }
1254
  /**
1255
  * Post modified content.
1256
  *
1257
+ * @param integer $post_id – Post ID.
1258
+ * @param stdClass $oldpost – Old post.
1259
+ * @param stdClass $newpost – New post.
1260
+ * @param int $modified – Set to 0 if no changes done to the post.
1261
+ *
1262
+ * @return int|void
1263
  */
1264
  public function check_modification_change( $post_id, $oldpost, $newpost, $modified ) {
1265
  if ( $this->check_other_sensors( $oldpost ) ) {
classes/Sensors/Database.php CHANGED
@@ -116,10 +116,13 @@ class WSAL_Sensors_Database extends WSAL_AbstractSensor {
116
  return;
117
  }
118
 
119
- $alert_options = $this->GetEventOptions( $actor );
120
- $event_code = $this->GetEventCode( $actor, $query_type );
121
- $alert_options['TableNames'] = implode( ',', $table_names );
122
- $this->plugin->alerts->Trigger( $event_code, $alert_options );
 
 
 
123
  }
124
  }
125
 
@@ -182,6 +185,7 @@ class WSAL_Sensors_Database extends WSAL_AbstractSensor {
182
  case 'plugins':
183
  // Action Plugin Component.
184
  $plugin_file = '';
 
185
  // @codingStandardsIgnoreStart
186
  if ( isset( $_GET['plugin'] ) ) {
187
  $plugin_file = sanitize_text_field( wp_unslash( $_GET['plugin'] ) );
@@ -205,6 +209,12 @@ class WSAL_Sensors_Database extends WSAL_AbstractSensor {
205
  $plugin_name = basename( $plugin_file, '.php' );
206
  $plugin_name = str_replace( array( '_', '-', ' ' ), ' ', $plugin_name );
207
  $plugin_name = ucwords( $plugin_name );
 
 
 
 
 
 
208
  $alert_options['Plugin'] = (object) array( 'Name' => $plugin_name );
209
  }
210
  break;
@@ -339,4 +349,26 @@ class WSAL_Sensors_Database extends WSAL_AbstractSensor {
339
 
340
  return $queries;
341
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
  }
116
  return;
117
  }
118
 
119
+ // Loop through each item to report event per table.
120
+ foreach ( $table_names as $table_name ) {
121
+ $alert_options = $this->GetEventOptions( $actor );
122
+ $event_code = $this->GetEventCode( $actor, $query_type );
123
+ $alert_options['TableNames'] = $table_name;
124
+ $this->plugin->alerts->Trigger( $event_code, $alert_options );
125
+ }
126
  }
127
  }
128
 
185
  case 'plugins':
186
  // Action Plugin Component.
187
  $plugin_file = '';
188
+
189
  // @codingStandardsIgnoreStart
190
  if ( isset( $_GET['plugin'] ) ) {
191
  $plugin_file = sanitize_text_field( wp_unslash( $_GET['plugin'] ) );
209
  $plugin_name = basename( $plugin_file, '.php' );
210
  $plugin_name = str_replace( array( '_', '-', ' ' ), ' ', $plugin_name );
211
  $plugin_name = ucwords( $plugin_name );
212
+
213
+ // If this is still empty at this point, lets check recent events.
214
+ if ( empty( $plugin_file ) ) {
215
+ $plugin_name = $this->determine_recently_activated_plugin();
216
+ }
217
+
218
  $alert_options['Plugin'] = (object) array( 'Name' => $plugin_name );
219
  }
220
  break;
349
 
350
  return $queries;
351
  }
352
+
353
+ /**
354
+ * Last resort to determine the name of a plugin performing the action.
355
+ *
356
+ * @return string Name, taken from recent event.
357
+ */
358
+ private function determine_recently_activated_plugin() {
359
+ $alert_id = 5001;
360
+
361
+ $latest_events = $this->plugin->alerts->get_latest_events( 25 );
362
+
363
+ foreach ( $latest_events as $latest_event ) {
364
+ if ( $alert_id === intval( $latest_event->alert_id ) ) {
365
+ $event_meta = $latest_event ? $latest_event->GetMetaArray() : false;
366
+ $plugin_name = $event_meta['PluginData']->Name;
367
+ }
368
+ }
369
+
370
+ if ( $plugin_name ) {
371
+ return $plugin_name;
372
+ }
373
+ }
374
  }
classes/Sensors/LogInOut.php CHANGED
@@ -117,7 +117,14 @@ class WSAL_Sensors_LogInOut extends WSAL_AbstractSensor {
117
  /**
118
  * Event Login.
119
  *
120
- * TODO: update params doc block to match the new hook it's attached to.
 
 
 
 
 
 
 
121
  */
122
  public function EventLogin( $auth_cookie, $expire, $expiration, $user_id, $scheme, $token ) {
123
  // Get global POST array.
@@ -192,7 +199,9 @@ class WSAL_Sensors_LogInOut extends WSAL_AbstractSensor {
192
  */
193
  function ( $manager ) {
194
  // don't fire if the user is changing their password via admin profile page
195
- return ! $manager->WillOrHasTriggered(4003);
 
 
196
  }
197
  );
198
 
117
  /**
118
  * Event Login.
119
  *
120
+ * @param string $auth_cookie Authentication cookie value.
121
+ * @param int $expire The time the login grace period expires as a UNIX timestamp.
122
+ * Default is 12 hours past the cookie's expiration time.
123
+ * @param int $expiration The time when the authentication cookie expires as a UNIX timestamp.
124
+ * Default is 14 days from now.
125
+ * @param int $user_id User ID.
126
+ * @param string $scheme Authentication scheme. Values include 'auth' or 'secure_auth'.
127
+ * @param string $token User's session token to use for this cookie.
128
  */
129
  public function EventLogin( $auth_cookie, $expire, $expiration, $user_id, $scheme, $token ) {
130
  // Get global POST array.
199
  */
200
  function ( $manager ) {
201
  // don't fire if the user is changing their password via admin profile page
202
+ return ! $manager->WillOrHasTriggered( 4003 )
203
+ // ...or if the login has been triggered somewhere else (most likely a front-end login)
204
+ && ! $manager->WillOrHasTriggered( 1000, 2 );
205
  }
206
  );
207
 
classes/Sensors/MainWP.php ADDED
@@ -0,0 +1,419 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Sensor: MainWP Plugins & Themes
4
+ *
5
+ * MainWP Plugins & Themes sensor file.
6
+ *
7
+ * @since 4.1.4
8
+ * @package Wsal
9
+ */
10
+
11
+ // Exit if accessed directly.
12
+ if ( ! defined( 'ABSPATH' ) ) {
13
+ exit;
14
+ }
15
+
16
+ /**
17
+ * MainWP Plugins & Themes sensor.
18
+ *
19
+ * 5000 User installed a plugin
20
+ * 5001 User activated a WordPress plugin
21
+ * 5002 User deactivated a WordPress plugin
22
+ * 5003 User uninstalled a plugin
23
+ * 5004 User upgraded a plugin
24
+ * 5005 User installed a theme
25
+ * 5006 User activated a theme
26
+ * 5007 User uninstalled a theme
27
+ * 5031 User updated a theme
28
+ *
29
+ * @package Wsal
30
+ * @subpackage Sensors
31
+ */
32
+ class WSAL_Sensors_MainWP extends WSAL_AbstractSensor {
33
+
34
+ /**
35
+ * List of Themes.
36
+ *
37
+ * @var array
38
+ */
39
+ protected $old_themes = array();
40
+
41
+ /**
42
+ * Listening to events using WP hooks.as
43
+ */
44
+ public function HookEvents() {
45
+
46
+ add_action( 'admin_init', array( $this, 'EventAdminInit' ) );
47
+
48
+ // Check if MainWP Child Plugin exists.
49
+ if ( WpSecurityAuditLog::is_mainwp_active() ) {
50
+
51
+ $this->mainwp_child_init();
52
+
53
+ // Handle plugin/theme installation event via MainWP dashboard.
54
+ add_action( 'mainwp_child_installPluginTheme', array( $this, 'mainwp_child_install_assets' ), 10, 1 );
55
+
56
+ // Activate/Deactivate plugin event.
57
+ add_action( 'activated_plugin', array( $this, 'mainwp_child_plugin_events' ), 10, 1 );
58
+ add_action( 'deactivated_plugin', array( $this, 'mainwp_child_plugin_events' ), 10, 1 );
59
+
60
+ // Uninstall plugin from MainWP dashboard.
61
+ add_action( 'mainwp_child_plugin_action', array( $this, 'mainwp_child_uninstall_plugin' ), 10, 1 );
62
+
63
+ // Uninstall theme from MainWP dashboard.
64
+ add_action( 'mainwp_child_theme_action', array( $this, 'mainwp_child_uninstall_theme' ), 10, 1 );
65
+
66
+ // Update theme/plugin from MainWP dashboard.
67
+ add_action( 'mainwp_child_upgradePluginTheme', array( $this, 'mainwp_child_update_assets' ), 10, 1 );
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Triggered when a user accesses the admin area.
73
+ */
74
+ public function EventAdminInit() {
75
+ $this->old_themes = wp_get_themes();
76
+ $this->old_plugins = get_plugins();
77
+ }
78
+
79
+ /**
80
+ * Method: Check and initialize class members for MainWP.
81
+ */
82
+ public function mainwp_child_init() {
83
+ // $_POST array arguments.
84
+ $post_array_args = array(
85
+ 'function' => FILTER_SANITIZE_STRING,
86
+ 'action' => FILTER_SANITIZE_STRING,
87
+ 'theme' => FILTER_SANITIZE_STRING,
88
+ 'mainwpsignature' => FILTER_SANITIZE_STRING,
89
+ );
90
+
91
+ // Get $_POST array.
92
+ $post_array = filter_input_array( INPUT_POST, $post_array_args );
93
+
94
+ if (
95
+ isset( $post_array['function'] ) && 'theme_action' === $post_array['function']
96
+ && isset( $post_array['action'] ) && 'delete' === $post_array['action']
97
+ && isset( $post_array['theme'] ) && ! empty( $post_array['theme'] )
98
+ && isset( $post_array['mainwpsignature'] ) && ! empty( $post_array['mainwpsignature'] )
99
+ ) {
100
+ if ( empty( $this->old_themes ) ) {
101
+ $this->old_themes = wp_get_themes();
102
+ }
103
+ }
104
+ }
105
+
106
+ /**
107
+ * Get removed themes.
108
+ *
109
+ * @return array of WP_Theme objects
110
+ */
111
+ protected function GetRemovedThemes() {
112
+ $result = $this->old_themes;
113
+ foreach ( $result as $i => $theme ) {
114
+ if ( file_exists( $theme->get_template_directory() ) ) {
115
+ unset( $result[ $i ] );
116
+ }
117
+ }
118
+ return array_values( $result );
119
+ }
120
+
121
+ /**
122
+ * Method: Handle plugin/theme install event
123
+ * from MainWP dashboard on child site.
124
+ *
125
+ * @param array $args - Array of arguments related to asset installed.
126
+ * @since 3.2.2
127
+ */
128
+ public function mainwp_child_install_assets( $args ) {
129
+ if ( empty( $args ) || ! is_array( $args ) ) {
130
+ return;
131
+ }
132
+
133
+ // Verify the action from MainWP.
134
+ if (
135
+ isset( $args['action'] ) && 'install' === $args['action']
136
+ && isset( $args['success'] ) && ! empty( $args['success'] )
137
+ ) {
138
+ if ( isset( $args['type'] ) && 'theme' === $args['type'] ) { // Installing theme.
139
+ // Get theme name & object.
140
+ $theme_slug = isset( $args['slug'] ) ? $args['slug'] : false;
141
+ $theme_obj = wp_get_theme( $theme_slug );
142
+
143
+ // Check if theme exists.
144
+ if ( $theme_obj->exists() ) {
145
+ $this->plugin->alerts->Trigger(
146
+ 5005,
147
+ array(
148
+ 'Theme' => (object) array(
149
+ 'Name' => $theme_obj->Name,
150
+ 'ThemeURI' => $theme_obj->ThemeURI,
151
+ 'Description' => $theme_obj->Description,
152
+ 'Author' => $theme_obj->Author,
153
+ 'Version' => $theme_obj->Version,
154
+ 'get_template_directory' => $theme_obj->get_template_directory(),
155
+ ),
156
+ )
157
+ );
158
+ }
159
+ } elseif ( isset( $args['type'] ) && 'plugin' === $args['type'] ) {
160
+ // Get plugin slug.
161
+ $plugin_slug = isset( $args['slug'] ) ? $args['slug'] : false;
162
+
163
+ $plugins = get_plugins(); // Get all plugins.
164
+ $plugin = $plugins[ $plugin_slug ]; // Take out the plugin being installed.
165
+
166
+ $plugin_path = plugin_dir_path( WP_PLUGIN_DIR . '/' . $plugin_slug );
167
+ $this->plugin->alerts->Trigger(
168
+ 5000,
169
+ array(
170
+ 'Plugin' => (object) array(
171
+ 'Name' => $plugin['Name'],
172
+ 'PluginURI' => $plugin['PluginURI'],
173
+ 'Version' => $plugin['Version'],
174
+ 'Author' => $plugin['Author'],
175
+ 'Network' => $plugin['Network'] ? 'True' : 'False',
176
+ 'plugin_dir_path' => $plugin_path,
177
+ ),
178
+ )
179
+ );
180
+ }
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Method: Handle plugin uninstall event
186
+ * from MainWP dashboard on child site.
187
+ *
188
+ * @param array $args - Array of arguments related to asset uninstalled.
189
+ * @since 3.2.2
190
+ */
191
+ public function mainwp_child_uninstall_plugin( $args ) {
192
+ if ( empty( $args ) || ! is_array( $args ) ) {
193
+ return;
194
+ }
195
+
196
+ // Get MainWP post data.
197
+ $post_array = filter_input_array( INPUT_POST );
198
+
199
+ // Get plugins from MainWP.
200
+ if ( isset( $post_array['plugin'] ) && ! empty( $post_array['plugin'] ) ) {
201
+ $wp_plugins = explode( '||', $post_array['plugin'] );
202
+ }
203
+
204
+ // Verify actions from MainWP.
205
+ if (
206
+ isset( $args['action'] ) && 'delete' === $args['action']
207
+ && isset( $args['Name'] ) && ! empty( $args['Name'] )
208
+ && isset( $post_array['mainwpsignature'] ) && ! empty( $post_array['mainwpsignature'] )
209
+ ) {
210
+ // Get plugin name.
211
+ $plugin_name = $args['Name'];
212
+
213
+ // Get plugin filename.
214
+ $plugin_filename = WSAL_Sensors_PluginsThemes::get_plugin_file_name( $plugin_name );
215
+
216
+ if ( ! empty( $plugin_filename ) && in_array( $plugin_filename, $wp_plugins, true ) ) {
217
+ $this->plugin->alerts->Trigger(
218
+ 5003,
219
+ array(
220
+ 'PluginFile' => $plugin_filename,
221
+ 'PluginData' => (object) array(
222
+ 'Name' => $plugin_name,
223
+ ),
224
+ )
225
+ );
226
+ }
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Method: Handle theme uninstall event
232
+ * from MainWP dashboard on child site.
233
+ *
234
+ * @param array $args - Array of arguments related to asset uninstalled.
235
+ * @since 3.2.2
236
+ */
237
+ public function mainwp_child_uninstall_theme( $args ) {
238
+ if ( empty( $args ) || ! is_array( $args ) ) {
239
+ return;
240
+ }
241
+
242
+ // Get MainWP post data.
243
+ $post_array = filter_input_array( INPUT_POST );
244
+
245
+ // Get themes from MainWP.
246
+ if ( isset( $post_array['theme'] ) && ! empty( $post_array['theme'] ) ) {
247
+ $wp_themes = explode( '||', $post_array['theme'] );
248
+ }
249
+
250
+ // Verify actions from MainWP.
251
+ if (
252
+ isset( $args['action'] ) && 'delete' === $args['action']
253
+ && isset( $args['Name'] ) && ! empty( $args['Name'] )
254
+ && isset( $post_array['mainwpsignature'] ) && ! empty( $post_array['mainwpsignature'] )
255
+ ) {
256
+ // Get theme object.
257
+ $themes = $this->GetRemovedThemes();
258
+
259
+ if ( ! empty( $themes ) ) {
260
+ foreach ( $themes as $index => $theme ) {
261
+ if ( ! empty( $theme ) && $theme instanceof WP_Theme && in_array( $theme->Name, $wp_themes, true ) ) {
262
+ $this->plugin->alerts->Trigger(
263
+ 5007,
264
+ array(
265
+ 'Theme' => (object) array(
266
+ 'Name' => $theme->Name,
267
+ 'ThemeURI' => $theme->ThemeURI,
268
+ 'Description' => $theme->Description,
269
+ 'Author' => $theme->Author,
270
+ 'Version' => $theme->Version,
271
+ 'get_template_directory' => $theme->get_template_directory(),
272
+ ),
273
+ )
274
+ );
275
+ }
276
+ }
277
+ }
278
+ }
279
+ }
280
+
281
+ /**
282
+ * Method: Handle plugin activation event
283
+ * from MainWP dashboard on a child site.
284
+ *
285
+ * @param string $plugin - Plugin slug.
286
+ * @since 3.2.2
287
+ */
288
+ public function mainwp_child_plugin_events( $plugin ) {
289
+ // Check parameter.
290
+ if ( empty( $plugin ) ) {
291
+ return;
292
+ }
293
+
294
+ // Get MainWP post data.
295
+ $post_array = filter_input_array( INPUT_POST );
296
+
297
+ // Get plugins from MainWP.
298
+ if ( isset( $post_array['plugin'] ) && ! empty( $post_array['plugin'] ) ) {
299
+ $wp_plugins = explode( '||', $post_array['plugin'] );
300
+ }
301
+
302
+ if (
303
+ isset( $post_array['mainwpsignature'] ) // Check MainWP signature.
304
+ && isset( $post_array['action'] ) // Check if action is set.
305
+ && isset( $post_array['function'] ) // Check if function is set.
306
+ && 'plugin_action' === $post_array['function']
307
+ && in_array( $plugin, $wp_plugins, true ) // Check if plugin being activate/deactivate is in the list of plugins from MainWP.
308
+ ) {
309
+ if ( 'activate' === $post_array['action'] ) {
310
+ $event = 5001;
311
+ } elseif ( 'deactivate' === $post_array['action'] ) {
312
+ $event = 5002;
313
+ }
314
+
315
+ $plugin = WP_PLUGIN_DIR . '/' . $plugin;
316
+ $plugin_data = get_plugin_data( $plugin, false, true );
317
+ $this->plugin->alerts->Trigger(
318
+ $event,
319
+ array(
320
+ 'PluginFile' => $plugin,
321
+ 'PluginData' => (object) array(
322
+ 'Name' => $plugin_data['Name'],
323
+ 'PluginURI' => $plugin_data['PluginURI'],
324
+ 'Version' => $plugin_data['Version'],
325
+ 'Author' => $plugin_data['Author'],
326
+ 'Network' => $plugin_data['Network'] ? 'True' : 'False',
327
+ ),
328
+ )
329
+ );
330
+ } elseif (
331
+ isset( $post_array['mainwpsignature'] ) // Check MainWP signature.
332
+ && isset( $post_array['function'] ) // Check if function is set.
333
+ && 'installplugintheme' === $post_array['function']
334
+ && isset( $post_array['type'] ) // Check if type is set.
335
+ && 'plugin' === $post_array['type']
336
+ ) {
337
+ $plugin = WP_PLUGIN_DIR . '/' . $plugin;
338
+ $plugin_data = get_plugin_data( $plugin, false, true );
339
+ $this->plugin->alerts->Trigger(
340
+ 5001,
341
+ array(
342
+ 'PluginFile' => $plugin,
343
+ 'PluginData' => (object) array(
344
+ 'Name' => $plugin_data['Name'],
345
+ 'PluginURI' => $plugin_data['PluginURI'],
346
+ 'Version' => $plugin_data['Version'],
347
+ 'Author' => $plugin_data['Author'],
348
+ 'Network' => $plugin_data['Network'] ? 'True' : 'False',
349
+ ),
350
+ )
351
+ );
352
+ }
353
+ }
354
+
355
+ /**
356
+ * Method: Handle plugin/theme update event
357
+ * from MainWP dashboard on child site.
358
+ *
359
+ * @param array $args - Array of arguments related to asset updated.
360
+ * @since 3.2.2
361
+ */
362
+ public function mainwp_child_update_assets( $args ) {
363
+ if ( empty( $args ) || ! is_array( $args ) ) {
364
+ return;
365
+ }
366
+
367
+ // Get MainWP post data.
368
+ $post_array = filter_input_array( INPUT_POST );
369
+
370
+ // Check type.
371
+ if (
372
+ isset( $post_array['function'] ) && 'upgradeplugintheme' === $post_array['function']
373
+ && isset( $post_array['mainwpsignature'] ) && ! empty( $post_array['mainwpsignature'] )
374
+ && isset( $post_array['list'] ) && ! empty( $post_array['list'] )
375
+ && isset( $args['type'] ) && ! empty( $args['type'] )
376
+ && isset( $args['name'] ) && ! empty( $args['name'] )
377
+ ) {
378
+ if ( 'theme' === $args['type'] ) {
379
+ // Site themes updated.
380
+ $site_themes = explode( ',', $post_array['list'] );
381
+
382
+ // Theme name.
383
+ $theme_name = $args['name'];
384
+
385
+ // Get theme object.
386
+ $theme = WSAL_Sensors_PluginsThemes::get_theme_by_name( $theme_name );
387
+
388
+ if ( ! empty( $theme ) && $theme instanceof WP_Theme && in_array( $theme->stylesheet, $site_themes, true ) ) {
389
+ $this->plugin->alerts->Trigger(
390
+ 5031,
391
+ array(
392
+ 'Theme' => (object) array(
393
+ 'Name' => $theme->Name,
394
+ 'ThemeURI' => $theme->ThemeURI,
395
+ 'Description' => $theme->Description,
396
+ 'Author' => $theme->Author,
397
+ 'Version' => $theme->Version,
398
+ 'get_template_directory' => $theme->get_template_directory(),
399
+ ),
400
+ )
401
+ );
402
+ }
403
+ } elseif ( 'plugin' === $args['type'] ) {
404
+ // Plugin name.
405
+ $plugin_name = $args['name'];
406
+
407
+ // Get plugin filename.
408
+ $plugin_file = WSAL_Sensors_PluginsThemes::get_plugin_file_name( $plugin_name );
409
+
410
+ // If plugin file is empty then return.
411
+ if ( empty( $plugin_file ) ) {
412
+ return;
413
+ }
414
+
415
+ WSAL_Sensors_PluginsThemes::LogPluginUpdatedEvent( $plugin_file );
416
+ }
417
+ }
418
+ }
419
+ }
classes/Sensors/Menus.php CHANGED
@@ -177,16 +177,18 @@ class WSAL_Sensors_Menus extends WSAL_AbstractSensor {
177
  $post_array = filter_input_array( INPUT_POST );
178
 
179
  // Verify nonce.
180
- if ( isset( $post_array['_wpnonce'] ) && wp_verify_nonce( $post_array['_wpnonce'], 'save-menu-locations' ) ) {
181
- // Manage Location tab.
182
- if ( isset( $post_array['menu-locations'] ) ) {
183
- $new_locations = $post_array['menu-locations'];
184
- if ( isset( $new_locations['top'] ) ) {
185
- $this->LocationSetting( $new_locations['top'], 'top' );
186
- }
187
- if ( isset( $new_locations['social'] ) ) {
188
- $this->LocationSetting( $new_locations['social'], 'social' );
189
- }
 
 
190
  }
191
  }
192
  }
177
  $post_array = filter_input_array( INPUT_POST );
178
 
179
  // Verify nonce.
180
+ if ( ! isset( $post_array['_wpnonce'] ) || ! wp_verify_nonce( $post_array['_wpnonce'], 'save-menu-locations' ) ) {
181
+ return;
182
+ }
183
+
184
+ // Manage Location tab.
185
+ if ( isset( $post_array['menu-locations'] ) ) {
186
+ $new_locations = $post_array['menu-locations'];
187
+ if ( isset( $new_locations['top'] ) ) {
188
+ $this->LocationSetting( $new_locations['top'], 'top' );
189
+ }
190
+ if ( isset( $new_locations['social'] ) ) {
191
+ $this->LocationSetting( $new_locations['social'], 'social' );
192
  }
193
  }
194
  }
classes/Sensors/MetaData.php CHANGED
@@ -17,17 +17,9 @@ if ( ! defined( 'ABSPATH' ) ) {
17
  * Custom fields (posts, pages, custom posts and users) sensor.
18
  *
19
  * 2053 User created a custom field for a post
20
- * 2056 User created a custom field for a custom post type
21
- * 2059 User created a custom field for a page
22
  * 2062 User updated a custom field name for a post
23
- * 2063 User updated a custom field name for a custom post type
24
- * 2064 User updated a custom field name for a page
25
- * 2060 User updated a custom field value for a page
26
- * 2057 User updated a custom field for a custom post type
27
  * 2054 User updated a custom field value for a post
28
  * 2055 User deleted a custom field from a post
29
- * 2058 User deleted a custom field from a custom post type
30
- * 2061 User deleted a custom field from a page
31
  * 4015 User updated a custom field value for a user
32
  * 4016 User created a custom field value for a user
33
  * 4017 User changed first name for a user
17
  * Custom fields (posts, pages, custom posts and users) sensor.
18
  *
19
  * 2053 User created a custom field for a post
 
 
20
  * 2062 User updated a custom field name for a post
 
 
 
 
21
  * 2054 User updated a custom field value for a post
22
  * 2055 User deleted a custom field from a post
 
 
23
  * 4015 User updated a custom field value for a user
24
  * 4016 User created a custom field value for a user
25
  * 4017 User changed first name for a user
classes/Sensors/PluginsThemes.php CHANGED
@@ -24,16 +24,7 @@ if ( ! defined( 'ABSPATH' ) ) {
24
  * 5005 User installed a theme
25
  * 5006 User activated a theme
26
  * 5007 User uninstalled a theme
27
- * 5019 A plugin created a post
28
- * 5020 A plugin created a page
29
- * 5021 A plugin created a custom post
30
- * 5025 A plugin deleted a post
31
- * 5026 A plugin deleted a page
32
- * 5027 A plugin deleted a custom post
33
  * 5031 User updated a theme
34
- * 2106 A plugin modified a post
35
- * 2107 A plugin modified a page
36
- * 2108 A plugin modified a custom post
37
  *
38
  * @package Wsal
39
  * @subpackage Sensors
@@ -54,61 +45,19 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
54
  */
55
  protected $old_plugins = array();
56
 
57
- /**
58
- * Website plugins + themes.
59
- *
60
- * Used to keep track of file change alerts. If a plugin/theme is
61
- * installed/updated/uninstalled, then its name is added to the
62
- * respective skip array of this object. These arrays are used in
63
- * Sensors/FileChanges.php to filter the files during a scan.
64
- *
65
- * @var stdClass
66
- */
67
- private $site_content;
68
-
69
  /**
70
  * Listening to events using WP hooks.
71
  */
72
  public function HookEvents() {
73
  $has_permission = ( current_user_can( 'install_plugins' ) || current_user_can( 'activate_plugins' ) ||
74
- current_user_can( 'delete_plugins' ) || current_user_can( 'update_plugins' ) || current_user_can( 'install_themes' ) );
75
 
76
  add_action( 'admin_init', array( $this, 'EventAdminInit' ) );
77
  if ( $has_permission ) {
78
  add_action( 'shutdown', array( $this, 'EventAdminShutdown' ) );
79
  }
80
  add_action( 'switch_theme', array( $this, 'EventThemeActivated' ) );
81
-
82
- // TO DO.
83
- add_action( 'wp_insert_post', array( $this, 'EventPluginPostCreate' ), 10, 2 );
84
- add_action( 'delete_post', array( $this, 'EventPluginPostDelete' ), 10, 1 );
85
-
86
- // Set site plugins.
87
- $this->set_site_plugins();
88
-
89
- // Set site content.
90
- $this->set_site_themes();
91
-
92
- // Check if MainWP Child Plugin exists.
93
- if ( WpSecurityAuditLog::is_mainwp_active() ) {
94
- $this->mainwp_child_init();
95
-
96
- // Handle plugin/theme installation event via MainWP dashboard.
97
- add_action( 'mainwp_child_installPluginTheme', array( $this, 'mainwp_child_install_assets' ), 10, 1 );
98
-
99
- // Activate/Deactivate plugin event.
100
- add_action( 'activated_plugin', array( $this, 'mainwp_child_plugin_events' ), 10, 1 );
101
- add_action( 'deactivated_plugin', array( $this, 'mainwp_child_plugin_events' ), 10, 1 );
102
-
103
- // Uninstall plugin from MainWP dashboard.
104
- add_action( 'mainwp_child_plugin_action', array( $this, 'mainwp_child_uninstall_plugin' ), 10, 1 );
105
-
106
- // Uninstall theme from MainWP dashboard.
107
- add_action( 'mainwp_child_theme_action', array( $this, 'mainwp_child_uninstall_theme' ), 10, 1 );
108
-
109
- // Update theme/plugin from MainWP dashboard.
110
- add_action( 'mainwp_child_upgradePluginTheme', array( $this, 'mainwp_child_update_assets' ), 10, 1 );
111
- }
112
  }
113
 
114
  /**
@@ -119,33 +68,6 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
119
  $this->old_plugins = get_plugins();
120
  }
121
 
122
- /**
123
- * Method: Check and initialize class members for MainWP.
124
- */
125
- public function mainwp_child_init() {
126
- // $_POST array arguments.
127
- $post_array_args = array(
128
- 'function' => FILTER_SANITIZE_STRING,
129
- 'action' => FILTER_SANITIZE_STRING,
130
- 'theme' => FILTER_SANITIZE_STRING,
131
- 'mainwpsignature' => FILTER_SANITIZE_STRING,
132
- );
133
-
134
- // Get $_POST array.
135
- $post_array = filter_input_array( INPUT_POST, $post_array_args );
136
-
137
- if (
138
- isset( $post_array['function'] ) && 'theme_action' === $post_array['function']
139
- && isset( $post_array['action'] ) && 'delete' === $post_array['action']
140
- && isset( $post_array['theme'] ) && ! empty( $post_array['theme'] )
141
- && isset( $post_array['mainwpsignature'] ) && ! empty( $post_array['mainwpsignature'] )
142
- ) {
143
- if ( empty( $this->old_themes ) ) {
144
- $this->old_themes = wp_get_themes();
145
- }
146
- }
147
- }
148
-
149
  /**
150
  * Install, uninstall, activate, deactivate, upgrade and update.
151
  */
@@ -194,10 +116,7 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
194
  $plugin = $plugin[ $plugin_path ];
195
 
196
  // Get plugin directory name.
197
- $plugin_dir = $this->get_plugin_dir( $plugin_path );
198
-
199
- // Add plugin to site plugins list.
200
- $this->set_site_plugins( $plugin_dir );
201
 
202
  $plugin_path = plugin_dir_path( WP_PLUGIN_DIR . '/' . $plugin_path[0] );
203
  $this->plugin->alerts->Trigger(
@@ -325,7 +244,7 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
325
  ),
326
  )
327
  );
328
- $this->run_addon_removal_check( $plugin_file );
329
  }
330
  } elseif ( isset( $post_array['checked'] ) && ! empty( $post_array['checked'] ) ) {
331
  foreach ( $post_array['checked'] as $plugin_file ) {
@@ -344,7 +263,7 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
344
  ),
345
  )
346
  );
347
- $this->run_addon_removal_check( $plugin_file );
348
  }
349
  }
350
  }
@@ -371,7 +290,7 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
371
  ),
372
  )
373
  );
374
- $this->run_addon_removal_check( $plugin_file );
375
  }
376
  }
377
  }
@@ -393,16 +312,7 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
393
  )
394
  );
395
 
396
- // Get plugin directory name.
397
- $plugin_dir = $this->get_plugin_dir( $post_array['plugin'] );
398
-
399
- // Set plugin to skip file changes alert.
400
- $this->skip_plugin_change_alerts( $plugin_dir );
401
-
402
- // Remove it from the list.
403
- $this->remove_site_plugin( $plugin_dir );
404
-
405
- $this->run_addon_removal_check( $plugin_file );
406
  }
407
  }
408
 
@@ -425,27 +335,7 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
425
  }
426
  if ( isset( $plugins ) ) {
427
  foreach ( $plugins as $plugin_file ) {
428
- // Get plugin directory name.
429
- $plugin_dir = $this->get_plugin_dir( $plugin_file );
430
-
431
- // Set plugin to skip file changes alert.
432
- $this->skip_plugin_change_alerts( $plugin_dir );
433
-
434
- $plugin_file = WP_PLUGIN_DIR . '/' . $plugin_file;
435
- $plugin_data = get_plugin_data( $plugin_file, false, true );
436
- $this->plugin->alerts->Trigger(
437
- 5004,
438
- array(
439
- 'PluginFile' => $plugin_file,
440
- 'PluginData' => (object) array(
441
- 'Name' => $plugin_data['Name'],
442
- 'PluginURI' => $plugin_data['PluginURI'],
443
- 'Version' => $plugin_data['Version'],
444
- 'Author' => $plugin_data['Author'],
445
- 'Network' => $plugin_data['Network'] ? 'True' : 'False',
446
- ),
447
- )
448
- );
449
  }
450
  }
451
  }
@@ -508,8 +398,6 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
508
  ),
509
  )
510
  );
511
- // Add theme to site themes list.
512
- $this->set_site_themes( $name );
513
  }
514
  }
515
 
@@ -529,12 +417,6 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
529
  ),
530
  )
531
  );
532
-
533
- // Set theme to skip file changes alert.
534
- $this->skip_theme_change_alerts( $theme->stylesheet );
535
-
536
- // Remove it from the list.
537
- $this->remove_site_theme( $theme->stylesheet );
538
  }
539
  }
540
  }
@@ -577,168 +459,6 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
577
  );
578
  }
579
 
580
- /**
581
- * Plugin creates/modifies posts.
582
- *
583
- * @param int $post_id - Post ID.
584
- * @param object $post - Post object.
585
- */
586
- public function EventPluginPostCreate( $post_id, $post ) {
587
- if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) {
588
- return;
589
- }
590
-
591
- // Ignore if the request is coming from post editor.
592
- if ( isset( $_REQUEST['_wp_http_referer'] ) ) { // phpcs:ignore
593
- $referrer = esc_url_raw( wp_unslash( $_REQUEST['_wp_http_referer'] ) ); // phpcs:ignore
594
- $parsed_url = wp_parse_url( $referrer );
595
-
596
- if ( isset( $parsed_url['path'] ) && 'post' === basename( $parsed_url['path'], '.php' ) ) {
597
- return;
598
- }
599
- }
600
-
601
- // Filter $_REQUEST array for security.
602
- $get_array = filter_input_array( INPUT_GET );
603
- $post_array = filter_input_array( INPUT_POST );
604
-
605
- // Check if Yoast SEO is active.
606
- if ( WpSecurityAuditLog::is_wpseo_active() ) {
607
- return;
608
- }
609
-
610
- $wp_actions = array( 'editpost', 'heartbeat', 'inline-save', 'trash', 'untrash', 'vc_save' );
611
- if ( isset( $get_array['action'] ) && ! in_array( $get_array['action'], $wp_actions, true ) ) {
612
- if (
613
- ! in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true )
614
- && ! empty( $post->post_title )
615
- ) {
616
- // Get post editor link.
617
- $editor_link = $this->GetEditorLink( $post );
618
-
619
- // If the plugin modify the post.
620
- if ( false !== strpos( $get_array['action'], 'edit' ) ) {
621
- $this->plugin->alerts->Trigger(
622
- 2106,
623
- array(
624
- 'PostID' => $post->ID,
625
- 'PostType' => $post->post_type,
626
- 'PostTitle' => $post->post_title,
627
- 'PostStatus' => $post->post_status,
628
- 'PostUrl' => get_permalink( $post->ID ),
629
- $editor_link['name'] => $editor_link['value'],
630
- )
631
- );
632
- } else {
633
- $plugin_name = isset( $get_array['plugin'] ) ? $get_array['plugin'] : false;
634
- $plugin_data = $plugin_name ? get_plugin_data( trailingslashit( WP_PLUGIN_DIR ) . $plugin_name ) : false;
635
-
636
- $this->plugin->alerts->Trigger(
637
- 5019,
638
- array(
639
- 'PluginName' => ( $plugin_data && isset( $plugin_data['Name'] ) ) ? $plugin_data['Name'] : false,
640
- 'PostID' => $post->ID,
641
- 'PostType' => $post->post_type,
642
- 'PostTitle' => $post->post_title,
643
- 'PostStatus' => $post->post_status,
644
- 'Username' => 'Plugins',
645
- $editor_link['name'] => $editor_link['value'],
646
- )
647
- );
648
- }
649
- }
650
- }
651
-
652
- if ( isset( $post_array['action'] ) && ! in_array( $post_array['action'], $wp_actions, true ) ) {
653
- if (
654
- ! in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true )
655
- && ! empty( $post->post_title )
656
- ) {
657
- // If the plugin modify the post.
658
- if ( false !== strpos( $post_array['action'], 'edit' ) ) {
659
- $editor_link = $this->GetEditorLink( $post );
660
- $this->plugin->alerts->Trigger(
661
- 2106,
662
- array(
663
- 'PostID' => $post->ID,
664
- 'PostType' => $post->post_type,
665
- 'PostTitle' => $post->post_title,
666
- $editor_link['name'] => $editor_link['value'],
667
- )
668
- );
669
- } elseif (
670
- ( isset( $post_array['page'] ) && 'woocommerce-bulk-stock-management' === $post_array['page'] ) // If page index is set in post array then ignore.
671
- || (
672
- isset( $post_array['mainwpsignature'] )
673
- && ( 'restore' === $post_array['action'] || 'unpublish' === $post_array['action'] || 'publish' === $post_array['action'] )
674
- ) // OR If the request is coming from MainWP then ignore.
675
- ) {
676
- // Ignore WooCommerce Bulk Stock Management page.
677
- // OR MainWP plugin requests.
678
- } else {
679
- $plugin_name = isset( $get_array['plugin'] ) ? $get_array['plugin'] : false;
680
- $plugin_data = $plugin_name ? get_plugin_data( trailingslashit( WP_PLUGIN_DIR ) . $plugin_name ) : false;
681
- $editor_link = $this->GetEditorLink( $post );
682
- $this->plugin->alerts->Trigger(
683
- 5019,
684
- array(
685
- 'PluginName' => ( $plugin_data && isset( $plugin_data['Name'] ) ) ? $plugin_data['Name'] : false,
686
- 'PostID' => $post->ID,
687
- 'PostType' => $post->post_type,
688
- 'PostTitle' => $post->post_title,
689
- 'PostStatus' => $post->post_status,
690
- 'Username' => 'Plugins',
691
- $editor_link['name'] => $editor_link['value'],
692
- )
693
- );
694
- }
695
- }
696
- }
697
- }
698
-
699
- /**
700
- * Plugin deletes posts.
701
- *
702
- * @param integer $post_id - Post ID.
703
- */
704
- public function EventPluginPostDelete( $post_id ) {
705
- // Filter $_REQUEST array for security.
706
- $get_array = filter_input_array( INPUT_GET );
707
- $post_array = filter_input_array( INPUT_POST );
708
-
709
- if ( empty( $get_array['action'] ) && isset( $get_array['page'] ) ) {
710
- $post = get_post( $post_id );
711
- if ( ! in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true )
712
- || ! empty( $post->post_title ) ) {
713
- $this->plugin->alerts->Trigger(
714
- 5025,
715
- array(
716
- 'PostID' => $post->ID,
717
- 'PostType' => $post->post_type,
718
- 'PostTitle' => $post->post_title,
719
- 'Username' => 'Plugins',
720
- )
721
- );
722
- }
723
- }
724
-
725
- if ( empty( $post_array['action'] ) && isset( $post_array['page'] ) ) {
726
- $post = get_post( $post_id );
727
- if ( ! in_array( $post->post_type, $this->plugin->alerts->ignored_cpts, true )
728
- || ! empty( $post->post_title ) ) {
729
- $this->plugin->alerts->Trigger(
730
- 5025,
731
- array(
732
- 'PostID' => $post->ID,
733
- 'PostType' => $post->post_type,
734
- 'PostTitle' => $post->post_title,
735
- 'Username' => 'Plugins',
736
- )
737
- );
738
- }
739
- }
740
- }
741
-
742
  /**
743
  * Get removed themes.
744
  *
@@ -754,359 +474,15 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
754
  return array_values( $result );
755
  }
756
 
757
- /**
758
- * Method: Handle plugin/theme install event
759
- * from MainWP dashboard on child site.
760
- *
761
- * @param array $args - Array of arguments related to asset installed.
762
- * @since 3.2.2
763
- */
764
- public function mainwp_child_install_assets( $args ) {
765
- if ( empty( $args ) || ! is_array( $args ) ) {
766
- return;
767
- }
768
-
769
- // Verify the action from MainWP.
770
- if (
771
- isset( $args['action'] ) && 'install' === $args['action']
772
- && isset( $args['success'] ) && ! empty( $args['success'] )
773
- ) {
774
- if ( isset( $args['type'] ) && 'theme' === $args['type'] ) { // Installing theme.
775
- // Get theme name & object.
776
- $theme_slug = isset( $args['slug'] ) ? $args['slug'] : false;
777
- $theme_obj = wp_get_theme( $theme_slug );
778
-
779
- // Check if theme exists.
780
- if ( $theme_obj->exists() ) {
781
- $this->plugin->alerts->Trigger(
782
- 5005,
783
- array(
784
- 'Theme' => (object) array(
785
- 'Name' => $theme_obj->Name,
786
- 'ThemeURI' => $theme_obj->ThemeURI,
787
- 'Description' => $theme_obj->Description,
788
- 'Author' => $theme_obj->Author,
789
- 'Version' => $theme_obj->Version,
790
- 'get_template_directory' => $theme_obj->get_template_directory(),
791
- ),
792
- )
793
- );
794
- // Add theme to site themes list.
795
- $this->set_site_themes( $theme_slug );
796
- }
797
- } elseif ( isset( $args['type'] ) && 'plugin' === $args['type'] ) {
798
- // Get plugin slug.
799
- $plugin_slug = isset( $args['slug'] ) ? $args['slug'] : false;
800
-
801
- $plugins = get_plugins(); // Get all plugins.
802
- $plugin = $plugins[ $plugin_slug ]; // Take out the plugin being installed.
803
-
804
- // Get plugin directory name.
805
- $plugin_dir = $this->get_plugin_dir( $plugin_slug );
806
-
807
- // Add plugin to site plugins list.
808
- $this->set_site_plugins( $plugin_dir );
809
-
810
- $plugin_path = plugin_dir_path( WP_PLUGIN_DIR . '/' . $plugin_slug );
811
- $this->plugin->alerts->Trigger(
812
- 5000,
813
- array(
814
- 'Plugin' => (object) array(
815
- 'Name' => $plugin['Name'],
816
- 'PluginURI' => $plugin['PluginURI'],
817
- 'Version' => $plugin['Version'],
818
- 'Author' => $plugin['Author'],
819
- 'Network' => $plugin['Network'] ? 'True' : 'False',
820
- 'plugin_dir_path' => $plugin_path,
821
- ),
822
- )
823
- );
824
- }
825
- }
826
- }
827
-
828
- /**
829
- * Method: Handle plugin uninstall event
830
- * from MainWP dashboard on child site.
831
- *
832
- * @param array $args - Array of arguments related to asset uninstalled.
833
- * @since 3.2.2
834
- */
835
- public function mainwp_child_uninstall_plugin( $args ) {
836
- if ( empty( $args ) || ! is_array( $args ) ) {
837
- return;
838
- }
839
-
840
- // Get MainWP post data.
841
- $post_array = filter_input_array( INPUT_POST );
842
-
843
- // Get plugins from MainWP.
844
- if ( isset( $post_array['plugin'] ) && ! empty( $post_array['plugin'] ) ) {
845
- $wp_plugins = explode( '||', $post_array['plugin'] );
846
- }
847
-
848
- // Verify actions from MainWP.
849
- if (
850
- isset( $args['action'] ) && 'delete' === $args['action']
851
- && isset( $args['Name'] ) && ! empty( $args['Name'] )
852
- && isset( $post_array['mainwpsignature'] ) && ! empty( $post_array['mainwpsignature'] )
853
- ) {
854
- // Get plugin name.
855
- $plugin_name = $args['Name'];
856
-
857
- // Get plugin filename.
858
- $plugin_filename = $this->get_plugin_file_name( $plugin_name );
859
-
860
- if ( ! empty( $plugin_filename ) && in_array( $plugin_filename, $wp_plugins, true ) ) {
861
- $this->plugin->alerts->Trigger(
862
- 5003,
863
- array(
864
- 'PluginFile' => $plugin_filename,
865
- 'PluginData' => (object) array(
866
- 'Name' => $plugin_name,
867
- ),
868
- )
869
- );
870
-
871
- // Get plugin directory name.
872
- $plugin_dir = $this->get_plugin_dir( $plugin_filename );
873
-
874
- // Set plugin to skip file changes alert.
875
- $this->skip_plugin_change_alerts( $plugin_dir );
876
-
877
- // Remove it from the list.
878
- $this->remove_site_plugin( $plugin_dir );
879
- }
880
- }
881
- }
882
-
883
- /**
884
- * Method: Handle theme uninstall event
885
- * from MainWP dashboard on child site.
886
- *
887
- * @param array $args - Array of arguments related to asset uninstalled.
888
- * @since 3.2.2
889
- */
890
- public function mainwp_child_uninstall_theme( $args ) {
891
- if ( empty( $args ) || ! is_array( $args ) ) {
892
- return;
893
- }
894
-
895
- // Get MainWP post data.
896
- $post_array = filter_input_array( INPUT_POST );
897
-
898
- // Get themes from MainWP.
899
- if ( isset( $post_array['theme'] ) && ! empty( $post_array['theme'] ) ) {
900
- $wp_themes = explode( '||', $post_array['theme'] );
901
- }
902
-
903
- // Verify actions from MainWP.
904
- if (
905
- isset( $args['action'] ) && 'delete' === $args['action']
906
- && isset( $args['Name'] ) && ! empty( $args['Name'] )
907
- && isset( $post_array['mainwpsignature'] ) && ! empty( $post_array['mainwpsignature'] )
908
- ) {
909
- // Get theme object.
910
- $themes = $this->GetRemovedThemes();
911
-
912
- if ( ! empty( $themes ) ) {
913
- foreach ( $themes as $index => $theme ) {
914
- if ( ! empty( $theme ) && $theme instanceof WP_Theme && in_array( $theme->Name, $wp_themes, true ) ) {
915
- $this->plugin->alerts->Trigger(
916
- 5007,
917
- array(
918
- 'Theme' => (object) array(
919
- 'Name' => $theme->Name,
920
- 'ThemeURI' => $theme->ThemeURI,
921
- 'Description' => $theme->Description,
922
- 'Author' => $theme->Author,
923
- 'Version' => $theme->Version,
924
- 'get_template_directory' => $theme->get_template_directory(),
925
- ),
926
- )
927
- );
928
-
929
- // Set theme to skip file changes alert.
930
- $this->skip_theme_change_alerts( $theme->stylesheet );
931
-
932
- // Remove it from the list.
933
- $this->remove_site_theme( $theme->stylesheet );
934
- }
935
- }
936
- }
937
- }
938
- }
939
-
940
- /**
941
- * Method: Handle plugin activation event
942
- * from MainWP dashboard on a child site.
943
- *
944
- * @param string $plugin - Plugin slug.
945
- * @since 3.2.2
946
- */
947
- public function mainwp_child_plugin_events( $plugin ) {
948
- // Check parameter.
949
- if ( empty( $plugin ) ) {
950
- return;
951
- }
952
-
953
- // Get MainWP post data.
954
- $post_array = filter_input_array( INPUT_POST );
955
-
956
- // Get plugins from MainWP.
957
- if ( isset( $post_array['plugin'] ) && ! empty( $post_array['plugin'] ) ) {
958
- $wp_plugins = explode( '||', $post_array['plugin'] );
959
- }
960
-
961
- if (
962
- isset( $post_array['mainwpsignature'] ) // Check MainWP signature.
963
- && isset( $post_array['action'] ) // Check if action is set.
964
- && isset( $post_array['function'] ) // Check if function is set.
965
- && 'plugin_action' === $post_array['function']
966
- && in_array( $plugin, $wp_plugins, true ) // Check if plugin being activate/deactivate is in the list of plugins from MainWP.
967
- ) {
968
- if ( 'activate' === $post_array['action'] ) {
969
- $event = 5001;
970
- } elseif ( 'deactivate' === $post_array['action'] ) {
971
- $event = 5002;
972
- }
973
-
974
- $plugin = WP_PLUGIN_DIR . '/' . $plugin;
975
- $plugin_data = get_plugin_data( $plugin, false, true );
976
- $this->plugin->alerts->Trigger(
977
- $event,
978
- array(
979
- 'PluginFile' => $plugin,
980
- 'PluginData' => (object) array(
981
- 'Name' => $plugin_data['Name'],
982
- 'PluginURI' => $plugin_data['PluginURI'],
983
- 'Version' => $plugin_data['Version'],
984
- 'Author' => $plugin_data['Author'],
985
- 'Network' => $plugin_data['Network'] ? 'True' : 'False',
986
- ),
987
- )
988
- );
989
- } elseif (
990
- isset( $post_array['mainwpsignature'] ) // Check MainWP signature.
991
- && isset( $post_array['function'] ) // Check if function is set.
992
- && 'installplugintheme' === $post_array['function']
993
- && isset( $post_array['type'] ) // Check if type is set.
994
- && 'plugin' === $post_array['type']
995
- ) {
996
- $plugin = WP_PLUGIN_DIR . '/' . $plugin;
997
- $plugin_data = get_plugin_data( $plugin, false, true );
998
- $this->plugin->alerts->Trigger(
999
- 5001,
1000
- array(
1001
- 'PluginFile' => $plugin,
1002
- 'PluginData' => (object) array(
1003
- 'Name' => $plugin_data['Name'],
1004
- 'PluginURI' => $plugin_data['PluginURI'],
1005
- 'Version' => $plugin_data['Version'],
1006
- 'Author' => $plugin_data['Author'],
1007
- 'Network' => $plugin_data['Network'] ? 'True' : 'False',
1008
- ),
1009
- )
1010
- );
1011
- }
1012
- }
1013
-
1014
- /**
1015
- * Method: Handle plugin/theme update event
1016
- * from MainWP dashboard on child site.
1017
- *
1018
- * @param array $args - Array of arguments related to asset updated.
1019
- * @since 3.2.2
1020
- */
1021
- public function mainwp_child_update_assets( $args ) {
1022
- if ( empty( $args ) || ! is_array( $args ) ) {
1023
- return;
1024
- }
1025
-
1026
- // Get MainWP post data.
1027
- $post_array = filter_input_array( INPUT_POST );
1028
-
1029
- // Check type.
1030
- if (
1031
- isset( $post_array['function'] ) && 'upgradeplugintheme' === $post_array['function']
1032
- && isset( $post_array['mainwpsignature'] ) && ! empty( $post_array['mainwpsignature'] )
1033
- && isset( $post_array['list'] ) && ! empty( $post_array['list'] )
1034
- && isset( $args['type'] ) && ! empty( $args['type'] )
1035
- && isset( $args['name'] ) && ! empty( $args['name'] )
1036
- ) {
1037
- if ( 'theme' === $args['type'] ) {
1038
- // Site themes updated.
1039
- $site_themes = explode( ',', $post_array['list'] );
1040
-
1041
- // Theme name.
1042
- $theme_name = $args['name'];
1043
-
1044
- // Get theme object.
1045
- $theme = $this->get_theme_by_name( $theme_name );
1046
-
1047
- if ( ! empty( $theme ) && $theme instanceof WP_Theme && in_array( $theme->stylesheet, $site_themes, true ) ) {
1048
- $this->plugin->alerts->Trigger(
1049
- 5031,
1050
- array(
1051
- 'Theme' => (object) array(
1052
- 'Name' => $theme->Name,
1053
- 'ThemeURI' => $theme->ThemeURI,
1054
- 'Description' => $theme->Description,
1055
- 'Author' => $theme->Author,
1056
- 'Version' => $theme->Version,
1057
- 'get_template_directory' => $theme->get_template_directory(),
1058
- ),
1059
- )
1060
- );
1061
-
1062
- // Set theme to skip file changes alert.
1063
- $this->skip_theme_change_alerts( $theme->stylesheet );
1064
- }
1065
- } elseif ( 'plugin' === $args['type'] ) {
1066
- // Plugin name.
1067
- $plugin_name = $args['name'];
1068
-
1069
- // Get plugin filename.
1070
- $plugin_file = $this->get_plugin_file_name( $plugin_name );
1071
-
1072
- // If plugin file is empty then return.
1073
- if ( empty( $plugin_file ) ) {
1074
- return;
1075
- }
1076
-
1077
- // Get plugin directory name.
1078
- $plugin_dir = $this->get_plugin_dir( $plugin_file );
1079
-
1080
- // Set plugin to skip file changes alert.
1081
- $this->skip_plugin_change_alerts( $plugin_dir );
1082
-
1083
- $plugin_file = WP_PLUGIN_DIR . '/' . $plugin_file;
1084
- $plugin_data = get_plugin_data( $plugin_file, false, true );
1085
-
1086
- $this->plugin->alerts->Trigger(
1087
- 5004,
1088
- array(
1089
- 'PluginFile' => $plugin_file,
1090
- 'PluginData' => (object) array(
1091
- 'Name' => $plugin_data['Name'],
1092
- 'PluginURI' => $plugin_data['PluginURI'],
1093
- 'Version' => $plugin_data['Version'],
1094
- 'Author' => $plugin_data['Author'],
1095
- 'Network' => $plugin_data['Network'] ? 'True' : 'False',
1096
- ),
1097
- )
1098
- );
1099
- }
1100
- }
1101
- }
1102
-
1103
  /**
1104
  * Get event code by post type.
1105
  *
1106
  * @param object $post - Post object.
1107
- * @param int $type_post - Code for post.
1108
- * @param int $type_page - Code for page.
1109
- * @param int $type_custom - Code for custom post type.
 
 
1110
  */
1111
  protected function GetEventTypeForPostType( $post, $type_post, $type_page, $type_custom ) {
1112
  if ( empty( $post ) || ! isset( $post->post_type ) ) {
@@ -1140,237 +516,6 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
1140
  return $editor_link;
1141
  }
1142
 
1143
- /**
1144
- * Method: Add plugins to site plugins list.
1145
- *
1146
- * @param string $plugin – Plugin directory name.
1147
- */
1148
- public function set_site_plugins( $plugin = '' ) {
1149
- // Call the wrapper function to setup content.
1150
- $this->set_site_content( 'plugin', $plugin );
1151
- }
1152
-
1153
- /**
1154
- * Method: Add themes to site themes list.
1155
- *
1156
- * @param string $theme – Theme name.
1157
- */
1158
- public function set_site_themes( $theme = '' ) {
1159
- // Call the wrapper function to setup content.
1160
- $this->set_site_content( 'theme', $theme );
1161
- }
1162
-
1163
- /**
1164
- * Method: Add plugins or themes to site content class member.
1165
- *
1166
- * @param string $type – Type of content i.e. `plugin` or `theme`.
1167
- * @param string $content – Name of the content. It can be a plugin or a theme.
1168
- */
1169
- public function set_site_content( $type, $content = '' ) {
1170
- /**
1171
- * $type should not be empty.
1172
- * Possible values: `plugin` | `theme`.
1173
- */
1174
- if ( empty( $type ) ) {
1175
- return;
1176
- }
1177
-
1178
- // Set content option.
1179
- $content_option = 'site_content';
1180
-
1181
- // Get site plugins options.
1182
- $this->site_content = $this->plugin->GetGlobalSetting( $content_option, false );
1183
-
1184
- /**
1185
- * Initiate the content option.
1186
- *
1187
- * If option does not exists then set the option.
1188
- */
1189
- if ( false === $this->site_content ) {
1190
- $this->site_content = new stdClass(); // New stdClass object.
1191
- $plugins = $this->get_site_plugins(); // Get plugins on the site.
1192
- $themes = $this->get_site_themes(); // Get themes on the site.
1193
-
1194
- // Assign the plugins to content object.
1195
- foreach ( $plugins as $index => $plugin ) {
1196
- $this->site_content->plugins[] = strtolower( $plugin );
1197
- $this->site_content->skip_plugins[] = strtolower( $plugin );
1198
- }
1199
-
1200
- // Assign the themes to content object.
1201
- foreach ( $themes as $index => $theme ) {
1202
- $this->site_content->themes[] = strtolower( $theme );
1203
- $this->site_content->skip_themes[] = strtolower( $theme );
1204
- }
1205
-
1206
- $this->plugin->SetGlobalSetting( $content_option, $this->site_content );
1207
- }
1208
-
1209
- // Check if type is plugin and content is not empty.
1210
- if ( 'plugin' === $type && ! empty( $content ) ) {
1211
- // If the plugin is not already present in the current list then.
1212
- if ( ! in_array( $content, $this->site_content->plugins, true ) ) {
1213
- // Add the plugin to the list and save it.
1214
- $this->site_content->plugins[] = strtolower( $content );
1215
- $this->site_content->skip_plugins[] = strtolower( $content );
1216
- $this->plugin->SetGlobalSetting( $content_option, $this->site_content );
1217
- }
1218
- } elseif ( 'theme' === $type && ! empty( $content ) ) {
1219
- // If the theme is not already present in the current list then.
1220
- if ( ! in_array( $content, $this->site_content->themes, true ) ) {
1221
- // Add the theme to the list and save it.
1222
- $this->site_content->themes[] = strtolower( $content );
1223
- $this->site_content->skip_themes[] = strtolower( $content );
1224
- $this->plugin->SetGlobalSetting( $content_option, $this->site_content );
1225
- }
1226
- }
1227
- }
1228
-
1229
- /**
1230
- * Method: Remove plugin from site plugins list.
1231
- *
1232
- * @param string $plugin – Plugin name.
1233
- * @return bool
1234
- */
1235
- public function remove_site_plugin( $plugin ) {
1236
- return $this->remove_site_content( 'plugin', $plugin );
1237
- }
1238
-
1239
- /**
1240
- * Method: Remove theme from site themes list.
1241
- *
1242
- * @param string $theme – Theme name.
1243
- * @return bool
1244
- */
1245
- public function remove_site_theme( $theme ) {
1246
- return $this->remove_site_content( 'theme', $theme );
1247
- }
1248
-
1249
- /**
1250
- * Method: Remove content from site content list.
1251
- *
1252
- * @param string $type – Type of content.
1253
- * @param string $content – Name of content.
1254
- * @return bool
1255
- */
1256
- public function remove_site_content( $type, $content ) {
1257
- /**
1258
- * $type should not be empty.
1259
- * Possible values: `plugin` | `theme`.
1260
- */
1261
- if ( empty( $type ) ) {
1262
- return;
1263
- }
1264
-
1265
- // Check if $content is empty.
1266
- if ( empty( $content ) ) {
1267
- return false;
1268
- }
1269
-
1270
- // Check if the plugin is already present in the list.
1271
- if ( 'plugin' === $type && in_array( $content, $this->site_content->plugins, true ) ) {
1272
- // Get key of the plugin from plugins array.
1273
- $key = array_search( $content, $this->site_content->plugins, true );
1274
-
1275
- // If key is found then remove it from the array and save the plugins list.
1276
- if ( false !== $key ) {
1277
- unset( $this->site_content->plugins[ $key ] );
1278
- $this->plugin->SetGlobalSetting( 'site_content', $this->site_content );
1279
- return true;
1280
- }
1281
- } elseif ( 'theme' === $type && in_array( $content, $this->site_content->themes, true ) ) {
1282
- // Get key of the theme from themes array.
1283
- $key = array_search( $content, $this->site_content->themes, true );
1284
-
1285
- // If key is found then remove it from the array and save the themes list.
1286
- if ( false !== $key ) {
1287
- unset( $this->site_content->themes[ $key ] );
1288
- $this->plugin->SetGlobalSetting( 'site_content', $this->site_content );
1289
- return true;
1290
- }
1291
- }
1292
- return false;
1293
- }
1294
-
1295
- /**
1296
- * Method: Add plugin to skip file changes alert list.
1297
- *
1298
- * @param string $plugin – Plugin name.
1299
- * @return bool
1300
- */
1301
- public function skip_plugin_change_alerts( $plugin ) {
1302
- return $this->skip_content_change_alerts( 'plugin', $plugin );
1303
- }
1304
-
1305
- /**
1306
- * Method: Add theme to skip file changes alert list.
1307
- *
1308
- * @param string $theme – Theme name.
1309
- * @return bool
1310
- */
1311
- public function skip_theme_change_alerts( $theme ) {
1312
- return $this->skip_content_change_alerts( 'theme', $theme );
1313
- }
1314
-
1315
- /**
1316
- * Method: Add content to skip file changes alert list.
1317
- *
1318
- * @param string $type – Type of content.
1319
- * @param string $content – Name of content.
1320
- * @return bool
1321
- */
1322
- public function skip_content_change_alerts( $type, $content ) {
1323
- /**
1324
- * $type should not be empty.
1325
- * Possible values: `plugin` | `theme`.
1326
- */
1327
- if ( empty( $type ) ) {
1328
- return;
1329
- }
1330
-
1331
- // Check if $content is empty.
1332
- if ( empty( $content ) ) {
1333
- return false;
1334
- }
1335
-
1336
- // Add plugin to skip file alerts list.
1337
- if ( 'plugin' === $type ) {
1338
- $this->site_content->skip_plugins[] = $content;
1339
- $this->plugin->SetGlobalSetting( 'site_content', $this->site_content );
1340
- } elseif ( 'theme' === $type ) {
1341
- // Add theme to skip file alerts list.
1342
- $this->site_content->skip_themes[] = $content;
1343
- $this->plugin->SetGlobalSetting( 'site_content', $this->site_content );
1344
- }
1345
- return true;
1346
- }
1347
-
1348
- /**
1349
- * Method: Get site plugin directories.
1350
- *
1351
- * @return array
1352
- */
1353
- public function get_site_plugins() {
1354
- // Get plugins.
1355
- $plugins = array_keys( get_plugins() );
1356
-
1357
- // Remove php file name from the plugins.
1358
- $plugins = array_map( array( $this, 'get_plugin_dir' ), $plugins );
1359
-
1360
- // Return plugins.
1361
- return $plugins;
1362
- }
1363
-
1364
- /**
1365
- * Method: Get site themes.
1366
- *
1367
- * @return array
1368
- */
1369
- public function get_site_themes() {
1370
- // Get themes.
1371
- return array_keys( wp_get_themes() );
1372
- }
1373
-
1374
  /**
1375
  * Method: Remove the PHP file after `/` in the plugin
1376
  * directory name.
@@ -1379,9 +524,10 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
1379
  * `akismet/akismet.php`.
1380
  *
1381
  * @param string $plugin – Plugin name.
 
1382
  * @return string
1383
  */
1384
- public function get_plugin_dir( $plugin ) {
1385
  $position = strpos( $plugin, '/' );
1386
  if ( false !== $position ) {
1387
  $plugin = substr_replace( $plugin, '', $position );
@@ -1393,12 +539,13 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
1393
  * Method: Return plugin file name.
1394
  *
1395
  * @param string $plugin_name - Plugin name.
 
1396
  * @return string
1397
  */
1398
- public function get_plugin_file_name( $plugin_name ) {
1399
  // Verify parameter.
1400
  if ( empty( $plugin_name ) ) {
1401
- return;
1402
  }
1403
 
1404
  // Get all plugins.
@@ -1419,9 +566,10 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
1419
  * Method: Search and return theme object by name.
1420
  *
1421
  * @param string $theme_name - Theme name.
 
1422
  * @return WP_Theme
1423
  */
1424
- public function get_theme_by_name( $theme_name ) {
1425
  // Check if $theme_name is empty.
1426
  if ( empty( $theme_name ) ) {
1427
  return;
@@ -1451,11 +599,11 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
1451
  // Grab list of plugins we have addons for.
1452
  $predefined_plugins = WSAL_PluginInstallAndActivate::get_installable_plugins();
1453
  $predefined_plugins_addon = array_column( $predefined_plugins, 'addon_for' );
1454
- $predefined_plugins_slugs = array_column( $predefined_plugins, 'plugin_slug' );
1455
- $all_plugins = get_plugins();
1456
- $all_plugins = array_keys( $all_plugins );
1457
-
1458
  foreach ( $predefined_plugins_addon as $plugin ) {
 
 
 
1459
  // Check if plugin file starts with the same string as our addon_for, or if its equal.
1460
  if ( $plugin_filename === $plugin ) {
1461
  $addon_slug = array( array_search( $plugin, array_column( $predefined_plugins, 'addon_for', 'plugin_slug' ) ) );
@@ -1469,13 +617,14 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
1469
  $new_plugin_filenames = $plugin_filename;
1470
  }
1471
  $this->plugin->SetGlobalSetting( 'installed_plugin_addon_available', $new_plugin_filenames );
1472
- $this->plugin->options_helper->delete_option( 'wsal_addon_available_notice_dismissed' );
1473
  }
1474
  }
1475
  }
1476
  }
1477
 
1478
- public function run_addon_removal_check( $plugin_dir ) {
 
1479
  $plugin_filename = basename( preg_replace( '/\\.[^.\\s]{3,4}$/', '', $plugin_dir ) );
1480
 
1481
  if ( is_array( $plugin_filename ) ) {
@@ -1485,22 +634,71 @@ class WSAL_Sensors_PluginsThemes extends WSAL_AbstractSensor {
1485
  // Grab list of plugins we have addons for.
1486
  $predefined_plugins = WSAL_PluginInstallAndActivate::get_installable_plugins();
1487
  $predefined_plugins_addon = array_column( $predefined_plugins, 'addon_for' );
1488
- $predefined_plugins_slugs = array_column( $predefined_plugins, 'plugin_slug' );
1489
- $all_plugins = get_plugins();
1490
- $all_plugins = array_keys( $all_plugins );
1491
-
1492
  foreach ( $predefined_plugins_addon as $plugin ) {
 
 
 
1493
  // Check if plugin file starts with the same string as our addon_for, or if its equal.
1494
  if ( $plugin_filename === $plugin ) {
1495
- $current_installed = $this->plugin->GetGlobalSetting( 'installed_plugin_addon_available' );
1496
  if ( isset( $current_installed ) && ! empty( $current_installed ) ) {
1497
  if ( ( $key = array_search( $plugin, $current_installed ) ) !== false ) {
1498
  unset( $current_installed[$key] );
1499
  }
1500
  }
1501
 
1502
- $this->plugin->SetGlobalSetting( 'installed_plugin_addon_available', $current_installed );
1503
  }
1504
  }
1505
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1506
  }
24
  * 5005 User installed a theme
25
  * 5006 User activated a theme
26
  * 5007 User uninstalled a theme
 
 
 
 
 
 
27
  * 5031 User updated a theme
 
 
 
28
  *
29
  * @package Wsal
30
  * @subpackage Sensors
45
  */
46
  protected $old_plugins = array();
47
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  /**
49
  * Listening to events using WP hooks.
50
  */
51
  public function HookEvents() {
52
  $has_permission = ( current_user_can( 'install_plugins' ) || current_user_can( 'activate_plugins' ) ||
53
+ current_user_can( 'delete_plugins' ) || current_user_can( 'update_plugins' ) || current_user_can( 'install_themes' ) );
54
 
55
  add_action( 'admin_init', array( $this, 'EventAdminInit' ) );
56
  if ( $has_permission ) {
57
  add_action( 'shutdown', array( $this, 'EventAdminShutdown' ) );
58
  }
59
  add_action( 'switch_theme', array( $this, 'EventThemeActivated' ) );
60
+ add_action( 'upgrader_overwrote_package', [ $this, 'OnPackageOverwrite' ], 10, 3 );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  }
62
 
63
  /**
68
  $this->old_plugins = get_plugins();
69
  }
70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
71
  /**
72
  * Install, uninstall, activate, deactivate, upgrade and update.
73
  */
116
  $plugin = $plugin[ $plugin_path ];
117
 
118
  // Get plugin directory name.
119
+ $plugin_dir = WSAL_Sensors_PluginsThemes::get_plugin_dir( $plugin_path );
 
 
 
120
 
121
  $plugin_path = plugin_dir_path( WP_PLUGIN_DIR . '/' . $plugin_path[0] );
122
  $this->plugin->alerts->Trigger(
244
  ),
245
  )
246
  );
247
+ WSAL_Sensors_PluginsThemes::run_addon_removal_check( $plugin_file );
248
  }
249
  } elseif ( isset( $post_array['checked'] ) && ! empty( $post_array['checked'] ) ) {
250
  foreach ( $post_array['checked'] as $plugin_file ) {
263
  ),
264
  )
265
  );
266
+ WSAL_Sensors_PluginsThemes::run_addon_removal_check( $plugin_file );
267
  }
268
  }
269
  }
290
  ),
291
  )
292
  );
293
+ WSAL_Sensors_PluginsThemes::run_addon_removal_check( $plugin_file );
294
  }
295
  }
296
  }
312
  )
313
  );
314
 
315
+ WSAL_Sensors_PluginsThemes::run_addon_removal_check( $plugin_file );
 
 
 
 
 
 
 
 
 
316
  }
317
  }
318
 
335
  }
336
  if ( isset( $plugins ) ) {
337
  foreach ( $plugins as $plugin_file ) {
338
+ WSAL_Sensors_PluginsThemes::LogPluginUpdatedEvent( $plugin_file );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
339
  }
340
  }
341
  }
398
  ),
399
  )
400
  );
 
 
401
  }
402
  }
403
 
417
  ),
418
  )
419
  );
 
 
 
 
 
 
420
  }
421
  }
422
  }
459
  );
460
  }
461
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
462
  /**
463
  * Get removed themes.
464
  *
474
  return array_values( $result );
475
  }
476
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
477
  /**
478
  * Get event code by post type.
479
  *
480
  * @param object $post - Post object.
481
+ * @param int $type_post - Code for post.
482
+ * @param int $type_page - Code for page.
483
+ * @param int $type_custom - Code for custom post type.
484
+ *
485
+ * @return false|int
486
  */
487
  protected function GetEventTypeForPostType( $post, $type_post, $type_page, $type_custom ) {
488
  if ( empty( $post ) || ! isset( $post->post_type ) ) {
516
  return $editor_link;
517
  }
518
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
519
  /**
520
  * Method: Remove the PHP file after `/` in the plugin
521
  * directory name.
524
  * `akismet/akismet.php`.
525
  *
526
  * @param string $plugin – Plugin name.
527
+ *
528
  * @return string
529
  */
530
+ public static function get_plugin_dir( $plugin ) {
531
  $position = strpos( $plugin, '/' );
532
  if ( false !== $position ) {
533
  $plugin = substr_replace( $plugin, '', $position );
539
  * Method: Return plugin file name.
540
  *
541
  * @param string $plugin_name - Plugin name.
542
+ *
543
  * @return string
544
  */
545
+ public static function get_plugin_file_name( $plugin_name ) {
546
  // Verify parameter.
547
  if ( empty( $plugin_name ) ) {
548
+ return '';
549
  }
550
 
551
  // Get all plugins.
566
  * Method: Search and return theme object by name.
567
  *
568
  * @param string $theme_name - Theme name.
569
+ *
570
  * @return WP_Theme
571
  */
572
+ public static function get_theme_by_name( $theme_name ) {
573
  // Check if $theme_name is empty.
574
  if ( empty( $theme_name ) ) {
575
  return;
599
  // Grab list of plugins we have addons for.
600
  $predefined_plugins = WSAL_PluginInstallAndActivate::get_installable_plugins();
601
  $predefined_plugins_addon = array_column( $predefined_plugins, 'addon_for' );
602
+ $all_plugins = array_keys( get_plugins() );
 
 
 
603
  foreach ( $predefined_plugins_addon as $plugin ) {
604
+
605
+ $plugin = apply_filters( 'wsal_modify_predefined_plugin_slug', $plugin );
606
+
607
  // Check if plugin file starts with the same string as our addon_for, or if its equal.
608
  if ( $plugin_filename === $plugin ) {
609
  $addon_slug = array( array_search( $plugin, array_column( $predefined_plugins, 'addon_for', 'plugin_slug' ) ) );
617
  $new_plugin_filenames = $plugin_filename;
618
  }
619
  $this->plugin->SetGlobalSetting( 'installed_plugin_addon_available', $new_plugin_filenames );
620
+ $this->plugin->DeleteSettingByName( WpSecurityAuditLog::OPTIONS_PREFIX . '_addon_available_notice_dismissed' );
621
  }
622
  }
623
  }
624
  }
625
 
626
+ public static function run_addon_removal_check( $plugin_dir ) {
627
+ $wsal = WpSecurityAuditLog::GetInstance();
628
  $plugin_filename = basename( preg_replace( '/\\.[^.\\s]{3,4}$/', '', $plugin_dir ) );
629
 
630
  if ( is_array( $plugin_filename ) ) {
634
  // Grab list of plugins we have addons for.
635
  $predefined_plugins = WSAL_PluginInstallAndActivate::get_installable_plugins();
636
  $predefined_plugins_addon = array_column( $predefined_plugins, 'addon_for' );
 
 
 
 
637
  foreach ( $predefined_plugins_addon as $plugin ) {
638
+
639
+ $plugin = apply_filters( 'wsal_modify_predefined_plugin_slug', $plugin );
640
+
641
  // Check if plugin file starts with the same string as our addon_for, or if its equal.
642
  if ( $plugin_filename === $plugin ) {
643
+ $current_installed = $wsal->GetGlobalSetting( 'installed_plugin_addon_available' );
644
  if ( isset( $current_installed ) && ! empty( $current_installed ) ) {
645
  if ( ( $key = array_search( $plugin, $current_installed ) ) !== false ) {
646
  unset( $current_installed[$key] );
647
  }
648
  }
649
 
650
+ $wsal->SetGlobalSetting( 'installed_plugin_addon_available', $current_installed );
651
  }
652
  }
653
  }
654
+
655
+ /**
656
+ * Fires when the upgrader has successfully overwritten a currently installed
657
+ * plugin or theme with an uploaded zip package.
658
+ *
659
+ * @since 4.1.4
660
+ *
661
+ * @param string $package The package file.
662
+ * @param array $new_plugin_data The new plugin data.
663
+ * @param string $package_type The package type (plugin or theme).
664
+ */
665
+ public function OnPackageOverwrite( $package, $new_plugin_data, $package_type ) {
666
+ if ( 'plugin' !== $package_type ) {
667
+ return;
668
+ }
669
+
670
+ if ( array_key_exists( 'Name', $new_plugin_data ) ) {
671
+ $plugin_file = WSAL_Sensors_PluginsThemes::get_plugin_file_name( $new_plugin_data['Name'] );
672
+ if ( ! empty( $plugin_file ) ) {
673
+ WSAL_Sensors_PluginsThemes::LogPluginUpdatedEvent( $plugin_file );
674
+ }
675
+ }
676
+ }
677
+
678
+ /**
679
+ * Log plugin updated event.
680
+ *
681
+ * @param string $plugin_file Relative path to the plugin filename.
682
+ *
683
+ * @since 4.1.4
684
+ */
685
+ public static function LogPluginUpdatedEvent( $plugin_file ) {
686
+ $plugin_file = WP_PLUGIN_DIR . '/' . $plugin_file;
687
+ $plugin_data = get_plugin_data( $plugin_file, false, true );
688
+
689
+ $wsal = WpSecurityAuditLog::GetInstance();
690
+ $wsal->alerts->Trigger(
691
+ 5004,
692
+ array(
693
+ 'PluginFile' => $plugin_file,
694
+ 'PluginData' => (object) array(
695
+ 'Name' => $plugin_data['Name'],
696
+ 'PluginURI' => $plugin_data['PluginURI'],
697
+ 'Version' => $plugin_data['Version'],
698
+ 'Author' => $plugin_data['Author'],
699
+ 'Network' => $plugin_data['Network'] ? 'True' : 'False',
700
+ ),
701
+ )
702
+ );
703
+ }
704
  }
classes/Sensors/System.php CHANGED
@@ -90,7 +90,7 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
90
  // Cron Job 404 log files pruning.
91
  add_action( self::SCHEDULED_HOOK_LOG_FILE_PRUDING, array( $this, 'LogFilesPruning' ) );
92
  // whitelist options.
93
- add_action( 'whitelist_options', array( $this, 'EventOptions' ), 10, 1 );
94
 
95
  // Update admin email alert.
96
  add_action( 'update_option_admin_email', array( $this, 'admin_email_changed' ), 10, 3 );
@@ -356,7 +356,7 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
356
  }
357
 
358
  // Make sure user can actually modify target options.
359
- if ( ! current_user_can( 'manage_options' ) && isset( $post_array['_wpnonce'] ) && ! wp_verify_nonce( $post_array['_wpnonce'], 'update' ) ) {
360
  return;
361
  }
362
 
@@ -405,7 +405,7 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
405
  }
406
  }
407
 
408
- // Registeration Option.
409
  if ( $is_option_page && wp_verify_nonce( $post_array['_wpnonce'], 'general-options' ) && ( get_option( 'users_can_register' ) xor isset( $post_array['users_can_register'] ) ) ) {
410
  $old = get_option( 'users_can_register' ) ? 'enabled' : 'disabled';
411
  $new = isset( $post_array['users_can_register'] ) ? 'enabled' : 'disabled';
@@ -454,9 +454,9 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
454
  }
455
 
456
  // Admin Email of Network.
457
- if ( $is_network_settings && ! empty( $post_array['admin_email'] ) ) {
458
  $old = get_site_option( 'admin_email' );
459
- $new = trim( $post_array['admin_email'] );
460
  if ( $old != $new ) {
461
  $this->plugin->alerts->Trigger(
462
  6003,
@@ -470,7 +470,8 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
470
  }
471
 
472
  // Permalinks changed.
473
- if ( $is_permalink_page && ! empty( $post_array['permalink_structure'] ) ) {
 
474
  $old = get_option( 'permalink_structure' );
475
  $new = trim( $post_array['permalink_structure'] );
476
  if ( $old != $new ) {
@@ -486,7 +487,8 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
486
  }
487
 
488
  // Core Update.
489
- if ( isset( $get_array['action'] ) && 'do-core-upgrade' === $get_array['action'] && isset( $post_array['version'] ) ) {
 
490
  $old_version = get_bloginfo( 'version' );
491
  $new_version = $post_array['version'];
492
  if ( $old_version != $new_version ) {
@@ -497,15 +499,6 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
497
  'NewVersion' => $new_version,
498
  )
499
  );
500
-
501
- // Get `site_content` option.
502
- $site_content = $this->plugin->GetGlobalSetting( 'site_content' );
503
-
504
- // Check if the option is instance of stdClass.
505
- if ( $site_content instanceof stdClass ) {
506
- $site_content->skip_core = true; // Set skip core to true to skip file alerts after a core update.
507
- $this->plugin->SetGlobalSetting( 'site_content', $site_content ); // Save the option.
508
- }
509
  }
510
  }
511
  }
@@ -526,15 +519,6 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
526
  'NewVersion' => $obj->item->version . ' (auto update)',
527
  )
528
  );
529
-
530
- // Get `site_content` option.
531
- $site_content = $this->plugin->GetGlobalSetting( 'site_content' );
532
-
533
- // Check if the option is instance of stdClass.
534
- if ( $site_content instanceof stdClass ) {
535
- $site_content->skip_core = true; // Set skip core to true to skip file alerts after a core update.
536
- $this->plugin->SetGlobalSetting( 'site_content', $site_content ); // Save the option.
537
- }
538
  }
539
  }
540
 
@@ -670,8 +654,10 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
670
  );
671
  }
672
 
673
- $old_status = (int) get_option( 'comment_whitelist', 0 );
674
- $new_status = isset( $post_array['comment_whitelist'] ) ? 1 : 0;
 
 
675
 
676
  if ( $old_status !== $new_status ) {
677
  $this->plugin->alerts->Trigger(
@@ -698,8 +684,10 @@ class WSAL_Sensors_System extends WSAL_AbstractSensor {
698
  $this->plugin->alerts->Trigger( 6017, array() );
699
  }
700
 
701
- $old_value = get_option( 'blacklist_keys', 0 );
702
- $new_value = isset( $post_array['blacklist_keys'] ) ? $post_array['blacklist_keys'] : 0;
 
 
703
  if ( $old_value !== $new_value ) {
704
  $this->plugin->alerts->Trigger( 6018, array() );
705
  }
90
  // Cron Job 404 log files pruning.
91
  add_action( self::SCHEDULED_HOOK_LOG_FILE_PRUDING, array( $this, 'LogFilesPruning' ) );
92
  // whitelist options.
93
+ add_action( 'allowed_options', array( $this, 'EventOptions' ), 10, 1 );
94
 
95
  // Update admin email alert.
96
  add_action( 'update_option_admin_email', array( $this, 'admin_email_changed' ), 10, 3 );
356
  }
357
 
358
  // Make sure user can actually modify target options.
359
+ if ( ! current_user_can( 'manage_options' ) ) {
360
  return;
361
  }
362
 
405
  }
406
  }
407
 
408
+ // Registration Option.
409
  if ( $is_option_page && wp_verify_nonce( $post_array['_wpnonce'], 'general-options' ) && ( get_option( 'users_can_register' ) xor isset( $post_array['users_can_register'] ) ) ) {
410
  $old = get_option( 'users_can_register' ) ? 'enabled' : 'disabled';
411
  $new = isset( $post_array['users_can_register'] ) ? 'enabled' : 'disabled';
454
  }
455
 
456
  // Admin Email of Network.
457
+ if ( $is_network_settings && ! empty( $post_array['new_admin_email'] ) && wp_verify_nonce( $post_array['_wpnonce'], 'siteoptions' ) ) {
458
  $old = get_site_option( 'admin_email' );
459
+ $new = trim( $post_array['new_admin_email'] );
460
  if ( $old != $new ) {
461
  $this->plugin->alerts->Trigger(
462
  6003,
470
  }
471
 
472
  // Permalinks changed.
473
+ if ( $is_permalink_page && ! empty( $post_array['permalink_structure'] )
474
+ && wp_verify_nonce( $post_array['_wpnonce'], 'update-permalink' )) {
475
  $old = get_option( 'permalink_structure' );
476
  $new = trim( $post_array['permalink_structure'] );
477
  if ( $old != $new ) {
487
  }
488
 
489
  // Core Update.
490
+ if ( isset( $get_array['action'] ) && 'do-core-upgrade' === $get_array['action'] && isset( $post_array['version'] )
491
+ && wp_verify_nonce( $post_array['_wpnonce'], 'upgrade-core' )) {
492
  $old_version = get_bloginfo( 'version' );
493
  $new_version = $post_array['version'];
494
  if ( $old_version != $new_version ) {
499
  'NewVersion' => $new_version,
500
  )
501
  );
 
 
 
 
 
 
 
 
 
502
  }
503
  }
504
  }
519
  'NewVersion' => $obj->item->version . ' (auto update)',
520
  )
521
  );
 
 
 
 
 
 
 
 
 
522
  }
523
  }
524
 
654
  );
655
  }
656
 
657
+ // comment_whitelist option was renamed to comment_previously_approved in WordPress 5.5.0
658
+ $comment_whitelist_option_name = version_compare( get_bloginfo( 'version' ), '5.5.0', '<' ) ? 'comment_whitelist' : 'comment_previously_approved';
659
+ $old_status = (int) get_option( $comment_whitelist_option_name, 0 );
660
+ $new_status = isset( $post_array[ $comment_whitelist_option_name ] ) ? 1 : 0;
661
 
662
  if ( $old_status !== $new_status ) {
663
  $this->plugin->alerts->Trigger(
684
  $this->plugin->alerts->Trigger( 6017, array() );
685
  }
686
 
687
+ // blacklist_keys option was renamed to disallowed_keys in WordPress 5.5.0
688
+ $blacklist_keys_option_name = version_compare( get_bloginfo( 'version' ), '5.5.0', '<' ) ? 'blacklist_keys' : 'disallowed_keys';
689
+ $old_value = get_option( $blacklist_keys_option_name, 0 );
690
+ $new_value = isset( $post_array[ $blacklist_keys_option_name ] ) ? $post_array[ $blacklist_keys_option_name ] : 0;
691
  if ( $old_value !== $new_value ) {
692
  $this->plugin->alerts->Trigger( 6018, array() );
693
  }
classes/Sensors/UserProfile.php CHANGED
@@ -26,7 +26,6 @@ if ( ! defined( 'ABSPATH' ) ) {
26
  * 4007 User was deleted by another user
27
  * 4008 User granted Super Admin privileges
28
  * 4009 User revoked from Super Admin privileges
29
- * 4013 The forum role of a user was changed by another WordPress user
30
  * 4014 User opened the profile page of another user
31
  *
32
  * @package Wsal
26
  * 4007 User was deleted by another user
27
  * 4008 User granted Super Admin privileges
28
  * 4009 User revoked from Super Admin privileges
 
29
  * 4014 User opened the profile page of another user
30
  *
31
  * @package Wsal
classes/Sensors/Widgets.php CHANGED
@@ -53,8 +53,8 @@ class WSAL_Sensors_Widgets extends WSAL_AbstractSensor {
53
  // Filter $_POST array for security.
54
  $post_array = filter_input_array( INPUT_POST );
55
 
56
- if ( isset( $post_array['savewidgets'] ) ) {
57
- check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );
58
  }
59
 
60
  if ( isset( $post_array ) && ! empty( $post_array['sidebars'] ) ) {
@@ -222,8 +222,8 @@ class WSAL_Sensors_Widgets extends WSAL_AbstractSensor {
222
  return;
223
  }
224
 
225
- if ( isset( $post_array['savewidgets'] ) ) {
226
- check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );
227
  }
228
 
229
  global $wp_registered_sidebars;
53
  // Filter $_POST array for security.
54
  $post_array = filter_input_array( INPUT_POST );
55
 
56
+ if ( ! isset( $post_array['savewidgets'] ) || false === check_ajax_referer( 'save-sidebar-widgets', 'savewidgets', false ) ) {
57
+ return;
58
  }
59
 
60
  if ( isset( $post_array ) && ! empty( $post_array['sidebars'] ) ) {
222
  return;
223
  }
224
 
225
+ if ( ! isset( $post_array['savewidgets'] ) || false === check_ajax_referer( 'save-sidebar-widgets', 'savewidgets', false ) ) {
226
+ return;
227
  }
228
 
229
  global $wp_registered_sidebars;
classes/Sensors/YoastSEO.php DELETED
@@ -1,823 +0,0 @@
1
- <?php
2
- /**
3
- * Sensor: Yoast SEO
4
- *
5
- * Yoast SEO sensor file.
6
- *
7
- * @package Wsal
8
- * @since 3.2.0
9
- */
10
-
11
- // Exit if accessed directly.
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
-
16
- /**
17
- * Support for Yoast SEO Plugin.
18
- *
19
- * @package Wsal
20
- * @subpackage Sensors
21
- */
22
- class WSAL_Sensors_YoastSEO extends WSAL_AbstractSensor {
23
-
24
- /**
25
- * Post ID.
26
- *
27
- * @var int
28
- */
29
- private $post_id = 0;
30
-
31
- /**
32
- * Post Object.
33
- *
34
- * @var WP_Post
35
- */
36
- private $post;
37
-
38
- /**
39
- * SEO Post Data.
40
- *
41
- * @var array
42
- */
43
- private $post_seo_data = array(
44
- '_yoast_wpseo_title' => '',
45
- '_yoast_wpseo_metadesc' => '',
46
- '_yoast_wpseo_focuskw' => '',
47
- '_yoast_wpseo_is_cornerstone' => '',
48
- '_yoast_wpseo_meta-robots-noindex' => '',
49
- '_yoast_wpseo_meta-robots-nofollow' => '',
50
- '_yoast_wpseo_meta-robots-adv' => '',
51
- '_yoast_wpseo_canonical' => '',
52
- );
53
-
54
- /**
55
- * Listening to events using hooks.
56
- */
57
- public function HookEvents() {
58
- // If user can edit post then hook this function.
59
- if ( current_user_can( 'edit_posts' ) ) {
60
- add_action( 'admin_init', array( $this, 'event_admin_init' ) );
61
- }
62
-
63
- // Yoast SEO option alerts.
64
- add_action( 'updated_option', array( $this, 'yoast_options_trigger' ), 10, 3 );
65
- }
66
-
67
- /**
68
- * Method: Admin Init Event.
69
- */
70
- public function event_admin_init() {
71
- // Load old data, if applicable.
72
- $this->retrieve_post_data();
73
-
74
- // Check for settings change.
75
- $this->check_seo_data_change();
76
- }
77
-
78
- /**
79
- * Method: Retrieve Post ID.
80
- */
81
- protected function retrieve_post_data() {
82
- // Filter POST global array.
83
- $post_array = filter_input_array( INPUT_POST );
84
-
85
- if ( isset( $post_array['post_ID'] )
86
- && isset( $post_array['_wpnonce'] )
87
- && ! wp_verify_nonce( $post_array['_wpnonce'], 'update-post_' . $post_array['post_ID'] ) ) {
88
- return false;
89
- }
90
-
91
- if ( isset( $post_array ) && isset( $post_array['post_ID'] )
92
- && ! ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
93
- && ! ( isset( $post_array['action'] ) && 'autosave' === $post_array['action'] )
94
- ) {
95
- $this->post_id = intval( $post_array['post_ID'] );
96
- $this->post = get_post( $this->post_id );
97
- $this->set_post_seo_data();
98
- }
99
- }
100
-
101
- /**
102
- * Method: Set Post SEO Data.
103
- */
104
- private function set_post_seo_data() {
105
- // Set post SEO meta data.
106
- $this->post_seo_data = array(
107
- '_yoast_wpseo_title' => get_post_meta( $this->post_id, '_yoast_wpseo_title', true ),
108
- '_yoast_wpseo_metadesc' => get_post_meta( $this->post_id, '_yoast_wpseo_metadesc', true ),
109
- '_yoast_wpseo_focuskw' => get_post_meta( $this->post_id, '_yoast_wpseo_focuskw', true ),
110
- '_yoast_wpseo_is_cornerstone' => get_post_meta( $this->post_id, '_yoast_wpseo_is_cornerstone', true ),
111
- '_yoast_wpseo_meta-robots-noindex' => get_post_meta( $this->post_id, '_yoast_wpseo_meta-robots-noindex', true ),
112
- '_yoast_wpseo_meta-robots-nofollow' => get_post_meta( $this->post_id, '_yoast_wpseo_meta-robots-nofollow', true ),
113
- '_yoast_wpseo_meta-robots-adv' => get_post_meta( $this->post_id, '_yoast_wpseo_meta-robots-adv', true ),
114
- '_yoast_wpseo_canonical' => get_post_meta( $this->post_id, '_yoast_wpseo_canonical', true ),
115
- );
116
- }
117
-
118
- /**
119
- * Method: Get Post SEO Data.
120
- *
121
- * @param string $key – Meta Key.
122
- * @return mixed
123
- */
124
- protected function get_post_seo_data( $key = '' ) {
125
- // If empty key then return false.
126
- if ( empty( $key ) ) {
127
- return false;
128
- }
129
-
130
- // Set prefix of meta data.
131
- $prefix = '_yoast_wpseo_';
132
-
133
- // Option to retrieve.
134
- $option = $prefix . $key;
135
-
136
- // If key exists and is not empty then return value.
137
- if ( isset( $this->post_seo_data[ $option ] ) && ! empty( $this->post_seo_data[ $option ] ) ) {
138
- return $this->post_seo_data[ $option ];
139
- } else {
140
- // Return false if key doesn't exists or its value is empty.
141
- return false;
142
- }
143
- }
144
-
145
- /**
146
- * Get editor link.
147
- *
148
- * @param stdClass $post_id - Post id.
149
- * @return array $editor_link - Name and value link.
150
- */
151
- private function get_editor_link( $post_id ) {
152
- $value = get_edit_post_link( $post_id );
153
- $editor_link = array(
154
- 'name' => 'EditorLinkPost',
155
- 'value' => $value,
156
- );
157
- return $editor_link;
158
- }
159
-
160
- /**
161
- * Method: Detect Post SEO Data Change.
162
- */
163
- protected function check_seo_data_change() {
164
- // Set filter input args.
165
- $filter_input_args = array(
166
- 'post_ID' => FILTER_VALIDATE_INT,
167
- '_wpnonce' => FILTER_SANITIZE_STRING,
168
- 'action' => FILTER_SANITIZE_STRING,
169
- 'yoast_wpseo_title' => FILTER_SANITIZE_STRING,
170
- 'yoast_wpseo_metadesc' => FILTER_SANITIZE_STRING,
171
- 'yoast_wpseo_focuskw' => FILTER_SANITIZE_STRING,
172
- 'yoast_wpseo_is_cornerstone' => FILTER_VALIDATE_BOOLEAN,
173
- 'yoast_wpseo_meta-robots-noindex' => FILTER_VALIDATE_INT,
174
- 'yoast_wpseo_meta-robots-nofollow' => FILTER_VALIDATE_INT,
175
- 'yoast_wpseo_meta-robots-adv' => array(
176
- 'flags' => FILTER_REQUIRE_ARRAY,
177
- ),
178
- 'yoast_wpseo_canonical' => FILTER_VALIDATE_URL,
179
- );
180
-
181
- // Filter POST global array.
182
- $post_array = filter_input_array( INPUT_POST, $filter_input_args );
183
-
184
- if ( isset( $post_array['post_ID'] )
185
- && 'editpost' === $post_array['action']
186
- && isset( $post_array['_wpnonce'] )
187
- && wp_verify_nonce( $post_array['_wpnonce'], 'update-post_' . $post_array['post_ID'] ) ) {
188
- // Check SEO data changes and alert if changed.
189
- $this->check_title_change( $post_array['yoast_wpseo_title'] ); // Title.
190
- $this->check_desc_change( $post_array['yoast_wpseo_metadesc'] ); // Meta description.
191
- $this->check_robots_index_change( $post_array['yoast_wpseo_meta-robots-noindex'] ); // Meta Robots Index.
192
- $this->check_robots_follow_change( $post_array['yoast_wpseo_meta-robots-nofollow'] ); // Meta Robots Follow.
193
- $this->check_robots_advanced_change( $post_array['yoast_wpseo_meta-robots-adv'] ); // Meta Robots Advanced.
194
- $this->check_canonical_url_change( $post_array['yoast_wpseo_canonical'] ); // Canonical URL.
195
- $this->check_focus_keys_change( $post_array['yoast_wpseo_focuskw'] ); // Focus keywords.
196
- $this->check_cornerstone_change( $post_array['yoast_wpseo_is_cornerstone'] ); // Cornerstone.
197
- }
198
- }
199
-
200
- /**
201
- * Method: Check SEO Title Change.
202
- *
203
- * @param string $title – Changed SEO Title.
204
- */
205
- protected function check_title_change( $title ) {
206
- // Get old title value.
207
- $old_title = $this->get_post_seo_data( 'title' );
208
-
209
- // If old and new values are empty then don't log the alert.
210
- if ( empty( $old_title ) && empty( $title ) ) {
211
- return;
212
- }
213
-
214
- // Remove whitespaces at the ends of the titles.
215
- $old_title = trim( $old_title );
216
- $title = trim( $title );
217
- // If title is changed then log alert.
218
- if ( $old_title !== $title ) {
219
- $editor_link = $this->get_editor_link( $this->post_id );
220
- $this->plugin->alerts->Trigger(
221
- 8801,
222
- array(
223
- 'PostID' => $this->post->ID,
224
- 'PostType' => $this->post->post_type,
225
- 'PostTitle' => $this->post->post_title,
226
- 'PostStatus' => $this->post->post_status,
227
- 'PostDate' => $this->post->post_date,
228
- 'PostUrl' => get_permalink( $this->post->ID ),
229
- 'OldSEOTitle' => $old_title,
230
- 'NewSEOTitle' => $title,
231
- $editor_link['name'] => $editor_link['value'],
232
- )
233
- );
234
- }
235
- }
236
-
237
- /**
238
- * Method: Check SEO Meta Description Change.
239
- *
240
- * @param string $desc – Changed SEO Meta Description.
241
- */
242
- protected function check_desc_change( $desc ) {
243
- // Get old desc value.
244
- $old_desc = esc_html( $this->get_post_seo_data( 'metadesc' ) );
245
- $desc = esc_html( $desc );
246
-
247
- // If old and new values are empty then don't log the alert.
248
- if ( empty( $old_desc ) && empty( $desc ) ) {
249
- return;
250
- }
251
-
252
- // If desc is changed then log alert.
253
- if ( $old_desc !== $desc ) {
254
- $editor_link = $this->get_editor_link( $this->post_id );
255
- $this->plugin->alerts->Trigger(
256
- 8802,
257
- array(
258
- 'PostID' => $this->post->ID,
259
- 'PostType' => $this->post->post_type,
260
- 'PostTitle' => $this->post->post_title,
261
- 'PostStatus' => $this->post->post_status,
262
- 'PostDate' => $this->post->post_date,
263
- 'PostUrl' => get_permalink( $this->post->ID ),
264
- 'old_desc' => $old_desc,
265
- 'new_desc' => $desc,
266
- $editor_link['name'] => $editor_link['value'],
267
- )
268
- );
269
- }
270
- }
271
-
272
- /**
273
- * Method: Check Meta Robots Index Change.
274
- *
275
- * @param string $index – Changed Meta Robots Index.
276
- */
277
- protected function check_robots_index_change( $index ) {
278
- // Get old title value.
279
- $old_index = (int) $this->get_post_seo_data( 'meta-robots-noindex' );
280
-
281
- if ( 1 === $old_index ) {
282
- $old_index = 'No';
283
- } else {
284
- $old_index = 'Yes';
285
- }
286
-
287
- if ( 1 === $index ) {
288
- $index = 'No';
289
- } else {
290
- $index = 'Yes';
291
- }
292
-
293
- // If setting is changed then log alert.
294
- if ( $old_index !== $index ) {
295
- $editor_link = $this->get_editor_link( $this->post_id );
296
- $this->plugin->alerts->Trigger(
297
- 8803,
298
- array(
299
- 'PostID' => $this->post->ID,
300
- 'PostType' => $this->post->post_type,
301
- 'PostTitle' => $this->post->post_title,
302
- 'PostStatus' => $this->post->post_status,
303
- 'PostDate' => $this->post->post_date,
304
- 'PostUrl' => get_permalink( $this->post->ID ),
305
- 'OldStatus' => $old_index,
306
- 'NewStatus' => $index,
307
- $editor_link['name'] => $editor_link['value'],
308
- )
309
- );
310
- }
311
- }
312
-
313
- /**
314
- * Method: Check Meta Robots Follow Change.
315
- *
316
- * @param string $follow – Changed Meta Robots Follow.
317
- */
318
- protected function check_robots_follow_change( $follow ) {
319
- // Get old title value.
320
- $old_follow = (int) $this->get_post_seo_data( 'meta-robots-nofollow' );
321
-
322
- if ( 1 === $old_follow ) {
323
- $old_follow = 'disabled';
324
- } else {
325
- $old_follow = 'enabled';
326
- }
327
-
328
- if ( 1 === $follow ) {
329
- $follow = 'disabled';
330
- } else {
331
- $follow = 'enabled';
332
- }
333
-
334
- // If setting is changed then log alert.
335
- if ( $old_follow !== $follow ) {
336
- $editor_link = $this->get_editor_link( $this->post_id );
337
- $this->plugin->alerts->Trigger(
338
- 8804,
339
- array(
340
- 'PostID' => $this->post->ID,
341
- 'PostType' => $this->post->post_type,
342
- 'PostTitle' => $this->post->post_title,
343
- 'PostStatus' => $this->post->post_status,
344
- 'PostDate' => $this->post->post_date,
345
- 'PostUrl' => get_permalink( $this->post->ID ),
346
- 'EventType' => $follow,
347
- $editor_link['name'] => $editor_link['value'],
348
- )
349
- );
350
- }
351
- }
352
-
353
- /**
354
- * Method: Check Meta Robots Advanced Change.
355
- *
356
- * @param array $advanced – Advanced array.
357
- */
358
- protected function check_robots_advanced_change( $advanced ) {
359
- // Convert to string.
360
- if ( is_array( $advanced ) ) {
361
- $advanced = implode( ',', $advanced );
362
- }
363
-
364
- // Get old title value.
365
- $old_adv = $this->get_post_seo_data( 'meta-robots-adv' );
366
-
367
- // If old and new values are empty then don't log the alert.
368
- if ( empty( $old_adv ) && ( empty( $advanced ) || '-' === $advanced ) ) {
369
- return;
370
- }
371
-
372
- // If setting is changed then log alert.
373
- if ( $old_adv !== $advanced ) {
374
- $editor_link = $this->get_editor_link( $this->post_id );
375
- $this->plugin->alerts->Trigger(
376
- 8805,
377
- array(
378
- 'PostID' => $this->post->ID,
379
- 'PostType' => $this->post->post_type,
380
- 'PostTitle' => $this->post->post_title,
381
- 'PostStatus' => $this->post->post_status,
382
- 'PostDate' => $this->post->post_date,
383
- 'PostUrl' => get_permalink( $this->post->ID ),
384
- 'OldStatus' => $old_adv,
385
- 'NewStatus' => $advanced,
386
- $editor_link['name'] => $editor_link['value'],
387
- )
388
- );
389
- }
390
- }
391
-
392
- /**
393
- * Method: Check Canonical URL Change.
394
- *
395
- * @param string $canonical_url – Changed Canonical URL.
396
- */
397
- protected function check_canonical_url_change( $canonical_url ) {
398
- // Get old title value.
399
- $old_url = $this->get_post_seo_data( 'canonical' );
400
-
401
- // Check to see if both change value are empty.
402
- if ( empty( $old_url ) && empty( $canonical_url ) ) {
403
- return; // Return if both are empty.
404
- }
405
-
406
- // If title is changed then log alert.
407
- if ( $old_url !== $canonical_url ) {
408
- $editor_link = $this->get_editor_link( $this->post_id );
409
- $this->plugin->alerts->Trigger(
410
- 8806,
411
- array(
412
- 'PostID' => $this->post->ID,
413
- 'PostType' => $this->post->post_type,
414
- 'PostTitle' => $this->post->post_title,
415
- 'PostStatus' => $this->post->post_status,
416
- 'PostDate' => $this->post->post_date,
417
- 'PostUrl' => get_permalink( $this->post->ID ),
418
- 'OldCanonicalUrl' => $old_url,
419
- 'NewCanonicalUrl' => $canonical_url,
420
- $editor_link['name'] => $editor_link['value'],
421
- )
422
- );
423
- }
424
- }
425
-
426
- /**
427
- * Method: Check Focus Keywords Change.
428
- *
429
- * @param string $focus_keys – Changed Focus Keywords.
430
- */
431
- protected function check_focus_keys_change( $focus_keys ) {
432
- // Get old title value.
433
- $old_focus_keys = $this->get_post_seo_data( 'focuskw' );
434
-
435
- // If old and new values are empty then don't log the alert.
436
- if ( empty( $old_focus_keys ) && empty( $focus_keys ) ) {
437
- return;
438
- }
439
-
440
- // If title is changed then log alert.
441
- if ( $old_focus_keys !== $focus_keys ) {
442
- $editor_link = $this->get_editor_link( $this->post_id );
443
- $this->plugin->alerts->Trigger(
444
- 8807,
445
- array(
446
- 'PostID' => $this->post->ID,
447
- 'PostType' => $this->post->post_type,
448
- 'PostTitle' => $this->post->post_title,
449
- 'PostStatus' => $this->post->post_status,
450
- 'PostDate' => $this->post->post_date,
451
- 'PostUrl' => get_permalink( $this->post->ID ),
452
- 'old_keywords' => $old_focus_keys,
453
- 'new_keywords' => $focus_keys,
454
- $editor_link['name'] => $editor_link['value'],
455
- )
456
- );
457
- }
458
- }
459
-
460
- /**
461
- * Method: Check Cornerstone Change.
462
- *
463
- * @param string $cornerstone – Changed Cornerstone.
464
- */
465
- protected function check_cornerstone_change( $cornerstone ) {
466
- // Get old title value.
467
- $old_cornerstone = (int) $this->get_post_seo_data( 'is_cornerstone' );
468
- $cornerstone = (int) $cornerstone;
469
-
470
- if ( 1 === $cornerstone ) {
471
- $alert_status = 'enabled';
472
- } else {
473
- $alert_status = 'disabled';
474
- }
475
-
476
- // If setting is changed then log alert.
477
- if ( $old_cornerstone !== $cornerstone ) {
478
- $editor_link = $this->get_editor_link( $this->post_id );
479
- $this->plugin->alerts->Trigger(
480
- 8808,
481
- array(
482
- 'PostID' => $this->post->ID,
483
- 'PostType' => $this->post->post_type,
484
- 'PostTitle' => $this->post->post_title,
485
- 'PostStatus' => $this->post->post_status,
486
- 'PostDate' => $this->post->post_date,
487
- 'PostUrl' => get_permalink( $this->post->ID ),
488
- 'EventType' => $alert_status,
489
- $editor_link['name'] => $editor_link['value'],
490
- )
491
- );
492
- }
493
- }
494
-
495
- /**
496
- * Method: Yoast SEO options trigger.
497
- *
498
- * @param string $option – Option name.
499
- * @param mixed $old_value – Option old value.
500
- * @param mixed $new_value – Option new value.
501
- */
502
- public function yoast_options_trigger( $option, $old_value, $new_value ) {
503
- // Detect the SEO option.
504
- if ( 'wpseo_titles' === $option || 'wpseo' === $option ) {
505
- // WPSEO Title Alerts.
506
- if ( 'wpseo_titles' === $option ) {
507
- // Title Separator.
508
- if ( $old_value['separator'] !== $new_value['separator'] ) {
509
- $this->yoast_setting_change_alert( 'separator', $old_value['separator'], $new_value['separator'] );
510
- }
511
-
512
- // Homepage Title.
513
- if ( $old_value['title-home-wpseo'] !== $new_value['title-home-wpseo'] ) {
514
- $this->yoast_setting_change_alert( 'title-home-wpseo', $old_value['title-home-wpseo'], $new_value['title-home-wpseo'] );
515
- }
516
-
517
- // Homepage Meta Description.
518
- if ( $old_value['metadesc-home-wpseo'] !== $new_value['metadesc-home-wpseo'] ) {
519
- $this->yoast_setting_change_alert( 'metadesc-home-wpseo', $old_value['metadesc-home-wpseo'], $new_value['metadesc-home-wpseo'] );
520
- }
521
-
522
- // Company or Person.
523
- if ( $old_value['company_or_person'] !== $new_value['company_or_person'] ) {
524
- $this->yoast_setting_change_alert( 'company_or_person', $old_value['company_or_person'], $new_value['company_or_person'] );
525
- }
526
-
527
- // Get public post types.
528
- $post_types = get_post_types( array( 'public' => true ) );
529
-
530
- // For each post type check show, title, and description changes.
531
- foreach ( $post_types as $type ) {
532
- if ( isset( $old_value[ "noindex-$type" ] ) ) {
533
- // Show Post Type in search results.
534
- if ( $old_value[ "noindex-$type" ] !== $new_value[ "noindex-$type" ] ) {
535
- $this->yoast_setting_switch_alert( "noindex-$type", $new_value[ "noindex-$type" ] );
536
- }
537
-
538
- // Post Type Title Template.
539
- if ( $old_value[ "title-$type" ] !== $new_value[ "title-$type" ] ) {
540
- $this->yoast_setting_change_alert( "title-$type", $old_value[ "title-$type" ], $new_value[ "title-$type" ] );
541
- }
542
-
543
- // Post Type Meta Description Template.
544
- if ( $old_value[ "metadesc-$type" ] !== $new_value[ "metadesc-$type" ] ) {
545
- $this->yoast_setting_change_alert( "metadesc-$type", $old_value[ "metadesc-$type" ], $new_value[ "metadesc-$type" ] );
546
- }
547
-
548
- // Show Date.
549
- if ( $old_value[ "showdate-$type" ] !== $new_value[ "showdate-$type" ] ) {
550
- $this->yoast_setting_switch_alert( "showdate-$type", $new_value[ "showdate-$type" ] );
551
- }
552
-
553
- // Show Meta box.
554
- if ( $old_value[ "display-metabox-pt-$type" ] !== $new_value[ "display-metabox-pt-$type" ] ) {
555
- $this->yoast_setting_switch_alert( "display-metabox-pt-$type", $new_value[ "display-metabox-pt-$type" ] );
556
- }
557
- }
558
- }
559
- }
560
-
561
- // Webmaster URL alerts.
562
- if ( 'wpseo' === $option ) {
563
- // SEO analysis.
564
- if ( isset( $old_value['keyword_analysis_active'] ) && isset( $new_value['keyword_analysis_active'] ) ) {
565
- if ( $old_value['keyword_analysis_active'] !== $new_value['keyword_analysis_active'] ) {
566
- $this->yoast_setting_switch_alert( 'keyword_analysis_active', $new_value['keyword_analysis_active'] );
567
- }
568
- }
569
-
570
- // Readability analysis.
571
- if ( isset( $old_value['content_analysis_active'] ) && isset( $new_value['content_analysis_active'] ) ) {
572
- if ( $old_value['content_analysis_active'] !== $new_value['content_analysis_active'] ) {
573
- $this->yoast_setting_switch_alert( 'content_analysis_active', $new_value['content_analysis_active'] );
574
- }
575
- }
576
-
577
- // Cornerstone Content.
578
- if ( isset( $old_value['enable_cornerstone_content'] ) && isset( $new_value['enable_cornerstone_content'] ) ) {
579
- if ( $old_value['enable_cornerstone_content'] !== $new_value['enable_cornerstone_content'] ) {
580
- $this->yoast_setting_switch_alert( 'enable_cornerstone_content', $new_value['enable_cornerstone_content'] );
581
- }
582
- }
583
-
584
- // Text Link Counter.
585
- if ( isset( $old_value['enable_text_link_counter'] ) && isset( $new_value['enable_text_link_counter'] ) ) {
586
- if ( $old_value['enable_text_link_counter'] !== $new_value['enable_text_link_counter'] ) {
587
- $this->yoast_setting_switch_alert( 'enable_text_link_counter', $new_value['enable_text_link_counter'] );
588
- }
589
- }
590
-
591
- // XML Sitemaps.
592
- if ( isset( $old_value['enable_xml_sitemap'] ) && isset( $new_value['enable_xml_sitemap'] ) ) {
593
- if ( $old_value['enable_xml_sitemap'] !== $new_value['enable_xml_sitemap'] ) {
594
- $this->yoast_setting_switch_alert( 'enable_xml_sitemap', $new_value['enable_xml_sitemap'] );
595
- }
596
- }
597
-
598
-
599
- /**
600
- * Ryte integration.
601
- *
602
- * NOTE: Reenamed in yoast plugin v13.2.
603
- *
604
- * @see: https://github.com/Yoast/wordpress-seo/pull/14123
605
- */
606
- if ( isset( $old_value['ryte_indexability'] ) && isset( $new_value['ryte_indexability'] ) ) {
607
- if ( $old_value['ryte_indexability'] !== $new_value['ryte_indexability'] ) {
608
- $this->yoast_setting_switch_alert( 'ryte_indexability', $new_value['ryte_indexability'] );
609
- }
610
- }
611
-
612
- // Admin bar menu.
613
- if ( isset( $old_value['enable_admin_bar_menu'] ) && isset( $new_value['enable_admin_bar_menu'] ) ) {
614
- if ( $old_value['enable_admin_bar_menu'] !== $new_value['enable_admin_bar_menu'] ) {
615
- $this->yoast_setting_switch_alert( 'enable_admin_bar_menu', $new_value['enable_admin_bar_menu'] );
616
- }
617
- }
618
-
619
- // Advanced settings for authors.
620
- if ( isset( $old_value['disableadvanced_meta'] ) && isset( $new_value['disableadvanced_meta'] ) ) {
621
- if ( $old_value['disableadvanced_meta'] !== $new_value['disableadvanced_meta'] ) {
622
- $this->yoast_setting_switch_alert( 'disableadvanced_meta', $new_value['disableadvanced_meta'] );
623
- }
624
- }
625
- }
626
- }
627
- }
628
-
629
- /**
630
- * Method: Trigger Yoast Setting Change Alerts.
631
- *
632
- * @param string $key – Setting key.
633
- * @param string $old_value – Old setting value.
634
- * @param string $new_value – New setting value.
635
- */
636
- private function yoast_setting_change_alert( $key, $old_value, $new_value ) {
637
- // Return if key is empty.
638
- if ( empty( $key ) ) {
639
- return;
640
- }
641
-
642
- // Return if both old and new values are empty.
643
- if ( empty( $old_value ) && empty( $new_value ) ) {
644
- return;
645
- }
646
-
647
- // Alert arguments.
648
- $alert_args = array(
649
- 'old' => $old_value, // Old value.
650
- 'new' => $new_value, // New value.
651
- );
652
-
653
- // Find title-* in the key.
654
- if ( false !== strpos( $key, 'title-' ) ) {
655
- $seo_post_type = str_replace( 'title-', '', $key );
656
- $seo_post_type = ucfirst( $seo_post_type );
657
- $seo_post_type .= 's';
658
-
659
- // Set alert meta data.
660
- $alert_args['SEOPostType'] = $seo_post_type;
661
- }
662
-
663
- // Find metadesc-* in the key.
664
- if ( false !== strpos( $key, 'metadesc-' ) ) {
665
- $seo_post_type = str_replace( 'metadesc-', '', $key );
666
- $seo_post_type = ucfirst( $seo_post_type );
667
- $seo_post_type .= 's';
668
-
669
- // Set alert meta data.
670
- $alert_args['SEOPostType'] = $seo_post_type;
671
- }
672
-
673
- // Set alert code to null initially.
674
- $alert_code = null;
675
-
676
- // Detect alert code for setting.
677
- switch ( $key ) {
678
- case 'separator':
679
- $alert_code = 8809;
680
- break;
681
-
682
- case 'title-home-wpseo':
683
- $alert_code = 8810;
684
- break;
685
-
686
- case 'metadesc-home-wpseo':
687
- $alert_code = 8811;
688
- break;
689
-
690
- case 'company_or_person':
691
- $alert_code = 8812;
692
- break;
693
-
694
- case strpos( $key, 'title-' ):
695
- $alert_code = 8814;
696
- break;
697
-
698
- case strpos( $key, 'metadesc-' ):
699
- $alert_code = 8822;
700
- break;
701
-
702
- default:
703
- break;
704
- }
705
-
706
- // Trigger the alert.
707
- if ( ! empty( $alert_code ) ) {
708
- $this->plugin->alerts->Trigger( $alert_code, $alert_args );
709
- }
710
- }
711
-
712
- /**
713
- * Method: Trigger Yoast Enable/Disable Setting Alerts.
714
- *
715
- * @param string $key – Setting index to alert.
716
- * @param mixed $new_value – Setting new value.
717
- */
718
- private function yoast_setting_switch_alert( $key, $new_value ) {
719
- // If key is empty, then return.
720
- if ( empty( $key ) ) {
721
- return;
722
- }
723
-
724
- // Check and set status.
725
- $status = (int) $new_value;
726
-
727
- // Alert arguments.
728
- $alert_args = array();
729
-
730
- // Find noindex-* in the key.
731
- if ( false !== strpos( $key, 'noindex-' ) ) {
732
- $seo_post_type = str_replace( 'noindex-', '', $key );
733
- $seo_post_type = ucfirst( $seo_post_type );
734
- $seo_post_type .= 's';
735
-
736
- // Set alert meta data.
737
- $alert_args['SEOPostType'] = $seo_post_type;
738
- $status = 1 === $status ? 0 : 1;
739
- }
740
-
741
- // Find showdate-* in the key.
742
- if ( false !== strpos( $key, 'showdate-' ) ) {
743
- $seo_post_type = str_replace( 'showdate-', '', $key );
744
- $seo_post_type = ucfirst( $seo_post_type );
745
- $seo_post_type .= 's';
746
-
747
- // Set alert meta data.
748
- $alert_args['SEOPostType'] = $seo_post_type;
749
- }
750
-
751
- // Find display-metabox-pt-* in the key.
752
- if ( false !== strpos( $key, 'display-metabox-pt-' ) ) {
753
- $seo_post_type = str_replace( 'display-metabox-pt-', '', $key );
754
- $seo_post_type = ucfirst( $seo_post_type );
755
- $seo_post_type .= 's';
756
-
757
- // Set alert meta data.
758
- $alert_args['SEOPostType'] = $seo_post_type;
759
- }
760
-
761
- $alert_args['EventType'] = 1 === $status ? 'enabled' : 'disabled';
762
-
763
- // Set alert code to NULL initially.
764
- $alert_code = null;
765
-
766
- // Add switch case to set the alert code.
767
- switch ( $key ) {
768
- case strpos( $key, 'noindex-' ):
769
- $alert_code = 8813;
770
- break;
771
-
772
- case 'keyword_analysis_active':
773
- $alert_code = 8815;
774
- break;
775
-
776
- case 'content_analysis_active':
777
- $alert_code = 8816;
778
- break;
779
-
780
- case 'enable_cornerstone_content':
781
- $alert_code = 8817;
782
- break;
783
-
784
- case 'enable_text_link_counter':
785
- $alert_code = 8818;
786
- break;
787
-
788
- case 'enable_xml_sitemap':
789
- $alert_code = 8819;
790
- break;
791
-
792
- // renamed to ryte_integration. see: https://github.com/Yoast/wordpress-seo/pull/14123
793
- case 'onpage_indexability':
794
- case 'ryte_indexability':
795
- $alert_code = 8820;
796
- break;
797
-
798
- case 'enable_admin_bar_menu':
799
- $alert_code = 8821;
800
- break;
801
-
802
- case strpos( $key, 'showdate-' ):
803
- $alert_code = 8823;
804
- break;
805
-
806
- case strpos( $key, 'display-metabox-pt-' ):
807
- $alert_code = 8824;
808
- break;
809
-
810
- case strpos( $key, 'disableadvanced_meta' ):
811
- $alert_code = 8825;
812
- break;
813
-
814
- default:
815
- break;
816
- }
817
-
818
- // Trigger the alert.
819
- if ( ! empty( $alert_code ) ) {
820
- $this->plugin->alerts->Trigger( $alert_code, $alert_args );
821
- }
822
- }
823
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/Settings.php CHANGED
@@ -129,7 +129,7 @@ class WSAL_Settings {
129
  *
130
  * @var array
131
  */
132
- public $geek_alerts = array( 1004, 1005, 1006, 1007, 2023, 2024, 2053, 2054, 2055, 2062, 2100, 2106, 2111, 2112, 2124, 2125, 2131, 2132, 2094, 2095, 2043, 2071, 2082, 2083, 2085, 2089, 4014, 4015, 4016, 5010, 5011, 5012, 5019, 5025, 5013, 5014, 5015, 5016, 5017, 5018, 5022, 5023, 5024, 6001, 6002, 6007, 6008, 6010, 6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6023, 6024, 6025 );
133
 
134
  /**
135
  * Current screen object.
@@ -311,8 +311,7 @@ class WSAL_Settings {
311
  public function IsDevOptionEnabled( $option ) {
312
  if ( is_null( $this->_devoption ) ) {
313
  $this->_devoption = $this->_plugin->GetGlobalSetting(
314
- 'dev-options',
315
- implode( ',', $this->GetDefaultDevOptions() )
316
  );
317
  $this->_devoption = explode( ',', $this->_devoption );
318
  }
@@ -347,8 +346,7 @@ class WSAL_Settings {
347
  }
348
  // Commit option.
349
  $this->_plugin->SetGlobalSetting(
350
- 'dev-options',
351
- implode( ',', $this->_devoption )
352
  );
353
  }
354
 
@@ -1418,7 +1416,7 @@ class WSAL_Settings {
1418
  if ( ! empty( $value ) ) {
1419
  $this->_plugin->SetGlobalSetting( 'log-failed-login-limit', abs( $value ) );
1420
  } else {
1421
- $this->_plugin->SetGlobalSetting( 'log-failed-login-limit', -1 );
1422
  }
1423
  }
1424
 
@@ -1441,7 +1439,7 @@ class WSAL_Settings {
1441
  if ( ! empty( $value ) ) {
1442
  $this->_plugin->SetGlobalSetting( 'log-visitor-failed-login-limit', abs( $value ) );
1443
  } else {
1444
- $this->_plugin->SetGlobalSetting( 'log-visitor-failed-login-limit', -1 );
1445
  }
1446
  }
1447
 
@@ -1489,7 +1487,7 @@ class WSAL_Settings {
1489
  $wsal_working_dir = $this->get_working_dir_path();
1490
 
1491
  // If the directory exists then generate index.php file for every sub-directory.
1492
- if ( ! empty( $wsal_working_dir ) && is_dir( $wsal_working_dir ) ) {
1493
  // Generate index.php for the main directory.
1494
  if ( ! file_exists( $wsal_working_dir . DIRECTORY_SEPARATOR . 'index.php' ) ) {
1495
  // Generate index.php file.
@@ -2182,44 +2180,9 @@ class WSAL_Settings {
2182
  *
2183
  * @return array - WSAL Options array.
2184
  */
2185
- public function get_wsal_options() {
2186
- // Get options transient.
2187
- $wsal_options = get_transient( 'wsal_options' );
2188
-
2189
- // If options transient is not set then query and set options.
2190
- if ( false === $wsal_options ) {
2191
- // Get raw options from DB.
2192
- $raw_options = $this->query_wsal_options();
2193
-
2194
- if ( ! empty( $raw_options ) && is_array( $raw_options ) ) {
2195
- foreach ( $raw_options as $option ) {
2196
- if ( ! empty( $option->option_value ) ) {
2197
- $wsal_options[] = $option;
2198
- }
2199
- }
2200
- }
2201
-
2202
- // Store the results in a transient.
2203
- set_transient( 'wsal_options', $wsal_options, DAY_IN_SECONDS );
2204
- }
2205
-
2206
- return $wsal_options;
2207
- }
2208
-
2209
- /**
2210
- * Query WSAL Options from DB.
2211
- *
2212
- * @return array - Array of options.
2213
- */
2214
- public function query_wsal_options() {
2215
- // Query WSAL options.
2216
- global $wpdb;
2217
-
2218
- // Set table name.
2219
- $options_table = $wpdb->prefix . 'wsal_options';
2220
-
2221
- // Query the options.
2222
- return $wpdb->get_results( "SELECT * FROM $options_table" ); // phpcs:ignore
2223
  }
2224
 
2225
  /**
@@ -2411,18 +2374,19 @@ class WSAL_Settings {
2411
  */
2412
  public static function get_frontend_events() {
2413
  // Option defaults.
 
2414
  $default = array(
2415
  'register' => false,
2416
  'login' => false,
2417
  'system' => false,
2418
- 'woocommerce' => WpSecurityAuditLog::is_woocommerce_active(),
2419
  );
2420
 
2421
  // Get the option.
2422
- $value = \WSAL\Helpers\Options::get_option_value_ignore_prefix( self::FRONT_END_EVENTS_OPTION_NAME, $default );
2423
 
2424
  // Check for WooCommerce in case it is not stored.
2425
- $value['woocommerce'] = ! isset( $value['woocommerce'] ) ? WpSecurityAuditLog::is_woocommerce_active() : $value['woocommerce'];
2426
  return $value;
2427
  }
2428
 
129
  *
130
  * @var array
131
  */
132
+ public $geek_alerts = array( 1004, 1005, 1006, 1007, 2023, 2024, 2053, 2054, 2055, 2062, 2100, 2111, 2112, 2124, 2125, 2131, 2132, 2094, 2095, 2043, 2071, 2082, 2083, 2085, 2089, 4014, 4015, 4016, 5010, 5011, 5012, 5019, 5025, 5013, 5014, 5015, 5016, 5017, 5018, 5022, 5023, 5024, 6001, 6002, 6007, 6008, 6010, 6011, 6012, 6013, 6014, 6015, 6016, 6017, 6018, 6023, 6024, 6025 );
133
 
134
  /**
135
  * Current screen object.
311
  public function IsDevOptionEnabled( $option ) {
312
  if ( is_null( $this->_devoption ) ) {
313
  $this->_devoption = $this->_plugin->GetGlobalSetting(
314
+ 'dev-options', implode( ',', $this->GetDefaultDevOptions() )
 
315
  );
316
  $this->_devoption = explode( ',', $this->_devoption );
317
  }
346
  }
347
  // Commit option.
348
  $this->_plugin->SetGlobalSetting(
349
+ 'dev-options', implode( ',', $this->_devoption )
 
350
  );
351
  }
352
 
1416
  if ( ! empty( $value ) ) {
1417
  $this->_plugin->SetGlobalSetting( 'log-failed-login-limit', abs( $value ) );
1418
  } else {
1419
+ $this->_plugin->SetGlobalSetting( 'log-failed-login-limit', - 1 );
1420
  }
1421
  }
1422
 
1439
  if ( ! empty( $value ) ) {
1440
  $this->_plugin->SetGlobalSetting( 'log-visitor-failed-login-limit', abs( $value ) );
1441
  } else {
1442
+ $this->_plugin->SetGlobalSetting( 'log-visitor-failed-login-limit', - 1 );
1443
  }
1444
  }
1445
 
1487
  $wsal_working_dir = $this->get_working_dir_path();
1488
 
1489
  // If the directory exists then generate index.php file for every sub-directory.
1490
+ if ( ! is_wp_error( $wsal_working_dir ) && ! empty( $wsal_working_dir ) && is_dir( $wsal_working_dir ) ) {
1491
  // Generate index.php for the main directory.
1492
  if ( ! file_exists( $wsal_working_dir . DIRECTORY_SEPARATOR . 'index.php' ) ) {
1493
  // Generate index.php file.
2180
  *
2181
  * @return array - WSAL Options array.
2182
  */
2183
+ public function get_plugin_settings() {
2184
+ // @todo get a list of all plugin settings
2185
+ return [];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2186
  }
2187
 
2188
  /**
2374
  */
2375
  public static function get_frontend_events() {
2376
  // Option defaults.
2377
+ $is_woocommerce_active = WpSecurityAuditLog::is_woocommerce_active();
2378
  $default = array(
2379
  'register' => false,
2380
  'login' => false,
2381
  'system' => false,
2382
+ 'woocommerce' => $is_woocommerce_active,
2383
  );
2384
 
2385
  // Get the option.
2386
+ $value = \WSAL\Helpers\Options::get_option_value_ignore_prefix( self::FRONT_END_EVENTS_OPTION_NAME, $default );
2387
 
2388
  // Check for WooCommerce in case it is not stored.
2389
+ $value['woocommerce'] = ! isset( $value['woocommerce'] ) ? $is_woocommerce_active : $value['woocommerce'];
2390
  return $value;
2391
  }
2392
 
classes/ThirdPartyExtensions/AbstractExtension.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'WSAL_AbstractExtension' ) ) {
4
+
5
+ abstract class WSAL_AbstractExtension {
6
+
7
+ public function __construct() {
8
+ $this->add_filters();
9
+ }
10
+
11
+ public function add_filters() {
12
+ add_filter( 'wsal_filter_installable_plugins', array( $this, 'filter_installable_plugins' ), 10, 1 );
13
+ add_filter( 'wsal_addon_event_codes', array( $this, 'add_event_codes' ), 10, 1 );
14
+ add_filter( 'wsal_modify_predefined_plugin_slug', array( $this, 'modify_predefined_plugin_slug' ), 10, 1 );
15
+ }
16
+
17
+ abstract public function filter_installable_plugins( $plugins );
18
+
19
+ abstract public function add_event_codes( $addon_event_codes );
20
+
21
+ public function modify_predefined_plugin_slug( $plugin ) {
22
+ return $plugin;
23
+ }
24
+ }
25
+ }
classes/ThirdPartyExtensions/BBPressExtension.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'WSAL_BBPressExtension' ) ) {
4
+
5
+ class WSAL_BBPressExtension extends WSAL_AbstractExtension {
6
+
7
+ public function filter_installable_plugins( $plugins ) {
8
+ $new_plugin = array(
9
+ array(
10
+ 'addon_for' => 'bbpress',
11
+ 'title' => 'BBPress',
12
+ 'image_filename' => 'bbpress.png',
13
+ 'plugin_slug' => 'wp-security-audit-log-add-on-for-bbpress/wsal-bbpress.php',
14
+ 'plugin_basename' => 'wsal-bbpress.php',
15
+ 'plugin_url' => 'https://downloads.wordpress.org/plugin/wp-security-audit-log-add-on-for-bbpress.latest-stable.zip',
16
+ 'event_tab_id' => '#tab-bbpress-forums',
17
+ 'plugin_description' => 'Keep a log of your sites bbPress activity, from forum and topic creation, user profile changes and more.',
18
+ )
19
+ );
20
+
21
+ // combine the two arrays.
22
+ $plugins = array_merge( $plugins, $new_plugin );
23
+ return $plugins;
24
+ }
25
+
26
+ public function add_event_codes( $addon_event_codes ) {
27
+ $new_event_codes = array(
28
+ 'bbpress' => array(
29
+ 'name' => __( 'BBPress', 'wp-security-audit-log' ),
30
+ 'event_ids' => array( 8000, 8001, 8002, 8003, 8004, 8005, 8006, 8007, 8008, 8009, 8010, 8011, 8012, 8013, 8014, 8015, 8016, 8017, 8018, 8019, 8020, 8021, 8022, 8023 ),
31
+ ),
32
+ );
33
+
34
+ // combine the two arrays.
35
+ $addon_event_codes = array_merge( $addon_event_codes, $new_event_codes );
36
+ return $addon_event_codes;
37
+ }
38
+ }
39
+ }
classes/ThirdPartyExtensions/GravityFormsExtension.php ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'WSAL_GravityFormsExtension' ) ) {
4
+
5
+ class WSAL_GravityFormsExtension extends WSAL_AbstractExtension {
6
+
7
+ public function filter_installable_plugins( $plugins ) {
8
+ $new_plugin = array(
9
+ array(
10
+ 'addon_for' => 'gravityforms',
11
+ 'title' => __( 'Gravity Forms', 'wp-security-audit-log' ),
12
+ 'image_filename' => 'gravityforms.png',
13
+ 'plugin_slug' => 'activity-log-gravity-forms/activity-log-gravity-forms.php',
14
+ 'plugin_url' => 'https://downloads.wordpress.org/plugin/wp-activity-log-for-woocommerce.latest-stable.zip',
15
+ 'event_tab_id' => '#tab-gravityforms',
16
+ 'plugin_description' => __( 'Keep a record of when someone adds, modifies or deletes forms, entries and more in the Gravity Forms plugin.', 'wp-security-audit-log' ),
17
+ )
18
+ );
19
+
20
+ // combine the two arrays.
21
+ $plugins = array_merge( $plugins, $new_plugin );
22
+ return $plugins;
23
+ }
24
+
25
+ public function add_event_codes( $addon_event_codes ) {
26
+ $new_event_codes = array(
27
+ 'yoast' => array(
28
+ 'name' => __( 'Gravity Forms', 'wp-security-audit-log' ),
29
+ 'event_ids' => array( 5700, 5702, 5703, 5704, 5709, 5715, 5705, 5708, 5706, 5707, 5710, 5711, 5712, 5713, 5714, 5716 ),
30
+ ),
31
+ );
32
+
33
+ // combine the two arrays.
34
+ $addon_event_codes = array_merge( $addon_event_codes, $new_event_codes );
35
+ return $addon_event_codes;
36
+ }
37
+ }
38
+ }
classes/ThirdPartyExtensions/WPFormsExtension.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'WSAL_WPFormsExtension' ) ) {
4
+
5
+ class WSAL_WPFormsExtension extends WSAL_AbstractExtension {
6
+
7
+ public function filter_installable_plugins( $plugins ) {
8
+ $new_plugin = array(
9
+ array(
10
+ 'addon_for' => 'wpforms',
11
+ 'title' => 'WPForms',
12
+ 'image_filename' => 'wpforms.png',
13
+ 'plugin_slug' => 'wp-security-audit-log-add-on-for-wpforms/wsal-wpforms.php',
14
+ 'plugin_basename' => 'wsal-wpforms.php',
15
+ 'plugin_url' => 'https://downloads.wordpress.org/plugin/wp-security-audit-log-add-on-for-wpforms.latest-stable.zip',
16
+ 'event_tab_id' => '#tab-wpforms',
17
+ 'plugin_description' => 'Keep a record of when someone adds, modifies or deletes forms, entries and more in the WPForms plugin.',
18
+ )
19
+ );
20
+
21
+ // combine the two arrays.
22
+ $plugins = array_merge( $plugins, $new_plugin );
23
+ return $plugins;
24
+ }
25
+
26
+ public function add_event_codes( $addon_event_codes ) {
27
+ $new_event_codes = array(
28
+ 'wpforms' => array(
29
+ 'name' => __( 'WPForms', 'wp-security-audit-log' ),
30
+ 'event_ids' => array( 5500, 5501, 5502, 5503, 5504, 5505, 5506 ),
31
+ ),
32
+ );
33
+
34
+ // combine the two arrays.
35
+ $addon_event_codes = array_merge( $addon_event_codes, $new_event_codes );
36
+ return $addon_event_codes;
37
+ }
38
+ }
39
+ }
classes/ThirdPartyExtensions/WooCommerceExtension.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'WSAL_WooCommerceExtension' ) ) {
4
+
5
+ class WSAL_WooCommerceExtension extends WSAL_AbstractExtension {
6
+
7
+ public function __construct() {
8
+ parent::__construct();
9
+ add_filter( 'wsal_save_settings_disabled_events', array( $this, 'save_settings_disabled_events' ), 10, 4 );
10
+ }
11
+
12
+ public function filter_installable_plugins( $plugins ) {
13
+ $new_plugin = array(
14
+ array(
15
+ 'addon_for' => 'woocommerce',
16
+ 'title' => 'WooCommerce',
17
+ 'image_filename' => 'woocommerce.png',
18
+ 'plugin_slug' => 'wp-activity-log-for-woocommerce/wsal-woocommerce.php',
19
+ 'plugin_basename' => 'wsal-woocommerce.php',
20
+ 'plugin_url' => 'https://downloads.wordpress.org/plugin/wp-activity-log-for-woocommerce.latest-stable.zip',
21
+ 'event_tab_id' => '#tab-woocommerce',
22
+ 'plugin_description' => 'Keep a log of your team\'s store settings, products, orders, coupons and any other changes they might do on your eCommerce store.',
23
+ )
24
+ );
25
+
26
+ // combine the two arrays.
27
+ $plugins = array_merge( $plugins, $new_plugin );
28
+ return $plugins;
29
+ }
30
+
31
+ public function add_event_codes( $addon_event_codes ) {
32
+ $new_event_codes = array(
33
+ 'woocommerce' => array(
34
+ 'name' => __( 'WooCommerce', 'wp-security-audit-log' ),
35
+ 'event_ids' => array( 9000, 9001, 9003, 9004, 9005, 9006, 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 9015, 9072, 9073, 9077, 9016, 9017, 9018, 9019, 9020, 9021, 9022, 9023, 9024, 9025, 9026, 9042, 9043, 9044, 9045, 9046, 9105, 9047, 9048, 9049, 9050, 9051, 9027, 9028, 9029, 9030, 9031, 9032, 9033, 9034, 9085, 9086, 9087, 9088, 9089, 9090, 9091, 9092, 9093, 9094, 9074, 9075, 9076, 9078, 9079, 9080, 9081, 9082, 9002, 9052, 9053, 9054, 9055, 9056, 9057, 9058, 9059, 9060, 9061, 9062, 9063, 9064, 9065, 9066, 9067, 9068, 9069, 9070, 9071, 9035, 9036, 9037, 9038, 9039, 9040, 9041, 9083, 9084, 9101, 9102, 9103, 9104 ),
36
+ ),
37
+ );
38
+
39
+ // combine the two arrays.
40
+ $addon_event_codes = array_merge( $addon_event_codes, $new_event_codes );
41
+ return $addon_event_codes;
42
+ }
43
+
44
+ public function save_settings_disabled_events( $disabled, $registered_alerts, $frontend_events, $enabled ) {
45
+
46
+ $settings = WpSecurityAuditLog::GetInstance()->settings();
47
+
48
+ // Now we check all registered events for further processing.
49
+ foreach ( $registered_alerts as $alert ) {
50
+ if ( 9036 === $alert->type ) {
51
+ $frontend_events = $settings::get_frontend_events();
52
+ $frontend_events = array_merge( $frontend_events, array( 'woocommerce' => true ) );
53
+ $settings->set_frontend_events( $frontend_events );
54
+ }
55
+
56
+ if ( ! in_array( $alert->type, $enabled, true ) ) {
57
+ if ( 9036 === $alert->type ) {
58
+ $frontend_events = $settings::get_frontend_events();
59
+ $frontend_events = array_merge( $frontend_events, array( 'woocommerce' => false ) );
60
+ $settings->set_frontend_events( $frontend_events );
61
+ }
62
+ $disabled[] = $alert->type;
63
+ }
64
+ }
65
+
66
+ return $disabled;
67
+ }
68
+ }
69
+ }
classes/ThirdPartyExtensions/YoastSeoExtension.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if ( ! class_exists( 'WSAL_YoastSeoExtension' ) ) {
4
+
5
+ class WSAL_YoastSeoExtension extends WSAL_AbstractExtension {
6
+
7
+ public function filter_installable_plugins( $plugins ) {
8
+ $new_plugin = array(
9
+ array(
10
+ 'addon_for' => 'wp-seo',
11
+ 'title' => 'Yoast SEO',
12
+ 'image_filename' => 'yoast.png',
13
+ 'plugin_slug' => 'activity-log-wp-seo/activity-log-wp-seo.php',
14
+ 'plugin_basename' => 'activity-log-wp-seo.php',
15
+ 'plugin_url' => 'https://downloads.wordpress.org/plugin/activity-log-wp-seo.latest-stable.zip',
16
+ 'event_tab_id' => '#tab-yeost-seo',
17
+ 'plugin_description' => 'Keep a log of all the changes that you and your team do in the Yoast SEO metabox, plugin settings & much more.',
18
+ )
19
+ );
20
+
21
+ // combine the two arrays.
22
+ $plugins = array_merge( $plugins, $new_plugin );
23
+ return $plugins;
24
+ }
25
+
26
+ public function add_event_codes( $addon_event_codes ) {
27
+ $new_event_codes = array(
28
+ 'yoast' => array(
29
+ 'name' => __( 'Yoast SEO', 'wp-security-audit-log' ),
30
+ 'event_ids' => array( 8801, 8802, 8803, 8804, 8805, 8806, 8807, 8808, 8809, 8810, 8811, 8812, 8813, 8814, 8815, 8816, 8817, 8818, 8819, 8820, 8821, 8822, 8823, 8824, 8825 ),
31
+ ),
32
+ );
33
+
34
+ // combine the two arrays.
35
+ $addon_event_codes = array_merge( $addon_event_codes, $new_event_codes );
36
+ return $addon_event_codes;
37
+ }
38
+
39
+ public function modify_predefined_plugin_slug( $plugin ) {
40
+ // Correct yoast addon
41
+ if ( 'yoast' === $plugin ) {
42
+ $plugin = 'wp-seo';
43
+ }
44
+
45
+ return $plugin;
46
+ }
47
+ }
48
+ }
classes/Uninstall.php CHANGED
@@ -25,10 +25,13 @@ class WSAL_Uninstall {
25
  self::drop_table( 'options' );
26
  self::drop_table( 'occurrences' );
27
  self::drop_table( 'metadata' );
 
 
 
28
  }
29
 
30
  // Check if we have set things to delete upon uninstall.
31
- if ( 'yes' === get_option( 'wsal_delete-data' ) ) {
32
  self::delete_options_from_wp_options();
33
  }
34
 
@@ -37,31 +40,23 @@ class WSAL_Uninstall {
37
  }
38
 
39
  /**
40
- * Delete wsal options from wp_options table.
 
 
41
  */
42
- private static function delete_options_from_wp_options() {
43
- global $wpdb;
44
- $plugin_options = $wpdb->get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE 'wsal_%'" );
45
-
46
- foreach( $plugin_options as $option ) {
47
- delete_option( $option->option_name );
48
- }
49
  }
50
 
51
- /**
52
- * Returns the name of the WSAL table.
53
- *
54
- * @param string $table - Name of the WSAL table (without prefix).
55
- * @return string
56
- */
57
- private static function get_table( $table ) {
58
- return $GLOBALS['wpdb']->base_prefix . 'wsal_' . $table; // Using base_prefix because we don't have multiple tables on multisite.
59
  }
60
 
61
  /**
62
  * Check if a table exists.
63
  *
64
  * @param string $table - Name of the WSAL table (without prefix).
 
65
  * @return bool
66
  */
67
  private static function table_exists( $table ) {
@@ -71,17 +66,14 @@ class WSAL_Uninstall {
71
  }
72
 
73
  /**
74
- * Get option from WSAL options table.
75
  *
76
- * @param string $name - Option name.
77
- * @return mixed
 
78
  */
79
- private static function get_option( $name ) {
80
- global $wpdb;
81
-
82
- $name = 'wsal-' . $name;
83
- $table_name = self::get_table( 'options' );
84
- return $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $table_name WHERE option_name = %s", $name ) );
85
  }
86
 
87
  /**
@@ -91,17 +83,21 @@ class WSAL_Uninstall {
91
  */
92
  private static function drop_table( $name ) {
93
  global $wpdb;
94
-
95
  $table_name = self::get_table( $name );
96
  $wpdb->query( 'DROP TABLE ' . $table_name );
97
  }
98
 
99
  /**
100
- * Checks if the removal of data is allowed in the options table.
101
- *
102
- * @return bool
103
  */
104
- private static function should_uninstall() {
105
- return self::table_exists( 'options' ) && '1' === self::get_option( 'delete-data' );
 
 
 
 
 
 
 
106
  }
107
  }
25
  self::drop_table( 'options' );
26
  self::drop_table( 'occurrences' );
27
  self::drop_table( 'metadata' );
28
+ if ( self::table_exists( 'sessions' ) ) {
29
+ self::drop_table( 'sessions' );
30
+ }
31
  }
32
 
33
  // Check if we have set things to delete upon uninstall.
34
+ if ( self::should_data_be_deleted() ) {
35
  self::delete_options_from_wp_options();
36
  }
37
 
40
  }
41
 
42
  /**
43
+ * Checks if the removal of data is allowed in the options table.
44
+ *
45
+ * @return bool
46
  */
47
+ private static function should_uninstall() {
48
+ return self::should_data_be_deleted() && self::table_exists( 'occurrences' );
 
 
 
 
 
49
  }
50
 
51
+ private static function should_data_be_deleted() {
52
+ return in_array( get_option( 'wsal_delete-data' ), [ 'yes', 1, '1', 'y', 'true', true ] );
 
 
 
 
 
 
53
  }
54
 
55
  /**
56
  * Check if a table exists.
57
  *
58
  * @param string $table - Name of the WSAL table (without prefix).
59
+ *
60
  * @return bool
61
  */
62
  private static function table_exists( $table ) {
66
  }
67
 
68
  /**
69
+ * Returns the name of the WSAL table.
70
  *
71
+ * @param string $table - Name of the WSAL table (without prefix).
72
+ *
73
+ * @return string
74
  */
75
+ private static function get_table( $table ) {
76
+ return $GLOBALS['wpdb']->base_prefix . 'wsal_' . $table; // Using base_prefix because we don't have multiple tables on multisite.
 
 
 
 
77
  }
78
 
79
  /**
83
  */
84
  private static function drop_table( $name ) {
85
  global $wpdb;
 
86
  $table_name = self::get_table( $name );
87
  $wpdb->query( 'DROP TABLE ' . $table_name );
88
  }
89
 
90
  /**
91
+ * Delete wsal options from wp_options table.
 
 
92
  */
93
+ public static function delete_options_from_wp_options() {
94
+ global $wpdb;
95
+ $plugin_options = $wpdb->get_results( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE 'wsal_%'" );
96
+
97
+ foreach ( $plugin_options as $option ) {
98
+ delete_option( $option->option_name );
99
+ }
100
+
101
+ // @todo delete also options from site-level tables in multisite context
102
  }
103
  }
classes/Update/Task/MoveSettingsToOptionsTable.php DELETED
@@ -1,227 +0,0 @@
1
- <?php
2
- /**
3
- * Task to handle moving some options from the custom table to the default
4
- * site options table.
5
- *
6
- * NOTE: This helps to simply setting/getting options and also benefits from
7
- * WPs in-built caching optimizations already applied to that table.
8
- *
9
- * @package Wsal
10
- * @since 4.0.3
11
- */
12
-
13
- namespace WSAL\Update\Task;
14
-
15
- /**
16
- * Remaps remaps old cron names to new ones and schedules them at the same
17
- * time as the original was scheduled.
18
- */
19
- class MoveSettingsToOptionsTable {
20
-
21
- /**
22
- * Holds the main plugin instance to work on.
23
- *
24
- * @var \WpSecurityAuditLog
25
- */
26
- private $wsal;
27
-
28
- /**
29
- * The prefix to use when creating the new settings.
30
- *
31
- * @var string
32
- */
33
- private $prefix = '';
34
-
35
- /**
36
- * The version we are upgrading from.
37
- *
38
- * @var null|string
39
- */
40
- private $old_version;
41
-
42
- /**
43
- * The version we upgraded to.
44
- *
45
- * @var null|string
46
- */
47
- private $new_version;
48
-
49
- /**
50
- * Sets up the class properties.
51
- *
52
- * @method __construct
53
- * @param \WpSecurityAuditLog $wsal An instance of the main plugin.
54
- * @param string $prefix The prefix string to prepend to options.
55
- *
56
- * @since 4.0.3
57
- */
58
- public function __construct( $wsal, $prefix = '' ) {
59
- $this->wsal = $wsal;
60
- $this->prefix = $prefix;
61
- add_filter( 'wsal_update_move_settings', array( $this, 'settings_to_move_4_0_3' ) );
62
- add_filter( 'wsal_update_move_settings', array( $this, 'settings_to_move_4_0_1' ) );
63
- add_filter( 'wsal_update_move_settings', array( $this, 'settings_to_move_4_1_3' ) );
64
- }
65
-
66
- /**
67
- * Passes in the version strings so we can decide what settings to move.
68
- *
69
- * @method pass_versions
70
- * @param string $old_version The old version string.
71
- * @param string $new_version The new version string.
72
- *
73
- * @since 4.0.3
74
- */
75
- public function set_versions( $old_version = '', $new_version = '' ) {
76
- $this->old_version = $old_version;
77
- $this->new_version = $new_version;
78
- }
79
-
80
- /**
81
- * Loop through an array of cron tasks and remap them if the name changed.
82
- *
83
- * NOTE: The expected data used in this is a single dimensional array with
84
- * option names.
85
- *
86
- * @method run
87
- * @since 4.0.2
88
- */
89
- public function run() {
90
- // bail early if we don't have a main plugin object to work with.
91
- if ( null === $this->wsal || ! is_a( $this->wsal, 'WpSecurityAuditLog' ) ) {
92
- return;
93
- }
94
- // bail early if options versions were not yet set.
95
- if ( null === $this->old_version || null === $this->new_version ) {
96
- return;
97
- }
98
-
99
- // get an array of options to move.
100
- $settings_to_move = apply_filters( 'wsal_update_move_settings', array() );
101
-
102
- // Loop through array of options to move to WP options table.
103
- foreach ( $settings_to_move as $setting ) {
104
- // the wsal- prefix needs stripped from this option.
105
- if ( false !== ( 'wsal-' === substr( $setting, 0, 5 ) ) ) {
106
- $setting = str_replace( 'wsal-', '', $setting );
107
- }
108
- $value = $this->wsal->GetGlobalSetting( $setting );
109
- // to prevent override of already migrated data we will first check
110
- // if option value exists in the standard options table.
111
- if ( null === $value || false === $value ) {
112
- // only continue with the current item if it doesn't exist already in the WP options table
113
-
114
- // no options value existed in the default table, check in the
115
- // plugins custom table.
116
- $value = $this->wsal->GetGlobalOption( $setting );
117
- if ( $value ) {
118
- // if we got data from the custom table save it.
119
- $this->wsal->SetGlobalSetting( $setting, $value );
120
- }
121
- }
122
-
123
- // delete the option from the custom table
124
- $this->wsal->DeleteByName( $setting );
125
- $this->wsal->DeleteByName( 'wsal-' . $setting );
126
- $this->wsal->DeleteByName( 'wsal_' . $setting );
127
- }
128
- }
129
-
130
- /**
131
- * Filters in a list of settings to move in the 4.0.3 update.
132
- *
133
- * NOTE: Should fire if coming from before 4.0.1 to 4.0.3 or later.
134
- *
135
- * @method settings_to_move_4_0_3
136
- * @param array $settings An array of settings to move.
137
- *
138
- * @return array
139
- * @since 4.0.3
140
- */
141
- public function settings_to_move_4_0_3( $settings ) {
142
- if ( \version_compare( $this->old_version, '4.0.2', '>=' ) && \version_compare( $this->old_version, '4.0.3', '<' ) ) {
143
- // settings moved in this version update.
144
- $settings = array_merge(
145
- $settings,
146
- array(
147
- 'pruning-date-e',
148
- 'pruning-date',
149
- 'pruning-unit',
150
- 'version',
151
- 'timezone',
152
- 'type_username',
153
- 'dismissed-privacy-notice',
154
- 'columns',
155
- 'disabled-alerts',
156
- 'wp-backend',
157
- )
158
- );
159
- }
160
-
161
- // Return an array of all the setting we are wanting moved.
162
- return $settings;
163
- }
164
-
165
- /**
166
- * Filters in a list of settings to move in the 4.0.3 update.
167
- *
168
- * NOTE: Should fire if coming from before 4.0.1 to 4.0.3 or later.
169
- *
170
- * @method settings_to_move_4_0_3
171
- * @param array $settings An array of settings to move.
172
- *
173
- * @return array
174
- * @since 4.1.0
175
- */
176
- public function settings_to_move_4_0_1( $settings ) {
177
- if ( \version_compare( $this->old_version, '4.0.2', '>' ) && \version_compare( $this->old_version, '4.1.3', '<=' ) ) {
178
- // settings moved in this version update.
179
- $settings = array_merge(
180
- $settings,
181
- array(
182
- 'log-404',
183
- 'log-404-limit',
184
- 'log-404-referrer',
185
- 'purge-404-log',
186
- 'wsal-setup-modal-dismissed',
187
- 'log-visitor-failed-login-limit',
188
- 'log-failed-login-limit',
189
- 'log-visitor-404-limit',
190
- 'log-visitor-404-referrer',
191
- 'purge-visitor-404-log',
192
- 'log-visitor-404',
193
- )
194
- );
195
- }
196
-
197
- // Return an array of all the setting we are wanting moved.
198
- return $settings;
199
- }
200
-
201
- /**
202
- * Filters in a list of settings to move in the 4.1.3 update.
203
- *
204
- * @param array $settings An array of settings to move.
205
- *
206
- * @return array
207
- * @since 4.1.3
208
- */
209
- public function settings_to_move_4_1_3( $settings ) {
210
- if ( \version_compare( $this->old_version, '4.1.3', '<=' ) ) {
211
- $this->wsal->settings();
212
- $options = new \WSAL_Models_Option();
213
- $adapter = $options->getAdapter();
214
- $all_options = $adapter->LoadArray('1=%d', array(1));
215
- if (!empty($all_options)) {
216
- /** @var \WSAL_Models_Option $option */
217
- foreach ($all_options as $option) {
218
- array_push($settings, preg_replace('/^wsal[\-_]/', '', $option->option_name));
219
- }
220
- }
221
- }
222
-
223
- // Return an array of all the setting we are wanting moved.
224
- return array_unique($settings);
225
- }
226
-
227
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/Utilities/Emailer.php CHANGED
@@ -84,16 +84,19 @@ class WSAL_Utilities_Emailer {
84
  * @param string $content - Email content.
85
  * @return bool
86
  */
87
- public static function send_email( $email_address, $subject, $content ) {
88
- // Get email adresses even when there is the Username.
89
- $email_address = self::get_emails( $email_address );
 
 
 
90
 
91
  // @see: http://codex.wordpress.org/Function_Reference/wp_mail
92
  add_filter( 'wp_mail_content_type', array( __CLASS__, 'set_html_content_type' ) );
93
  add_filter( 'wp_mail_from', array( __CLASS__, 'custom_wp_mail_from' ) );
94
  add_filter( 'wp_mail_from_name', array( __CLASS__, 'custom_wp_mail_from_name' ) );
95
 
96
- $result = wp_mail( $email_address, $subject, $content );
97
 
98
  /**
99
  * Reset content-type to avoid conflicts.
84
  * @param string $content - Email content.
85
  * @return bool
86
  */
87
+ public static function send_email( $email_address, $subject, $content, $headers = '', $attachments = array() ) {
88
+
89
+ if ( empty( $email_address ) ) {
90
+ // Get email adresses even when there is the Username.
91
+ $email_address = self::get_emails( $email_address );
92
+ }
93
 
94
  // @see: http://codex.wordpress.org/Function_Reference/wp_mail
95
  add_filter( 'wp_mail_content_type', array( __CLASS__, 'set_html_content_type' ) );
96
  add_filter( 'wp_mail_from', array( __CLASS__, 'custom_wp_mail_from' ) );
97
  add_filter( 'wp_mail_from_name', array( __CLASS__, 'custom_wp_mail_from_name' ) );
98
 
99
+ $result = wp_mail( $email_address, $subject, $content, $headers, $attachments );
100
 
101
  /**
102
  * Reset content-type to avoid conflicts.
classes/Utilities/PluginInstallAndActivate.php CHANGED
@@ -38,7 +38,7 @@ if ( ! class_exists( 'WSAL_PluginInstallAndActivate' ) ) {
38
  $allowed_plugins = self::get_installable_plugins();
39
  if ( is_array( $allowed_plugins ) ) {
40
  foreach ( $allowed_plugins as $allowed_plugin ) {
41
- // if we alredy found an allowed slug then break.
42
  if ( true === $is_allowed_slug ) {
43
  break;
44
  }
@@ -86,12 +86,12 @@ if ( ! class_exists( 'WSAL_PluginInstallAndActivate' ) ) {
86
  // Loop through plugins and output.
87
  foreach ( $our_plugins as $details ) {
88
  $disable_button = '';
89
- if ( is_plugin_active( $details['plugin_slug'] ) || 'wsal-wpforms.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_wpforms_init_actions' ) || 'wsal-bbpress.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_bbpress_init_actions' ) ) {
90
  $disable_button = 'disabled';
91
  }
92
  // Check if this is actually an addon for something, otherwise bail.
93
  if ( ! isset( $details['addon_for'] ) || ! isset( $details['image_filename'] ) ) {
94
- break;
95
  }
96
  ?>
97
 
@@ -101,9 +101,9 @@ if ( ! class_exists( 'WSAL_PluginInstallAndActivate' ) ) {
101
  <p><?php echo sanitize_text_field( $details['plugin_description'] ); ?></p><br>
102
  <p><button class="install-addon button button-primary <?php echo esc_attr( $disable_button ); ?>" data-nonce="<?php echo esc_attr( $nonce ); ?>" data-plugin-slug="<?php echo esc_attr( $details['plugin_slug'] ); ?>" data-plugin-download-url="<?php echo esc_url( $details['plugin_url'] ); ?>" data-plugin-event-tab-id="<?php echo esc_attr( $details['event_tab_id'] ); ?>">
103
  <?php
104
- if ( $this->is_plugin_installed( $details['plugin_slug'] ) && ! is_plugin_active( $details['plugin_slug'] ) ) {
105
  esc_html_e( 'Extension installed, activate now?', 'wp-security-audit-log' );
106
- } elseif ( $this->is_plugin_installed( $details['plugin_slug'] ) && is_plugin_active( $details['plugin_slug'] ) || 'wsal-wpforms.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_wpforms_init_actions' ) || 'wsal-bbpress.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_bbpress_init_actions' ) ) {
107
  esc_html_e( 'Extension installed', 'wp-security-audit-log' );
108
  } else {
109
  esc_html_e( 'Install Extension', 'wp-security-audit-log' );
@@ -130,33 +130,6 @@ if ( ! class_exists( 'WSAL_PluginInstallAndActivate' ) ) {
130
  */
131
  public static function get_installable_plugins() {
132
  $plugins = array(
133
- array(
134
- 'addon_for' => 'bbpress',
135
- 'title' => 'BBPress',
136
- 'image_filename' => 'bbpress.png',
137
- 'plugin_slug' => 'wp-security-audit-log-add-on-for-bbpress/wsal-bbpress.php',
138
- 'plugin_url' => 'https://downloads.wordpress.org/plugin/wp-security-audit-log-add-on-for-bbpress.latest-stable.zip',
139
- 'event_tab_id' => '#tab-bbpress-forums',
140
- 'plugin_description' => 'Keep a log of your sites bbPress activity, from forum and topic creation, user profile changes and more.',
141
- ),
142
- array(
143
- 'addon_for' => 'wpforms',
144
- 'title' => 'WPForms',
145
- 'image_filename' => 'wpforms.png',
146
- 'plugin_slug' => 'wp-security-audit-log-add-on-for-wpforms/wsal-wpforms.php',
147
- 'plugin_url' => 'https://downloads.wordpress.org/plugin/wp-security-audit-log-add-on-for-wpforms.latest-stable.zip',
148
- 'event_tab_id' => '#tab-wpforms',
149
- 'plugin_description' => 'Keep a record of when someone adds, modifies or deletes forms, entries and more in the WPForms plugin.',
150
- ),
151
- array(
152
- 'addon_for' => 'woocommerce',
153
- 'title' => 'WooCommerce',
154
- 'image_filename' => 'woocommerce.png',
155
- 'plugin_slug' => 'wp-activity-log-for-woocommerce/wsal-woocommerce.php',
156
- 'plugin_url' => 'https://downloads.wordpress.org/plugin/wp-activity-log-for-woocommerce.latest-stable.zip',
157
- 'event_tab_id' => '#tab-woocommerce',
158
- 'plugin_description' => 'Keep a log of your team\'s store settings, products, orders, coupons and any other changes they might do on your eCommerce store.',
159
- ),
160
  array(
161
  'addon_for' => 'wfcm',
162
  'title' => 'Website File Changes Monitor',
@@ -166,7 +139,9 @@ if ( ! class_exists( 'WSAL_PluginInstallAndActivate' ) ) {
166
  );
167
  // runs through a filter so it can be added to programatically.
168
  // NOTE: this means when using we need to test it's still an array.
169
- return apply_filters( 'wsal_filter_installable_plugins', $plugins );
 
 
170
  }
171
  }
172
  }
38
  $allowed_plugins = self::get_installable_plugins();
39
  if ( is_array( $allowed_plugins ) ) {
40
  foreach ( $allowed_plugins as $allowed_plugin ) {
41
+ // if we already found an allowed slug then break.
42
  if ( true === $is_allowed_slug ) {
43
  break;
44
  }
86
  // Loop through plugins and output.
87
  foreach ( $our_plugins as $details ) {
88
  $disable_button = '';
89
+ if ( WpSecurityAuditLog::is_plugin_active( $details['plugin_slug'] ) ) {
90
  $disable_button = 'disabled';
91
  }
92
  // Check if this is actually an addon for something, otherwise bail.
93
  if ( ! isset( $details['addon_for'] ) || ! isset( $details['image_filename'] ) ) {
94
+ continue;
95
  }
96
  ?>
97
 
101
  <p><?php echo sanitize_text_field( $details['plugin_description'] ); ?></p><br>
102
  <p><button class="install-addon button button-primary <?php echo esc_attr( $disable_button ); ?>" data-nonce="<?php echo esc_attr( $nonce ); ?>" data-plugin-slug="<?php echo esc_attr( $details['plugin_slug'] ); ?>" data-plugin-download-url="<?php echo esc_url( $details['plugin_url'] ); ?>" data-plugin-event-tab-id="<?php echo esc_attr( $details['event_tab_id'] ); ?>">
103
  <?php
104
+ if ( $this->is_plugin_installed( $details['plugin_slug'] ) && ! WpSecurityAuditLog::is_plugin_active( $details['plugin_slug'] ) ) {
105
  esc_html_e( 'Extension installed, activate now?', 'wp-security-audit-log' );
106
+ } elseif ( $this->is_plugin_installed( $details['plugin_slug'] ) && WpSecurityAuditLog::is_plugin_active( $details['plugin_slug'] ) || 'wsal-wpforms.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_wpforms_add_custom_event_objects' ) || 'wsal-bbpress.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_bbpress_add_custom_event_objects' ) || 'activity-log-yoast-seo.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_yoast_seo_extension_add_custom_event_objects' ) ) {
107
  esc_html_e( 'Extension installed', 'wp-security-audit-log' );
108
  } else {
109
  esc_html_e( 'Install Extension', 'wp-security-audit-log' );
130
  */
131
  public static function get_installable_plugins() {
132
  $plugins = array(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  array(
134
  'addon_for' => 'wfcm',
135
  'title' => 'Website File Changes Monitor',
139
  );
140
  // runs through a filter so it can be added to programatically.
141
  // NOTE: this means when using we need to test it's still an array.
142
+ $installable_plugins = apply_filters( 'wsal_filter_installable_plugins', $plugins );
143
+
144
+ return $installable_plugins;
145
  }
146
  }
147
  }
classes/Utilities/PluginInstallerAction.php CHANGED
@@ -81,7 +81,7 @@ if ( ! class_exists( 'WSAL_PluginInstallerAction' ) ) {
81
  // Check if the plugin is installed.
82
  if ( $this->is_plugin_installed( $plugin_slug ) ) {
83
  // If plugin is installed but not active, activate it.
84
- if ( ! is_plugin_active( $plugin_zip ) ) {
85
  $this->run_activate( $plugin_slug );
86
  $this->activate( $plugin_zip );
87
  $result = 'activated';
@@ -150,7 +150,7 @@ if ( ! class_exists( 'WSAL_PluginInstallerAction' ) ) {
150
  require_once ABSPATH . 'wp-admin/includes/plugin.php';
151
  }
152
 
153
- if ( ! is_plugin_active( $plugin_zip ) ) {
154
  activate_plugin( $plugin_zip );
155
  }
156
  }
81
  // Check if the plugin is installed.
82
  if ( $this->is_plugin_installed( $plugin_slug ) ) {
83
  // If plugin is installed but not active, activate it.
84
+ if ( ! WpSecurityAuditLog::is_plugin_active( $plugin_zip ) ) {
85
  $this->run_activate( $plugin_slug );
86
  $this->activate( $plugin_zip );
87
  $result = 'activated';
150
  require_once ABSPATH . 'wp-admin/includes/plugin.php';
151
  }
152
 
153
+ if ( ! WpSecurityAuditLog::is_plugin_active( $plugin_zip ) ) {
154
  activate_plugin( $plugin_zip );
155
  }
156
  }
classes/Utilities/RequestUtils.php ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Utility class for handling request inputs.
5
+ *
6
+ * @package Wsal
7
+ * @since 4.1.4
8
+ */
9
+ class WSAL_Utilities_RequestUtils {
10
+ public static function get_filtered_request_data() {
11
+ $result = [];
12
+
13
+ $get_data = filter_input_array( INPUT_GET );
14
+ if ( is_array( $get_data ) ) {
15
+ $result = array_merge( $result, $get_data );
16
+ }
17
+
18
+ $post_data = filter_input_array( INPUT_POST );
19
+ if ( is_array( $post_data ) ) {
20
+ $result = array_merge( $result, $post_data );
21
+ }
22
+
23
+ return $result;
24
+ }
25
+ }
classes/ViewManager.php CHANGED
@@ -47,7 +47,9 @@ class WSAL_ViewManager {
47
  /**
48
  * Method: Constructor.
49
  *
50
- * @param WpSecurityAuditLog $plugin - Instance of WpSecurityAuditLog.
 
 
51
  * @since 1.0.0
52
  */
53
  public function __construct( WpSecurityAuditLog $plugin ) {
@@ -110,9 +112,8 @@ class WSAL_ViewManager {
110
  add_action( 'admin_footer', array( $this, 'RenderViewFooter' ) );
111
 
112
  // Initialize setup wizard.
113
- if (
114
- ! $this->_plugin->GetGlobalBooleanSetting( 'setup-complete', false )
115
- || ! $this->_plugin->GetGlobalBooleanSetting( 'setup-modal-dismissed', false )
116
  ) {
117
  new WSAL_Views_SetupWizard( $plugin );
118
  }
@@ -231,7 +232,8 @@ class WSAL_ViewManager {
231
  'wsal-settings',
232
  'wsal-ext-settings',
233
  'wsal-rep-views-main',
234
- 'wsal-np-notifications'
 
235
  );
236
 
237
  // check edit privileges of the current user
@@ -506,4 +508,20 @@ class WSAL_ViewManager {
506
  public function bypass_freemius_menu_hiding($should_hide) {
507
  return false;
508
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
509
  }
47
  /**
48
  * Method: Constructor.
49
  *
50
+ * @param WpSecurityAuditLog $plugin - Instance of WpSecurityAuditLog.
51
+ *
52
+ * @throws Freemius_Exception
53
  * @since 1.0.0
54
  */
55
  public function __construct( WpSecurityAuditLog $plugin ) {
112
  add_action( 'admin_footer', array( $this, 'RenderViewFooter' ) );
113
 
114
  // Initialize setup wizard.
115
+ if ( ! $this->_plugin->GetGlobalBooleanSetting( 'setup-complete', false )
116
+ && $this->_plugin->settings()->CurrentUserCan( 'edit' )
 
117
  ) {
118
  new WSAL_Views_SetupWizard( $plugin );
119
  }
232
  'wsal-settings',
233
  'wsal-ext-settings',
234
  'wsal-rep-views-main',
235
+ 'wsal-np-notifications',
236
+ 'wsal-setup'
237
  );
238
 
239
  // check edit privileges of the current user
508
  public function bypass_freemius_menu_hiding($should_hide) {
509
  return false;
510
  }
511
+
512
+ /**
513
+ * Builds a relative asset path that takes SCRIPT_DEBUG constant into account.
514
+ *
515
+ * @param string $path Path relative to the plugin folder.
516
+ * @param string $filename Filename base (.min is optionally appended to this).
517
+ * @param string $extension File extension
518
+ *
519
+ * @return string
520
+ */
521
+ public static function get_asset_path($path, $filename, $extension) {
522
+ $result = $path . $filename;
523
+ $result .= SCRIPT_DEBUG ? '.' : '.min.';
524
+ $result .= $extension;
525
+ return $result;
526
+ }
527
  }
classes/Views/AuditLog.php CHANGED
@@ -77,6 +77,7 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
77
  add_action( 'wp_ajax_wsal_download_404_log', array( $this, 'wsal_download_404_log' ) );
78
  add_action( 'wp_ajax_wsal_freemius_opt_in', array( $this, 'wsal_freemius_opt_in' ) );
79
  add_action( 'wp_ajax_wsal_exclude_url', array( $this, 'wsal_exclude_url' ) );
 
80
  add_action( 'wp_ajax_wsal_dismiss_advert', array( $this, 'wsal_dismiss_advert' ) );
81
  add_action( 'wp_ajax_wsal_dismiss_notice_disconnect', array( $this, 'dismiss_notice_disconnect' ) );
82
  add_action( 'wp_ajax_wsal_dismiss_notice_addon_available', array( $this, 'dismiss_notice_addon_available' ) );
@@ -245,8 +246,7 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
245
 
246
  // Display add-on available notice.
247
  $screen = get_current_screen();
248
- $notice_already_dismissed = $this->_plugin->GetGlobalSetting( 'addon_available_notice_dismissed' );
249
- if ( $screen->base === 'toplevel_page_wsal-auditlog' && $is_current_view && ! $notice_already_dismissed || $screen->base === 'toplevel_page_wsal-auditlog-network' && $is_current_view && ! $notice_already_dismissed ) {
250
  // Grab list of installed plugins.
251
  $all_plugins = get_plugins();
252
  $plugin_filenames = array();
@@ -262,58 +262,49 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
262
  // Loop through plugins and create an array of slugs, we will compare these agains the plugins we have addons for.
263
  $we_have_addon = array_intersect( $plugin_filenames, $predefined_plugins_check );
264
 
265
- $display_notice = false;
266
-
267
  if ( isset( $we_have_addon ) && is_array( $we_have_addon ) ) {
268
  $addon_names = '';
269
  $i = 0;
270
  foreach ( $we_have_addon as $addon ) {
271
  $addon_slug = array_search( $addon, array_column( $predefined_plugins, 'addon_for', 'plugin_slug' ) );
272
- $is_addon_installed = is_plugin_active( $addon_slug );
273
 
274
- // Check if a function from the addon exists, just in case.
275
- if ( $addon === 'wpforms' && function_exists( 'wsal_wpforms_init_actions' ) || $addon === 'bbpress' && function_exists( 'wsal_bbpress_init_actions' ) ) {
 
276
  continue;
277
  }
278
 
279
- if ( ! $is_addon_installed ) {
280
- $addon = str_replace( '-', ' ', $addon);
281
- if ( $addon === 'bbpress' ) {
282
- $addon = 'bbPress';
283
- }
284
- if ( $addon === 'wpforms' ) {
285
- $addon = 'WPForms';
286
- }
287
- if ( $addon === 'woocommerce' ) {
288
- $addon = 'WooCommerce';
289
- }
290
- if ( empty( $addon_names ) ) {
291
- $addon_names .= $addon;
292
- $button_label = esc_html__( 'Install Extension', 'wp-security-audit-log' );
293
- } else {
294
- $addon_names .= ' & ' .$addon;
295
- $button_label = esc_html__( 'Install Extensions', 'wp-security-audit-log' );
296
- }
297
- $display_notice = true;
 
 
 
 
 
 
 
 
 
 
298
  }
299
- $i++;
300
  }
301
- ?>
302
- <?php if ( $display_notice ) : ?>
303
- <div class="notice notice-information is-dismissible" id="wsal-notice-addon-available">
304
- <p><?php $message = printf(
305
- /* translators: %1$s: is the user name, %2$s is the website name */
306
- '%1$s %2$s %3$s %4$s. <a href="%6$s" class="button button-primary">%5$s</a>',
307
- esc_html__( 'You have', 'wp-security-audit-log' ),
308
- $addon_names,
309
- esc_html__( 'installed. Keep a log of changes in', 'wp-security-audit-log' ),
310
- $addon_names,
311
- $button_label,
312
- esc_url( add_query_arg( 'page', 'wsal-togglealerts#tab-third-party-plugins', network_admin_url( 'admin.php' ) ) )
313
- ); ?></p>
314
- <?php wp_nonce_field( 'wsal_dismiss_notice_addon_available', 'wsal-dismiss-notice-addon-available', false, true ); ?>
315
- </div>
316
- <?php endif;
317
  }
318
  }
319
  }
@@ -343,12 +334,13 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
343
  // Get $_POST array arguments.
344
  $post_array_args = array(
345
  'nonce' => FILTER_SANITIZE_STRING,
 
346
  );
347
  $post_array = filter_input_array( INPUT_POST, $post_array_args );
348
 
349
  // Verify nonce.
350
- if ( wp_verify_nonce( $post_array['nonce'], 'wsal_dismiss_notice_addon_available' ) ) {
351
- $this->_plugin->SetGlobalSetting( 'addon_available_notice_dismissed', true );
352
  die();
353
  }
354
  die( 'Nonce verification failed!' );
@@ -590,7 +582,8 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
590
 
591
  <?php
592
  if (
593
- ! $this->_plugin->GetGlobalBooleanSetting( 'setup-complete', false )
 
594
  && ! $this->_plugin->GetGlobalBooleanSetting( 'setup-modal-dismissed', false )
595
  ) :
596
  ?>
@@ -600,23 +593,20 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
600
  <br>
601
  <button data-remodal-action="confirm" class="remodal-confirm"><?php esc_html_e( 'Yes', 'wp-security-audit-log' ); ?></button>
602
  <button data-remodal-action="cancel" class="remodal-cancel"><?php esc_html_e( 'No', 'wp-security-audit-log' ); ?></button>
 
603
  </div>
 
604
  <script type="text/javascript">
605
  jQuery( document ).ready( function() {
606
  var wsal_setup_modal = jQuery( '[data-remodal-id="wsal-setup-modal"]' );
607
  wsal_setup_modal.remodal().open();
608
 
609
  jQuery(document).on('confirmation', wsal_setup_modal, function () {
610
- <?php $this->_plugin->SetGlobalBooleanSetting( 'setup-modal-dismissed', true ); ?>
611
- window.location = '<?php echo esc_url( add_query_arg( 'page', 'wsal-setup', admin_url( 'index.php' ) ) ); ?>';
612
- });
613
-
614
- jQuery(document).on('cancellation', wsal_setup_modal, function () {
615
- <?php $this->_plugin->SetGlobalBooleanSetting( 'setup-modal-dismissed', true ); ?>
616
  });
617
 
618
  jQuery(document).on('closed', wsal_setup_modal, function () {
619
- <?php $this->_plugin->SetGlobalBooleanSetting( 'setup-modal-dismissed', true ); ?>
620
  });
621
  });
622
  </script>
@@ -802,28 +792,30 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
802
  public function wsal_download_failed_login_log() {
803
  // Get post array through filter.
804
  $download_nonce = filter_input( INPUT_POST, 'download_nonce', FILTER_SANITIZE_STRING );
805
- $alert_id = filter_input( INPUT_POST, 'alert_id', FILTER_SANITIZE_NUMBER_INT );
806
 
807
  // Verify nonce.
808
- if ( ! empty( $download_nonce ) && wp_verify_nonce( $download_nonce, 'wsal-download-failed-logins' ) ) {
809
- // Get alert by id.
810
- $alert = new WSAL_Models_Occurrence();
811
- $alert->id = (int) $alert_id;
812
-
813
- // Get users using alert meta.
814
- $users = $alert->GetMetaValue( 'Users', array() );
815
-
816
- // Check if there are any users.
817
- if ( ! empty( $users ) && is_array( $users ) ) {
818
- // Prepare content.
819
- $content = implode( ',', $users );
820
- echo esc_html( $content );
821
- } else {
822
- echo esc_html__( 'No users found.', 'wp-security-audit-log' );
823
- }
824
- } else {
825
  echo esc_html__( 'Nonce verification failed.', 'wp-security-audit-log' );
 
826
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
827
  die();
828
  }
829
 
@@ -848,45 +840,46 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
848
  }
849
 
850
  // Verify nonce.
851
- if ( ! empty( $filename ) && ! empty( $nonce ) && wp_verify_nonce( $nonce, 'wsal-download-404-log-' . $filename ) ) {
852
-
853
- // Get basename to prevent path traversal attack.
854
- $filename = basename( $filename );
855
-
856
- // Construct log file path to eliminate the risks of path traversal attack.
857
- $log_file_path = $this->_plugin->settings()->get_working_dir_path( '404s' ) . $filename;
858
-
859
- // Request the file.
860
- $response = file_get_contents( $log_file_path, true );
861
-
862
- // Check if the response is valid.
863
- if ( $response ) {
864
- // Return the file body.
865
- echo wp_json_encode(
866
- array(
867
- 'success' => true,
868
- 'filename' => $filename,
869
- 'file_content' => $response,
870
- )
871
- );
872
- } else {
873
- // Request failed.
874
- echo wp_json_encode(
875
- array(
876
- 'success' => false,
877
- 'message' => esc_html__( 'Request to get log file failed.', 'wp-security-audit-log' ),
878
- )
879
- );
880
- }
881
- } else {
882
- // Nonce verification failed.
883
  echo wp_json_encode(
884
  array(
885
  'success' => false,
886
  'message' => esc_html__( 'Nonce verification failed.', 'wp-security-audit-log' ),
887
  )
888
  );
 
889
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
890
  die();
891
  }
892
 
@@ -934,7 +927,7 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
934
  }
935
 
936
  // Update freemius state.
937
- $this->_plugin->SetGlobalSetting( 'freemius_state', 'in' );
938
  } elseif ( 'no' === $choice ) {
939
  if ( ! is_multisite() ) {
940
  wsal_freemius()->skip_connection(); // Opt out.
@@ -1179,7 +1172,7 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
1179
  // Filter $_POST array for security.
1180
  $post_array = filter_input_array( INPUT_POST, $filter_input_args );
1181
 
1182
- if ( isset( $post_array['nonce'] ) && ! wp_verify_nonce( $post_array['nonce'], 'wsal-exclude-url-' . $post_array['url'] ) ) {
1183
  die();
1184
  }
1185
 
@@ -1217,14 +1210,8 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
1217
  );
1218
  die();
1219
  }
1220
-
1221
- // Filter $_POST array for security.
1222
- // @codingStandardsIgnoreStart
1223
- $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : false;
1224
- $advert = isset( $_POST['advert'] ) ? (int) sanitize_text_field( wp_unslash( $_POST['advert'] ) ) : false;
1225
- // @codingStandardsIgnoreEnd
1226
-
1227
- if ( ! empty( $nonce ) && ! wp_verify_nonce( $nonce, 'wsal_dismiss_advert' ) ) {
1228
  // Nonce verification failed.
1229
  echo wp_json_encode(
1230
  array(
@@ -1235,6 +1222,10 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
1235
  die();
1236
  }
1237
 
 
 
 
 
1238
  $advert = 2 === $advert ? '0' : $advert + 1;
1239
  $this->_plugin->SetGlobalSetting( 'premium-advert', $advert );
1240
  $set_transient_fn = $this->_plugin->IsMultisite() ? 'set_site_transient' : 'set_transient';
@@ -1286,21 +1277,21 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
1286
  }
1287
 
1288
  // Verify nonce.
1289
- if ( isset( $_POST['wsal_viewer_security'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['wsal_viewer_security'] ) ), 'wsal_auditlog_viewer_nonce' ) ) {
1290
- // Get $_POST arguments.
1291
- $paged = isset( $_POST['page_number'] ) ? sanitize_text_field( wp_unslash( $_POST['page_number'] ) ) : 0;
1292
-
1293
- // Query events.
1294
- $events_query = $this->GetView()->query_events( $paged );
1295
- if ( ! empty( $events_query['items'] ) ) {
1296
- foreach ( $events_query['items'] as $event ) {
1297
- $this->GetView()->single_row( $event );
1298
- }
1299
- }
1300
- exit();
1301
- } else {
1302
  die( esc_html__( 'Nonce verification failed.', 'wp-security-audit-log' ) );
1303
  }
 
 
 
 
 
 
 
 
 
 
 
 
1304
  }
1305
 
1306
  /**
@@ -1312,4 +1303,41 @@ class WSAL_Views_AuditLog extends WSAL_AbstractView {
1312
  $occ = new WSAL_Models_Occurrence();
1313
  return (int) $occ->Count();
1314
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1315
  }
77
  add_action( 'wp_ajax_wsal_download_404_log', array( $this, 'wsal_download_404_log' ) );
78
  add_action( 'wp_ajax_wsal_freemius_opt_in', array( $this, 'wsal_freemius_opt_in' ) );
79
  add_action( 'wp_ajax_wsal_exclude_url', array( $this, 'wsal_exclude_url' ) );
80
+ add_action( 'wp_ajax_wsal_dismiss_setup_modal', array( $this, 'dismiss_setup_modal' ) );
81
  add_action( 'wp_ajax_wsal_dismiss_advert', array( $this, 'wsal_dismiss_advert' ) );
82
  add_action( 'wp_ajax_wsal_dismiss_notice_disconnect', array( $this, 'dismiss_notice_disconnect' ) );
83
  add_action( 'wp_ajax_wsal_dismiss_notice_addon_available', array( $this, 'dismiss_notice_addon_available' ) );
246
 
247
  // Display add-on available notice.
248
  $screen = get_current_screen();
249
+ if ( $is_current_view && in_array( $screen->base, array( 'toplevel_page_wsal-auditlog', 'toplevel_page_wsal-auditlog-network' ) ) ) {
 
250
  // Grab list of installed plugins.
251
  $all_plugins = get_plugins();
252
  $plugin_filenames = array();
262
  // Loop through plugins and create an array of slugs, we will compare these agains the plugins we have addons for.
263
  $we_have_addon = array_intersect( $plugin_filenames, $predefined_plugins_check );
264
 
 
 
265
  if ( isset( $we_have_addon ) && is_array( $we_have_addon ) ) {
266
  $addon_names = '';
267
  $i = 0;
268
  foreach ( $we_have_addon as $addon ) {
269
  $addon_slug = array_search( $addon, array_column( $predefined_plugins, 'addon_for', 'plugin_slug' ) );
 
270
 
271
+ $is_addon_installed = WpSecurityAuditLog::is_plugin_active( $addon_slug );
272
+
273
+ if ( $is_addon_installed ) {
274
  continue;
275
  }
276
 
277
+ $is_dismissed = $this->_plugin->GetGlobalSetting( $addon . '_addon_available_notice_dismissed' );
278
+
279
+ if ( ! $is_dismissed ) {
280
+
281
+ $image_filename = array_search( $addon, array_column( $predefined_plugins, 'addon_for', 'image_filename' ) );
282
+ $title = array_search( $addon, array_column( $predefined_plugins, 'addon_for', 'title' ) );
283
+ $plugin_description = array_search( $addon, array_column( $predefined_plugins, 'addon_for', 'plugin_description' ) );
284
+
285
+ ?>
286
+ <div class="notice notice-information is-dismissible notice-addon-available" id="wsal-notice-addon-available-<?php echo esc_attr( $addon ); ?>" data-addon="<?php echo esc_attr( $addon ); ?>">
287
+ <div class="addon-logo-wrapper">
288
+ <img src="<?php echo esc_url( trailingslashit( WSAL_BASE_URL ) . 'img/addons/' . $image_filename ); ?>">
289
+ </div>
290
+ <div class="addon-content-wrapper">
291
+ <?php
292
+ $message = printf(
293
+ '<p><b>%1$s %2$s %3$s</b></br>%4$s.</br> <a href="%6$s" class="button button-primary">%5$s</a></p>',
294
+ esc_html__( 'We noticed you have', 'wp-security-audit-log' ),
295
+ esc_html( $title ),
296
+ esc_html__( 'installed.', 'wp-security-audit-log' ),
297
+ esc_html( $plugin_description ),
298
+ esc_html__( 'Install extension', 'wp-security-audit-log' ),
299
+ esc_url( add_query_arg( 'page', 'wsal-togglealerts#tab-third-party-plugins', network_admin_url( 'admin.php' ) ) )
300
+ );
301
+ ?>
302
+ <?php wp_nonce_field( 'wsal_dismiss_notice_addon_available_' . $addon, 'wsal-dismiss-notice-addon-available-' . $addon, false, true ); ?>
303
+ </div>
304
+ </div>
305
+ <?php
306
  }
 
307
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
  }
309
  }
310
  }
334
  // Get $_POST array arguments.
335
  $post_array_args = array(
336
  'nonce' => FILTER_SANITIZE_STRING,
337
+ 'addon' => FILTER_SANITIZE_STRING,
338
  );
339
  $post_array = filter_input_array( INPUT_POST, $post_array_args );
340
 
341
  // Verify nonce.
342
+ if ( wp_verify_nonce( $post_array['nonce'], 'wsal_dismiss_notice_addon_available_'. $post_array['addon'] ) ) {
343
+ $this->_plugin->SetGlobalSetting( $post_array['addon'] . '_addon_available_notice_dismissed', true );
344
  die();
345
  }
346
  die( 'Nonce verification failed!' );
582
 
583
  <?php
584
  if (
585
+ $this->_plugin->settings()->CurrentUserCan( 'edit' )
586
+ && ! $this->_plugin->GetGlobalBooleanSetting( 'setup-complete', false )
587
  && ! $this->_plugin->GetGlobalBooleanSetting( 'setup-modal-dismissed', false )
588
  ) :
589
  ?>
593
  <br>
594
  <button data-remodal-action="confirm" class="remodal-confirm"><?php esc_html_e( 'Yes', 'wp-security-audit-log' ); ?></button>
595
  <button data-remodal-action="cancel" class="remodal-cancel"><?php esc_html_e( 'No', 'wp-security-audit-log' ); ?></button>
596
+ <?php wp_nonce_field( 'wsal_dismiss_setup_modal', 'wsal-dismiss-setup-modal', false, true ); ?>
597
  </div>
598
+
599
  <script type="text/javascript">
600
  jQuery( document ).ready( function() {
601
  var wsal_setup_modal = jQuery( '[data-remodal-id="wsal-setup-modal"]' );
602
  wsal_setup_modal.remodal().open();
603
 
604
  jQuery(document).on('confirmation', wsal_setup_modal, function () {
605
+ window.location = '<?php echo esc_url( add_query_arg( 'page', 'wsal-setup', network_admin_url( 'index.php' ) ) ); ?>';
 
 
 
 
 
606
  });
607
 
608
  jQuery(document).on('closed', wsal_setup_modal, function () {
609
+ wsal_dismiss_setup_modal();
610
  });
611
  });
612
  </script>
792
  public function wsal_download_failed_login_log() {
793
  // Get post array through filter.
794
  $download_nonce = filter_input( INPUT_POST, 'download_nonce', FILTER_SANITIZE_STRING );
 
795
 
796
  // Verify nonce.
797
+ if ( empty( $download_nonce ) || ! wp_verify_nonce( $download_nonce, 'wsal-download-failed-logins' ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
798
  echo esc_html__( 'Nonce verification failed.', 'wp-security-audit-log' );
799
+ die();
800
  }
801
+
802
+ // Get alert by id.
803
+ $alert_id = filter_input( INPUT_POST, 'alert_id', FILTER_SANITIZE_NUMBER_INT );
804
+ $alert = new WSAL_Models_Occurrence();
805
+ $alert->id = (int) $alert_id;
806
+
807
+ // Get users using alert meta.
808
+ $users = $alert->GetMetaValue( 'Users', array() );
809
+
810
+ // Check if there are any users.
811
+ if ( ! empty( $users ) && is_array( $users ) ) {
812
+ // Prepare content.
813
+ $content = implode( ',', $users );
814
+ echo esc_html( $content );
815
+ } else {
816
+ echo esc_html__( 'No users found.', 'wp-security-audit-log' );
817
+ }
818
+
819
  die();
820
  }
821
 
840
  }
841
 
842
  // Verify nonce.
843
+ if ( empty( $filename ) || empty( $nonce ) || ! wp_verify_nonce( $nonce, 'wsal-download-404-log-' . $filename ) ) {
844
+ // Nonce verification failed.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
845
  echo wp_json_encode(
846
  array(
847
  'success' => false,
848
  'message' => esc_html__( 'Nonce verification failed.', 'wp-security-audit-log' ),
849
  )
850
  );
851
+ die();
852
  }
853
+
854
+ // Get basename to prevent path traversal attack.
855
+ $filename = basename( $filename );
856
+
857
+ // Construct log file path to eliminate the risks of path traversal attack.
858
+ $log_file_path = $this->_plugin->settings()->get_working_dir_path( '404s' ) . $filename;
859
+
860
+ // Request the file.
861
+ $response = file_get_contents( $log_file_path, true );
862
+
863
+ // Check if the response is valid.
864
+ if ( $response ) {
865
+ // Return the file body.
866
+ echo wp_json_encode(
867
+ array(
868
+ 'success' => true,
869
+ 'filename' => $filename,
870
+ 'file_content' => $response,
871
+ )
872
+ );
873
+ } else {
874
+ // Request failed.
875
+ echo wp_json_encode(
876
+ array(
877
+ 'success' => false,
878
+ 'message' => esc_html__( 'Request to get log file failed.', 'wp-security-audit-log' ),
879
+ )
880
+ );
881
+ }
882
+
883
  die();
884
  }
885
 
927
  }
928
 
929
  // Update freemius state.
930
+ $this->_plugin->SetGlobalSetting( 'freemius_state', 'in' );
931
  } elseif ( 'no' === $choice ) {
932
  if ( ! is_multisite() ) {
933
  wsal_freemius()->skip_connection(); // Opt out.
1172
  // Filter $_POST array for security.
1173
  $post_array = filter_input_array( INPUT_POST, $filter_input_args );
1174
 
1175
+ if ( ! isset( $post_array['nonce'] ) || ! wp_verify_nonce( $post_array['nonce'], 'wsal-exclude-url-' . $post_array['url'] ) ) {
1176
  die();
1177
  }
1178
 
1210
  );
1211
  die();
1212
  }
1213
+
1214
+ if ( empty( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'wsal_dismiss_advert' ) ) {
 
 
 
 
 
 
1215
  // Nonce verification failed.
1216
  echo wp_json_encode(
1217
  array(
1222
  die();
1223
  }
1224
 
1225
+ // @codingStandardsIgnoreStart
1226
+ $advert = isset( $_POST['advert'] ) ? (int) sanitize_text_field( wp_unslash( $_POST['advert'] ) ) : false;
1227
+ // @codingStandardsIgnoreEnd
1228
+
1229
  $advert = 2 === $advert ? '0' : $advert + 1;
1230
  $this->_plugin->SetGlobalSetting( 'premium-advert', $advert );
1231
  $set_transient_fn = $this->_plugin->IsMultisite() ? 'set_site_transient' : 'set_transient';
1277
  }
1278
 
1279
  // Verify nonce.
1280
+ if ( ! isset( $_POST['wsal_viewer_security'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['wsal_viewer_security'] ) ), 'wsal_auditlog_viewer_nonce' ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
1281
  die( esc_html__( 'Nonce verification failed.', 'wp-security-audit-log' ) );
1282
  }
1283
+
1284
+ // Get $_POST arguments.
1285
+ $paged = isset( $_POST['page_number'] ) ? sanitize_text_field( wp_unslash( $_POST['page_number'] ) ) : 0;
1286
+
1287
+ // Query events.
1288
+ $events_query = $this->GetView()->query_events( $paged );
1289
+ if ( ! empty( $events_query['items'] ) ) {
1290
+ foreach ( $events_query['items'] as $event ) {
1291
+ $this->GetView()->single_row( $event );
1292
+ }
1293
+ }
1294
+ exit();
1295
  }
1296
 
1297
  /**
1303
  $occ = new WSAL_Models_Occurrence();
1304
  return (int) $occ->Count();
1305
  }
1306
+
1307
+ /**
1308
+ * Method: Ajax request handler to dismiss setup modal.
1309
+ *
1310
+ * @since 4.1.4
1311
+ */
1312
+ public function dismiss_setup_modal() {
1313
+ // Die if user does not have permission to dismiss.
1314
+ if ( ! $this->_plugin->settings()->CurrentUserCan( 'edit' ) ) {
1315
+ echo wp_json_encode(
1316
+ array(
1317
+ 'success' => false,
1318
+ 'message' => esc_html__( 'You do not have sufficient permissions to dismiss this notice.', 'wp-security-audit-log' ),
1319
+ )
1320
+ );
1321
+ die();
1322
+ }
1323
+
1324
+ // Filter $_POST array for security.
1325
+ // @codingStandardsIgnoreStart
1326
+ $nonce = isset( $_POST['nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['nonce'] ) ) : false;
1327
+ // @codingStandardsIgnoreEnd
1328
+
1329
+ if ( empty( $nonce ) || ! wp_verify_nonce( $nonce, 'wsal_dismiss_setup_modal' ) ) {
1330
+ // Nonce verification failed.
1331
+ echo wp_json_encode(
1332
+ array(
1333
+ 'success' => false,
1334
+ 'message' => esc_html__( 'Nonce verification failed.', 'wp-security-audit-log' ),
1335
+ )
1336
+ );
1337
+ die();
1338
+ }
1339
+
1340
+ $this->_plugin->SetGlobalBooleanSetting( 'setup-modal-dismissed', true );
1341
+ echo wp_send_json_success();
1342
+ }
1343
  }
classes/Views/Help.php CHANGED
@@ -464,7 +464,7 @@ class WSAL_Views_Help extends WSAL_AbstractView {
464
 
465
  // WSAL options.
466
  $sysinfo .= "\n" . '-- WSAL Options --' . "\n\n";
467
- $options = $this->_plugin->settings()->get_wsal_options();
468
 
469
  if ( ! empty( $options ) && is_array( $options ) ) {
470
  foreach ( $options as $option ) {
464
 
465
  // WSAL options.
466
  $sysinfo .= "\n" . '-- WSAL Options --' . "\n\n";
467
+ $options = $this->_plugin->settings()->get_plugin_settings();
468
 
469
  if ( ! empty( $options ) && is_array( $options ) ) {
470
  foreach ( $options as $option ) {
classes/Views/Settings.php CHANGED
@@ -132,6 +132,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
132
  * );
133
  *
134
  * @param array $wsal_setting_tabs – Array of WSAL Setting Tabs.
 
135
  * @since 3.2.3
136
  */
137
  $wsal_setting_tabs = apply_filters( 'wsal_setting_tabs', $wsal_setting_tabs );
@@ -444,9 +445,7 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
444
  */
445
  private function tab_general() {
446
  ?>
447
- <p class="description"><?php echo wp_kses( __( 'Need help with setting up the plugin to meet your requirements? <a href="https://wpactivitylog.com/contact/?utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=settings+pages" target="_blank">Schedule a 20 minutes consultation and setup call</a> with our experts for just $50.', 'wp-security-audit-log' ), $this->_plugin->allowed_html_tags ); ?></p>
448
-
449
- <h3><?php esc_html_e( 'Use infinite scroll or pagination for the event viewer?', 'wp-security-audit-log' ); ?></h3>
450
  <p class="description">
451
  <?php
452
  echo sprintf(
@@ -737,7 +736,6 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
737
  esc_html_e( 'All administrators', 'wp-security-audit-log' );
738
  }
739
  ?>
740
- <?php ?>
741
  </label>
742
  <br/>
743
  </fieldset>
@@ -781,12 +779,12 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
781
  <?php
782
  $restrict_settings = $this->_plugin->settings()->get_restrict_log_viewer();
783
  $viewer_restriction_options = array(
784
- 'only_me' => __('Only me', 'wp-security-audit-log'),
785
- 'only_superadmins' => __('Super administators only', 'wp-security-audit-log'),
786
- 'only_admins' => __('Super administators and site administrators', 'wp-security-audit-log'),
787
  );
788
  ?>
789
- <?php foreach ($viewer_restriction_options as $option => $label): ?>
790
  <label for="log_viewer_<?php echo $option; ?>">
791
  <?php $disabled = ('only_me' === $option && 'only_superadmins' === $restrict_settings); ?>
792
  <input type="radio" name="restrict-log-viewer" id="log_viewer_<?php echo $option; ?>" value="<?php echo $option; ?>" <?php checked( $restrict_settings, $option ); ?> <?php disabled( $disabled ); ?> />
@@ -1504,18 +1502,18 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
1504
  </tbody>
1505
  </table>
1506
 
1507
- <h3><?php esc_html_e( 'Reset plugin settings to default', 'wp-security-audit-log' ); ?></h3>
1508
- <p class="description"><?php esc_html_e( 'Click the RESET button to reset ALL plugin settings to default. Note that the activity log data will be retained and only the plugin settings will be reset. To purge the data of the activity log use the setting below.', 'wp-security-audit-log' ); ?></p>
1509
- <table class="form-table wsal-tab">
1510
- <tbody>
1511
- <tr>
1512
- <th><?php esc_html_e( 'Reset Settings', 'wp-security-audit-log' ); ?></th>
1513
- <td>
1514
- <a href="#wsal_reset_settings" class="button-primary"><?php esc_html_e( 'RESET', 'wp-security-audit-log' ); ?></a>
1515
- </td>
1516
- </tr>
1517
- </tbody>
1518
- </table>
1519
 
1520
  <h3><?php esc_html_e( 'Purge the WordPress activity log', 'wp-security-audit-log' ); ?></h3>
1521
  <p class="description"><?php esc_html_e( 'Click the Purge button below to delete all the data from the WordPress activity log and start afresh.', 'wp-security-audit-log' ); ?></p>
@@ -1598,15 +1596,15 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
1598
  </tbody>
1599
  </table>
1600
 
1601
- <div class="remodal" data-remodal-id="wsal_reset_settings">
1602
- <button data-remodal-action="close" class="remodal-close"></button>
1603
- <h3><?php esc_html_e( 'Are you sure you want to reset all the plugin settings to default?', 'wp-security-audit-log' ); ?></h3>
1604
- <br>
1605
- <input type="hidden" id="wsal-reset-settings-nonce" value="<?php echo esc_attr( wp_create_nonce( 'wsal-reset-settings' ) ); ?>">
1606
- <button data-remodal-action="confirm" class="remodal-confirm"><?php esc_html_e( 'Yes', 'wp-security-audit-log' ); ?></button>
1607
- <button data-remodal-action="cancel" class="remodal-cancel"><?php esc_html_e( 'No', 'wp-security-audit-log' ); ?></button>
1608
- </div>
1609
- <!-- Reset Settings Modal -->
1610
 
1611
  <div class="remodal" data-remodal-id="wsal_purge_activity">
1612
  <button data-remodal-action="close" class="remodal-close"></button>
@@ -1749,14 +1747,15 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
1749
  );
1750
  // Passing nonce for security to JS file.
1751
  $wsal_data = array(
1752
- 'wp_nonce' => wp_create_nonce( 'wsal-exclude-nonce' ),
1753
- 'invalidURL' => esc_html__( 'The specified value is not a valid URL!', 'wp-security-audit-log' ),
1754
- 'invalidCPT' => esc_html__( 'The specified value is not a valid post type!', 'wp-security-audit-log' ),
1755
- 'invalidIP' => esc_html__( 'The specified value is not a valid IP address!', 'wp-security-audit-log' ),
1756
- 'invalidUser' => esc_html__( 'The specified value is not a user nor a role!', 'wp-security-audit-log' ),
1757
- 'invalidFile' => esc_html__( 'Filename cannot be added because it contains invalid characters.', 'wp-security-audit-log' ),
1758
- 'invalidFileExt' => esc_html__( 'File extension cannot be added because it contains invalid characters.', 'wp-security-audit-log' ),
1759
- 'invalidDir' => esc_html__( 'Directory cannot be added because it contains invalid characters.', 'wp-security-audit-log' ),
 
1760
  );
1761
  wp_localize_script( 'settings', 'wsal_data', $wsal_data );
1762
  wp_enqueue_script( 'settings' );
@@ -1877,28 +1876,22 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
1877
  */
1878
  public function reset_settings() {
1879
  // Die if user does not have permission to change settings.
1880
- if ( ! $this->_plugin->settings()->CurrentUserCan( 'view' ) ) {
1881
- die( esc_html__( 'Access Denied.', 'wp-security-audit-log' ) );
1882
  }
1883
 
1884
  // Verify nonce.
1885
  $nonce = filter_input( INPUT_POST, 'nonce', FILTER_SANITIZE_STRING );
1886
- if ( ! empty( $nonce ) && wp_verify_nonce( $nonce, 'wsal-reset-settings' ) ) {
1887
- global $wpdb;
 
1888
 
1889
- $table_name = $wpdb->prefix . 'wsal_options';
1890
- $result = $wpdb->query( "TRUNCATE {$table_name}" );
1891
 
1892
- if ( $result ) {
1893
- // Log settings reset event.
1894
- $this->_plugin->alerts->Trigger( 6006 );
1895
- die( esc_html__( 'Tables has been reset.', 'wp-security-audit-log' ) );
1896
- } else {
1897
- die( esc_html__( 'Reset query failed.', 'wp-security-audit-log' ) );
1898
- }
1899
- } else {
1900
- die( esc_html__( 'Nonce Verification Failed.', 'wp-security-audit-log' ) );
1901
- }
1902
  }
1903
 
1904
  /**
@@ -1907,24 +1900,24 @@ class WSAL_Views_Settings extends WSAL_AbstractView {
1907
  public function purge_activity() {
1908
  // Die if user does not have permission to change settings.
1909
  if ( ! $this->_plugin->settings()->CurrentUserCan( 'view' ) ) {
1910
- die( esc_html__( 'Access Denied.', 'wp-security-audit-log' ) );
1911
  }
1912
 
1913
  // Verify nonce.
1914
  $nonce = filter_input( INPUT_POST, 'nonce', FILTER_SANITIZE_STRING );
1915
- if ( ! empty( $nonce ) && wp_verify_nonce( $nonce, 'wsal-purge-activity' ) ) {
1916
- $connector = WpSecurityAuditLog::getConnector();
1917
- $result = $connector->purge_activity();
1918
-
1919
- if ( $result ) {
1920
- // Log purge activity event.
1921
- $this->_plugin->alerts->Trigger( 6034 );
1922
- die( esc_html__( 'Tables has been reset.', 'wp-security-audit-log' ) );
1923
- } else {
1924
- die( esc_html__( 'Reset query failed.', 'wp-security-audit-log' ) );
1925
- }
1926
- } else {
1927
- die( esc_html__( 'Nonce Verification Failed.', 'wp-security-audit-log' ) );
1928
  }
 
 
 
 
 
 
 
 
 
 
 
1929
  }
1930
  }
132
  * );
133
  *
134
  * @param array $wsal_setting_tabs – Array of WSAL Setting Tabs.
135
+ *
136
  * @since 3.2.3
137
  */
138
  $wsal_setting_tabs = apply_filters( 'wsal_setting_tabs', $wsal_setting_tabs );
445
  */
446
  private function tab_general() {
447
  ?>
448
+ <h3><?php esc_html_e( 'Use infinite scroll or pagination for the event viewer?', 'wp-security-audit-log' ); ?></h3>
 
 
449
  <p class="description">
450
  <?php
451
  echo sprintf(
736
  esc_html_e( 'All administrators', 'wp-security-audit-log' );
737
  }
738
  ?>
 
739
  </label>
740
  <br/>
741
  </fieldset>
779
  <?php
780
  $restrict_settings = $this->_plugin->settings()->get_restrict_log_viewer();
781
  $viewer_restriction_options = array(
782
+ 'only_me' => __( 'Only me', 'wp-security-audit-log' ),
783
+ 'only_superadmins' => __( 'Super administators only', 'wp-security-audit-log' ),
784
+ 'only_admins' => __( 'Super administators and site administrators', 'wp-security-audit-log' ),
785
  );
786
  ?>
787
+ <?php foreach ( $viewer_restriction_options as $option => $label ): ?>
788
  <label for="log_viewer_<?php echo $option; ?>">
789
  <?php $disabled = ('only_me' === $option && 'only_superadmins' === $restrict_settings); ?>
790
  <input type="radio" name="restrict-log-viewer" id="log_viewer_<?php echo $option; ?>" value="<?php echo $option; ?>" <?php checked( $restrict_settings, $option ); ?> <?php disabled( $disabled ); ?> />
1502
  </tbody>
1503
  </table>
1504
 
1505
+ <h3><?php esc_html_e( 'Reset plugin settings to default', 'wp-security-audit-log' ); ?></h3>
1506
+ <p class="description"><?php _e( 'Use this button to <em>factory reset</em> the plugin. This means that all the configured settings will be reset to default and all email notifications, scheduled reports, external database / third party services connections, archiving and mirroring rule will be deleted. NOTE: the activity log data will not be purged. Use the setting below to purge the activity log.', 'wp-security-audit-log' ); ?></p>
1507
+ <table class="form-table wsal-tab">
1508
+ <tbody>
1509
+ <tr>
1510
+ <th><?php esc_html_e( 'Reset Settings', 'wp-security-audit-log' ); ?></th>
1511
+ <td>
1512
+ <a href="#wsal_reset_settings" class="button-primary js-settings-reset"><?php esc_html_e( 'RESET', 'wp-security-audit-log' ); ?></a>
1513
+ </td>
1514
+ </tr>
1515
+ </tbody>
1516
+ </table>
1517
 
1518
  <h3><?php esc_html_e( 'Purge the WordPress activity log', 'wp-security-audit-log' ); ?></h3>
1519
  <p class="description"><?php esc_html_e( 'Click the Purge button below to delete all the data from the WordPress activity log and start afresh.', 'wp-security-audit-log' ); ?></p>
1596
  </tbody>
1597
  </table>
1598
 
1599
+ <div class="remodal" data-remodal-id="wsal_reset_settings">
1600
+ <button data-remodal-action="close" class="remodal-close"></button>
1601
+ <h3><?php esc_html_e( 'Are you sure you want to reset all the plugin settings to default? This action cannot be undone.', 'wp-security-audit-log' ); ?></h3>
1602
+ <br>
1603
+ <input type="hidden" id="wsal-reset-settings-nonce" value="<?php echo esc_attr( wp_create_nonce( 'wsal-reset-settings' ) ); ?>">
1604
+ <button data-remodal-action="confirm" class="remodal-confirm"><?php esc_html_e( 'Yes' ); ?></button>
1605
+ <button data-remodal-action="cancel" class="remodal-cancel"><?php esc_html_e( 'No' ); ?></button>
1606
+ </div>
1607
+ <!-- Reset Settings Modal -->
1608
 
1609
  <div class="remodal" data-remodal-id="wsal_purge_activity">
1610
  <button data-remodal-action="close" class="remodal-close"></button>
1747
  );
1748
  // Passing nonce for security to JS file.
1749
  $wsal_data = array(
1750
+ 'wp_nonce' => wp_create_nonce( 'wsal-exclude-nonce' ),
1751
+ 'invalidURL' => esc_html__( 'The specified value is not a valid URL!', 'wp-security-audit-log' ),
1752
+ 'invalidCPT' => esc_html__( 'The specified value is not a valid post type!', 'wp-security-audit-log' ),
1753
+ 'invalidIP' => esc_html__( 'The specified value is not a valid IP address!', 'wp-security-audit-log' ),
1754
+ 'invalidUser' => esc_html__( 'The specified value is not a user nor a role!', 'wp-security-audit-log' ),
1755
+ 'invalidFile' => esc_html__( 'Filename cannot be added because it contains invalid characters.', 'wp-security-audit-log' ),
1756
+ 'invalidFileExt' => esc_html__( 'File extension cannot be added because it contains invalid characters.', 'wp-security-audit-log' ),
1757
+ 'invalidDir' => esc_html__( 'Directory cannot be added because it contains invalid characters.', 'wp-security-audit-log' ),
1758
+ 'saveSettingsChanges' => esc_html__( 'Please save any changes before switching tabs.', 'wp-security-audit-log' ),
1759
  );
1760
  wp_localize_script( 'settings', 'wsal_data', $wsal_data );
1761
  wp_enqueue_script( 'settings' );
1876
  */
1877
  public function reset_settings() {
1878
  // Die if user does not have permission to change settings.
1879
+ if ( ! $this->_plugin->settings()->CurrentUserCan( 'edit' ) ) {
1880
+ wp_send_json_error( esc_html__( 'Access Denied.', 'wp-security-audit-log' ) );
1881
  }
1882
 
1883
  // Verify nonce.
1884
  $nonce = filter_input( INPUT_POST, 'nonce', FILTER_SANITIZE_STRING );
1885
+ if ( empty( $nonce ) || ! wp_verify_nonce( $nonce, 'wsal-reset-settings' ) ) {
1886
+ wp_send_json_error( esc_html__( 'Nonce Verification Failed.', 'wp-security-audit-log' ) );
1887
+ }
1888
 
1889
+ // delete all settings
1890
+ WSAL_Uninstall::delete_options_from_wp_options();
1891
 
1892
+ // Log settings reset event.
1893
+ $this->_plugin->alerts->Trigger( 6006 );
1894
+ wp_send_json_success( esc_html__( 'Plugin settings have been reset.', 'wp-security-audit-log' ) );
 
 
 
 
 
 
 
1895
  }
1896
 
1897
  /**
1900
  public function purge_activity() {
1901
  // Die if user does not have permission to change settings.
1902
  if ( ! $this->_plugin->settings()->CurrentUserCan( 'view' ) ) {
1903
+ wp_send_json_error( esc_html__( 'Access Denied.', 'wp-security-audit-log' ) );
1904
  }
1905
 
1906
  // Verify nonce.
1907
  $nonce = filter_input( INPUT_POST, 'nonce', FILTER_SANITIZE_STRING );
1908
+ if ( empty( $nonce ) || ! wp_verify_nonce( $nonce, 'wsal-purge-activity' ) ) {
1909
+ wp_send_json_error( esc_html__( 'Nonce Verification Failed.', 'wp-security-audit-log' ) );
 
 
 
 
 
 
 
 
 
 
 
1910
  }
1911
+
1912
+ $connector = WpSecurityAuditLog::getConnector();
1913
+ $result = $connector->purge_activity();
1914
+
1915
+ if ( $result ) {
1916
+ // Log purge activity event.
1917
+ $this->_plugin->alerts->Trigger( 6034 );
1918
+ wp_send_json_success( esc_html__( 'Tables has been reset.', 'wp-security-audit-log' ) );
1919
+ } else {
1920
+ wp_send_json_error( esc_html__( 'Reset query failed.', 'wp-security-audit-log' ) );
1921
+ }
1922
  }
1923
  }
classes/Views/SetupWizard.php CHANGED
@@ -64,19 +64,19 @@ final class WSAL_Views_SetupWizard {
64
  public function __construct( WpSecurityAuditLog $wsal ) {
65
  $this->wsal = $wsal;
66
 
67
- if ( current_user_can( 'manage_options' ) ) {
68
  add_action( 'admin_init', array( $this, 'setup_page' ), 10 );
 
 
 
69
  }
70
- add_action( 'admin_menu', array( $this, 'admin_menus' ), 10 );
71
- add_action( 'wp_ajax_setup_check_security_token', array( $this, 'setup_check_security_token' ) );
72
-
73
  }
74
 
75
  /**
76
  * Ajax handler to verify setting token.
77
  */
78
  public function setup_check_security_token() {
79
- if ( ! current_user_can( 'manage_options' ) ) {
80
  echo wp_json_encode(
81
  array(
82
  'success' => false,
@@ -231,29 +231,32 @@ final class WSAL_Views_SetupWizard {
231
  /**
232
  * Enqueue Styles.
233
  */
 
234
  wp_enqueue_style(
235
  'wsal-wizard-css',
236
- $this->wsal->GetBaseUrl() . '/css/dist/wsal-wizard.build.css',
237
  array( 'dashicons', 'install', 'forms' ),
238
- filemtime( $this->wsal->GetBaseDir() . 'css/dist/wsal-wizard.build.css' )
239
  );
240
 
241
  /**
242
  * Enqueue Scripts.
243
  */
244
- wp_register_script(
 
245
  'wsal-wizard-js',
246
- $this->wsal->GetBaseUrl() . '/js/dist/wsal-wizard.min.js',
247
- array( ),
248
- filemtime( $this->wsal->GetBaseDir() . 'js/dist/wsal-wizard.min.js' ),
249
  false
250
  );
251
 
 
252
  wp_register_script(
253
  'wsal-common',
254
- $this->wsal->GetBaseUrl() . '/js/common.js',
255
  array( 'jquery' ),
256
- filemtime( $this->wsal->GetBaseDir() . '/js/common.js' ),
257
  true
258
  );
259
 
@@ -426,8 +429,8 @@ final class WSAL_Views_SetupWizard {
426
  * Step View: `Welcome`
427
  */
428
  private function wsal_step_welcome() {
429
- // Dismiss the setup modal on audit log.
430
- if ( $this->wsal->GetGlobalBooleanSetting( 'setup-modal-dismissed', false ) ) {
431
  $this->wsal->SetGlobalBooleanSetting( 'setup-modal-dismissed', true );
432
  }
433
  ?>
@@ -840,7 +843,7 @@ final class WSAL_Views_SetupWizard {
840
  private function addons_step() {
841
  $our_plugins = WSAL_PluginInstallAndActivate::get_installable_plugins();
842
 
843
- // Grab list of instaleld plugins.
844
  $all_plugins = get_plugins();
845
  $plugin_filenames = array();
846
  foreach ( $all_plugins as $plugin => $info ) {
@@ -851,7 +854,7 @@ final class WSAL_Views_SetupWizard {
851
  // Grab list of plugins we have addons for.
852
  $predefined_plugins = array_column( $our_plugins, 'addon_for' );
853
 
854
- // Loop through plugins and create an array of slugs, we will compare these agains the plugins we have addons for.
855
  $we_have_addon = array_intersect( $plugin_filenames, $predefined_plugins );
856
 
857
  ?>
@@ -866,7 +869,7 @@ final class WSAL_Views_SetupWizard {
866
  // Loop through plugins and output.
867
  foreach ( $our_plugins as $details ) {
868
  $disable_button = '';
869
- if ( is_plugin_active( $details['plugin_slug'] ) || 'wsal-wpforms.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_wpforms_init_actions' ) || 'wsal-bbpress.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_bbpress_init_actions' ) ) {
870
  $disable_button = 'disabled';
871
  }
872
  if ( ! in_array( $details['addon_for'], $we_have_addon ) ) {
@@ -885,9 +888,9 @@ final class WSAL_Views_SetupWizard {
885
  <p><?php echo sanitize_text_field( $details['plugin_description'] ); ?></p>
886
  <p><button class="install-addon button button-primary <?php echo esc_attr( $disable_button ); ?>" data-nonce="<?php echo esc_attr( $nonce ); ?>" data-plugin-slug="<?php echo esc_attr( $details['plugin_slug'] ); ?>" data-plugin-download-url="<?php echo esc_url( $details['plugin_url'] ); ?>" data-plugin-event-tab-id="<?php echo esc_attr( $details['event_tab_id'] ); ?>">
887
  <?php
888
- if ( WSAL_PluginInstallAndActivate::is_plugin_installed( $details['plugin_slug'] ) && ! is_plugin_active( $details['plugin_slug'] ) ) {
889
  esc_html_e( 'Extension installed, activate now?', 'wp-security-audit-log' );
890
- } elseif ( WSAL_PluginInstallAndActivate::is_plugin_installed( $details['plugin_slug'] ) && is_plugin_active( $details['plugin_slug'] ) || 'wsal-wpforms.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_wpforms_init_actions' ) || 'wsal-bbpress.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_bbpress_init_actions' ) ) {
891
  esc_html_e( 'Extension installed', 'wp-security-audit-log' );
892
  } else {
893
  esc_html_e( 'Install Extension', 'wp-security-audit-log' );
64
  public function __construct( WpSecurityAuditLog $wsal ) {
65
  $this->wsal = $wsal;
66
 
67
+ if ( $wsal->settings()->CurrentUserCan( 'edit' ) ) {
68
  add_action( 'admin_init', array( $this, 'setup_page' ), 10 );
69
+ add_action( 'admin_menu', array( $this, 'admin_menus' ), 10 );
70
+ add_action( 'network_admin_menu', array( $this, 'admin_menus' ), 10 );
71
+ add_action( 'wp_ajax_setup_check_security_token', array( $this, 'setup_check_security_token' ) );
72
  }
 
 
 
73
  }
74
 
75
  /**
76
  * Ajax handler to verify setting token.
77
  */
78
  public function setup_check_security_token() {
79
+ if ( ! $this->wsal->settings()->CurrentUserCan( 'edit' ) ) {
80
  echo wp_json_encode(
81
  array(
82
  'success' => false,
231
  /**
232
  * Enqueue Styles.
233
  */
234
+ $wizard_css = WSAL_ViewManager::get_asset_path('/css/dist/', 'wsal-wizard', 'css');
235
  wp_enqueue_style(
236
  'wsal-wizard-css',
237
+ $this->wsal->GetBaseUrl() . $wizard_css,
238
  array( 'dashicons', 'install', 'forms' ),
239
+ filemtime( $this->wsal->GetBaseDir() . $wizard_css )
240
  );
241
 
242
  /**
243
  * Enqueue Scripts.
244
  */
245
+ $wizard_js = WSAL_ViewManager::get_asset_path( '/js/dist/', 'wsal-wizard', 'js');
246
+ wp_register_script(
247
  'wsal-wizard-js',
248
+ $this->wsal->GetBaseUrl() .$wizard_js,
249
+ array( 'jquery' ),
250
+ filemtime( $this->wsal->GetBaseDir() .$wizard_js ),
251
  false
252
  );
253
 
254
+ $common_js = '/js/common.js';
255
  wp_register_script(
256
  'wsal-common',
257
+ $this->wsal->GetBaseUrl() . $common_js,
258
  array( 'jquery' ),
259
+ filemtime( $this->wsal->GetBaseDir() . $common_js ),
260
  true
261
  );
262
 
429
  * Step View: `Welcome`
430
  */
431
  private function wsal_step_welcome() {
432
+ // dismiss the setup modal in case if not already done
433
+ if ( ! $this->wsal->GetGlobalBooleanSetting( 'setup-modal-dismissed', false ) ) {
434
  $this->wsal->SetGlobalBooleanSetting( 'setup-modal-dismissed', true );
435
  }
436
  ?>
843
  private function addons_step() {
844
  $our_plugins = WSAL_PluginInstallAndActivate::get_installable_plugins();
845
 
846
+ // Grab list of installed plugins.
847
  $all_plugins = get_plugins();
848
  $plugin_filenames = array();
849
  foreach ( $all_plugins as $plugin => $info ) {
854
  // Grab list of plugins we have addons for.
855
  $predefined_plugins = array_column( $our_plugins, 'addon_for' );
856
 
857
+ // Loop through plugins and create an array of slugs, we will compare these against the plugins we have addons for.
858
  $we_have_addon = array_intersect( $plugin_filenames, $predefined_plugins );
859
 
860
  ?>
869
  // Loop through plugins and output.
870
  foreach ( $our_plugins as $details ) {
871
  $disable_button = '';
872
+ if ( WpSecurityAuditLog::is_plugin_active( $details['plugin_slug'] ) || 'wsal-wpforms.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_wpforms_init_actions' ) || 'wsal-bbpress.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_bbpress_init_actions' ) ) {
873
  $disable_button = 'disabled';
874
  }
875
  if ( ! in_array( $details['addon_for'], $we_have_addon ) ) {
888
  <p><?php echo sanitize_text_field( $details['plugin_description'] ); ?></p>
889
  <p><button class="install-addon button button-primary <?php echo esc_attr( $disable_button ); ?>" data-nonce="<?php echo esc_attr( $nonce ); ?>" data-plugin-slug="<?php echo esc_attr( $details['plugin_slug'] ); ?>" data-plugin-download-url="<?php echo esc_url( $details['plugin_url'] ); ?>" data-plugin-event-tab-id="<?php echo esc_attr( $details['event_tab_id'] ); ?>">
890
  <?php
891
+ if ( WSAL_PluginInstallAndActivate::is_plugin_installed( $details['plugin_slug'] ) && ! WpSecurityAuditLog::is_plugin_active( $details['plugin_slug'] ) ) {
892
  esc_html_e( 'Extension installed, activate now?', 'wp-security-audit-log' );
893
+ } elseif ( WSAL_PluginInstallAndActivate::is_plugin_installed( $details['plugin_slug'] ) && WpSecurityAuditLog::is_plugin_active( $details['plugin_slug'] ) || 'wsal-wpforms.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_wpforms_init_actions' ) || 'wsal-bbpress.php' === basename( $details['plugin_slug'] ) && function_exists( 'wsal_bbpress_init_actions' ) ) {
894
  esc_html_e( 'Extension installed', 'wp-security-audit-log' );
895
  } else {
896
  esc_html_e( 'Install Extension', 'wp-security-audit-log' );
classes/Views/ToggleAlerts.php CHANGED
@@ -68,6 +68,7 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
68
  // Filter $_POST array.
69
  $post_array = filter_input_array( INPUT_POST );
70
 
 
71
  $frontend_events = array(
72
  'register' => false,
73
  'login' => false,
@@ -75,35 +76,33 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
75
  'woocommerce' => false,
76
  );
77
 
 
78
  if ( isset( $post_array['frontend-events'] ) ) {
79
  $frontend_events = array_merge( $frontend_events, $post_array['frontend-events'] );
80
  }
81
- $this->_plugin->settings()->set_frontend_events( $frontend_events );
82
 
83
- $enabled = array_map( 'intval', $post_array['alert'] );
84
- $disabled = array();
85
- foreach ( $this->_plugin->alerts->GetAlerts() as $alert ) {
86
- if ( 6023 === $alert->type && ! $frontend_events['system'] ) {
87
- $disabled[] = $alert->type;
88
- continue;
89
- } elseif ( 6023 === $alert->type ) {
90
- continue;
91
- } elseif ( 9036 === $alert->type ) {
92
- $frontend_events = WSAL_Settings::get_frontend_events();
93
- $frontend_events = array_merge( $frontend_events, array( 'woocommerce' => true ) );
94
- $this->_plugin->settings()->set_frontend_events( $frontend_events );
95
- }
96
 
97
- if ( ! in_array( $alert->type, $enabled, true ) ) {
98
- if ( 9036 === $alert->type ) {
99
- $frontend_events = WSAL_Settings::get_frontend_events();
100
- $frontend_events = array_merge( $frontend_events, array( 'woocommerce' => false ) );
101
- $this->_plugin->settings()->set_frontend_events( $frontend_events );
 
 
 
 
 
 
 
 
102
  }
103
- $disabled[] = $alert->type;
104
  }
105
  }
106
 
 
 
107
  // Save the disabled events.
108
  $this->_plugin->alerts->SetDisabledAlerts( $disabled );
109
 
@@ -180,6 +179,10 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
180
  $log_details = $this->_plugin->GetGlobalSetting( 'details-level', false ); // Get log level option.
181
 
182
  $subcat_alerts = array( 1004, 2010, 2111, 9007, 9105, 9047 );
 
 
 
 
183
  $obsolete_events = array( 9999, 2126, 6023, 9011, 9070, 9075, 4013 );
184
  ?>
185
  <p>
@@ -211,12 +214,10 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
211
  <h2 id="wsal-tabs" class="nav-tab-wrapper">
212
  <?php foreach ( $safe_names as $name => $safe ) : ?>
213
  <a href="#tab-<?php echo esc_attr( $safe ); ?>" class="nav-tab"><?php echo esc_html( $name ); ?></a>
214
- <?php if ( __( 'Yoast SEO', 'wp-security-audit-log' ) === $name ) : ?>
215
- <a href="#tab-frontend-events" class="nav-tab">
216
- <?php esc_html_e( 'Front-end Events', 'wp-security-audit-log' ); ?>
217
- </a>
218
- <?php endif; ?>
219
  <?php endforeach; ?>
 
 
 
220
  <a href="#tab-third-party-plugins" class="nav-tab">
221
  <?php esc_html_e( 'Third party plugins', 'wp-security-audit-log' ); ?>
222
  </a>
@@ -341,14 +342,6 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
341
  </td>
342
  </tr>
343
  <?php endif; ?>
344
- <?php elseif ( __( 'Yoast SEO', 'wp-security-audit-log' ) === $subname ) : ?>
345
- <?php if ( ! empty( $disabled ) ) : ?>
346
- <tr>
347
- <td colspan="4">
348
- <p class="wsal-tab-help wsal-tab-notice description"><?php esc_html_e( 'The plugin Yoast SEO is not installed on your website so these events have been disabled.', 'wp-security-audit-log' ); ?></p>
349
- </td>
350
- </tr>
351
- <?php endif; ?>
352
  <tr>
353
  <td colspan="4">
354
  <h3 class="sub-category"><?php esc_html_e( 'Post Changes', 'wp-security-audit-log' ); ?></h3>
@@ -413,6 +406,12 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
413
  } elseif ( 9047 === $alert->type ) {
414
  esc_html_e( 'Product Attributes', 'wp-security-audit-log' );
415
  }
 
 
 
 
 
 
416
  ?>
417
  </h3>
418
  </td>
@@ -511,7 +510,7 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
511
  <?php
512
  }
513
  if ( 1003 === $alert->type ) {
514
- $log_visitor_failed_login_limit = (int) $this->_plugin->GetGlobalSetting( 'log-visitor-failed-login-limit', 10 );
515
  $log_visitor_failed_login_limit = ( -1 === $log_visitor_failed_login_limit ) ? '0' : $log_visitor_failed_login_limit;
516
  ?>
517
  <tr>
@@ -765,11 +764,14 @@ class WSAL_Views_ToggleAlerts extends WSAL_AbstractView {
765
  max-width: 200px;
766
  }
767
  .addon-wrapper {
768
- max-width: 25%;
769
  display: inline-block;
770
  border: 1px solid #eee;
771
  padding: 20px;
772
  text-align: center;
 
 
 
773
  }
774
  .addon-wrapper:hover {
775
  border: 1px solid #ccc;
68
  // Filter $_POST array.
69
  $post_array = filter_input_array( INPUT_POST );
70
 
71
+ // Assume front end events are disbaled unless we are told otherwise.
72
  $frontend_events = array(
73
  'register' => false,
74
  'login' => false,
76
  'woocommerce' => false,
77
  );
78
 
79
+ // Check for enabled front end events and merge result with above array.
80
  if ( isset( $post_array['frontend-events'] ) ) {
81
  $frontend_events = array_merge( $frontend_events, $post_array['frontend-events'] );
82
  }
 
83
 
84
+ // Save enabled front end events.
85
+ $this->_plugin->settings()->set_frontend_events( $frontend_events );
 
 
 
 
 
 
 
 
 
 
 
86
 
87
+ $enabled = array_map( 'intval', $post_array['alert'] );
88
+ $disabled = array();
89
+ $registered_alerts = $this->_plugin->alerts->GetAlerts();
90
+
91
+ // Now we check all registered events for further processing.
92
+ foreach ( $registered_alerts as $alert ) {
93
+ // 6023 (user visits 404) is tied to the 'system' checkbox, so if this is not checked,
94
+ // set 6023 as a disabled event.
95
+ if ( 6023 === $alert->type ) {
96
+ if ( $frontend_events['system'] ) {
97
+ $enabled[] = $alert->type;
98
+ } else {
99
+ $disabled[] = $alert->type;
100
  }
 
101
  }
102
  }
103
 
104
+ $disabled = apply_filters( 'wsal_save_settings_disabled_events', $disabled, $registered_alerts, $frontend_events, $enabled );
105
+
106
  // Save the disabled events.
107
  $this->_plugin->alerts->SetDisabledAlerts( $disabled );
108
 
179
  $log_details = $this->_plugin->GetGlobalSetting( 'details-level', false ); // Get log level option.
180
 
181
  $subcat_alerts = array( 1004, 2010, 2111, 9007, 9105, 9047 );
182
+
183
+ // Allow further items to be added externally.
184
+ $subcat_alerts = apply_filters( 'wsal_togglealerts_sub_category_events', $subcat_alerts );
185
+
186
  $obsolete_events = array( 9999, 2126, 6023, 9011, 9070, 9075, 4013 );
187
  ?>
188
  <p>
214
  <h2 id="wsal-tabs" class="nav-tab-wrapper">
215
  <?php foreach ( $safe_names as $name => $safe ) : ?>
216
  <a href="#tab-<?php echo esc_attr( $safe ); ?>" class="nav-tab"><?php echo esc_html( $name ); ?></a>
 
 
 
 
 
217
  <?php endforeach; ?>
218
+ <a href="#tab-frontend-events" class="nav-tab">
219
+ <?php esc_html_e( 'Front-end Events', 'wp-security-audit-log' ); ?>
220
+ </a>
221
  <a href="#tab-third-party-plugins" class="nav-tab">
222
  <?php esc_html_e( 'Third party plugins', 'wp-security-audit-log' ); ?>
223
  </a>
342
  </td>
343
  </tr>
344
  <?php endif; ?>
 
 
 
 
 
 
 
 
345
  <tr>
346
  <td colspan="4">
347
  <h3 class="sub-category"><?php esc_html_e( 'Post Changes', 'wp-security-audit-log' ); ?></h3>
406
  } elseif ( 9047 === $alert->type ) {
407
  esc_html_e( 'Product Attributes', 'wp-security-audit-log' );
408
  }
409
+
410
+ // Allow further titles to be added externally.
411
+ $subcat_title = apply_filters( 'wsal_togglealerts_sub_category_titles', $alert->type );
412
+ if ( $subcat_title ) {
413
+ echo esc_html( $subcat_title );
414
+ }
415
  ?>
416
  </h3>
417
  </td>
510
  <?php
511
  }
512
  if ( 1003 === $alert->type ) {
513
+ $log_visitor_failed_login_limit = (int) $this->_plugin->GetGlobalSetting( 'log-visitor-failed-login-limit', 10 );
514
  $log_visitor_failed_login_limit = ( -1 === $log_visitor_failed_login_limit ) ? '0' : $log_visitor_failed_login_limit;
515
  ?>
516
  <tr>
764
  max-width: 200px;
765
  }
766
  .addon-wrapper {
767
+ max-width: calc( 25% - 45px );
768
  display: inline-block;
769
  border: 1px solid #eee;
770
  padding: 20px;
771
  text-align: center;
772
+ float: left;
773
+ margin-right: 3px;
774
+ min-height: 250px;
775
  }
776
  .addon-wrapper:hover {
777
  border: 1px solid #ccc;
classes/WidgetManager.php CHANGED
@@ -79,14 +79,14 @@ class WSAL_WidgetManager {
79
  <tbody>
80
  <?php
81
  $url = 'admin.php?page=' . $this->_plugin->views->views[0]->GetSafeViewName();
82
- $fmt = array( $this->_plugin->settings, 'meta_formatter' );
83
  foreach ( $results as $entry ) :
84
  $username = $entry->GetUsername();
85
  ?>
86
  <tr>
87
  <td><?php echo ( $username ) ? esc_html( $username ) : '<i>unknown</i>'; ?></td>
88
  <td>
89
- <a href="<?php echo esc_url( $url ) . '#Event' . esc_attr( $entry->id ); ?>">
90
  <?php echo wp_kses( $entry->GetMessage( $fmt ), $this->_plugin->allowed_html_tags ); ?>
91
  </a>
92
  </td>
79
  <tbody>
80
  <?php
81
  $url = 'admin.php?page=' . $this->_plugin->views->views[0]->GetSafeViewName();
82
+ $fmt = array( $this->_plugin->settings(), 'meta_formatter' );
83
  foreach ( $results as $entry ) :
84
  $username = $entry->GetUsername();
85
  ?>
86
  <tr>
87
  <td><?php echo ( $username ) ? esc_html( $username ) : '<i>unknown</i>'; ?></td>
88
  <td>
89
+ <a href="<?php echo esc_url( $url ) . '#Event' . esc_attr( $entry->getId() ); ?>">
90
  <?php echo wp_kses( $entry->GetMessage( $fmt ), $this->_plugin->allowed_html_tags ); ?>
91
  </a>
92
  </td>
css/auditlog.css CHANGED
@@ -645,3 +645,26 @@ input#wsal_as_widget_event::-webkit-outer-spin-button {
645
  -webkit-appearance: none;
646
  margin: 0;
647
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
645
  -webkit-appearance: none;
646
  margin: 0;
647
  }
648
+
649
+ /* Addon Notices */
650
+ .notice-addon-available {
651
+ display: flex;
652
+ }
653
+
654
+ .addon-logo-wrapper {
655
+ display: flex;
656
+ margin-right: 20px;
657
+ }
658
+
659
+ .notice-addon-available img {
660
+ max-height: 48px;
661
+ align-self: center;
662
+ }
663
+
664
+ .notice-addon-available .button {
665
+ margin-top: 8px;
666
+ }
667
+
668
+ .notice-addon-available .notice-dismiss {
669
+ margin-top: 5px;
670
+ }
css/dist/{wsal-wizard.build.css → wsal-wizard.css} RENAMED
@@ -17,15 +17,13 @@ body {
17
  width: 400px; }
18
 
19
  .steps {
20
- display: -ms-flexbox;
21
  display: flex;
22
  list-style-type: none;
23
  margin: 0;
24
  padding: 0 0 25px;
25
  text-align: center; }
26
  .steps li {
27
- -ms-flex: 1 0 auto;
28
- flex: 1 0 auto;
29
  font-weight: 700;
30
  margin: 0 0 5px;
31
  color: #b4b9be;
@@ -50,8 +48,7 @@ body {
50
  background: #b4b9be; }
51
 
52
  .wsal-setup-content {
53
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13);
54
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13);
55
  padding: 2em;
56
  margin: 0 0 20px;
57
  background: #fff;
@@ -61,33 +58,39 @@ body {
61
  .wsal-setup-content h4,
62
  .wsal-setup-content fieldset {
63
  line-height: 1.5; }
 
 
 
 
 
 
 
 
 
 
 
64
 
65
  .wsal-setup-actions {
66
  text-align: center; }
67
  .wsal-setup-actions .button {
68
- -webkit-box-shadow: none;
69
- box-shadow: none;
70
  font-size: 14px;
71
  height: auto;
72
  padding: 8px 20px;
73
  min-width: 12em;
74
  min-width: auto;
75
- -webkit-transition: 0.1s all linear;
76
- -o-transition: 0.1s all linear;
77
  transition: 0.1s all linear; }
78
  .wsal-setup-actions .button-primary {
79
  background-color: #009344;
80
  border-color: #009344;
81
- -webkit-box-shadow: none;
82
- box-shadow: none;
83
  text-shadow: none;
84
  margin: 0;
85
  opacity: 1; }
86
  .wsal-setup-actions .button-primary:hover, .wsal-setup-actions .button-primary:focus {
87
  background: #00ad50;
88
  border-color: #00ad50;
89
- -webkit-box-shadow: none;
90
- box-shadow: none;
91
  color: #fff; }
92
 
93
  .wsal-setup-footer {
@@ -171,35 +174,3 @@ body {
171
  p.description {
172
  font-size: 13px;
173
  font-style: italic; }
174
-
175
- /* Addons */
176
- .addon-wrapper {
177
- width: auto;
178
- border: 1px solid #ccc;
179
- border-radius: 4px;
180
- padding: 15px;
181
- float: left;
182
- display: flex;
183
- margin-top: 15px;
184
- }
185
-
186
- .addon-wrapper:hover {
187
- border-color: #BDD63A;
188
- }
189
-
190
- .addon-wrapper img {
191
- max-width: 170px;
192
- margin-right: 15px;
193
- align-self: center;
194
- }
195
-
196
- .addon-content h5 {
197
- margin-top: 0;
198
- margin-bottom: 10px;
199
- }
200
-
201
-
202
- .addon-wrapper + .wsal-setup-actions {
203
- clear: both;
204
- border-top: 30px solid #fff;
205
- }
17
  width: 400px; }
18
 
19
  .steps {
 
20
  display: flex;
21
  list-style-type: none;
22
  margin: 0;
23
  padding: 0 0 25px;
24
  text-align: center; }
25
  .steps li {
26
+ flex: 1 0 auto;
 
27
  font-weight: 700;
28
  margin: 0 0 5px;
29
  color: #b4b9be;
48
  background: #b4b9be; }
49
 
50
  .wsal-setup-content {
51
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13);
 
52
  padding: 2em;
53
  margin: 0 0 20px;
54
  background: #fff;
58
  .wsal-setup-content h4,
59
  .wsal-setup-content fieldset {
60
  line-height: 1.5; }
61
+ .wsal-setup-content .addon-wrapper {
62
+ border: 1px solid #eee;
63
+ padding: 15px;
64
+ display: flex;
65
+ margin-bottom: 15px; }
66
+ .wsal-setup-content .addon-wrapper:hover {
67
+ border-color: #ccc; }
68
+ .wsal-setup-content .addon-wrapper img {
69
+ align-self: center;
70
+ max-width: 200px;
71
+ margin-right: 15px; }
72
 
73
  .wsal-setup-actions {
74
  text-align: center; }
75
  .wsal-setup-actions .button {
76
+ box-shadow: none;
 
77
  font-size: 14px;
78
  height: auto;
79
  padding: 8px 20px;
80
  min-width: 12em;
81
  min-width: auto;
 
 
82
  transition: 0.1s all linear; }
83
  .wsal-setup-actions .button-primary {
84
  background-color: #009344;
85
  border-color: #009344;
86
+ box-shadow: none;
 
87
  text-shadow: none;
88
  margin: 0;
89
  opacity: 1; }
90
  .wsal-setup-actions .button-primary:hover, .wsal-setup-actions .button-primary:focus {
91
  background: #00ad50;
92
  border-color: #00ad50;
93
+ box-shadow: none;
 
94
  color: #fff; }
95
 
96
  .wsal-setup-footer {
174
  p.description {
175
  font-size: 13px;
176
  font-style: italic; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
css/dist/wsal-wizard.min.css ADDED
@@ -0,0 +1 @@
 
1
+ body{margin:65px auto 24px;-webkit-box-shadow:none;box-shadow:none;background:#f1f1f1;padding:0}#wsal-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wsal-logo img{width:400px}.steps{display:flex;list-style-type:none;margin:0;padding:0 0 25px;text-align:center}.steps li{flex:1 0 auto;font-weight:700;margin:0 0 5px;color:#b4b9be;padding-bottom:15px;position:relative}.steps li.is-active{color:#009344}.steps li.is-active::before{border:4px solid #009344;background:#009344}.steps li::before{content:'';border:4px solid #b4b9be;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#b4b9be}.wsal-setup-content{box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:left}.wsal-setup-content fieldset,.wsal-setup-content h4{line-height:1.5}.wsal-setup-content .addon-wrapper{border:1px solid #eee;padding:15px;display:flex;margin-bottom:15px}.wsal-setup-content .addon-wrapper:hover{border-color:#ccc}.wsal-setup-content .addon-wrapper img{align-self:center;max-width:200px;margin-right:15px}.wsal-setup-actions{text-align:center}.wsal-setup-actions .button{box-shadow:none;font-size:14px;height:auto;padding:8px 20px;min-width:12em;min-width:auto;transition:.1s all linear}.wsal-setup-actions .button-primary{background-color:#009344;border-color:#009344;box-shadow:none;text-shadow:none;margin:0;opacity:1}.wsal-setup-actions .button-primary:focus,.wsal-setup-actions .button-primary:hover{background:#00ad50;border-color:#00ad50;box-shadow:none;color:#fff}.wsal-setup-footer{text-align:center}.wsal-setup-footer a{color:#009344;font-size:14px;text-decoration:none}.wsal-setup-form label[for=editor-roles-box],.wsal-setup-form label[for=editor-users-box],.wsal-setup-form label[for=exrole-query-box],.wsal-setup-form label[for=exuser-query-box],.wsal-setup-form label[for=ipaddr-query-box]{display:inline-block;margin:5px 0}.wsal-setup-form label[for=editor-roles-box] span,.wsal-setup-form label[for=editor-users-box] span,.wsal-setup-form label[for=exrole-query-box] span,.wsal-setup-form label[for=exuser-query-box] span,.wsal-setup-form label[for=ipaddr-query-box] span{display:inline-block;min-width:100px}.sectoken-ip,.sectoken-other,.sectoken-role,.sectoken-user{display:inline-block;border-width:1px;border-style:solid;padding:2px 4px;margin:2px 0 0 2px;border-radius:3px;cursor:default;line-height:1.3;font-size:14px}.sectoken-ip a,.sectoken-other a,.sectoken-role a,.sectoken-user a{text-decoration:none;font-size:12px;font-weight:700;color:#fff;margin-left:2px;background:#bbb;border-radius:25px;height:14px;display:inline-block;vertical-align:middle;width:14px;text-align:center;line-height:12px}.sectoken-ip a:hover,.sectoken-other a:hover,.sectoken-role a:hover,.sectoken-user a:hover{background:#fb9}.sectoken-other{display:table;border-collapse:separate}.sectoken-role{background:#efe;border-color:#5b5}.sectoken-user{background:#eff;border-color:#5be}.sectoken-ip{background:#ffe;border-color:#ed5}.sectoken-other{background:#ffe;border-color:#ed5}p.description{font-size:13px;font-style:italic}
css/src/wsal-wizard.scss CHANGED
@@ -81,6 +81,22 @@ body {
81
  fieldset {
82
  line-height: 1.5;
83
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  }
85
 
86
  .wsal-setup-actions {
81
  fieldset {
82
  line-height: 1.5;
83
  }
84
+
85
+ .addon-wrapper {
86
+ border: 1px solid #eee;
87
+ padding: 15px;
88
+ display: flex;
89
+ margin-bottom: 15px;
90
+ &:hover {
91
+ border-color: #ccc;
92
+ }
93
+
94
+ img {
95
+ align-self: center;
96
+ max-width: 200px;
97
+ margin-right: 15px;
98
+ }
99
+ }
100
  }
101
 
102
  .wsal-setup-actions {
defaults.php CHANGED
@@ -122,7 +122,6 @@ function wsaldefaults_wsal_init() {
122
  array( 2086, WSAL_INFORMATIONAL, __( 'User changed title of a post', 'wp-security-audit-log' ), __( 'Changed the title of the post %OldTitle% %LineBreak% New title: %NewTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'modified' ),
123
  array( 2100, WSAL_INFORMATIONAL, __( 'User opened a post in the editor', 'wp-security-audit-log' ), __( 'Opened the post %PostTitle% in the editor %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'opened' ),
124
  array( 2101, WSAL_INFORMATIONAL, __( 'User viewed a post', 'wp-security-audit-log' ), __( 'Viewed the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% URL: %PostUrl% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'viewed' ),
125
- array( 2106, WSAL_MEDIUM, __( 'A plugin modified a post', 'wp-security-audit-log' ), __( 'Plugin modified the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'modified' ),
126
  array( 2111, WSAL_LOW, __( 'User enabled/disabled comments in a post', 'wp-security-audit-log' ), __( 'The comments in the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'enabled' ),
127
  array( 2112, WSAL_LOW, __( 'User enabled/disabled trackbacks and pingbacks in a post', 'wp-security-audit-log' ), __( 'Pingbacks and Trackbacks in the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'enabled' ),
128
  ),
@@ -335,9 +334,9 @@ function wsaldefaults_wsal_init() {
335
  array( 5002, WSAL_HIGH, __( 'User deactivated a WordPress plugin', 'wp-security-audit-log' ), __( 'Name: %PluginData->Name% %LineBreak% Install location: %PluginFile%', 'wp-security-audit-log' ), 'plugin', 'deactivated' ),
336
  array( 5003, WSAL_HIGH, __( 'User uninstalled a plugin', 'wp-security-audit-log' ), __( 'Name: %PluginData->Name% %LineBreak% Install location: %PluginFile%', 'wp-security-audit-log' ), 'plugin', 'uninstalled' ),
337
  array( 5004, WSAL_LOW, __( 'User upgraded a plugin', 'wp-security-audit-log' ), __( 'Name: %PluginData->Name% %LineBreak% Install location: %PluginFile%', 'wp-security-audit-log' ), 'plugin', 'updated' ),
338
- array( 5010, WSAL_LOW, __( 'Plugin created tables', 'wp-security-audit-log' ), __( 'Plugin created this table in the database %LineBreak% Plugin: %Plugin->Name% %LineBreak% Tables: %TableNames%', 'wp-security-audit-log' ), 'database', 'created' ),
339
- array( 5011, WSAL_LOW, __( 'Plugin modified tables structure', 'wp-security-audit-log' ), __( 'Plugin modified the structure of this table %LineBreak% Plugin: %Plugin->Name% %LineBreak% Tables: %TableNames%', 'wp-security-audit-log' ), 'database', 'modified' ),
340
- array( 5012, WSAL_MEDIUM, __( 'Plugin deleted tables', 'wp-security-audit-log' ), __( 'Plugin deleted this table from the database %LineBreak% Plugin: %Plugin->Name% %LineBreak% Tables: %TableNames%', 'wp-security-audit-log' ), 'database', 'deleted' ),
341
  array( 5019, WSAL_MEDIUM, __( 'A plugin created a post', 'wp-security-audit-log' ), __( 'Plugin %PluginName% created the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% %EditorLinkPage%', 'wp-security-audit-log' ), 'post', 'created' ),
342
  array( 5025, WSAL_LOW, __( 'A plugin deleted a post', 'wp-security-audit-log' ), __( 'Plugin %PluginName% deleted the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Type: %PostType%', 'wp-security-audit-log' ), 'post', 'deleted' ),
343
  array( 2051, WSAL_HIGH, __( 'User changed a file using the plugin editor', 'wp-security-audit-log' ), __( 'Modified a file with the plugin editor %LineBreak% File: %File%', 'wp-security-audit-log' ), 'file', 'modified' ),
@@ -383,7 +382,7 @@ function wsaldefaults_wsal_init() {
383
 
384
  __( 'Activity log plugin', 'wp-security-audit-log' ) => array(
385
  array( 6000, WSAL_INFORMATIONAL, __( 'Events automatically pruned by system', 'wp-security-audit-log' ), __( 'System automatically deleted %EventCount% event(s)', 'wp-security-audit-log' ), 'activity-logs', 'deleted' ),
386
- array( 6006, WSAL_MEDIUM, __( 'Reset plugin\'s settings to default', 'wp-security-audit-log' ), __( 'Reset the WP Activity Log plugin settings to default', 'wp-security-audit-log' ), 'plugin', 'modified' ),
387
  array( 6034, WSAL_CRITICAL, __( 'Purged the activity log', 'wp-security-audit-log' ), __( 'Purged the activity log', 'wp-security-audit-log' ), 'activity-logs', 'deleted' ),
388
  ),
389
 
@@ -423,42 +422,6 @@ function wsaldefaults_wsal_init() {
423
  array( 7005, WSAL_HIGH, __( 'Existing site deleted from network', 'wp-security-audit-log' ), __( 'The site: %SiteName% %LineBreak% URL: %BlogURL%', 'wp-security-audit-log' ), 'multisite-network', 'deleted' ),
424
  ),
425
  ),
426
-
427
- __( 'Yoast SEO', 'wp-security-audit-log' ) => array(
428
- __( 'Post Changes', 'wp-security-audit-log' ) => array(
429
- array( 8801, WSAL_INFORMATIONAL, __( 'User changed title of a SEO post', 'wp-security-audit-log' ), __( 'Changed the Meta title of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous title: %OldSEOTitle% %LineBreak% New title: %NewSEOTitle% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'yoast-seo-metabox', 'modified' ),
430
- array( 8802, WSAL_INFORMATIONAL, __( 'User changed the meta description of a SEO post', 'wp-security-audit-log' ), __( 'Changed the Meta Description of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous description: %old_desc% %LineBreak% New description: %new_desc% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'yoast-seo-metabox', 'modified' ),
431
- array( 8803, WSAL_INFORMATIONAL, __( 'User changed setting to allow search engines to show post in search results of a SEO post', 'wp-security-audit-log' ), __( 'Changed the setting to allow search engines to show post in search results for the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous setting: %OldStatus% %LineBreak% New setting: %NewStatus% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'yoast-seo-metabox', 'modified' ),
432
- array( 8804, WSAL_INFORMATIONAL, __( 'User Enabled/Disabled the option for search engine to follow links of a SEO post', 'wp-security-audit-log' ), __( 'The option for search engine to follow links in post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'yoast-seo-metabox', 'enabled' ),
433
- array( 8805, WSAL_LOW, __( 'User set the meta robots advanced setting of a SEO post', 'wp-security-audit-log' ), __( 'Changed the Meta Robots Advanced setting for the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous setting: %OldStatus% %LineBreak% New setting: %NewStatus% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'yoast-seo-metabox', 'modified' ),
434
- array( 8806, WSAL_INFORMATIONAL, __( 'User changed the canonical URL of a SEO post', 'wp-security-audit-log' ), __( 'Changed the Canonical URL of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous URL: %OldCanonicalUrl% %LineBreak% New URL: %NewCanonicalUrl% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'yoast-seo-metabox', 'modified' ),
435
- array( 8807, WSAL_INFORMATIONAL, __( 'User changed the focus keyword of a SEO post', 'wp-security-audit-log' ), __( 'Changed the focus keyword for the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous keyword: %old_keywords% %LineBreak% New keyword: %new_keywords% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'yoast-seo-metabox', 'modified' ),
436
- array( 8808, WSAL_INFORMATIONAL, __( 'User Enabled/Disabled the option Cornerston Content of a SEO post', 'wp-security-audit-log' ), __( 'The option Cornerstone Content in the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'yoast-seo-metabox', 'enabled' ),
437
- ),
438
-
439
- __( 'Website Changes', 'wp-security-audit-log' ) => array(
440
- array( 8809, WSAL_INFORMATIONAL, __( 'User changed the Title Separator setting', 'wp-security-audit-log' ), __( 'Changed the default title separator %LineBreak% Previous separator: %old% %LineBreak% New separator: %new%', 'wp-security-audit-log' ), 'yoast-seo', 'modified' ),
441
- array( 8810, WSAL_MEDIUM, __( 'User changed the Homepage Title setting', 'wp-security-audit-log' ), __( 'Changed the homepage Meta title %LineBreak% Previous title: %old% %LineBreak% New title: %new%', 'wp-security-audit-log' ), 'yoast-seo', 'modified' ),
442
- array( 8811, WSAL_MEDIUM, __( 'User changed the Homepage Meta description setting', 'wp-security-audit-log' ), __( 'Changed the homepage Meta description %LineBreak% Previous description: %old% %LineBreak% New description: %new%', 'wp-security-audit-log' ), 'yoast-seo', 'modified' ),
443
- array( 8812, WSAL_INFORMATIONAL, __( 'User changed the Company or Person setting', 'wp-security-audit-log' ), __( 'Changed the Company or Person setting %LineBreak% Previous setting: %old% %LineBreak% New setting: %new%', 'wp-security-audit-log' ), 'yoast-seo', 'modified' ),
444
- ),
445
-
446
- __( 'Plugin Settings Changes', 'wp-security-audit-log' ) => array(
447
- array( 8813, WSAL_MEDIUM, __( 'User Enabled/Disabled the option Show Posts/Pages in Search Results in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The option to show %SEOPostType% in search results', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
448
- array( 8814, WSAL_INFORMATIONAL, __( 'User changed the Posts/Pages title template in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'Changed the %SEOPostType% Meta (SEO) title template %LineBreak% Previous template: %old% %LineBreak% New template: %new%', 'wp-security-audit-log' ), 'yoast-seo', 'modified' ),
449
- array( 8815, WSAL_MEDIUM, __( 'User Enabled/Disabled SEO analysis in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The SEO Analysis feature', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
450
- array( 8816, WSAL_MEDIUM, __( 'User Enabled/Disabled readability analysis in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The Readability Analysis feature', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
451
- array( 8817, WSAL_MEDIUM, __( 'User Enabled/Disabled cornerstone content in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The Cornerstone content feature', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
452
- array( 8818, WSAL_MEDIUM, __( 'User Enabled/Disabled the text link counter in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The Text link counter feature', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
453
- array( 8819, WSAL_MEDIUM, __( 'User Enabled/Disabled XML sitemaps in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The XML sitemap feature', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
454
- array( 8820, WSAL_MEDIUM, __( 'User Enabled/Disabled ryte integration in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The Ryte integration feature', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
455
- array( 8821, WSAL_MEDIUM, __( 'User Enabled/Disabled the admin bar menu in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The Admin bar menu feature', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
456
- array( 8822, WSAL_INFORMATIONAL, __( 'User changed the Posts/Pages meta description template in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'Changed the %SEOPostType% Meta description template %LineBreak% Previous template: %old% New template: %new%', 'wp-security-audit-log' ), 'yoast-seo', 'modified' ),
457
- array( 8823, WSAL_LOW, __( 'User set the option Date in Snippet Preview for Posts/Pages in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The option Date in Snippet Preview for %SEOPostType%', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
458
- array( 8824, WSAL_LOW, __( 'User set the option Yoast SEO Meta Box for Posts/Pages in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The option Yoast SEO Meta Box for %SEOPostType%', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
459
- array( 8825, WSAL_LOW, __( 'User Enabled/Disabled the advanced settings for authors in the Yoast SEO plugin settings', 'wp-security-audit-log' ), __( 'The Security: no advanced settings for authors feature', 'wp-security-audit-log' ), 'yoast-seo', 'enabled' ),
460
- ),
461
- ),
462
  )
463
  );
464
 
122
  array( 2086, WSAL_INFORMATIONAL, __( 'User changed title of a post', 'wp-security-audit-log' ), __( 'Changed the title of the post %OldTitle% %LineBreak% New title: %NewTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'modified' ),
123
  array( 2100, WSAL_INFORMATIONAL, __( 'User opened a post in the editor', 'wp-security-audit-log' ), __( 'Opened the post %PostTitle% in the editor %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'opened' ),
124
  array( 2101, WSAL_INFORMATIONAL, __( 'User viewed a post', 'wp-security-audit-log' ), __( 'Viewed the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% URL: %PostUrl% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'viewed' ),
 
125
  array( 2111, WSAL_LOW, __( 'User enabled/disabled comments in a post', 'wp-security-audit-log' ), __( 'The comments in the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'enabled' ),
126
  array( 2112, WSAL_LOW, __( 'User enabled/disabled trackbacks and pingbacks in a post', 'wp-security-audit-log' ), __( 'Pingbacks and Trackbacks in the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%', 'wp-security-audit-log' ), 'post', 'enabled' ),
127
  ),
334
  array( 5002, WSAL_HIGH, __( 'User deactivated a WordPress plugin', 'wp-security-audit-log' ), __( 'Name: %PluginData->Name% %LineBreak% Install location: %PluginFile%', 'wp-security-audit-log' ), 'plugin', 'deactivated' ),
335
  array( 5003, WSAL_HIGH, __( 'User uninstalled a plugin', 'wp-security-audit-log' ), __( 'Name: %PluginData->Name% %LineBreak% Install location: %PluginFile%', 'wp-security-audit-log' ), 'plugin', 'uninstalled' ),
336
  array( 5004, WSAL_LOW, __( 'User upgraded a plugin', 'wp-security-audit-log' ), __( 'Name: %PluginData->Name% %LineBreak% Install location: %PluginFile%', 'wp-security-audit-log' ), 'plugin', 'updated' ),
337
+ array( 5010, WSAL_LOW, __( 'Plugin created table', 'wp-security-audit-log' ), __( 'Plugin created this table in the database %LineBreak% Plugin: %Plugin->Name% %LineBreak% Table: %TableNames%', 'wp-security-audit-log' ), 'database', 'created' ),
338
+ array( 5011, WSAL_LOW, __( 'Plugin modified table structure', 'wp-security-audit-log' ), __( 'Plugin modified the structure of this table %LineBreak% Plugin: %Plugin->Name% %LineBreak% Table: %TableNames%', 'wp-security-audit-log' ), 'database', 'modified' ),
339
+ array( 5012, WSAL_MEDIUM, __( 'Plugin deleted table', 'wp-security-audit-log' ), __( 'Plugin deleted this table from the database %LineBreak% Plugin: %Plugin->Name% %LineBreak% Table: %TableNames%', 'wp-security-audit-log' ), 'database', 'deleted' ),
340
  array( 5019, WSAL_MEDIUM, __( 'A plugin created a post', 'wp-security-audit-log' ), __( 'Plugin %PluginName% created the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% %EditorLinkPage%', 'wp-security-audit-log' ), 'post', 'created' ),
341
  array( 5025, WSAL_LOW, __( 'A plugin deleted a post', 'wp-security-audit-log' ), __( 'Plugin %PluginName% deleted the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Type: %PostType%', 'wp-security-audit-log' ), 'post', 'deleted' ),
342
  array( 2051, WSAL_HIGH, __( 'User changed a file using the plugin editor', 'wp-security-audit-log' ), __( 'Modified a file with the plugin editor %LineBreak% File: %File%', 'wp-security-audit-log' ), 'file', 'modified' ),
382
 
383
  __( 'Activity log plugin', 'wp-security-audit-log' ) => array(
384
  array( 6000, WSAL_INFORMATIONAL, __( 'Events automatically pruned by system', 'wp-security-audit-log' ), __( 'System automatically deleted %EventCount% event(s)', 'wp-security-audit-log' ), 'activity-logs', 'deleted' ),
385
+ array( 6006, WSAL_MEDIUM, __( 'Reset the plugin\'s settings to default', 'wp-security-audit-log' ), __( 'Reset the WP Activity Log plugin settings to default', 'wp-security-audit-log' ), 'wp-activity-log', 'modified' ),
386
  array( 6034, WSAL_CRITICAL, __( 'Purged the activity log', 'wp-security-audit-log' ), __( 'Purged the activity log', 'wp-security-audit-log' ), 'activity-logs', 'deleted' ),
387
  ),
388
 
422
  array( 7005, WSAL_HIGH, __( 'Existing site deleted from network', 'wp-security-audit-log' ), __( 'The site: %SiteName% %LineBreak% URL: %BlogURL%', 'wp-security-audit-log' ), 'multisite-network', 'deleted' ),
423
  ),
424
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
425
  )
426
  );
427
 
img/addons/gravityforms.png ADDED
Binary file
js/auditlog.js CHANGED
@@ -414,6 +414,24 @@ function wsal_dismiss_advert(element) {
414
  } );
415
  }
416
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
417
  /**
418
  * Load Events for Infinite Scroll.
419
  *
@@ -508,14 +526,16 @@ jQuery( document ).ready( function() {
508
  /**
509
  * Dismiss addon-available notice.
510
  */
511
- jQuery( '#wsal-notice-addon-available .notice-dismiss' ).click( function() {
 
512
  jQuery.ajax({
513
  type: 'POST',
514
  url: ajaxurl,
515
  async: true,
516
  data: {
517
  action: 'wsal_dismiss_notice_addon_available',
518
- nonce: jQuery( '#wsal-dismiss-notice-addon-available' ).val()
 
519
  },
520
  success: function( data ) {
521
  console.log( data );
414
  } );
415
  }
416
 
417
+ /**
418
+ * Onclick event handler to dismiss the setup modal.
419
+ *
420
+ * @since 4.1.4
421
+ */
422
+ function wsal_dismiss_setup_modal() {
423
+ jQuery.ajax( {
424
+ type: 'POST',
425
+ url: ajaxurl,
426
+ async: true,
427
+ dataType: 'json',
428
+ data: {
429
+ action: 'wsal_dismiss_setup_modal',
430
+ nonce: jQuery( '#wsal-dismiss-setup-modal' ).val()
431
+ }
432
+ } );
433
+ }
434
+
435
  /**
436
  * Load Events for Infinite Scroll.
437
  *
526
  /**
527
  * Dismiss addon-available notice.
528
  */
529
+ jQuery( '.notice-addon-available .notice-dismiss' ).click( function() {
530
+ var addonToDismiss = jQuery( this ).parent().attr( 'data-addon' );
531
  jQuery.ajax({
532
  type: 'POST',
533
  url: ajaxurl,
534
  async: true,
535
  data: {
536
  action: 'wsal_dismiss_notice_addon_available',
537
+ nonce: jQuery( '#wsal-dismiss-notice-addon-available-' + addonToDismiss ).val(),
538
+ addon: addonToDismiss
539
  },
540
  success: function( data ) {
541
  console.log( data );
js/dist/wsal-wizard.js CHANGED
@@ -1,152 +1,32 @@
1
- /******/ (function(modules) { // webpackBootstrap
2
- /******/ // The module cache
3
- /******/ var installedModules = {};
4
- /******/
5
- /******/ // The require function
6
- /******/ function __webpack_require__(moduleId) {
7
- /******/
8
- /******/ // Check if module is in cache
9
- /******/ if(installedModules[moduleId]) {
10
- /******/ return installedModules[moduleId].exports;
11
- /******/ }
12
- /******/ // Create a new module (and put it into the cache)
13
- /******/ var module = installedModules[moduleId] = {
14
- /******/ i: moduleId,
15
- /******/ l: false,
16
- /******/ exports: {}
17
- /******/ };
18
- /******/
19
- /******/ // Execute the module function
20
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
- /******/
22
- /******/ // Flag the module as loaded
23
- /******/ module.l = true;
24
- /******/
25
- /******/ // Return the exports of the module
26
- /******/ return module.exports;
27
- /******/ }
28
- /******/
29
- /******/
30
- /******/ // expose the modules object (__webpack_modules__)
31
- /******/ __webpack_require__.m = modules;
32
- /******/
33
- /******/ // expose the module cache
34
- /******/ __webpack_require__.c = installedModules;
35
- /******/
36
- /******/ // define getter function for harmony exports
37
- /******/ __webpack_require__.d = function(exports, name, getter) {
38
- /******/ if(!__webpack_require__.o(exports, name)) {
39
- /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
40
- /******/ }
41
- /******/ };
42
- /******/
43
- /******/ // define __esModule on exports
44
- /******/ __webpack_require__.r = function(exports) {
45
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
46
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
47
- /******/ }
48
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
49
- /******/ };
50
- /******/
51
- /******/ // create a fake namespace object
52
- /******/ // mode & 1: value is a module id, require it
53
- /******/ // mode & 2: merge all properties of value into the ns
54
- /******/ // mode & 4: return value when already ns object
55
- /******/ // mode & 8|1: behave like require
56
- /******/ __webpack_require__.t = function(value, mode) {
57
- /******/ if(mode & 1) value = __webpack_require__(value);
58
- /******/ if(mode & 8) return value;
59
- /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
60
- /******/ var ns = Object.create(null);
61
- /******/ __webpack_require__.r(ns);
62
- /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
63
- /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
64
- /******/ return ns;
65
- /******/ };
66
- /******/
67
- /******/ // getDefaultExport function for compatibility with non-harmony modules
68
- /******/ __webpack_require__.n = function(module) {
69
- /******/ var getter = module && module.__esModule ?
70
- /******/ function getDefault() { return module['default']; } :
71
- /******/ function getModuleExports() { return module; };
72
- /******/ __webpack_require__.d(getter, 'a', getter);
73
- /******/ return getter;
74
- /******/ };
75
- /******/
76
- /******/ // Object.prototype.hasOwnProperty.call
77
- /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
78
- /******/
79
- /******/ // __webpack_public_path__
80
- /******/ __webpack_require__.p = "";
81
- /******/
82
- /******/
83
- /******/ // Load entry module and return exports
84
- /******/ return __webpack_require__(__webpack_require__.s = "./js/src/wsal-wizard.js");
85
- /******/ })
86
- /************************************************************************/
87
- /******/ ({
88
-
89
- /***/ "./css/src/wsal-wizard.scss":
90
- /*!**********************************!*\
91
- !*** ./css/src/wsal-wizard.scss ***!
92
- \**********************************/
93
- /*! no static exports found */
94
- /***/ (function(module, exports) {
95
-
96
- // removed by extract-text-webpack-plugin
97
-
98
- /***/ }),
99
-
100
- /***/ "./js/src/wsal-wizard.js":
101
- /*!*******************************!*\
102
- !*** ./js/src/wsal-wizard.js ***!
103
- \*******************************/
104
- /*! no static exports found */
105
- /***/ (function(module, exports, __webpack_require__) {
106
-
107
- "use strict";
108
-
109
-
110
- __webpack_require__(/*! ../../css/src/wsal-wizard.scss */ "./css/src/wsal-wizard.scss");
111
-
112
- var _jquery = __webpack_require__(/*! jquery */ "./node_modules/jquery/dist/jquery.js");
113
-
114
- var _jquery2 = _interopRequireDefault(_jquery);
115
-
116
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
117
-
118
  /**
119
  * WSAL Wizard
120
  *
121
- * Entry file for webpack.
122
- *
123
  * @since 3.2.3
124
  */
125
 
126
- // Wizard styles.
127
- (0, _jquery2.default)(document).ready(function () {
128
 
129
  /**
130
- * Step: `Access`
131
- *
132
- * Usernames & roles access setting.
133
- */
134
- (0, _jquery2.default)('#editor-users-add, #editor-roles-add, #exuser-query-add, #exrole-query-add, #ipaddr-query-add').click(function () {
135
- var type = (0, _jquery2.default)(this).attr('id').substr(0, 6);
136
- var tokenType = (0, _jquery2.default)(this).attr('id').substr(7, 5);
137
- var tokenValue = _jquery2.default.trim((0, _jquery2.default)('#' + type + '-' + tokenType + '-box').val());
138
- var existing = (0, _jquery2.default)('#' + type + '-list input').filter(function () {
139
  return this.value === tokenValue;
140
  });
141
 
142
- if (!tokenValue || existing.length) {
143
  return;
144
  } // if value is empty or already used, stop here
145
 
146
  // checkDataToken( 'user' );
147
- (0, _jquery2.default)('#' + type + '-' + tokenType + '-box, #' + type + '-' + tokenType + '-add').attr('disabled', true);
148
 
149
- _jquery2.default.ajax({
150
  type: 'POST',
151
  url: wsalData.ajaxURL,
152
  async: true,
@@ -156,10437 +36,60 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
156
  nonce: wsalData.nonce
157
  },
158
  dataType: 'json',
159
- success: function success(data) {
160
 
161
  // Remove disabled attribute.
162
- (0, _jquery2.default)('#' + type + '-' + tokenType + '-box, #' + type + '-' + tokenType + '-add').removeAttr('disabled');
163
- (0, _jquery2.default)('#' + type + '-' + tokenType + '-box').val('');
164
 
165
- if (data.success) {
166
 
167
  // Error handling.
168
- if ('other' === data.tokenType && ('users' === tokenType || 'exuser' === type)) {
169
- alert(wsalData.usersError);
170
  return;
171
- } else if ('other' === data.tokenType && ('roles' === tokenType || 'exrole' === type)) {
172
- alert(wsalData.rolesError);
173
  return;
174
- } else if ('other' === data.tokenType && ('ip' === tokenType || 'ipaddr' === type)) {
175
- alert(wsalData.ipError);
176
  return;
177
  }
178
 
179
- (0, _jquery2.default)('#' + type + '-list').append((0, _jquery2.default)('<span class="sectoken-' + data.tokenType + '"/>').text(data.token).append((0, _jquery2.default)('<input type="hidden" name="' + type + 's[]"/>').val(data.token), (0, _jquery2.default)('<a href="javascript:;" title="Remove">&times;</a>').click(removeSecToken)));
 
 
 
180
  } else {
181
- alert(data.message);
182
  }
183
  },
184
- error: function error(xhr, textStatus, _error) {
185
- console.log(xhr.statusText);
186
- console.log(textStatus);
187
- console.log(_error);
188
  }
189
  });
190
  });
191
 
192
- (0, _jquery2.default)('#editor-users-box, #editor-roles-box, #exuser-query-box, #exrole-query-box, #ipaddr-query-box').keydown(function (event) {
193
- if (13 === event.keyCode) {
194
- var type = (0, _jquery2.default)(this).attr('id').substr(0, 6);
195
- var tokenType = (0, _jquery2.default)(this).attr('id').substr(7, 5);
196
- (0, _jquery2.default)('#' + type + '-' + tokenType + '-add').click();
197
  return false;
198
  }
199
  });
200
 
201
  /**
202
- * Remove access settings token.
203
- */
204
- (0, _jquery2.default)('#editor-list>span>a, #exuser-list>span>a, #exrole-list>span>a, #ipaddr-list>span>a').click(removeSecToken);
205
  function removeSecToken() {
206
- var token = (0, _jquery2.default)(this).parents('span:first');
207
- token.addClass('sectoken-del').fadeOut('fast', function () {
208
  token.remove();
209
  });
210
  };
211
  });
212
 
213
- /***/ }),
214
-
215
- /***/ "./node_modules/jquery/dist/jquery.js":
216
- /*!********************************************!*\
217
- !*** ./node_modules/jquery/dist/jquery.js ***!
218
- \********************************************/
219
- /*! no static exports found */
220
- /***/ (function(module, exports, __webpack_require__) {
221
-
222
- var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
223
- * jQuery JavaScript Library v3.3.1
224
- * https://jquery.com/
225
- *
226
- * Includes Sizzle.js
227
- * https://sizzlejs.com/
228
- *
229
- * Copyright JS Foundation and other contributors
230
- * Released under the MIT license
231
- * https://jquery.org/license
232
- *
233
- * Date: 2018-01-20T17:24Z
234
- */
235
- ( function( global, factory ) {
236
-
237
- "use strict";
238
-
239
- if ( typeof module === "object" && typeof module.exports === "object" ) {
240
-
241
- // For CommonJS and CommonJS-like environments where a proper `window`
242
- // is present, execute the factory and get jQuery.
243
- // For environments that do not have a `window` with a `document`
244
- // (such as Node.js), expose a factory as module.exports.
245
- // This accentuates the need for the creation of a real `window`.
246
- // e.g. var jQuery = require("jquery")(window);
247
- // See ticket #14549 for more info.
248
- module.exports = global.document ?
249
- factory( global, true ) :
250
- function( w ) {
251
- if ( !w.document ) {
252
- throw new Error( "jQuery requires a window with a document" );
253
- }
254
- return factory( w );
255
- };
256
- } else {
257
- factory( global );
258
- }
259
-
260
- // Pass this if window is not defined yet
261
- } )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
262
-
263
- // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
264
- // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
265
- // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
266
- // enough that all such attempts are guarded in a try block.
267
- "use strict";
268
-
269
- var arr = [];
270
-
271
- var document = window.document;
272
-
273
- var getProto = Object.getPrototypeOf;
274
-
275
- var slice = arr.slice;
276
-
277
- var concat = arr.concat;
278
-
279
- var push = arr.push;
280
-
281
- var indexOf = arr.indexOf;
282
-
283
- var class2type = {};
284
-
285
- var toString = class2type.toString;
286
-
287
- var hasOwn = class2type.hasOwnProperty;
288
-
289
- var fnToString = hasOwn.toString;
290
-
291
- var ObjectFunctionString = fnToString.call( Object );
292
-
293
- var support = {};
294
-
295
- var isFunction = function isFunction( obj ) {
296
-
297
- // Support: Chrome <=57, Firefox <=52
298
- // In some browsers, typeof returns "function" for HTML <object> elements
299
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
300
- // We don't want to classify *any* DOM node as a function.
301
- return typeof obj === "function" && typeof obj.nodeType !== "number";
302
- };
303
-
304
-
305
- var isWindow = function isWindow( obj ) {
306
- return obj != null && obj === obj.window;
307
- };
308
-
309
-
310
-
311
-
312
- var preservedScriptAttributes = {
313
- type: true,
314
- src: true,
315
- noModule: true
316
- };
317
-
318
- function DOMEval( code, doc, node ) {
319
- doc = doc || document;
320
-
321
- var i,
322
- script = doc.createElement( "script" );
323
-
324
- script.text = code;
325
- if ( node ) {
326
- for ( i in preservedScriptAttributes ) {
327
- if ( node[ i ] ) {
328
- script[ i ] = node[ i ];
329
- }
330
- }
331
- }
332
- doc.head.appendChild( script ).parentNode.removeChild( script );
333
- }
334
-
335
-
336
- function toType( obj ) {
337
- if ( obj == null ) {
338
- return obj + "";
339
- }
340
-
341
- // Support: Android <=2.3 only (functionish RegExp)
342
- return typeof obj === "object" || typeof obj === "function" ?
343
- class2type[ toString.call( obj ) ] || "object" :
344
- typeof obj;
345
- }
346
- /* global Symbol */
347
- // Defining this global in .eslintrc.json would create a danger of using the global
348
- // unguarded in another place, it seems safer to define global only for this module
349
-
350
-
351
-
352
- var
353
- version = "3.3.1",
354
-
355
- // Define a local copy of jQuery
356
- jQuery = function( selector, context ) {
357
-
358
- // The jQuery object is actually just the init constructor 'enhanced'
359
- // Need init if jQuery is called (just allow error to be thrown if not included)
360
- return new jQuery.fn.init( selector, context );
361
- },
362
-
363
- // Support: Android <=4.0 only
364
- // Make sure we trim BOM and NBSP
365
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
366
-
367
- jQuery.fn = jQuery.prototype = {
368
-
369
- // The current version of jQuery being used
370
- jquery: version,
371
-
372
- constructor: jQuery,
373
-
374
- // The default length of a jQuery object is 0
375
- length: 0,
376
-
377
- toArray: function() {
378
- return slice.call( this );
379
- },
380
-
381
- // Get the Nth element in the matched element set OR
382
- // Get the whole matched element set as a clean array
383
- get: function( num ) {
384
-
385
- // Return all the elements in a clean array
386
- if ( num == null ) {
387
- return slice.call( this );
388
- }
389
-
390
- // Return just the one element from the set
391
- return num < 0 ? this[ num + this.length ] : this[ num ];
392
- },
393
-
394
- // Take an array of elements and push it onto the stack
395
- // (returning the new matched element set)
396
- pushStack: function( elems ) {
397
-
398
- // Build a new jQuery matched element set
399
- var ret = jQuery.merge( this.constructor(), elems );
400
-
401
- // Add the old object onto the stack (as a reference)
402
- ret.prevObject = this;
403
-
404
- // Return the newly-formed element set
405
- return ret;
406
- },
407
-
408
- // Execute a callback for every element in the matched set.
409
- each: function( callback ) {
410
- return jQuery.each( this, callback );
411
- },
412
-
413
- map: function( callback ) {
414
- return this.pushStack( jQuery.map( this, function( elem, i ) {
415
- return callback.call( elem, i, elem );
416
- } ) );
417
- },
418
-
419
- slice: function() {
420
- return this.pushStack( slice.apply( this, arguments ) );
421
- },
422
-
423
- first: function() {
424
- return this.eq( 0 );
425
- },
426
-
427
- last: function() {
428
- return this.eq( -1 );
429
- },
430
-
431
- eq: function( i ) {
432
- var len = this.length,
433
- j = +i + ( i < 0 ? len : 0 );
434
- return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
435
- },
436
-
437
- end: function() {
438
- return this.prevObject || this.constructor();
439
- },
440
-
441
- // For internal use only.
442
- // Behaves like an Array's method, not like a jQuery method.
443
- push: push,
444
- sort: arr.sort,
445
- splice: arr.splice
446
- };
447
-
448
- jQuery.extend = jQuery.fn.extend = function() {
449
- var options, name, src, copy, copyIsArray, clone,
450
- target = arguments[ 0 ] || {},
451
- i = 1,
452
- length = arguments.length,
453
- deep = false;
454
-
455
- // Handle a deep copy situation
456
- if ( typeof target === "boolean" ) {
457
- deep = target;
458
-
459
- // Skip the boolean and the target
460
- target = arguments[ i ] || {};
461
- i++;
462
- }
463
-
464
- // Handle case when target is a string or something (possible in deep copy)
465
- if ( typeof target !== "object" && !isFunction( target ) ) {
466
- target = {};
467
- }
468
-
469
- // Extend jQuery itself if only one argument is passed
470
- if ( i === length ) {
471
- target = this;
472
- i--;
473
- }
474
-
475
- for ( ; i < length; i++ ) {
476
-
477
- // Only deal with non-null/undefined values
478
- if ( ( options = arguments[ i ] ) != null ) {
479
-
480
- // Extend the base object
481
- for ( name in options ) {
482
- src = target[ name ];
483
- copy = options[ name ];
484
-
485
- // Prevent never-ending loop
486
- if ( target === copy ) {
487
- continue;
488
- }
489
-
490
- // Recurse if we're merging plain objects or arrays
491
- if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
492
- ( copyIsArray = Array.isArray( copy ) ) ) ) {
493
-
494
- if ( copyIsArray ) {
495
- copyIsArray = false;
496
- clone = src && Array.isArray( src ) ? src : [];
497
-
498
- } else {
499
- clone = src && jQuery.isPlainObject( src ) ? src : {};
500
- }
501
-
502
- // Never move original objects, clone them
503
- target[ name ] = jQuery.extend( deep, clone, copy );
504
-
505
- // Don't bring in undefined values
506
- } else if ( copy !== undefined ) {
507
- target[ name ] = copy;
508
- }
509
- }
510
- }
511
- }
512
-
513
- // Return the modified object
514
- return target;
515
- };
516
-
517
- jQuery.extend( {
518
-
519
- // Unique for each copy of jQuery on the page
520
- expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
521
-
522
- // Assume jQuery is ready without the ready module
523
- isReady: true,
524
-
525
- error: function( msg ) {
526
- throw new Error( msg );
527
- },
528
-
529
- noop: function() {},
530
-
531
- isPlainObject: function( obj ) {
532
- var proto, Ctor;
533
-
534
- // Detect obvious negatives
535
- // Use toString instead of jQuery.type to catch host objects
536
- if ( !obj || toString.call( obj ) !== "[object Object]" ) {
537
- return false;
538
- }
539
-
540
- proto = getProto( obj );
541
-
542
- // Objects with no prototype (e.g., `Object.create( null )`) are plain
543
- if ( !proto ) {
544
- return true;
545
- }
546
-
547
- // Objects with prototype are plain iff they were constructed by a global Object function
548
- Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
549
- return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
550
- },
551
-
552
- isEmptyObject: function( obj ) {
553
-
554
- /* eslint-disable no-unused-vars */
555
- // See https://github.com/eslint/eslint/issues/6125
556
- var name;
557
-
558
- for ( name in obj ) {
559
- return false;
560
- }
561
- return true;
562
- },
563
-
564
- // Evaluates a script in a global context
565
- globalEval: function( code ) {
566
- DOMEval( code );
567
- },
568
-
569
- each: function( obj, callback ) {
570
- var length, i = 0;
571
-
572
- if ( isArrayLike( obj ) ) {
573
- length = obj.length;
574
- for ( ; i < length; i++ ) {
575
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
576
- break;
577
- }
578
- }
579
- } else {
580
- for ( i in obj ) {
581
- if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
582
- break;
583
- }
584
- }
585
- }
586
-
587
- return obj;
588
- },
589
-
590
- // Support: Android <=4.0 only
591
- trim: function( text ) {
592
- return text == null ?
593
- "" :
594
- ( text + "" ).replace( rtrim, "" );
595
- },
596
-
597
- // results is for internal usage only
598
- makeArray: function( arr, results ) {
599
- var ret = results || [];
600
-
601
- if ( arr != null ) {
602
- if ( isArrayLike( Object( arr ) ) ) {
603
- jQuery.merge( ret,
604
- typeof arr === "string" ?
605
- [ arr ] : arr
606
- );
607
- } else {
608
- push.call( ret, arr );
609
- }
610
- }
611
-
612
- return ret;
613
- },
614
-
615
- inArray: function( elem, arr, i ) {
616
- return arr == null ? -1 : indexOf.call( arr, elem, i );
617
- },
618
-
619
- // Support: Android <=4.0 only, PhantomJS 1 only
620
- // push.apply(_, arraylike) throws on ancient WebKit
621
- merge: function( first, second ) {
622
- var len = +second.length,
623
- j = 0,
624
- i = first.length;
625
-
626
- for ( ; j < len; j++ ) {
627
- first[ i++ ] = second[ j ];
628
- }
629
-
630
- first.length = i;
631
-
632
- return first;
633
- },
634
-
635
- grep: function( elems, callback, invert ) {
636
- var callbackInverse,
637
- matches = [],
638
- i = 0,
639
- length = elems.length,
640
- callbackExpect = !invert;
641
-
642
- // Go through the array, only saving the items
643
- // that pass the validator function
644
- for ( ; i < length; i++ ) {
645
- callbackInverse = !callback( elems[ i ], i );
646
- if ( callbackInverse !== callbackExpect ) {
647
- matches.push( elems[ i ] );
648
- }
649
- }
650
-
651
- return matches;
652
- },
653
-
654
- // arg is for internal usage only
655
- map: function( elems, callback, arg ) {
656
- var length, value,
657
- i = 0,
658
- ret = [];
659
-
660
- // Go through the array, translating each of the items to their new values
661
- if ( isArrayLike( elems ) ) {
662
- length = elems.length;
663
- for ( ; i < length; i++ ) {
664
- value = callback( elems[ i ], i, arg );
665
-
666
- if ( value != null ) {
667
- ret.push( value );
668
- }
669
- }
670
-
671
- // Go through every key on the object,
672
- } else {
673
- for ( i in elems ) {
674
- value = callback( elems[ i ], i, arg );
675
-
676
- if ( value != null ) {
677
- ret.push( value );
678
- }
679
- }
680
- }
681
-
682
- // Flatten any nested arrays
683
- return concat.apply( [], ret );
684
- },
685
-
686
- // A global GUID counter for objects
687
- guid: 1,
688
-
689
- // jQuery.support is not used in Core but other projects attach their
690
- // properties to it so it needs to exist.
691
- support: support
692
- } );
693
-
694
- if ( typeof Symbol === "function" ) {
695
- jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
696
- }
697
-
698
- // Populate the class2type map
699
- jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
700
- function( i, name ) {
701
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
702
- } );
703
-
704
- function isArrayLike( obj ) {
705
-
706
- // Support: real iOS 8.2 only (not reproducible in simulator)
707
- // `in` check used to prevent JIT error (gh-2145)
708
- // hasOwn isn't used here due to false negatives
709
- // regarding Nodelist length in IE
710
- var length = !!obj && "length" in obj && obj.length,
711
- type = toType( obj );
712
-
713
- if ( isFunction( obj ) || isWindow( obj ) ) {
714
- return false;
715
- }
716
-
717
- return type === "array" || length === 0 ||
718
- typeof length === "number" && length > 0 && ( length - 1 ) in obj;
719
- }
720
- var Sizzle =
721
- /*!
722
- * Sizzle CSS Selector Engine v2.3.3
723
- * https://sizzlejs.com/
724
- *
725
- * Copyright jQuery Foundation and other contributors
726
- * Released under the MIT license
727
- * http://jquery.org/license
728
- *
729
- * Date: 2016-08-08
730
- */
731
- (function( window ) {
732
-
733
- var i,
734
- support,
735
- Expr,
736
- getText,
737
- isXML,
738
- tokenize,
739
- compile,
740
- select,
741
- outermostContext,
742
- sortInput,
743
- hasDuplicate,
744
-
745
- // Local document vars
746
- setDocument,
747
- document,
748
- docElem,
749
- documentIsHTML,
750
- rbuggyQSA,
751
- rbuggyMatches,
752
- matches,
753
- contains,
754
-
755
- // Instance-specific data
756
- expando = "sizzle" + 1 * new Date(),
757
- preferredDoc = window.document,
758
- dirruns = 0,
759
- done = 0,
760
- classCache = createCache(),
761
- tokenCache = createCache(),
762
- compilerCache = createCache(),
763
- sortOrder = function( a, b ) {
764
- if ( a === b ) {
765
- hasDuplicate = true;
766
- }
767
- return 0;
768
- },
769
-
770
- // Instance methods
771
- hasOwn = ({}).hasOwnProperty,
772
- arr = [],
773
- pop = arr.pop,
774
- push_native = arr.push,
775
- push = arr.push,
776
- slice = arr.slice,
777
- // Use a stripped-down indexOf as it's faster than native
778
- // https://jsperf.com/thor-indexof-vs-for/5
779
- indexOf = function( list, elem ) {
780
- var i = 0,
781
- len = list.length;
782
- for ( ; i < len; i++ ) {
783
- if ( list[i] === elem ) {
784
- return i;
785
- }
786
- }
787
- return -1;
788
- },
789
-
790
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
791
-
792
- // Regular expressions
793
-
794
- // http://www.w3.org/TR/css3-selectors/#whitespace
795
- whitespace = "[\\x20\\t\\r\\n\\f]",
796
-
797
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
798
- identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
799
-
800
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
801
- attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
802
- // Operator (capture 2)
803
- "*([*^$|!~]?=)" + whitespace +
804
- // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
805
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
806
- "*\\]",
807
-
808
- pseudos = ":(" + identifier + ")(?:\\((" +
809
- // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
810
- // 1. quoted (capture 3; capture 4 or capture 5)
811
- "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
812
- // 2. simple (capture 6)
813
- "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
814
- // 3. anything else (capture 2)
815
- ".*" +
816
- ")\\)|)",
817
-
818
- // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
819
- rwhitespace = new RegExp( whitespace + "+", "g" ),
820
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
821
-
822
- rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
823
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
824
-
825
- rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
826
-
827
- rpseudo = new RegExp( pseudos ),
828
- ridentifier = new RegExp( "^" + identifier + "$" ),
829
-
830
- matchExpr = {
831
- "ID": new RegExp( "^#(" + identifier + ")" ),
832
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
833
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
834
- "ATTR": new RegExp( "^" + attributes ),
835
- "PSEUDO": new RegExp( "^" + pseudos ),
836
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
837
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
838
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
839
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
840
- // For use in libraries implementing .is()
841
- // We use this for POS matching in `select`
842
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
843
- whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
844
- },
845
-
846
- rinputs = /^(?:input|select|textarea|button)$/i,
847
- rheader = /^h\d$/i,
848
-
849
- rnative = /^[^{]+\{\s*\[native \w/,
850
-
851
- // Easily-parseable/retrievable ID or TAG or CLASS selectors
852
- rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
853
-
854
- rsibling = /[+~]/,
855
-
856
- // CSS escapes
857
- // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
858
- runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
859
- funescape = function( _, escaped, escapedWhitespace ) {
860
- var high = "0x" + escaped - 0x10000;
861
- // NaN means non-codepoint
862
- // Support: Firefox<24
863
- // Workaround erroneous numeric interpretation of +"0x"
864
- return high !== high || escapedWhitespace ?
865
- escaped :
866
- high < 0 ?
867
- // BMP codepoint
868
- String.fromCharCode( high + 0x10000 ) :
869
- // Supplemental Plane codepoint (surrogate pair)
870
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
871
- },
872
-
873
- // CSS string/identifier serialization
874
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
875
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
876
- fcssescape = function( ch, asCodePoint ) {
877
- if ( asCodePoint ) {
878
-
879
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
880
- if ( ch === "\0" ) {
881
- return "\uFFFD";
882
- }
883
-
884
- // Control characters and (dependent upon position) numbers get escaped as code points
885
- return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
886
- }
887
-
888
- // Other potentially-special ASCII characters get backslash-escaped
889
- return "\\" + ch;
890
- },
891
-
892
- // Used for iframes
893
- // See setDocument()
894
- // Removing the function wrapper causes a "Permission Denied"
895
- // error in IE
896
- unloadHandler = function() {
897
- setDocument();
898
- },
899
-
900
- disabledAncestor = addCombinator(
901
- function( elem ) {
902
- return elem.disabled === true && ("form" in elem || "label" in elem);
903
- },
904
- { dir: "parentNode", next: "legend" }
905
- );
906
-
907
- // Optimize for push.apply( _, NodeList )
908
- try {
909
- push.apply(
910
- (arr = slice.call( preferredDoc.childNodes )),
911
- preferredDoc.childNodes
912
- );
913
- // Support: Android<4.0
914
- // Detect silently failing push.apply
915
- arr[ preferredDoc.childNodes.length ].nodeType;
916
- } catch ( e ) {
917
- push = { apply: arr.length ?
918
-
919
- // Leverage slice if possible
920
- function( target, els ) {
921
- push_native.apply( target, slice.call(els) );
922
- } :
923
-
924
- // Support: IE<9
925
- // Otherwise append directly
926
- function( target, els ) {
927
- var j = target.length,
928
- i = 0;
929
- // Can't trust NodeList.length
930
- while ( (target[j++] = els[i++]) ) {}
931
- target.length = j - 1;
932
- }
933
- };
934
- }
935
-
936
- function Sizzle( selector, context, results, seed ) {
937
- var m, i, elem, nid, match, groups, newSelector,
938
- newContext = context && context.ownerDocument,
939
-
940
- // nodeType defaults to 9, since context defaults to document
941
- nodeType = context ? context.nodeType : 9;
942
-
943
- results = results || [];
944
-
945
- // Return early from calls with invalid selector or context
946
- if ( typeof selector !== "string" || !selector ||
947
- nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
948
-
949
- return results;
950
- }
951
-
952
- // Try to shortcut find operations (as opposed to filters) in HTML documents
953
- if ( !seed ) {
954
-
955
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
956
- setDocument( context );
957
- }
958
- context = context || document;
959
-
960
- if ( documentIsHTML ) {
961
-
962
- // If the selector is sufficiently simple, try using a "get*By*" DOM method
963
- // (excepting DocumentFragment context, where the methods don't exist)
964
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
965
-
966
- // ID selector
967
- if ( (m = match[1]) ) {
968
-
969
- // Document context
970
- if ( nodeType === 9 ) {
971
- if ( (elem = context.getElementById( m )) ) {
972
-
973
- // Support: IE, Opera, Webkit
974
- // TODO: identify versions
975
- // getElementById can match elements by name instead of ID
976
- if ( elem.id === m ) {
977
- results.push( elem );
978
- return results;
979
- }
980
- } else {
981
- return results;
982
- }
983
-
984
- // Element context
985
- } else {
986
-
987
- // Support: IE, Opera, Webkit
988
- // TODO: identify versions
989
- // getElementById can match elements by name instead of ID
990
- if ( newContext && (elem = newContext.getElementById( m )) &&
991
- contains( context, elem ) &&
992
- elem.id === m ) {
993
-
994
- results.push( elem );
995
- return results;
996
- }
997
- }
998
-
999
- // Type selector
1000
- } else if ( match[2] ) {
1001
- push.apply( results, context.getElementsByTagName( selector ) );
1002
- return results;
1003
-
1004
- // Class selector
1005
- } else if ( (m = match[3]) && support.getElementsByClassName &&
1006
- context.getElementsByClassName ) {
1007
-
1008
- push.apply( results, context.getElementsByClassName( m ) );
1009
- return results;
1010
- }
1011
- }
1012
-
1013
- // Take advantage of querySelectorAll
1014
- if ( support.qsa &&
1015
- !compilerCache[ selector + " " ] &&
1016
- (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
1017
-
1018
- if ( nodeType !== 1 ) {
1019
- newContext = context;
1020
- newSelector = selector;
1021
-
1022
- // qSA looks outside Element context, which is not what we want
1023
- // Thanks to Andrew Dupont for this workaround technique
1024
- // Support: IE <=8
1025
- // Exclude object elements
1026
- } else if ( context.nodeName.toLowerCase() !== "object" ) {
1027
-
1028
- // Capture the context ID, setting it first if necessary
1029
- if ( (nid = context.getAttribute( "id" )) ) {
1030
- nid = nid.replace( rcssescape, fcssescape );
1031
- } else {
1032
- context.setAttribute( "id", (nid = expando) );
1033
- }
1034
-
1035
- // Prefix every selector in the list
1036
- groups = tokenize( selector );
1037
- i = groups.length;
1038
- while ( i-- ) {
1039
- groups[i] = "#" + nid + " " + toSelector( groups[i] );
1040
- }
1041
- newSelector = groups.join( "," );
1042
-
1043
- // Expand context for sibling selectors
1044
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
1045
- context;
1046
- }
1047
-
1048
- if ( newSelector ) {
1049
- try {
1050
- push.apply( results,
1051
- newContext.querySelectorAll( newSelector )
1052
- );
1053
- return results;
1054
- } catch ( qsaError ) {
1055
- } finally {
1056
- if ( nid === expando ) {
1057
- context.removeAttribute( "id" );
1058
- }
1059
- }
1060
- }
1061
- }
1062
- }
1063
- }
1064
-
1065
- // All others
1066
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
1067
- }
1068
-
1069
- /**
1070
- * Create key-value caches of limited size
1071
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
1072
- * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
1073
- * deleting the oldest entry
1074
- */
1075
- function createCache() {
1076
- var keys = [];
1077
-
1078
- function cache( key, value ) {
1079
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
1080
- if ( keys.push( key + " " ) > Expr.cacheLength ) {
1081
- // Only keep the most recent entries
1082
- delete cache[ keys.shift() ];
1083
- }
1084
- return (cache[ key + " " ] = value);
1085
- }
1086
- return cache;
1087
- }
1088
-
1089
- /**
1090
- * Mark a function for special use by Sizzle
1091
- * @param {Function} fn The function to mark
1092
- */
1093
- function markFunction( fn ) {
1094
- fn[ expando ] = true;
1095
- return fn;
1096
- }
1097
-
1098
- /**
1099
- * Support testing using an element
1100
- * @param {Function} fn Passed the created element and returns a boolean result
1101
- */
1102
- function assert( fn ) {
1103
- var el = document.createElement("fieldset");
1104
-
1105
- try {
1106
- return !!fn( el );
1107
- } catch (e) {
1108
- return false;
1109
- } finally {
1110
- // Remove from its parent by default
1111
- if ( el.parentNode ) {
1112
- el.parentNode.removeChild( el );
1113
- }
1114
- // release memory in IE
1115
- el = null;
1116
- }
1117
- }
1118
-
1119
- /**
1120
- * Adds the same handler for all of the specified attrs
1121
- * @param {String} attrs Pipe-separated list of attributes
1122
- * @param {Function} handler The method that will be applied
1123
- */
1124
- function addHandle( attrs, handler ) {
1125
- var arr = attrs.split("|"),
1126
- i = arr.length;
1127
-
1128
- while ( i-- ) {
1129
- Expr.attrHandle[ arr[i] ] = handler;
1130
- }
1131
- }
1132
-
1133
- /**
1134
- * Checks document order of two siblings
1135
- * @param {Element} a
1136
- * @param {Element} b
1137
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
1138
- */
1139
- function siblingCheck( a, b ) {
1140
- var cur = b && a,
1141
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
1142
- a.sourceIndex - b.sourceIndex;
1143
-
1144
- // Use IE sourceIndex if available on both nodes
1145
- if ( diff ) {
1146
- return diff;
1147
- }
1148
-
1149
- // Check if b follows a
1150
- if ( cur ) {
1151
- while ( (cur = cur.nextSibling) ) {
1152
- if ( cur === b ) {
1153
- return -1;
1154
- }
1155
- }
1156
- }
1157
-
1158
- return a ? 1 : -1;
1159
- }
1160
-
1161
- /**
1162
- * Returns a function to use in pseudos for input types
1163
- * @param {String} type
1164
- */
1165
- function createInputPseudo( type ) {
1166
- return function( elem ) {
1167
- var name = elem.nodeName.toLowerCase();
1168
- return name === "input" && elem.type === type;
1169
- };
1170
- }
1171
-
1172
- /**
1173
- * Returns a function to use in pseudos for buttons
1174
- * @param {String} type
1175
- */
1176
- function createButtonPseudo( type ) {
1177
- return function( elem ) {
1178
- var name = elem.nodeName.toLowerCase();
1179
- return (name === "input" || name === "button") && elem.type === type;
1180
- };
1181
- }
1182
-
1183
- /**
1184
- * Returns a function to use in pseudos for :enabled/:disabled
1185
- * @param {Boolean} disabled true for :disabled; false for :enabled
1186
- */
1187
- function createDisabledPseudo( disabled ) {
1188
-
1189
- // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1190
- return function( elem ) {
1191
-
1192
- // Only certain elements can match :enabled or :disabled
1193
- // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1194
- // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1195
- if ( "form" in elem ) {
1196
-
1197
- // Check for inherited disabledness on relevant non-disabled elements:
1198
- // * listed form-associated elements in a disabled fieldset
1199
- // https://html.spec.whatwg.org/multipage/forms.html#category-listed
1200
- // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1201
- // * option elements in a disabled optgroup
1202
- // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1203
- // All such elements have a "form" property.
1204
- if ( elem.parentNode && elem.disabled === false ) {
1205
-
1206
- // Option elements defer to a parent optgroup if present
1207
- if ( "label" in elem ) {
1208
- if ( "label" in elem.parentNode ) {
1209
- return elem.parentNode.disabled === disabled;
1210
- } else {
1211
- return elem.disabled === disabled;
1212
- }
1213
- }
1214
-
1215
- // Support: IE 6 - 11
1216
- // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1217
- return elem.isDisabled === disabled ||
1218
-
1219
- // Where there is no isDisabled, check manually
1220
- /* jshint -W018 */
1221
- elem.isDisabled !== !disabled &&
1222
- disabledAncestor( elem ) === disabled;
1223
- }
1224
-
1225
- return elem.disabled === disabled;
1226
-
1227
- // Try to winnow out elements that can't be disabled before trusting the disabled property.
1228
- // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1229
- // even exist on them, let alone have a boolean value.
1230
- } else if ( "label" in elem ) {
1231
- return elem.disabled === disabled;
1232
- }
1233
-
1234
- // Remaining elements are neither :enabled nor :disabled
1235
- return false;
1236
- };
1237
- }
1238
-
1239
- /**
1240
- * Returns a function to use in pseudos for positionals
1241
- * @param {Function} fn
1242
- */
1243
- function createPositionalPseudo( fn ) {
1244
- return markFunction(function( argument ) {
1245
- argument = +argument;
1246
- return markFunction(function( seed, matches ) {
1247
- var j,
1248
- matchIndexes = fn( [], seed.length, argument ),
1249
- i = matchIndexes.length;
1250
-
1251
- // Match elements found at the specified indexes
1252
- while ( i-- ) {
1253
- if ( seed[ (j = matchIndexes[i]) ] ) {
1254
- seed[j] = !(matches[j] = seed[j]);
1255
- }
1256
- }
1257
- });
1258
- });
1259
- }
1260
-
1261
- /**
1262
- * Checks a node for validity as a Sizzle context
1263
- * @param {Element|Object=} context
1264
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1265
- */
1266
- function testContext( context ) {
1267
- return context && typeof context.getElementsByTagName !== "undefined" && context;
1268
- }
1269
-
1270
- // Expose support vars for convenience
1271
- support = Sizzle.support = {};
1272
-
1273
- /**
1274
- * Detects XML nodes
1275
- * @param {Element|Object} elem An element or a document
1276
- * @returns {Boolean} True iff elem is a non-HTML XML node
1277
- */
1278
- isXML = Sizzle.isXML = function( elem ) {
1279
- // documentElement is verified for cases where it doesn't yet exist
1280
- // (such as loading iframes in IE - #4833)
1281
- var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1282
- return documentElement ? documentElement.nodeName !== "HTML" : false;
1283
- };
1284
-
1285
- /**
1286
- * Sets document-related variables once based on the current document
1287
- * @param {Element|Object} [doc] An element or document object to use to set the document
1288
- * @returns {Object} Returns the current document
1289
- */
1290
- setDocument = Sizzle.setDocument = function( node ) {
1291
- var hasCompare, subWindow,
1292
- doc = node ? node.ownerDocument || node : preferredDoc;
1293
-
1294
- // Return early if doc is invalid or already selected
1295
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1296
- return document;
1297
- }
1298
-
1299
- // Update global variables
1300
- document = doc;
1301
- docElem = document.documentElement;
1302
- documentIsHTML = !isXML( document );
1303
-
1304
- // Support: IE 9-11, Edge
1305
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1306
- if ( preferredDoc !== document &&
1307
- (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1308
-
1309
- // Support: IE 11, Edge
1310
- if ( subWindow.addEventListener ) {
1311
- subWindow.addEventListener( "unload", unloadHandler, false );
1312
-
1313
- // Support: IE 9 - 10 only
1314
- } else if ( subWindow.attachEvent ) {
1315
- subWindow.attachEvent( "onunload", unloadHandler );
1316
- }
1317
- }
1318
-
1319
- /* Attributes
1320
- ---------------------------------------------------------------------- */
1321
-
1322
- // Support: IE<8
1323
- // Verify that getAttribute really returns attributes and not properties
1324
- // (excepting IE8 booleans)
1325
- support.attributes = assert(function( el ) {
1326
- el.className = "i";
1327
- return !el.getAttribute("className");
1328
- });
1329
-
1330
- /* getElement(s)By*
1331
- ---------------------------------------------------------------------- */
1332
-
1333
- // Check if getElementsByTagName("*") returns only elements
1334
- support.getElementsByTagName = assert(function( el ) {
1335
- el.appendChild( document.createComment("") );
1336
- return !el.getElementsByTagName("*").length;
1337
- });
1338
-
1339
- // Support: IE<9
1340
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1341
-
1342
- // Support: IE<10
1343
- // Check if getElementById returns elements by name
1344
- // The broken getElementById methods don't pick up programmatically-set names,
1345
- // so use a roundabout getElementsByName test
1346
- support.getById = assert(function( el ) {
1347
- docElem.appendChild( el ).id = expando;
1348
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
1349
- });
1350
-
1351
- // ID filter and find
1352
- if ( support.getById ) {
1353
- Expr.filter["ID"] = function( id ) {
1354
- var attrId = id.replace( runescape, funescape );
1355
- return function( elem ) {
1356
- return elem.getAttribute("id") === attrId;
1357
- };
1358
- };
1359
- Expr.find["ID"] = function( id, context ) {
1360
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1361
- var elem = context.getElementById( id );
1362
- return elem ? [ elem ] : [];
1363
- }
1364
- };
1365
- } else {
1366
- Expr.filter["ID"] = function( id ) {
1367
- var attrId = id.replace( runescape, funescape );
1368
- return function( elem ) {
1369
- var node = typeof elem.getAttributeNode !== "undefined" &&
1370
- elem.getAttributeNode("id");
1371
- return node && node.value === attrId;
1372
- };
1373
- };
1374
-
1375
- // Support: IE 6 - 7 only
1376
- // getElementById is not reliable as a find shortcut
1377
- Expr.find["ID"] = function( id, context ) {
1378
- if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1379
- var node, i, elems,
1380
- elem = context.getElementById( id );
1381
-
1382
- if ( elem ) {
1383
-
1384
- // Verify the id attribute
1385
- node = elem.getAttributeNode("id");
1386
- if ( node && node.value === id ) {
1387
- return [ elem ];
1388
- }
1389
-
1390
- // Fall back on getElementsByName
1391
- elems = context.getElementsByName( id );
1392
- i = 0;
1393
- while ( (elem = elems[i++]) ) {
1394
- node = elem.getAttributeNode("id");
1395
- if ( node && node.value === id ) {
1396
- return [ elem ];
1397
- }
1398
- }
1399
- }
1400
-
1401
- return [];
1402
- }
1403
- };
1404
- }
1405
-
1406
- // Tag
1407
- Expr.find["TAG"] = support.getElementsByTagName ?
1408
- function( tag, context ) {
1409
- if ( typeof context.getElementsByTagName !== "undefined" ) {
1410
- return context.getElementsByTagName( tag );
1411
-
1412
- // DocumentFragment nodes don't have gEBTN
1413
- } else if ( support.qsa ) {
1414
- return context.querySelectorAll( tag );
1415
- }
1416
- } :
1417
-
1418
- function( tag, context ) {
1419
- var elem,
1420
- tmp = [],
1421
- i = 0,
1422
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1423
- results = context.getElementsByTagName( tag );
1424
-
1425
- // Filter out possible comments
1426
- if ( tag === "*" ) {
1427
- while ( (elem = results[i++]) ) {
1428
- if ( elem.nodeType === 1 ) {
1429
- tmp.push( elem );
1430
- }
1431
- }
1432
-
1433
- return tmp;
1434
- }
1435
- return results;
1436
- };
1437
-
1438
- // Class
1439
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1440
- if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1441
- return context.getElementsByClassName( className );
1442
- }
1443
- };
1444
-
1445
- /* QSA/matchesSelector
1446
- ---------------------------------------------------------------------- */
1447
-
1448
- // QSA and matchesSelector support
1449
-
1450
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1451
- rbuggyMatches = [];
1452
-
1453
- // qSa(:focus) reports false when true (Chrome 21)
1454
- // We allow this because of a bug in IE8/9 that throws an error
1455
- // whenever `document.activeElement` is accessed on an iframe
1456
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
1457
- // See https://bugs.jquery.com/ticket/13378
1458
- rbuggyQSA = [];
1459
-
1460
- if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1461
- // Build QSA regex
1462
- // Regex strategy adopted from Diego Perini
1463
- assert(function( el ) {
1464
- // Select is set to empty string on purpose
1465
- // This is to test IE's treatment of not explicitly
1466
- // setting a boolean content attribute,
1467
- // since its presence should be enough
1468
- // https://bugs.jquery.com/ticket/12359
1469
- docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1470
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
1471
- "<option selected=''></option></select>";
1472
-
1473
- // Support: IE8, Opera 11-12.16
1474
- // Nothing should be selected when empty strings follow ^= or $= or *=
1475
- // The test attribute must be unknown in Opera but "safe" for WinRT
1476
- // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1477
- if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1478
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1479
- }
1480
-
1481
- // Support: IE8
1482
- // Boolean attributes and "value" are not treated correctly
1483
- if ( !el.querySelectorAll("[selected]").length ) {
1484
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1485
- }
1486
-
1487
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1488
- if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1489
- rbuggyQSA.push("~=");
1490
- }
1491
-
1492
- // Webkit/Opera - :checked should return selected option elements
1493
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1494
- // IE8 throws error here and will not see later tests
1495
- if ( !el.querySelectorAll(":checked").length ) {
1496
- rbuggyQSA.push(":checked");
1497
- }
1498
-
1499
- // Support: Safari 8+, iOS 8+
1500
- // https://bugs.webkit.org/show_bug.cgi?id=136851
1501
- // In-page `selector#id sibling-combinator selector` fails
1502
- if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1503
- rbuggyQSA.push(".#.+[+~]");
1504
- }
1505
- });
1506
-
1507
- assert(function( el ) {
1508
- el.innerHTML = "<a href='' disabled='disabled'></a>" +
1509
- "<select disabled='disabled'><option/></select>";
1510
-
1511
- // Support: Windows 8 Native Apps
1512
- // The type and name attributes are restricted during .innerHTML assignment
1513
- var input = document.createElement("input");
1514
- input.setAttribute( "type", "hidden" );
1515
- el.appendChild( input ).setAttribute( "name", "D" );
1516
-
1517
- // Support: IE8
1518
- // Enforce case-sensitivity of name attribute
1519
- if ( el.querySelectorAll("[name=d]").length ) {
1520
- rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1521
- }
1522
-
1523
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1524
- // IE8 throws error here and will not see later tests
1525
- if ( el.querySelectorAll(":enabled").length !== 2 ) {
1526
- rbuggyQSA.push( ":enabled", ":disabled" );
1527
- }
1528
-
1529
- // Support: IE9-11+
1530
- // IE's :disabled selector does not pick up the children of disabled fieldsets
1531
- docElem.appendChild( el ).disabled = true;
1532
- if ( el.querySelectorAll(":disabled").length !== 2 ) {
1533
- rbuggyQSA.push( ":enabled", ":disabled" );
1534
- }
1535
-
1536
- // Opera 10-11 does not throw on post-comma invalid pseudos
1537
- el.querySelectorAll("*,:x");
1538
- rbuggyQSA.push(",.*:");
1539
- });
1540
- }
1541
-
1542
- if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1543
- docElem.webkitMatchesSelector ||
1544
- docElem.mozMatchesSelector ||
1545
- docElem.oMatchesSelector ||
1546
- docElem.msMatchesSelector) )) ) {
1547
-
1548
- assert(function( el ) {
1549
- // Check to see if it's possible to do matchesSelector
1550
- // on a disconnected node (IE 9)
1551
- support.disconnectedMatch = matches.call( el, "*" );
1552
-
1553
- // This should fail with an exception
1554
- // Gecko does not error, returns false instead
1555
- matches.call( el, "[s!='']:x" );
1556
- rbuggyMatches.push( "!=", pseudos );
1557
- });
1558
- }
1559
-
1560
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1561
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1562
-
1563
- /* Contains
1564
- ---------------------------------------------------------------------- */
1565
- hasCompare = rnative.test( docElem.compareDocumentPosition );
1566
-
1567
- // Element contains another
1568
- // Purposefully self-exclusive
1569
- // As in, an element does not contain itself
1570
- contains = hasCompare || rnative.test( docElem.contains ) ?
1571
- function( a, b ) {
1572
- var adown = a.nodeType === 9 ? a.documentElement : a,
1573
- bup = b && b.parentNode;
1574
- return a === bup || !!( bup && bup.nodeType === 1 && (
1575
- adown.contains ?
1576
- adown.contains( bup ) :
1577
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1578
- ));
1579
- } :
1580
- function( a, b ) {
1581
- if ( b ) {
1582
- while ( (b = b.parentNode) ) {
1583
- if ( b === a ) {
1584
- return true;
1585
- }
1586
- }
1587
- }
1588
- return false;
1589
- };
1590
-
1591
- /* Sorting
1592
- ---------------------------------------------------------------------- */
1593
-
1594
- // Document order sorting
1595
- sortOrder = hasCompare ?
1596
- function( a, b ) {
1597
-
1598
- // Flag for duplicate removal
1599
- if ( a === b ) {
1600
- hasDuplicate = true;
1601
- return 0;
1602
- }
1603
-
1604
- // Sort on method existence if only one input has compareDocumentPosition
1605
- var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1606
- if ( compare ) {
1607
- return compare;
1608
- }
1609
-
1610
- // Calculate position if both inputs belong to the same document
1611
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1612
- a.compareDocumentPosition( b ) :
1613
-
1614
- // Otherwise we know they are disconnected
1615
- 1;
1616
-
1617
- // Disconnected nodes
1618
- if ( compare & 1 ||
1619
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1620
-
1621
- // Choose the first element that is related to our preferred document
1622
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1623
- return -1;
1624
- }
1625
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1626
- return 1;
1627
- }
1628
-
1629
- // Maintain original order
1630
- return sortInput ?
1631
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1632
- 0;
1633
- }
1634
-
1635
- return compare & 4 ? -1 : 1;
1636
- } :
1637
- function( a, b ) {
1638
- // Exit early if the nodes are identical
1639
- if ( a === b ) {
1640
- hasDuplicate = true;
1641
- return 0;
1642
- }
1643
-
1644
- var cur,
1645
- i = 0,
1646
- aup = a.parentNode,
1647
- bup = b.parentNode,
1648
- ap = [ a ],
1649
- bp = [ b ];
1650
-
1651
- // Parentless nodes are either documents or disconnected
1652
- if ( !aup || !bup ) {
1653
- return a === document ? -1 :
1654
- b === document ? 1 :
1655
- aup ? -1 :
1656
- bup ? 1 :
1657
- sortInput ?
1658
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1659
- 0;
1660
-
1661
- // If the nodes are siblings, we can do a quick check
1662
- } else if ( aup === bup ) {
1663
- return siblingCheck( a, b );
1664
- }
1665
-
1666
- // Otherwise we need full lists of their ancestors for comparison
1667
- cur = a;
1668
- while ( (cur = cur.parentNode) ) {
1669
- ap.unshift( cur );
1670
- }
1671
- cur = b;
1672
- while ( (cur = cur.parentNode) ) {
1673
- bp.unshift( cur );
1674
- }
1675
-
1676
- // Walk down the tree looking for a discrepancy
1677
- while ( ap[i] === bp[i] ) {
1678
- i++;
1679
- }
1680
-
1681
- return i ?
1682
- // Do a sibling check if the nodes have a common ancestor
1683
- siblingCheck( ap[i], bp[i] ) :
1684
-
1685
- // Otherwise nodes in our document sort first
1686
- ap[i] === preferredDoc ? -1 :
1687
- bp[i] === preferredDoc ? 1 :
1688
- 0;
1689
- };
1690
-
1691
- return document;
1692
- };
1693
-
1694
- Sizzle.matches = function( expr, elements ) {
1695
- return Sizzle( expr, null, null, elements );
1696
- };
1697
-
1698
- Sizzle.matchesSelector = function( elem, expr ) {
1699
- // Set document vars if needed
1700
- if ( ( elem.ownerDocument || elem ) !== document ) {
1701
- setDocument( elem );
1702
- }
1703
-
1704
- // Make sure that attribute selectors are quoted
1705
- expr = expr.replace( rattributeQuotes, "='$1']" );
1706
-
1707
- if ( support.matchesSelector && documentIsHTML &&
1708
- !compilerCache[ expr + " " ] &&
1709
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1710
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1711
-
1712
- try {
1713
- var ret = matches.call( elem, expr );
1714
-
1715
- // IE 9's matchesSelector returns false on disconnected nodes
1716
- if ( ret || support.disconnectedMatch ||
1717
- // As well, disconnected nodes are said to be in a document
1718
- // fragment in IE 9
1719
- elem.document && elem.document.nodeType !== 11 ) {
1720
- return ret;
1721
- }
1722
- } catch (e) {}
1723
- }
1724
-
1725
- return Sizzle( expr, document, null, [ elem ] ).length > 0;
1726
- };
1727
-
1728
- Sizzle.contains = function( context, elem ) {
1729
- // Set document vars if needed
1730
- if ( ( context.ownerDocument || context ) !== document ) {
1731
- setDocument( context );
1732
- }
1733
- return contains( context, elem );
1734
- };
1735
-
1736
- Sizzle.attr = function( elem, name ) {
1737
- // Set document vars if needed
1738
- if ( ( elem.ownerDocument || elem ) !== document ) {
1739
- setDocument( elem );
1740
- }
1741
-
1742
- var fn = Expr.attrHandle[ name.toLowerCase() ],
1743
- // Don't get fooled by Object.prototype properties (jQuery #13807)
1744
- val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1745
- fn( elem, name, !documentIsHTML ) :
1746
- undefined;
1747
-
1748
- return val !== undefined ?
1749
- val :
1750
- support.attributes || !documentIsHTML ?
1751
- elem.getAttribute( name ) :
1752
- (val = elem.getAttributeNode(name)) && val.specified ?
1753
- val.value :
1754
- null;
1755
- };
1756
-
1757
- Sizzle.escape = function( sel ) {
1758
- return (sel + "").replace( rcssescape, fcssescape );
1759
- };
1760
-
1761
- Sizzle.error = function( msg ) {
1762
- throw new Error( "Syntax error, unrecognized expression: " + msg );
1763
- };
1764
-
1765
- /**
1766
- * Document sorting and removing duplicates
1767
- * @param {ArrayLike} results
1768
- */
1769
- Sizzle.uniqueSort = function( results ) {
1770
- var elem,
1771
- duplicates = [],
1772
- j = 0,
1773
- i = 0;
1774
-
1775
- // Unless we *know* we can detect duplicates, assume their presence
1776
- hasDuplicate = !support.detectDuplicates;
1777
- sortInput = !support.sortStable && results.slice( 0 );
1778
- results.sort( sortOrder );
1779
-
1780
- if ( hasDuplicate ) {
1781
- while ( (elem = results[i++]) ) {
1782
- if ( elem === results[ i ] ) {
1783
- j = duplicates.push( i );
1784
- }
1785
- }
1786
- while ( j-- ) {
1787
- results.splice( duplicates[ j ], 1 );
1788
- }
1789
- }
1790
-
1791
- // Clear input after sorting to release objects
1792
- // See https://github.com/jquery/sizzle/pull/225
1793
- sortInput = null;
1794
-
1795
- return results;
1796
- };
1797
-
1798
- /**
1799
- * Utility function for retrieving the text value of an array of DOM nodes
1800
- * @param {Array|Element} elem
1801
- */
1802
- getText = Sizzle.getText = function( elem ) {
1803
- var node,
1804
- ret = "",
1805
- i = 0,
1806
- nodeType = elem.nodeType;
1807
-
1808
- if ( !nodeType ) {
1809
- // If no nodeType, this is expected to be an array
1810
- while ( (node = elem[i++]) ) {
1811
- // Do not traverse comment nodes
1812
- ret += getText( node );
1813
- }
1814
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1815
- // Use textContent for elements
1816
- // innerText usage removed for consistency of new lines (jQuery #11153)
1817
- if ( typeof elem.textContent === "string" ) {
1818
- return elem.textContent;
1819
- } else {
1820
- // Traverse its children
1821
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1822
- ret += getText( elem );
1823
- }
1824
- }
1825
- } else if ( nodeType === 3 || nodeType === 4 ) {
1826
- return elem.nodeValue;
1827
- }
1828
- // Do not include comment or processing instruction nodes
1829
-
1830
- return ret;
1831
- };
1832
-
1833
- Expr = Sizzle.selectors = {
1834
-
1835
- // Can be adjusted by the user
1836
- cacheLength: 50,
1837
-
1838
- createPseudo: markFunction,
1839
-
1840
- match: matchExpr,
1841
-
1842
- attrHandle: {},
1843
-
1844
- find: {},
1845
-
1846
- relative: {
1847
- ">": { dir: "parentNode", first: true },
1848
- " ": { dir: "parentNode" },
1849
- "+": { dir: "previousSibling", first: true },
1850
- "~": { dir: "previousSibling" }
1851
- },
1852
-
1853
- preFilter: {
1854
- "ATTR": function( match ) {
1855
- match[1] = match[1].replace( runescape, funescape );
1856
-
1857
- // Move the given value to match[3] whether quoted or unquoted
1858
- match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1859
-
1860
- if ( match[2] === "~=" ) {
1861
- match[3] = " " + match[3] + " ";
1862
- }
1863
-
1864
- return match.slice( 0, 4 );
1865
- },
1866
-
1867
- "CHILD": function( match ) {
1868
- /* matches from matchExpr["CHILD"]
1869
- 1 type (only|nth|...)
1870
- 2 what (child|of-type)
1871
- 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1872
- 4 xn-component of xn+y argument ([+-]?\d*n|)
1873
- 5 sign of xn-component
1874
- 6 x of xn-component
1875
- 7 sign of y-component
1876
- 8 y of y-component
1877
- */
1878
- match[1] = match[1].toLowerCase();
1879
-
1880
- if ( match[1].slice( 0, 3 ) === "nth" ) {
1881
- // nth-* requires argument
1882
- if ( !match[3] ) {
1883
- Sizzle.error( match[0] );
1884
- }
1885
-
1886
- // numeric x and y parameters for Expr.filter.CHILD
1887
- // remember that false/true cast respectively to 0/1
1888
- match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1889
- match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1890
-
1891
- // other types prohibit arguments
1892
- } else if ( match[3] ) {
1893
- Sizzle.error( match[0] );
1894
- }
1895
-
1896
- return match;
1897
- },
1898
-
1899
- "PSEUDO": function( match ) {
1900
- var excess,
1901
- unquoted = !match[6] && match[2];
1902
-
1903
- if ( matchExpr["CHILD"].test( match[0] ) ) {
1904
- return null;
1905
- }
1906
-
1907
- // Accept quoted arguments as-is
1908
- if ( match[3] ) {
1909
- match[2] = match[4] || match[5] || "";
1910
-
1911
- // Strip excess characters from unquoted arguments
1912
- } else if ( unquoted && rpseudo.test( unquoted ) &&
1913
- // Get excess from tokenize (recursively)
1914
- (excess = tokenize( unquoted, true )) &&
1915
- // advance to the next closing parenthesis
1916
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1917
-
1918
- // excess is a negative index
1919
- match[0] = match[0].slice( 0, excess );
1920
- match[2] = unquoted.slice( 0, excess );
1921
- }
1922
-
1923
- // Return only captures needed by the pseudo filter method (type and argument)
1924
- return match.slice( 0, 3 );
1925
- }
1926
- },
1927
-
1928
- filter: {
1929
-
1930
- "TAG": function( nodeNameSelector ) {
1931
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1932
- return nodeNameSelector === "*" ?
1933
- function() { return true; } :
1934
- function( elem ) {
1935
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1936
- };
1937
- },
1938
-
1939
- "CLASS": function( className ) {
1940
- var pattern = classCache[ className + " " ];
1941
-
1942
- return pattern ||
1943
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1944
- classCache( className, function( elem ) {
1945
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1946
- });
1947
- },
1948
-
1949
- "ATTR": function( name, operator, check ) {
1950
- return function( elem ) {
1951
- var result = Sizzle.attr( elem, name );
1952
-
1953
- if ( result == null ) {
1954
- return operator === "!=";
1955
- }
1956
- if ( !operator ) {
1957
- return true;
1958
- }
1959
-
1960
- result += "";
1961
-
1962
- return operator === "=" ? result === check :
1963
- operator === "!=" ? result !== check :
1964
- operator === "^=" ? check && result.indexOf( check ) === 0 :
1965
- operator === "*=" ? check && result.indexOf( check ) > -1 :
1966
- operator === "$=" ? check && result.slice( -check.length ) === check :
1967
- operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1968
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1969
- false;
1970
- };
1971
- },
1972
-
1973
- "CHILD": function( type, what, argument, first, last ) {
1974
- var simple = type.slice( 0, 3 ) !== "nth",
1975
- forward = type.slice( -4 ) !== "last",
1976
- ofType = what === "of-type";
1977
-
1978
- return first === 1 && last === 0 ?
1979
-
1980
- // Shortcut for :nth-*(n)
1981
- function( elem ) {
1982
- return !!elem.parentNode;
1983
- } :
1984
-
1985
- function( elem, context, xml ) {
1986
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
1987
- dir = simple !== forward ? "nextSibling" : "previousSibling",
1988
- parent = elem.parentNode,
1989
- name = ofType && elem.nodeName.toLowerCase(),
1990
- useCache = !xml && !ofType,
1991
- diff = false;
1992
-
1993
- if ( parent ) {
1994
-
1995
- // :(first|last|only)-(child|of-type)
1996
- if ( simple ) {
1997
- while ( dir ) {
1998
- node = elem;
1999
- while ( (node = node[ dir ]) ) {
2000
- if ( ofType ?
2001
- node.nodeName.toLowerCase() === name :
2002
- node.nodeType === 1 ) {
2003
-
2004
- return false;
2005
- }
2006
- }
2007
- // Reverse direction for :only-* (if we haven't yet done so)
2008
- start = dir = type === "only" && !start && "nextSibling";
2009
- }
2010
- return true;
2011
- }
2012
-
2013
- start = [ forward ? parent.firstChild : parent.lastChild ];
2014
-
2015
- // non-xml :nth-child(...) stores cache data on `parent`
2016
- if ( forward && useCache ) {
2017
-
2018
- // Seek `elem` from a previously-cached index
2019
-
2020
- // ...in a gzip-friendly way
2021
- node = parent;
2022
- outerCache = node[ expando ] || (node[ expando ] = {});
2023
-
2024
- // Support: IE <9 only
2025
- // Defend against cloned attroperties (jQuery gh-1709)
2026
- uniqueCache = outerCache[ node.uniqueID ] ||
2027
- (outerCache[ node.uniqueID ] = {});
2028
-
2029
- cache = uniqueCache[ type ] || [];
2030
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2031
- diff = nodeIndex && cache[ 2 ];
2032
- node = nodeIndex && parent.childNodes[ nodeIndex ];
2033
-
2034
- while ( (node = ++nodeIndex && node && node[ dir ] ||
2035
-
2036
- // Fallback to seeking `elem` from the start
2037
- (diff = nodeIndex = 0) || start.pop()) ) {
2038
-
2039
- // When found, cache indexes on `parent` and break
2040
- if ( node.nodeType === 1 && ++diff && node === elem ) {
2041
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
2042
- break;
2043
- }
2044
- }
2045
-
2046
- } else {
2047
- // Use previously-cached element index if available
2048
- if ( useCache ) {
2049
- // ...in a gzip-friendly way
2050
- node = elem;
2051
- outerCache = node[ expando ] || (node[ expando ] = {});
2052
-
2053
- // Support: IE <9 only
2054
- // Defend against cloned attroperties (jQuery gh-1709)
2055
- uniqueCache = outerCache[ node.uniqueID ] ||
2056
- (outerCache[ node.uniqueID ] = {});
2057
-
2058
- cache = uniqueCache[ type ] || [];
2059
- nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2060
- diff = nodeIndex;
2061
- }
2062
-
2063
- // xml :nth-child(...)
2064
- // or :nth-last-child(...) or :nth(-last)?-of-type(...)
2065
- if ( diff === false ) {
2066
- // Use the same loop as above to seek `elem` from the start
2067
- while ( (node = ++nodeIndex && node && node[ dir ] ||
2068
- (diff = nodeIndex = 0) || start.pop()) ) {
2069
-
2070
- if ( ( ofType ?
2071
- node.nodeName.toLowerCase() === name :
2072
- node.nodeType === 1 ) &&
2073
- ++diff ) {
2074
-
2075
- // Cache the index of each encountered element
2076
- if ( useCache ) {
2077
- outerCache = node[ expando ] || (node[ expando ] = {});
2078
-
2079
- // Support: IE <9 only
2080
- // Defend against cloned attroperties (jQuery gh-1709)
2081
- uniqueCache = outerCache[ node.uniqueID ] ||
2082
- (outerCache[ node.uniqueID ] = {});
2083
-
2084
- uniqueCache[ type ] = [ dirruns, diff ];
2085
- }
2086
-
2087
- if ( node === elem ) {
2088
- break;
2089
- }
2090
- }
2091
- }
2092
- }
2093
- }
2094
-
2095
- // Incorporate the offset, then check against cycle size
2096
- diff -= last;
2097
- return diff === first || ( diff % first === 0 && diff / first >= 0 );
2098
- }
2099
- };
2100
- },
2101
-
2102
- "PSEUDO": function( pseudo, argument ) {
2103
- // pseudo-class names are case-insensitive
2104
- // http://www.w3.org/TR/selectors/#pseudo-classes
2105
- // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2106
- // Remember that setFilters inherits from pseudos
2107
- var args,
2108
- fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2109
- Sizzle.error( "unsupported pseudo: " + pseudo );
2110
-
2111
- // The user may use createPseudo to indicate that
2112
- // arguments are needed to create the filter function
2113
- // just as Sizzle does
2114
- if ( fn[ expando ] ) {
2115
- return fn( argument );
2116
- }
2117
-
2118
- // But maintain support for old signatures
2119
- if ( fn.length > 1 ) {
2120
- args = [ pseudo, pseudo, "", argument ];
2121
- return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2122
- markFunction(function( seed, matches ) {
2123
- var idx,
2124
- matched = fn( seed, argument ),
2125
- i = matched.length;
2126
- while ( i-- ) {
2127
- idx = indexOf( seed, matched[i] );
2128
- seed[ idx ] = !( matches[ idx ] = matched[i] );
2129
- }
2130
- }) :
2131
- function( elem ) {
2132
- return fn( elem, 0, args );
2133
- };
2134
- }
2135
-
2136
- return fn;
2137
- }
2138
- },
2139
-
2140
- pseudos: {
2141
- // Potentially complex pseudos
2142
- "not": markFunction(function( selector ) {
2143
- // Trim the selector passed to compile
2144
- // to avoid treating leading and trailing
2145
- // spaces as combinators
2146
- var input = [],
2147
- results = [],
2148
- matcher = compile( selector.replace( rtrim, "$1" ) );
2149
-
2150
- return matcher[ expando ] ?
2151
- markFunction(function( seed, matches, context, xml ) {
2152
- var elem,
2153
- unmatched = matcher( seed, null, xml, [] ),
2154
- i = seed.length;
2155
-
2156
- // Match elements unmatched by `matcher`
2157
- while ( i-- ) {
2158
- if ( (elem = unmatched[i]) ) {
2159
- seed[i] = !(matches[i] = elem);
2160
- }
2161
- }
2162
- }) :
2163
- function( elem, context, xml ) {
2164
- input[0] = elem;
2165
- matcher( input, null, xml, results );
2166
- // Don't keep the element (issue #299)
2167
- input[0] = null;
2168
- return !results.pop();
2169
- };
2170
- }),
2171
-
2172
- "has": markFunction(function( selector ) {
2173
- return function( elem ) {
2174
- return Sizzle( selector, elem ).length > 0;
2175
- };
2176
- }),
2177
-
2178
- "contains": markFunction(function( text ) {
2179
- text = text.replace( runescape, funescape );
2180
- return function( elem ) {
2181
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
2182
- };
2183
- }),
2184
-
2185
- // "Whether an element is represented by a :lang() selector
2186
- // is based solely on the element's language value
2187
- // being equal to the identifier C,
2188
- // or beginning with the identifier C immediately followed by "-".
2189
- // The matching of C against the element's language value is performed case-insensitively.
2190
- // The identifier C does not have to be a valid language name."
2191
- // http://www.w3.org/TR/selectors/#lang-pseudo
2192
- "lang": markFunction( function( lang ) {
2193
- // lang value must be a valid identifier
2194
- if ( !ridentifier.test(lang || "") ) {
2195
- Sizzle.error( "unsupported lang: " + lang );
2196
- }
2197
- lang = lang.replace( runescape, funescape ).toLowerCase();
2198
- return function( elem ) {
2199
- var elemLang;
2200
- do {
2201
- if ( (elemLang = documentIsHTML ?
2202
- elem.lang :
2203
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2204
-
2205
- elemLang = elemLang.toLowerCase();
2206
- return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2207
- }
2208
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2209
- return false;
2210
- };
2211
- }),
2212
-
2213
- // Miscellaneous
2214
- "target": function( elem ) {
2215
- var hash = window.location && window.location.hash;
2216
- return hash && hash.slice( 1 ) === elem.id;
2217
- },
2218
-
2219
- "root": function( elem ) {
2220
- return elem === docElem;
2221
- },
2222
-
2223
- "focus": function( elem ) {
2224
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2225
- },
2226
-
2227
- // Boolean properties
2228
- "enabled": createDisabledPseudo( false ),
2229
- "disabled": createDisabledPseudo( true ),
2230
-
2231
- "checked": function( elem ) {
2232
- // In CSS3, :checked should return both checked and selected elements
2233
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2234
- var nodeName = elem.nodeName.toLowerCase();
2235
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2236
- },
2237
-
2238
- "selected": function( elem ) {
2239
- // Accessing this property makes selected-by-default
2240
- // options in Safari work properly
2241
- if ( elem.parentNode ) {
2242
- elem.parentNode.selectedIndex;
2243
- }
2244
-
2245
- return elem.selected === true;
2246
- },
2247
-
2248
- // Contents
2249
- "empty": function( elem ) {
2250
- // http://www.w3.org/TR/selectors/#empty-pseudo
2251
- // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2252
- // but not by others (comment: 8; processing instruction: 7; etc.)
2253
- // nodeType < 6 works because attributes (2) do not appear as children
2254
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2255
- if ( elem.nodeType < 6 ) {
2256
- return false;
2257
- }
2258
- }
2259
- return true;
2260
- },
2261
-
2262
- "parent": function( elem ) {
2263
- return !Expr.pseudos["empty"]( elem );
2264
- },
2265
-
2266
- // Element/input types
2267
- "header": function( elem ) {
2268
- return rheader.test( elem.nodeName );
2269
- },
2270
-
2271
- "input": function( elem ) {
2272
- return rinputs.test( elem.nodeName );
2273
- },
2274
-
2275
- "button": function( elem ) {
2276
- var name = elem.nodeName.toLowerCase();
2277
- return name === "input" && elem.type === "button" || name === "button";
2278
- },
2279
-
2280
- "text": function( elem ) {
2281
- var attr;
2282
- return elem.nodeName.toLowerCase() === "input" &&
2283
- elem.type === "text" &&
2284
-
2285
- // Support: IE<8
2286
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2287
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2288
- },
2289
-
2290
- // Position-in-collection
2291
- "first": createPositionalPseudo(function() {
2292
- return [ 0 ];
2293
- }),
2294
-
2295
- "last": createPositionalPseudo(function( matchIndexes, length ) {
2296
- return [ length - 1 ];
2297
- }),
2298
-
2299
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2300
- return [ argument < 0 ? argument + length : argument ];
2301
- }),
2302
-
2303
- "even": createPositionalPseudo(function( matchIndexes, length ) {
2304
- var i = 0;
2305
- for ( ; i < length; i += 2 ) {
2306
- matchIndexes.push( i );
2307
- }
2308
- return matchIndexes;
2309
- }),
2310
-
2311
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
2312
- var i = 1;
2313
- for ( ; i < length; i += 2 ) {
2314
- matchIndexes.push( i );
2315
- }
2316
- return matchIndexes;
2317
- }),
2318
-
2319
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2320
- var i = argument < 0 ? argument + length : argument;
2321
- for ( ; --i >= 0; ) {
2322
- matchIndexes.push( i );
2323
- }
2324
- return matchIndexes;
2325
- }),
2326
-
2327
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2328
- var i = argument < 0 ? argument + length : argument;
2329
- for ( ; ++i < length; ) {
2330
- matchIndexes.push( i );
2331
- }
2332
- return matchIndexes;
2333
- })
2334
- }
2335
- };
2336
-
2337
- Expr.pseudos["nth"] = Expr.pseudos["eq"];
2338
-
2339
- // Add button/input type pseudos
2340
- for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2341
- Expr.pseudos[ i ] = createInputPseudo( i );
2342
- }
2343
- for ( i in { submit: true, reset: true } ) {
2344
- Expr.pseudos[ i ] = createButtonPseudo( i );
2345
- }
2346
-
2347
- // Easy API for creating new setFilters
2348
- function setFilters() {}
2349
- setFilters.prototype = Expr.filters = Expr.pseudos;
2350
- Expr.setFilters = new setFilters();
2351
-
2352
- tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2353
- var matched, match, tokens, type,
2354
- soFar, groups, preFilters,
2355
- cached = tokenCache[ selector + " " ];
2356
-
2357
- if ( cached ) {
2358
- return parseOnly ? 0 : cached.slice( 0 );
2359
- }
2360
-
2361
- soFar = selector;
2362
- groups = [];
2363
- preFilters = Expr.preFilter;
2364
-
2365
- while ( soFar ) {
2366
-
2367
- // Comma and first run
2368
- if ( !matched || (match = rcomma.exec( soFar )) ) {
2369
- if ( match ) {
2370
- // Don't consume trailing commas as valid
2371
- soFar = soFar.slice( match[0].length ) || soFar;
2372
- }
2373
- groups.push( (tokens = []) );
2374
- }
2375
-
2376
- matched = false;
2377
-
2378
- // Combinators
2379
- if ( (match = rcombinators.exec( soFar )) ) {
2380
- matched = match.shift();
2381
- tokens.push({
2382
- value: matched,
2383
- // Cast descendant combinators to space
2384
- type: match[0].replace( rtrim, " " )
2385
- });
2386
- soFar = soFar.slice( matched.length );
2387
- }
2388
-
2389
- // Filters
2390
- for ( type in Expr.filter ) {
2391
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2392
- (match = preFilters[ type ]( match ))) ) {
2393
- matched = match.shift();
2394
- tokens.push({
2395
- value: matched,
2396
- type: type,
2397
- matches: match
2398
- });
2399
- soFar = soFar.slice( matched.length );
2400
- }
2401
- }
2402
-
2403
- if ( !matched ) {
2404
- break;
2405
- }
2406
- }
2407
-
2408
- // Return the length of the invalid excess
2409
- // if we're just parsing
2410
- // Otherwise, throw an error or return tokens
2411
- return parseOnly ?
2412
- soFar.length :
2413
- soFar ?
2414
- Sizzle.error( selector ) :
2415
- // Cache the tokens
2416
- tokenCache( selector, groups ).slice( 0 );
2417
- };
2418
-
2419
- function toSelector( tokens ) {
2420
- var i = 0,
2421
- len = tokens.length,
2422
- selector = "";
2423
- for ( ; i < len; i++ ) {
2424
- selector += tokens[i].value;
2425
- }
2426
- return selector;
2427
- }
2428
-
2429
- function addCombinator( matcher, combinator, base ) {
2430
- var dir = combinator.dir,
2431
- skip = combinator.next,
2432
- key = skip || dir,
2433
- checkNonElements = base && key === "parentNode",
2434
- doneName = done++;
2435
-
2436
- return combinator.first ?
2437
- // Check against closest ancestor/preceding element
2438
- function( elem, context, xml ) {
2439
- while ( (elem = elem[ dir ]) ) {
2440
- if ( elem.nodeType === 1 || checkNonElements ) {
2441
- return matcher( elem, context, xml );
2442
- }
2443
- }
2444
- return false;
2445
- } :
2446
-
2447
- // Check against all ancestor/preceding elements
2448
- function( elem, context, xml ) {
2449
- var oldCache, uniqueCache, outerCache,
2450
- newCache = [ dirruns, doneName ];
2451
-
2452
- // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2453
- if ( xml ) {
2454
- while ( (elem = elem[ dir ]) ) {
2455
- if ( elem.nodeType === 1 || checkNonElements ) {
2456
- if ( matcher( elem, context, xml ) ) {
2457
- return true;
2458
- }
2459
- }
2460
- }
2461
- } else {
2462
- while ( (elem = elem[ dir ]) ) {
2463
- if ( elem.nodeType === 1 || checkNonElements ) {
2464
- outerCache = elem[ expando ] || (elem[ expando ] = {});
2465
-
2466
- // Support: IE <9 only
2467
- // Defend against cloned attroperties (jQuery gh-1709)
2468
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2469
-
2470
- if ( skip && skip === elem.nodeName.toLowerCase() ) {
2471
- elem = elem[ dir ] || elem;
2472
- } else if ( (oldCache = uniqueCache[ key ]) &&
2473
- oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2474
-
2475
- // Assign to newCache so results back-propagate to previous elements
2476
- return (newCache[ 2 ] = oldCache[ 2 ]);
2477
- } else {
2478
- // Reuse newcache so results back-propagate to previous elements
2479
- uniqueCache[ key ] = newCache;
2480
-
2481
- // A match means we're done; a fail means we have to keep checking
2482
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2483
- return true;
2484
- }
2485
- }
2486
- }
2487
- }
2488
- }
2489
- return false;
2490
- };
2491
- }
2492
-
2493
- function elementMatcher( matchers ) {
2494
- return matchers.length > 1 ?
2495
- function( elem, context, xml ) {
2496
- var i = matchers.length;
2497
- while ( i-- ) {
2498
- if ( !matchers[i]( elem, context, xml ) ) {
2499
- return false;
2500
- }
2501
- }
2502
- return true;
2503
- } :
2504
- matchers[0];
2505
- }
2506
-
2507
- function multipleContexts( selector, contexts, results ) {
2508
- var i = 0,
2509
- len = contexts.length;
2510
- for ( ; i < len; i++ ) {
2511
- Sizzle( selector, contexts[i], results );
2512
- }
2513
- return results;
2514
- }
2515
-
2516
- function condense( unmatched, map, filter, context, xml ) {
2517
- var elem,
2518
- newUnmatched = [],
2519
- i = 0,
2520
- len = unmatched.length,
2521
- mapped = map != null;
2522
-
2523
- for ( ; i < len; i++ ) {
2524
- if ( (elem = unmatched[i]) ) {
2525
- if ( !filter || filter( elem, context, xml ) ) {
2526
- newUnmatched.push( elem );
2527
- if ( mapped ) {
2528
- map.push( i );
2529
- }
2530
- }
2531
- }
2532
- }
2533
-
2534
- return newUnmatched;
2535
- }
2536
-
2537
- function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2538
- if ( postFilter && !postFilter[ expando ] ) {
2539
- postFilter = setMatcher( postFilter );
2540
- }
2541
- if ( postFinder && !postFinder[ expando ] ) {
2542
- postFinder = setMatcher( postFinder, postSelector );
2543
- }
2544
- return markFunction(function( seed, results, context, xml ) {
2545
- var temp, i, elem,
2546
- preMap = [],
2547
- postMap = [],
2548
- preexisting = results.length,
2549
-
2550
- // Get initial elements from seed or context
2551
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2552
-
2553
- // Prefilter to get matcher input, preserving a map for seed-results synchronization
2554
- matcherIn = preFilter && ( seed || !selector ) ?
2555
- condense( elems, preMap, preFilter, context, xml ) :
2556
- elems,
2557
-
2558
- matcherOut = matcher ?
2559
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2560
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2561
-
2562
- // ...intermediate processing is necessary
2563
- [] :
2564
-
2565
- // ...otherwise use results directly
2566
- results :
2567
- matcherIn;
2568
-
2569
- // Find primary matches
2570
- if ( matcher ) {
2571
- matcher( matcherIn, matcherOut, context, xml );
2572
- }
2573
-
2574
- // Apply postFilter
2575
- if ( postFilter ) {
2576
- temp = condense( matcherOut, postMap );
2577
- postFilter( temp, [], context, xml );
2578
-
2579
- // Un-match failing elements by moving them back to matcherIn
2580
- i = temp.length;
2581
- while ( i-- ) {
2582
- if ( (elem = temp[i]) ) {
2583
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2584
- }
2585
- }
2586
- }
2587
-
2588
- if ( seed ) {
2589
- if ( postFinder || preFilter ) {
2590
- if ( postFinder ) {
2591
- // Get the final matcherOut by condensing this intermediate into postFinder contexts
2592
- temp = [];
2593
- i = matcherOut.length;
2594
- while ( i-- ) {
2595
- if ( (elem = matcherOut[i]) ) {
2596
- // Restore matcherIn since elem is not yet a final match
2597
- temp.push( (matcherIn[i] = elem) );
2598
- }
2599
- }
2600
- postFinder( null, (matcherOut = []), temp, xml );
2601
- }
2602
-
2603
- // Move matched elements from seed to results to keep them synchronized
2604
- i = matcherOut.length;
2605
- while ( i-- ) {
2606
- if ( (elem = matcherOut[i]) &&
2607
- (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2608
-
2609
- seed[temp] = !(results[temp] = elem);
2610
- }
2611
- }
2612
- }
2613
-
2614
- // Add elements to results, through postFinder if defined
2615
- } else {
2616
- matcherOut = condense(
2617
- matcherOut === results ?
2618
- matcherOut.splice( preexisting, matcherOut.length ) :
2619
- matcherOut
2620
- );
2621
- if ( postFinder ) {
2622
- postFinder( null, results, matcherOut, xml );
2623
- } else {
2624
- push.apply( results, matcherOut );
2625
- }
2626
- }
2627
- });
2628
- }
2629
-
2630
- function matcherFromTokens( tokens ) {
2631
- var checkContext, matcher, j,
2632
- len = tokens.length,
2633
- leadingRelative = Expr.relative[ tokens[0].type ],
2634
- implicitRelative = leadingRelative || Expr.relative[" "],
2635
- i = leadingRelative ? 1 : 0,
2636
-
2637
- // The foundational matcher ensures that elements are reachable from top-level context(s)
2638
- matchContext = addCombinator( function( elem ) {
2639
- return elem === checkContext;
2640
- }, implicitRelative, true ),
2641
- matchAnyContext = addCombinator( function( elem ) {
2642
- return indexOf( checkContext, elem ) > -1;
2643
- }, implicitRelative, true ),
2644
- matchers = [ function( elem, context, xml ) {
2645
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2646
- (checkContext = context).nodeType ?
2647
- matchContext( elem, context, xml ) :
2648
- matchAnyContext( elem, context, xml ) );
2649
- // Avoid hanging onto element (issue #299)
2650
- checkContext = null;
2651
- return ret;
2652
- } ];
2653
-
2654
- for ( ; i < len; i++ ) {
2655
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2656
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2657
- } else {
2658
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2659
-
2660
- // Return special upon seeing a positional matcher
2661
- if ( matcher[ expando ] ) {
2662
- // Find the next relative operator (if any) for proper handling
2663
- j = ++i;
2664
- for ( ; j < len; j++ ) {
2665
- if ( Expr.relative[ tokens[j].type ] ) {
2666
- break;
2667
- }
2668
- }
2669
- return setMatcher(
2670
- i > 1 && elementMatcher( matchers ),
2671
- i > 1 && toSelector(
2672
- // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2673
- tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2674
- ).replace( rtrim, "$1" ),
2675
- matcher,
2676
- i < j && matcherFromTokens( tokens.slice( i, j ) ),
2677
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2678
- j < len && toSelector( tokens )
2679
- );
2680
- }
2681
- matchers.push( matcher );
2682
- }
2683
- }
2684
-
2685
- return elementMatcher( matchers );
2686
- }
2687
-
2688
- function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2689
- var bySet = setMatchers.length > 0,
2690
- byElement = elementMatchers.length > 0,
2691
- superMatcher = function( seed, context, xml, results, outermost ) {
2692
- var elem, j, matcher,
2693
- matchedCount = 0,
2694
- i = "0",
2695
- unmatched = seed && [],
2696
- setMatched = [],
2697
- contextBackup = outermostContext,
2698
- // We must always have either seed elements or outermost context
2699
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2700
- // Use integer dirruns iff this is the outermost matcher
2701
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2702
- len = elems.length;
2703
-
2704
- if ( outermost ) {
2705
- outermostContext = context === document || context || outermost;
2706
- }
2707
-
2708
- // Add elements passing elementMatchers directly to results
2709
- // Support: IE<9, Safari
2710
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2711
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2712
- if ( byElement && elem ) {
2713
- j = 0;
2714
- if ( !context && elem.ownerDocument !== document ) {
2715
- setDocument( elem );
2716
- xml = !documentIsHTML;
2717
- }
2718
- while ( (matcher = elementMatchers[j++]) ) {
2719
- if ( matcher( elem, context || document, xml) ) {
2720
- results.push( elem );
2721
- break;
2722
- }
2723
- }
2724
- if ( outermost ) {
2725
- dirruns = dirrunsUnique;
2726
- }
2727
- }
2728
-
2729
- // Track unmatched elements for set filters
2730
- if ( bySet ) {
2731
- // They will have gone through all possible matchers
2732
- if ( (elem = !matcher && elem) ) {
2733
- matchedCount--;
2734
- }
2735
-
2736
- // Lengthen the array for every element, matched or not
2737
- if ( seed ) {
2738
- unmatched.push( elem );
2739
- }
2740
- }
2741
- }
2742
-
2743
- // `i` is now the count of elements visited above, and adding it to `matchedCount`
2744
- // makes the latter nonnegative.
2745
- matchedCount += i;
2746
-
2747
- // Apply set filters to unmatched elements
2748
- // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2749
- // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2750
- // no element matchers and no seed.
2751
- // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2752
- // case, which will result in a "00" `matchedCount` that differs from `i` but is also
2753
- // numerically zero.
2754
- if ( bySet && i !== matchedCount ) {
2755
- j = 0;
2756
- while ( (matcher = setMatchers[j++]) ) {
2757
- matcher( unmatched, setMatched, context, xml );
2758
- }
2759
-
2760
- if ( seed ) {
2761
- // Reintegrate element matches to eliminate the need for sorting
2762
- if ( matchedCount > 0 ) {
2763
- while ( i-- ) {
2764
- if ( !(unmatched[i] || setMatched[i]) ) {
2765
- setMatched[i] = pop.call( results );
2766
- }
2767
- }
2768
- }
2769
-
2770
- // Discard index placeholder values to get only actual matches
2771
- setMatched = condense( setMatched );
2772
- }
2773
-
2774
- // Add matches to results
2775
- push.apply( results, setMatched );
2776
-
2777
- // Seedless set matches succeeding multiple successful matchers stipulate sorting
2778
- if ( outermost && !seed && setMatched.length > 0 &&
2779
- ( matchedCount + setMatchers.length ) > 1 ) {
2780
-
2781
- Sizzle.uniqueSort( results );
2782
- }
2783
- }
2784
-
2785
- // Override manipulation of globals by nested matchers
2786
- if ( outermost ) {
2787
- dirruns = dirrunsUnique;
2788
- outermostContext = contextBackup;
2789
- }
2790
-
2791
- return unmatched;
2792
- };
2793
-
2794
- return bySet ?
2795
- markFunction( superMatcher ) :
2796
- superMatcher;
2797
- }
2798
-
2799
- compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2800
- var i,
2801
- setMatchers = [],
2802
- elementMatchers = [],
2803
- cached = compilerCache[ selector + " " ];
2804
-
2805
- if ( !cached ) {
2806
- // Generate a function of recursive functions that can be used to check each element
2807
- if ( !match ) {
2808
- match = tokenize( selector );
2809
- }
2810
- i = match.length;
2811
- while ( i-- ) {
2812
- cached = matcherFromTokens( match[i] );
2813
- if ( cached[ expando ] ) {
2814
- setMatchers.push( cached );
2815
- } else {
2816
- elementMatchers.push( cached );
2817
- }
2818
- }
2819
-
2820
- // Cache the compiled function
2821
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2822
-
2823
- // Save selector and tokenization
2824
- cached.selector = selector;
2825
- }
2826
- return cached;
2827
- };
2828
-
2829
- /**
2830
- * A low-level selection function that works with Sizzle's compiled
2831
- * selector functions
2832
- * @param {String|Function} selector A selector or a pre-compiled
2833
- * selector function built with Sizzle.compile
2834
- * @param {Element} context
2835
- * @param {Array} [results]
2836
- * @param {Array} [seed] A set of elements to match against
2837
- */
2838
- select = Sizzle.select = function( selector, context, results, seed ) {
2839
- var i, tokens, token, type, find,
2840
- compiled = typeof selector === "function" && selector,
2841
- match = !seed && tokenize( (selector = compiled.selector || selector) );
2842
-
2843
- results = results || [];
2844
-
2845
- // Try to minimize operations if there is only one selector in the list and no seed
2846
- // (the latter of which guarantees us context)
2847
- if ( match.length === 1 ) {
2848
-
2849
- // Reduce context if the leading compound selector is an ID
2850
- tokens = match[0] = match[0].slice( 0 );
2851
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2852
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2853
-
2854
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2855
- if ( !context ) {
2856
- return results;
2857
-
2858
- // Precompiled matchers will still verify ancestry, so step up a level
2859
- } else if ( compiled ) {
2860
- context = context.parentNode;
2861
- }
2862
-
2863
- selector = selector.slice( tokens.shift().value.length );
2864
- }
2865
-
2866
- // Fetch a seed set for right-to-left matching
2867
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2868
- while ( i-- ) {
2869
- token = tokens[i];
2870
-
2871
- // Abort if we hit a combinator
2872
- if ( Expr.relative[ (type = token.type) ] ) {
2873
- break;
2874
- }
2875
- if ( (find = Expr.find[ type ]) ) {
2876
- // Search, expanding context for leading sibling combinators
2877
- if ( (seed = find(
2878
- token.matches[0].replace( runescape, funescape ),
2879
- rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2880
- )) ) {
2881
-
2882
- // If seed is empty or no tokens remain, we can return early
2883
- tokens.splice( i, 1 );
2884
- selector = seed.length && toSelector( tokens );
2885
- if ( !selector ) {
2886
- push.apply( results, seed );
2887
- return results;
2888
- }
2889
-
2890
- break;
2891
- }
2892
- }
2893
- }
2894
- }
2895
-
2896
- // Compile and execute a filtering function if one is not provided
2897
- // Provide `match` to avoid retokenization if we modified the selector above
2898
- ( compiled || compile( selector, match ) )(
2899
- seed,
2900
- context,
2901
- !documentIsHTML,
2902
- results,
2903
- !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2904
- );
2905
- return results;
2906
- };
2907
-
2908
- // One-time assignments
2909
-
2910
- // Sort stability
2911
- support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2912
-
2913
- // Support: Chrome 14-35+
2914
- // Always assume duplicates if they aren't passed to the comparison function
2915
- support.detectDuplicates = !!hasDuplicate;
2916
-
2917
- // Initialize against the default document
2918
- setDocument();
2919
-
2920
- // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2921
- // Detached nodes confoundingly follow *each other*
2922
- support.sortDetached = assert(function( el ) {
2923
- // Should return 1, but returns 4 (following)
2924
- return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2925
- });
2926
-
2927
- // Support: IE<8
2928
- // Prevent attribute/property "interpolation"
2929
- // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2930
- if ( !assert(function( el ) {
2931
- el.innerHTML = "<a href='#'></a>";
2932
- return el.firstChild.getAttribute("href") === "#" ;
2933
- }) ) {
2934
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
2935
- if ( !isXML ) {
2936
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2937
- }
2938
- });
2939
- }
2940
-
2941
- // Support: IE<9
2942
- // Use defaultValue in place of getAttribute("value")
2943
- if ( !support.attributes || !assert(function( el ) {
2944
- el.innerHTML = "<input/>";
2945
- el.firstChild.setAttribute( "value", "" );
2946
- return el.firstChild.getAttribute( "value" ) === "";
2947
- }) ) {
2948
- addHandle( "value", function( elem, name, isXML ) {
2949
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2950
- return elem.defaultValue;
2951
- }
2952
- });
2953
- }
2954
-
2955
- // Support: IE<9
2956
- // Use getAttributeNode to fetch booleans when getAttribute lies
2957
- if ( !assert(function( el ) {
2958
- return el.getAttribute("disabled") == null;
2959
- }) ) {
2960
- addHandle( booleans, function( elem, name, isXML ) {
2961
- var val;
2962
- if ( !isXML ) {
2963
- return elem[ name ] === true ? name.toLowerCase() :
2964
- (val = elem.getAttributeNode( name )) && val.specified ?
2965
- val.value :
2966
- null;
2967
- }
2968
- });
2969
- }
2970
-
2971
- return Sizzle;
2972
-
2973
- })( window );
2974
-
2975
-
2976
-
2977
- jQuery.find = Sizzle;
2978
- jQuery.expr = Sizzle.selectors;
2979
-
2980
- // Deprecated
2981
- jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2982
- jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2983
- jQuery.text = Sizzle.getText;
2984
- jQuery.isXMLDoc = Sizzle.isXML;
2985
- jQuery.contains = Sizzle.contains;
2986
- jQuery.escapeSelector = Sizzle.escape;
2987
-
2988
-
2989
-
2990
-
2991
- var dir = function( elem, dir, until ) {
2992
- var matched = [],
2993
- truncate = until !== undefined;
2994
-
2995
- while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2996
- if ( elem.nodeType === 1 ) {
2997
- if ( truncate && jQuery( elem ).is( until ) ) {
2998
- break;
2999
- }
3000
- matched.push( elem );
3001
- }
3002
- }
3003
- return matched;
3004
- };
3005
-
3006
-
3007
- var siblings = function( n, elem ) {
3008
- var matched = [];
3009
-
3010
- for ( ; n; n = n.nextSibling ) {
3011
- if ( n.nodeType === 1 && n !== elem ) {
3012
- matched.push( n );
3013
- }
3014
- }
3015
-
3016
- return matched;
3017
- };
3018
-
3019
-
3020
- var rneedsContext = jQuery.expr.match.needsContext;
3021
-
3022
-
3023
-
3024
- function nodeName( elem, name ) {
3025
-
3026
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
3027
-
3028
- };
3029
- var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
3030
-
3031
-
3032
-
3033
- // Implement the identical functionality for filter and not
3034
- function winnow( elements, qualifier, not ) {
3035
- if ( isFunction( qualifier ) ) {
3036
- return jQuery.grep( elements, function( elem, i ) {
3037
- return !!qualifier.call( elem, i, elem ) !== not;
3038
- } );
3039
- }
3040
-
3041
- // Single element
3042
- if ( qualifier.nodeType ) {
3043
- return jQuery.grep( elements, function( elem ) {
3044
- return ( elem === qualifier ) !== not;
3045
- } );
3046
- }
3047
-
3048
- // Arraylike of elements (jQuery, arguments, Array)
3049
- if ( typeof qualifier !== "string" ) {
3050
- return jQuery.grep( elements, function( elem ) {
3051
- return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
3052
- } );
3053
- }
3054
-
3055
- // Filtered directly for both simple and complex selectors
3056
- return jQuery.filter( qualifier, elements, not );
3057
- }
3058
-
3059
- jQuery.filter = function( expr, elems, not ) {
3060
- var elem = elems[ 0 ];
3061
-
3062
- if ( not ) {
3063
- expr = ":not(" + expr + ")";
3064
- }
3065
-
3066
- if ( elems.length === 1 && elem.nodeType === 1 ) {
3067
- return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
3068
- }
3069
-
3070
- return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
3071
- return elem.nodeType === 1;
3072
- } ) );
3073
- };
3074
-
3075
- jQuery.fn.extend( {
3076
- find: function( selector ) {
3077
- var i, ret,
3078
- len = this.length,
3079
- self = this;
3080
-
3081
- if ( typeof selector !== "string" ) {
3082
- return this.pushStack( jQuery( selector ).filter( function() {
3083
- for ( i = 0; i < len; i++ ) {
3084
- if ( jQuery.contains( self[ i ], this ) ) {
3085
- return true;
3086
- }
3087
- }
3088
- } ) );
3089
- }
3090
-
3091
- ret = this.pushStack( [] );
3092
-
3093
- for ( i = 0; i < len; i++ ) {
3094
- jQuery.find( selector, self[ i ], ret );
3095
- }
3096
-
3097
- return len > 1 ? jQuery.uniqueSort( ret ) : ret;
3098
- },
3099
- filter: function( selector ) {
3100
- return this.pushStack( winnow( this, selector || [], false ) );
3101
- },
3102
- not: function( selector ) {
3103
- return this.pushStack( winnow( this, selector || [], true ) );
3104
- },
3105
- is: function( selector ) {
3106
- return !!winnow(
3107
- this,
3108
-
3109
- // If this is a positional/relative selector, check membership in the returned set
3110
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
3111
- typeof selector === "string" && rneedsContext.test( selector ) ?
3112
- jQuery( selector ) :
3113
- selector || [],
3114
- false
3115
- ).length;
3116
- }
3117
- } );
3118
-
3119
-
3120
- // Initialize a jQuery object
3121
-
3122
-
3123
- // A central reference to the root jQuery(document)
3124
- var rootjQuery,
3125
-
3126
- // A simple way to check for HTML strings
3127
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
3128
- // Strict HTML recognition (#11290: must start with <)
3129
- // Shortcut simple #id case for speed
3130
- rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
3131
-
3132
- init = jQuery.fn.init = function( selector, context, root ) {
3133
- var match, elem;
3134
-
3135
- // HANDLE: $(""), $(null), $(undefined), $(false)
3136
- if ( !selector ) {
3137
- return this;
3138
- }
3139
-
3140
- // Method init() accepts an alternate rootjQuery
3141
- // so migrate can support jQuery.sub (gh-2101)
3142
- root = root || rootjQuery;
3143
-
3144
- // Handle HTML strings
3145
- if ( typeof selector === "string" ) {
3146
- if ( selector[ 0 ] === "<" &&
3147
- selector[ selector.length - 1 ] === ">" &&
3148
- selector.length >= 3 ) {
3149
-
3150
- // Assume that strings that start and end with <> are HTML and skip the regex check
3151
- match = [ null, selector, null ];
3152
-
3153
- } else {
3154
- match = rquickExpr.exec( selector );
3155
- }
3156
-
3157
- // Match html or make sure no context is specified for #id
3158
- if ( match && ( match[ 1 ] || !context ) ) {
3159
-
3160
- // HANDLE: $(html) -> $(array)
3161
- if ( match[ 1 ] ) {
3162
- context = context instanceof jQuery ? context[ 0 ] : context;
3163
-
3164
- // Option to run scripts is true for back-compat
3165
- // Intentionally let the error be thrown if parseHTML is not present
3166
- jQuery.merge( this, jQuery.parseHTML(
3167
- match[ 1 ],
3168
- context && context.nodeType ? context.ownerDocument || context : document,
3169
- true
3170
- ) );
3171
-
3172
- // HANDLE: $(html, props)
3173
- if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
3174
- for ( match in context ) {
3175
-
3176
- // Properties of context are called as methods if possible
3177
- if ( isFunction( this[ match ] ) ) {
3178
- this[ match ]( context[ match ] );
3179
-
3180
- // ...and otherwise set as attributes
3181
- } else {
3182
- this.attr( match, context[ match ] );
3183
- }
3184
- }
3185
- }
3186
-
3187
- return this;
3188
-
3189
- // HANDLE: $(#id)
3190
- } else {
3191
- elem = document.getElementById( match[ 2 ] );
3192
-
3193
- if ( elem ) {
3194
-
3195
- // Inject the element directly into the jQuery object
3196
- this[ 0 ] = elem;
3197
- this.length = 1;
3198
- }
3199
- return this;
3200
- }
3201
-
3202
- // HANDLE: $(expr, $(...))
3203
- } else if ( !context || context.jquery ) {
3204
- return ( context || root ).find( selector );
3205
-
3206
- // HANDLE: $(expr, context)
3207
- // (which is just equivalent to: $(context).find(expr)
3208
- } else {
3209
- return this.constructor( context ).find( selector );
3210
- }
3211
-
3212
- // HANDLE: $(DOMElement)
3213
- } else if ( selector.nodeType ) {
3214
- this[ 0 ] = selector;
3215
- this.length = 1;
3216
- return this;
3217
-
3218
- // HANDLE: $(function)
3219
- // Shortcut for document ready
3220
- } else if ( isFunction( selector ) ) {
3221
- return root.ready !== undefined ?
3222
- root.ready( selector ) :
3223
-
3224
- // Execute immediately if ready is not present
3225
- selector( jQuery );
3226
- }
3227
-
3228
- return jQuery.makeArray( selector, this );
3229
- };
3230
-
3231
- // Give the init function the jQuery prototype for later instantiation
3232
- init.prototype = jQuery.fn;
3233
-
3234
- // Initialize central reference
3235
- rootjQuery = jQuery( document );
3236
-
3237
-
3238
- var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3239
-
3240
- // Methods guaranteed to produce a unique set when starting from a unique set
3241
- guaranteedUnique = {
3242
- children: true,
3243
- contents: true,
3244
- next: true,
3245
- prev: true
3246
- };
3247
-
3248
- jQuery.fn.extend( {
3249
- has: function( target ) {
3250
- var targets = jQuery( target, this ),
3251
- l = targets.length;
3252
-
3253
- return this.filter( function() {
3254
- var i = 0;
3255
- for ( ; i < l; i++ ) {
3256
- if ( jQuery.contains( this, targets[ i ] ) ) {
3257
- return true;
3258
- }
3259
- }
3260
- } );
3261
- },
3262
-
3263
- closest: function( selectors, context ) {
3264
- var cur,
3265
- i = 0,
3266
- l = this.length,
3267
- matched = [],
3268
- targets = typeof selectors !== "string" && jQuery( selectors );
3269
-
3270
- // Positional selectors never match, since there's no _selection_ context
3271
- if ( !rneedsContext.test( selectors ) ) {
3272
- for ( ; i < l; i++ ) {
3273
- for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3274
-
3275
- // Always skip document fragments
3276
- if ( cur.nodeType < 11 && ( targets ?
3277
- targets.index( cur ) > -1 :
3278
-
3279
- // Don't pass non-elements to Sizzle
3280
- cur.nodeType === 1 &&
3281
- jQuery.find.matchesSelector( cur, selectors ) ) ) {
3282
-
3283
- matched.push( cur );
3284
- break;
3285
- }
3286
- }
3287
- }
3288
- }
3289
-
3290
- return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3291
- },
3292
-
3293
- // Determine the position of an element within the set
3294
- index: function( elem ) {
3295
-
3296
- // No argument, return index in parent
3297
- if ( !elem ) {
3298
- return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3299
- }
3300
-
3301
- // Index in selector
3302
- if ( typeof elem === "string" ) {
3303
- return indexOf.call( jQuery( elem ), this[ 0 ] );
3304
- }
3305
-
3306
- // Locate the position of the desired element
3307
- return indexOf.call( this,
3308
-
3309
- // If it receives a jQuery object, the first element is used
3310
- elem.jquery ? elem[ 0 ] : elem
3311
- );
3312
- },
3313
-
3314
- add: function( selector, context ) {
3315
- return this.pushStack(
3316
- jQuery.uniqueSort(
3317
- jQuery.merge( this.get(), jQuery( selector, context ) )
3318
- )
3319
- );
3320
- },
3321
-
3322
- addBack: function( selector ) {
3323
- return this.add( selector == null ?
3324
- this.prevObject : this.prevObject.filter( selector )
3325
- );
3326
- }
3327
- } );
3328
-
3329
- function sibling( cur, dir ) {
3330
- while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3331
- return cur;
3332
- }
3333
-
3334
- jQuery.each( {
3335
- parent: function( elem ) {
3336
- var parent = elem.parentNode;
3337
- return parent && parent.nodeType !== 11 ? parent : null;
3338
- },
3339
- parents: function( elem ) {
3340
- return dir( elem, "parentNode" );
3341
- },
3342
- parentsUntil: function( elem, i, until ) {
3343
- return dir( elem, "parentNode", until );
3344
- },
3345
- next: function( elem ) {
3346
- return sibling( elem, "nextSibling" );
3347
- },
3348
- prev: function( elem ) {
3349
- return sibling( elem, "previousSibling" );
3350
- },
3351
- nextAll: function( elem ) {
3352
- return dir( elem, "nextSibling" );
3353
- },
3354
- prevAll: function( elem ) {
3355
- return dir( elem, "previousSibling" );
3356
- },
3357
- nextUntil: function( elem, i, until ) {
3358
- return dir( elem, "nextSibling", until );
3359
- },
3360
- prevUntil: function( elem, i, until ) {
3361
- return dir( elem, "previousSibling", until );
3362
- },
3363
- siblings: function( elem ) {
3364
- return siblings( ( elem.parentNode || {} ).firstChild, elem );
3365
- },
3366
- children: function( elem ) {
3367
- return siblings( elem.firstChild );
3368
- },
3369
- contents: function( elem ) {
3370
- if ( nodeName( elem, "iframe" ) ) {
3371
- return elem.contentDocument;
3372
- }
3373
-
3374
- // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3375
- // Treat the template element as a regular one in browsers that
3376
- // don't support it.
3377
- if ( nodeName( elem, "template" ) ) {
3378
- elem = elem.content || elem;
3379
- }
3380
-
3381
- return jQuery.merge( [], elem.childNodes );
3382
- }
3383
- }, function( name, fn ) {
3384
- jQuery.fn[ name ] = function( until, selector ) {
3385
- var matched = jQuery.map( this, fn, until );
3386
-
3387
- if ( name.slice( -5 ) !== "Until" ) {
3388
- selector = until;
3389
- }
3390
-
3391
- if ( selector && typeof selector === "string" ) {
3392
- matched = jQuery.filter( selector, matched );
3393
- }
3394
-
3395
- if ( this.length > 1 ) {
3396
-
3397
- // Remove duplicates
3398
- if ( !guaranteedUnique[ name ] ) {
3399
- jQuery.uniqueSort( matched );
3400
- }
3401
-
3402
- // Reverse order for parents* and prev-derivatives
3403
- if ( rparentsprev.test( name ) ) {
3404
- matched.reverse();
3405
- }
3406
- }
3407
-
3408
- return this.pushStack( matched );
3409
- };
3410
- } );
3411
- var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3412
-
3413
-
3414
-
3415
- // Convert String-formatted options into Object-formatted ones
3416
- function createOptions( options ) {
3417
- var object = {};
3418
- jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3419
- object[ flag ] = true;
3420
- } );
3421
- return object;
3422
- }
3423
-
3424
- /*
3425
- * Create a callback list using the following parameters:
3426
- *
3427
- * options: an optional list of space-separated options that will change how
3428
- * the callback list behaves or a more traditional option object
3429
- *
3430
- * By default a callback list will act like an event callback list and can be
3431
- * "fired" multiple times.
3432
- *
3433
- * Possible options:
3434
- *
3435
- * once: will ensure the callback list can only be fired once (like a Deferred)
3436
- *
3437
- * memory: will keep track of previous values and will call any callback added
3438
- * after the list has been fired right away with the latest "memorized"
3439
- * values (like a Deferred)
3440
- *
3441
- * unique: will ensure a callback can only be added once (no duplicate in the list)
3442
- *
3443
- * stopOnFalse: interrupt callings when a callback returns false
3444
- *
3445
- */
3446
- jQuery.Callbacks = function( options ) {
3447
-
3448
- // Convert options from String-formatted to Object-formatted if needed
3449
- // (we check in cache first)
3450
- options = typeof options === "string" ?
3451
- createOptions( options ) :
3452
- jQuery.extend( {}, options );
3453
-
3454
- var // Flag to know if list is currently firing
3455
- firing,
3456
-
3457
- // Last fire value for non-forgettable lists
3458
- memory,
3459
-
3460
- // Flag to know if list was already fired
3461
- fired,
3462
-
3463
- // Flag to prevent firing
3464
- locked,
3465
-
3466
- // Actual callback list
3467
- list = [],
3468
-
3469
- // Queue of execution data for repeatable lists
3470
- queue = [],
3471
-
3472
- // Index of currently firing callback (modified by add/remove as needed)
3473
- firingIndex = -1,
3474
-
3475
- // Fire callbacks
3476
- fire = function() {
3477
-
3478
- // Enforce single-firing
3479
- locked = locked || options.once;
3480
-
3481
- // Execute callbacks for all pending executions,
3482
- // respecting firingIndex overrides and runtime changes
3483
- fired = firing = true;
3484
- for ( ; queue.length; firingIndex = -1 ) {
3485
- memory = queue.shift();
3486
- while ( ++firingIndex < list.length ) {
3487
-
3488
- // Run callback and check for early termination
3489
- if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3490
- options.stopOnFalse ) {
3491
-
3492
- // Jump to end and forget the data so .add doesn't re-fire
3493
- firingIndex = list.length;
3494
- memory = false;
3495
- }
3496
- }
3497
- }
3498
-
3499
- // Forget the data if we're done with it
3500
- if ( !options.memory ) {
3501
- memory = false;
3502
- }
3503
-
3504
- firing = false;
3505
-
3506
- // Clean up if we're done firing for good
3507
- if ( locked ) {
3508
-
3509
- // Keep an empty list if we have data for future add calls
3510
- if ( memory ) {
3511
- list = [];
3512
-
3513
- // Otherwise, this object is spent
3514
- } else {
3515
- list = "";
3516
- }
3517
- }
3518
- },
3519
-
3520
- // Actual Callbacks object
3521
- self = {
3522
-
3523
- // Add a callback or a collection of callbacks to the list
3524
- add: function() {
3525
- if ( list ) {
3526
-
3527
- // If we have memory from a past run, we should fire after adding
3528
- if ( memory && !firing ) {
3529
- firingIndex = list.length - 1;
3530
- queue.push( memory );
3531
- }
3532
-
3533
- ( function add( args ) {
3534
- jQuery.each( args, function( _, arg ) {
3535
- if ( isFunction( arg ) ) {
3536
- if ( !options.unique || !self.has( arg ) ) {
3537
- list.push( arg );
3538
- }
3539
- } else if ( arg && arg.length && toType( arg ) !== "string" ) {
3540
-
3541
- // Inspect recursively
3542
- add( arg );
3543
- }
3544
- } );
3545
- } )( arguments );
3546
-
3547
- if ( memory && !firing ) {
3548
- fire();
3549
- }
3550
- }
3551
- return this;
3552
- },
3553
-
3554
- // Remove a callback from the list
3555
- remove: function() {
3556
- jQuery.each( arguments, function( _, arg ) {
3557
- var index;
3558
- while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3559
- list.splice( index, 1 );
3560
-
3561
- // Handle firing indexes
3562
- if ( index <= firingIndex ) {
3563
- firingIndex--;
3564
- }
3565
- }
3566
- } );
3567
- return this;
3568
- },
3569
-
3570
- // Check if a given callback is in the list.
3571
- // If no argument is given, return whether or not list has callbacks attached.
3572
- has: function( fn ) {
3573
- return fn ?
3574
- jQuery.inArray( fn, list ) > -1 :
3575
- list.length > 0;
3576
- },
3577
-
3578
- // Remove all callbacks from the list
3579
- empty: function() {
3580
- if ( list ) {
3581
- list = [];
3582
- }
3583
- return this;
3584
- },
3585
-
3586
- // Disable .fire and .add
3587
- // Abort any current/pending executions
3588
- // Clear all callbacks and values
3589
- disable: function() {
3590
- locked = queue = [];
3591
- list = memory = "";
3592
- return this;
3593
- },
3594
- disabled: function() {
3595
- return !list;
3596
- },
3597
-
3598
- // Disable .fire
3599
- // Also disable .add unless we have memory (since it would have no effect)
3600
- // Abort any pending executions
3601
- lock: function() {
3602
- locked = queue = [];
3603
- if ( !memory && !firing ) {
3604
- list = memory = "";
3605
- }
3606
- return this;
3607
- },
3608
- locked: function() {
3609
- return !!locked;
3610
- },
3611
-
3612
- // Call all callbacks with the given context and arguments
3613
- fireWith: function( context, args ) {
3614
- if ( !locked ) {
3615
- args = args || [];
3616
- args = [ context, args.slice ? args.slice() : args ];
3617
- queue.push( args );
3618
- if ( !firing ) {
3619
- fire();
3620
- }
3621
- }
3622
- return this;
3623
- },
3624
-
3625
- // Call all the callbacks with the given arguments
3626
- fire: function() {
3627
- self.fireWith( this, arguments );
3628
- return this;
3629
- },
3630
-
3631
- // To know if the callbacks have already been called at least once
3632
- fired: function() {
3633
- return !!fired;
3634
- }
3635
- };
3636
-
3637
- return self;
3638
- };
3639
-
3640
-
3641
- function Identity( v ) {
3642
- return v;
3643
- }
3644
- function Thrower( ex ) {
3645
- throw ex;
3646
- }
3647
-
3648
- function adoptValue( value, resolve, reject, noValue ) {
3649
- var method;
3650
-
3651
- try {
3652
-
3653
- // Check for promise aspect first to privilege synchronous behavior
3654
- if ( value && isFunction( ( method = value.promise ) ) ) {
3655
- method.call( value ).done( resolve ).fail( reject );
3656
-
3657
- // Other thenables
3658
- } else if ( value && isFunction( ( method = value.then ) ) ) {
3659
- method.call( value, resolve, reject );
3660
-
3661
- // Other non-thenables
3662
- } else {
3663
-
3664
- // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3665
- // * false: [ value ].slice( 0 ) => resolve( value )
3666
- // * true: [ value ].slice( 1 ) => resolve()
3667
- resolve.apply( undefined, [ value ].slice( noValue ) );
3668
- }
3669
-
3670
- // For Promises/A+, convert exceptions into rejections
3671
- // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3672
- // Deferred#then to conditionally suppress rejection.
3673
- } catch ( value ) {
3674
-
3675
- // Support: Android 4.0 only
3676
- // Strict mode functions invoked without .call/.apply get global-object context
3677
- reject.apply( undefined, [ value ] );
3678
- }
3679
- }
3680
-
3681
- jQuery.extend( {
3682
-
3683
- Deferred: function( func ) {
3684
- var tuples = [
3685
-
3686
- // action, add listener, callbacks,
3687
- // ... .then handlers, argument index, [final state]
3688
- [ "notify", "progress", jQuery.Callbacks( "memory" ),
3689
- jQuery.Callbacks( "memory" ), 2 ],
3690
- [ "resolve", "done", jQuery.Callbacks( "once memory" ),
3691
- jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3692
- [ "reject", "fail", jQuery.Callbacks( "once memory" ),
3693
- jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3694
- ],
3695
- state = "pending",
3696
- promise = {
3697
- state: function() {
3698
- return state;
3699
- },
3700
- always: function() {
3701
- deferred.done( arguments ).fail( arguments );
3702
- return this;
3703
- },
3704
- "catch": function( fn ) {
3705
- return promise.then( null, fn );
3706
- },
3707
-
3708
- // Keep pipe for back-compat
3709
- pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3710
- var fns = arguments;
3711
-
3712
- return jQuery.Deferred( function( newDefer ) {
3713
- jQuery.each( tuples, function( i, tuple ) {
3714
-
3715
- // Map tuples (progress, done, fail) to arguments (done, fail, progress)
3716
- var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3717
-
3718
- // deferred.progress(function() { bind to newDefer or newDefer.notify })
3719
- // deferred.done(function() { bind to newDefer or newDefer.resolve })
3720
- // deferred.fail(function() { bind to newDefer or newDefer.reject })
3721
- deferred[ tuple[ 1 ] ]( function() {
3722
- var returned = fn && fn.apply( this, arguments );
3723
- if ( returned && isFunction( returned.promise ) ) {
3724
- returned.promise()
3725
- .progress( newDefer.notify )
3726
- .done( newDefer.resolve )
3727
- .fail( newDefer.reject );
3728
- } else {
3729
- newDefer[ tuple[ 0 ] + "With" ](
3730
- this,
3731
- fn ? [ returned ] : arguments
3732
- );
3733
- }
3734
- } );
3735
- } );
3736
- fns = null;
3737
- } ).promise();
3738
- },
3739
- then: function( onFulfilled, onRejected, onProgress ) {
3740
- var maxDepth = 0;
3741
- function resolve( depth, deferred, handler, special ) {
3742
- return function() {
3743
- var that = this,
3744
- args = arguments,
3745
- mightThrow = function() {
3746
- var returned, then;
3747
-
3748
- // Support: Promises/A+ section 2.3.3.3.3
3749
- // https://promisesaplus.com/#point-59
3750
- // Ignore double-resolution attempts
3751
- if ( depth < maxDepth ) {
3752
- return;
3753
- }
3754
-
3755
- returned = handler.apply( that, args );
3756
-
3757
- // Support: Promises/A+ section 2.3.1
3758
- // https://promisesaplus.com/#point-48
3759
- if ( returned === deferred.promise() ) {
3760
- throw new TypeError( "Thenable self-resolution" );
3761
- }
3762
-
3763
- // Support: Promises/A+ sections 2.3.3.1, 3.5
3764
- // https://promisesaplus.com/#point-54
3765
- // https://promisesaplus.com/#point-75
3766
- // Retrieve `then` only once
3767
- then = returned &&
3768
-
3769
- // Support: Promises/A+ section 2.3.4
3770
- // https://promisesaplus.com/#point-64
3771
- // Only check objects and functions for thenability
3772
- ( typeof returned === "object" ||
3773
- typeof returned === "function" ) &&
3774
- returned.then;
3775
-
3776
- // Handle a returned thenable
3777
- if ( isFunction( then ) ) {
3778
-
3779
- // Special processors (notify) just wait for resolution
3780
- if ( special ) {
3781
- then.call(
3782
- returned,
3783
- resolve( maxDepth, deferred, Identity, special ),
3784
- resolve( maxDepth, deferred, Thrower, special )
3785
- );
3786
-
3787
- // Normal processors (resolve) also hook into progress
3788
- } else {
3789
-
3790
- // ...and disregard older resolution values
3791
- maxDepth++;
3792
-
3793
- then.call(
3794
- returned,
3795
- resolve( maxDepth, deferred, Identity, special ),
3796
- resolve( maxDepth, deferred, Thrower, special ),
3797
- resolve( maxDepth, deferred, Identity,
3798
- deferred.notifyWith )
3799
- );
3800
- }
3801
-
3802
- // Handle all other returned values
3803
- } else {
3804
-
3805
- // Only substitute handlers pass on context
3806
- // and multiple values (non-spec behavior)
3807
- if ( handler !== Identity ) {
3808
- that = undefined;
3809
- args = [ returned ];
3810
- }
3811
-
3812
- // Process the value(s)
3813
- // Default process is resolve
3814
- ( special || deferred.resolveWith )( that, args );
3815
- }
3816
- },
3817
-
3818
- // Only normal processors (resolve) catch and reject exceptions
3819
- process = special ?
3820
- mightThrow :
3821
- function() {
3822
- try {
3823
- mightThrow();
3824
- } catch ( e ) {
3825
-
3826
- if ( jQuery.Deferred.exceptionHook ) {
3827
- jQuery.Deferred.exceptionHook( e,
3828
- process.stackTrace );
3829
- }
3830
-
3831
- // Support: Promises/A+ section 2.3.3.3.4.1
3832
- // https://promisesaplus.com/#point-61
3833
- // Ignore post-resolution exceptions
3834
- if ( depth + 1 >= maxDepth ) {
3835
-
3836
- // Only substitute handlers pass on context
3837
- // and multiple values (non-spec behavior)
3838
- if ( handler !== Thrower ) {
3839
- that = undefined;
3840
- args = [ e ];
3841
- }
3842
-
3843
- deferred.rejectWith( that, args );
3844
- }
3845
- }
3846
- };
3847
-
3848
- // Support: Promises/A+ section 2.3.3.3.1
3849
- // https://promisesaplus.com/#point-57
3850
- // Re-resolve promises immediately to dodge false rejection from
3851
- // subsequent errors
3852
- if ( depth ) {
3853
- process();
3854
- } else {
3855
-
3856
- // Call an optional hook to record the stack, in case of exception
3857
- // since it's otherwise lost when execution goes async
3858
- if ( jQuery.Deferred.getStackHook ) {
3859
- process.stackTrace = jQuery.Deferred.getStackHook();
3860
- }
3861
- window.setTimeout( process );
3862
- }
3863
- };
3864
- }
3865
-
3866
- return jQuery.Deferred( function( newDefer ) {
3867
-
3868
- // progress_handlers.add( ... )
3869
- tuples[ 0 ][ 3 ].add(
3870
- resolve(
3871
- 0,
3872
- newDefer,
3873
- isFunction( onProgress ) ?
3874
- onProgress :
3875
- Identity,
3876
- newDefer.notifyWith
3877
- )
3878
- );
3879
-
3880
- // fulfilled_handlers.add( ... )
3881
- tuples[ 1 ][ 3 ].add(
3882
- resolve(
3883
- 0,
3884
- newDefer,
3885
- isFunction( onFulfilled ) ?
3886
- onFulfilled :
3887
- Identity
3888
- )
3889
- );
3890
-
3891
- // rejected_handlers.add( ... )
3892
- tuples[ 2 ][ 3 ].add(
3893
- resolve(
3894
- 0,
3895
- newDefer,
3896
- isFunction( onRejected ) ?
3897
- onRejected :
3898
- Thrower
3899
- )
3900
- );
3901
- } ).promise();
3902
- },
3903
-
3904
- // Get a promise for this deferred
3905
- // If obj is provided, the promise aspect is added to the object
3906
- promise: function( obj ) {
3907
- return obj != null ? jQuery.extend( obj, promise ) : promise;
3908
- }
3909
- },
3910
- deferred = {};
3911
-
3912
- // Add list-specific methods
3913
- jQuery.each( tuples, function( i, tuple ) {
3914
- var list = tuple[ 2 ],
3915
- stateString = tuple[ 5 ];
3916
-
3917
- // promise.progress = list.add
3918
- // promise.done = list.add
3919
- // promise.fail = list.add
3920
- promise[ tuple[ 1 ] ] = list.add;
3921
-
3922
- // Handle state
3923
- if ( stateString ) {
3924
- list.add(
3925
- function() {
3926
-
3927
- // state = "resolved" (i.e., fulfilled)
3928
- // state = "rejected"
3929
- state = stateString;
3930
- },
3931
-
3932
- // rejected_callbacks.disable
3933
- // fulfilled_callbacks.disable
3934
- tuples[ 3 - i ][ 2 ].disable,
3935
-
3936
- // rejected_handlers.disable
3937
- // fulfilled_handlers.disable
3938
- tuples[ 3 - i ][ 3 ].disable,
3939
-
3940
- // progress_callbacks.lock
3941
- tuples[ 0 ][ 2 ].lock,
3942
-
3943
- // progress_handlers.lock
3944
- tuples[ 0 ][ 3 ].lock
3945
- );
3946
- }
3947
-
3948
- // progress_handlers.fire
3949
- // fulfilled_handlers.fire
3950
- // rejected_handlers.fire
3951
- list.add( tuple[ 3 ].fire );
3952
-
3953
- // deferred.notify = function() { deferred.notifyWith(...) }
3954
- // deferred.resolve = function() { deferred.resolveWith(...) }
3955
- // deferred.reject = function() { deferred.rejectWith(...) }
3956
- deferred[ tuple[ 0 ] ] = function() {
3957
- deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3958
- return this;
3959
- };
3960
-
3961
- // deferred.notifyWith = list.fireWith
3962
- // deferred.resolveWith = list.fireWith
3963
- // deferred.rejectWith = list.fireWith
3964
- deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3965
- } );
3966
-
3967
- // Make the deferred a promise
3968
- promise.promise( deferred );
3969
-
3970
- // Call given func if any
3971
- if ( func ) {
3972
- func.call( deferred, deferred );
3973
- }
3974
-
3975
- // All done!
3976
- return deferred;
3977
- },
3978
-
3979
- // Deferred helper
3980
- when: function( singleValue ) {
3981
- var
3982
-
3983
- // count of uncompleted subordinates
3984
- remaining = arguments.length,
3985
-
3986
- // count of unprocessed arguments
3987
- i = remaining,
3988
-
3989
- // subordinate fulfillment data
3990
- resolveContexts = Array( i ),
3991
- resolveValues = slice.call( arguments ),
3992
-
3993
- // the master Deferred
3994
- master = jQuery.Deferred(),
3995
-
3996
- // subordinate callback factory
3997
- updateFunc = function( i ) {
3998
- return function( value ) {
3999
- resolveContexts[ i ] = this;
4000
- resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
4001
- if ( !( --remaining ) ) {
4002
- master.resolveWith( resolveContexts, resolveValues );
4003
- }
4004
- };
4005
- };
4006
-
4007
- // Single- and empty arguments are adopted like Promise.resolve
4008
- if ( remaining <= 1 ) {
4009
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
4010
- !remaining );
4011
-
4012
- // Use .then() to unwrap secondary thenables (cf. gh-3000)
4013
- if ( master.state() === "pending" ||
4014
- isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4015
-
4016
- return master.then();
4017
- }
4018
- }
4019
-
4020
- // Multiple arguments are aggregated like Promise.all array elements
4021
- while ( i-- ) {
4022
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
4023
- }
4024
-
4025
- return master.promise();
4026
- }
4027
- } );
4028
-
4029
-
4030
- // These usually indicate a programmer mistake during development,
4031
- // warn about them ASAP rather than swallowing them by default.
4032
- var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
4033
-
4034
- jQuery.Deferred.exceptionHook = function( error, stack ) {
4035
-
4036
- // Support: IE 8 - 9 only
4037
- // Console exists when dev tools are open, which can happen at any time
4038
- if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
4039
- window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
4040
- }
4041
- };
4042
-
4043
-
4044
-
4045
-
4046
- jQuery.readyException = function( error ) {
4047
- window.setTimeout( function() {
4048
- throw error;
4049
- } );
4050
- };
4051
-
4052
-
4053
-
4054
-
4055
- // The deferred used on DOM ready
4056
- var readyList = jQuery.Deferred();
4057
-
4058
- jQuery.fn.ready = function( fn ) {
4059
-
4060
- readyList
4061
- .then( fn )
4062
-
4063
- // Wrap jQuery.readyException in a function so that the lookup
4064
- // happens at the time of error handling instead of callback
4065
- // registration.
4066
- .catch( function( error ) {
4067
- jQuery.readyException( error );
4068
- } );
4069
-
4070
- return this;
4071
- };
4072
-
4073
- jQuery.extend( {
4074
-
4075
- // Is the DOM ready to be used? Set to true once it occurs.
4076
- isReady: false,
4077
-
4078
- // A counter to track how many items to wait for before
4079
- // the ready event fires. See #6781
4080
- readyWait: 1,
4081
-
4082
- // Handle when the DOM is ready
4083
- ready: function( wait ) {
4084
-
4085
- // Abort if there are pending holds or we're already ready
4086
- if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
4087
- return;
4088
- }
4089
-
4090
- // Remember that the DOM is ready
4091
- jQuery.isReady = true;
4092
-
4093
- // If a normal DOM Ready event fired, decrement, and wait if need be
4094
- if ( wait !== true && --jQuery.readyWait > 0 ) {
4095
- return;
4096
- }
4097
-
4098
- // If there are functions bound, to execute
4099
- readyList.resolveWith( document, [ jQuery ] );
4100
- }
4101
- } );
4102
-
4103
- jQuery.ready.then = readyList.then;
4104
-
4105
- // The ready event handler and self cleanup method
4106
- function completed() {
4107
- document.removeEventListener( "DOMContentLoaded", completed );
4108
- window.removeEventListener( "load", completed );
4109
- jQuery.ready();
4110
- }
4111
-
4112
- // Catch cases where $(document).ready() is called
4113
- // after the browser event has already occurred.
4114
- // Support: IE <=9 - 10 only
4115
- // Older IE sometimes signals "interactive" too soon
4116
- if ( document.readyState === "complete" ||
4117
- ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
4118
-
4119
- // Handle it asynchronously to allow scripts the opportunity to delay ready
4120
- window.setTimeout( jQuery.ready );
4121
-
4122
- } else {
4123
-
4124
- // Use the handy event callback
4125
- document.addEventListener( "DOMContentLoaded", completed );
4126
-
4127
- // A fallback to window.onload, that will always work
4128
- window.addEventListener( "load", completed );
4129
- }
4130
-
4131
-
4132
-
4133
-
4134
- // Multifunctional method to get and set values of a collection
4135
- // The value/s can optionally be executed if it's a function
4136
- var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4137
- var i = 0,
4138
- len = elems.length,
4139
- bulk = key == null;
4140
-
4141
- // Sets many values
4142
- if ( toType( key ) === "object" ) {
4143
- chainable = true;
4144
- for ( i in key ) {
4145
- access( elems, fn, i, key[ i ], true, emptyGet, raw );
4146
- }
4147
-
4148
- // Sets one value
4149
- } else if ( value !== undefined ) {
4150
- chainable = true;
4151
-
4152
- if ( !isFunction( value ) ) {
4153
- raw = true;
4154
- }
4155
-
4156
- if ( bulk ) {
4157
-
4158
- // Bulk operations run against the entire set
4159
- if ( raw ) {
4160
- fn.call( elems, value );
4161
- fn = null;
4162
-
4163
- // ...except when executing function values
4164
- } else {
4165
- bulk = fn;
4166
- fn = function( elem, key, value ) {
4167
- return bulk.call( jQuery( elem ), value );
4168
- };
4169
- }
4170
- }
4171
-
4172
- if ( fn ) {
4173
- for ( ; i < len; i++ ) {
4174
- fn(
4175
- elems[ i ], key, raw ?
4176
- value :
4177
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
4178
- );
4179
- }
4180
- }
4181
- }
4182
-
4183
- if ( chainable ) {
4184
- return elems;
4185
- }
4186
-
4187
- // Gets
4188
- if ( bulk ) {
4189
- return fn.call( elems );
4190
- }
4191
-
4192
- return len ? fn( elems[ 0 ], key ) : emptyGet;
4193
- };
4194
-
4195
-
4196
- // Matches dashed string for camelizing
4197
- var rmsPrefix = /^-ms-/,
4198
- rdashAlpha = /-([a-z])/g;
4199
-
4200
- // Used by camelCase as callback to replace()
4201
- function fcamelCase( all, letter ) {
4202
- return letter.toUpperCase();
4203
- }
4204
-
4205
- // Convert dashed to camelCase; used by the css and data modules
4206
- // Support: IE <=9 - 11, Edge 12 - 15
4207
- // Microsoft forgot to hump their vendor prefix (#9572)
4208
- function camelCase( string ) {
4209
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4210
- }
4211
- var acceptData = function( owner ) {
4212
-
4213
- // Accepts only:
4214
- // - Node
4215
- // - Node.ELEMENT_NODE
4216
- // - Node.DOCUMENT_NODE
4217
- // - Object
4218
- // - Any
4219
- return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4220
- };
4221
-
4222
-
4223
-
4224
-
4225
- function Data() {
4226
- this.expando = jQuery.expando + Data.uid++;
4227
- }
4228
-
4229
- Data.uid = 1;
4230
-
4231
- Data.prototype = {
4232
-
4233
- cache: function( owner ) {
4234
-
4235
- // Check if the owner object already has a cache
4236
- var value = owner[ this.expando ];
4237
-
4238
- // If not, create one
4239
- if ( !value ) {
4240
- value = {};
4241
-
4242
- // We can accept data for non-element nodes in modern browsers,
4243
- // but we should not, see #8335.
4244
- // Always return an empty object.
4245
- if ( acceptData( owner ) ) {
4246
-
4247
- // If it is a node unlikely to be stringify-ed or looped over
4248
- // use plain assignment
4249
- if ( owner.nodeType ) {
4250
- owner[ this.expando ] = value;
4251
-
4252
- // Otherwise secure it in a non-enumerable property
4253
- // configurable must be true to allow the property to be
4254
- // deleted when data is removed
4255
- } else {
4256
- Object.defineProperty( owner, this.expando, {
4257
- value: value,
4258
- configurable: true
4259
- } );
4260
- }
4261
- }
4262
- }
4263
-
4264
- return value;
4265
- },
4266
- set: function( owner, data, value ) {
4267
- var prop,
4268
- cache = this.cache( owner );
4269
-
4270
- // Handle: [ owner, key, value ] args
4271
- // Always use camelCase key (gh-2257)
4272
- if ( typeof data === "string" ) {
4273
- cache[ camelCase( data ) ] = value;
4274
-
4275
- // Handle: [ owner, { properties } ] args
4276
- } else {
4277
-
4278
- // Copy the properties one-by-one to the cache object
4279
- for ( prop in data ) {
4280
- cache[ camelCase( prop ) ] = data[ prop ];
4281
- }
4282
- }
4283
- return cache;
4284
- },
4285
- get: function( owner, key ) {
4286
- return key === undefined ?
4287
- this.cache( owner ) :
4288
-
4289
- // Always use camelCase key (gh-2257)
4290
- owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4291
- },
4292
- access: function( owner, key, value ) {
4293
-
4294
- // In cases where either:
4295
- //
4296
- // 1. No key was specified
4297
- // 2. A string key was specified, but no value provided
4298
- //
4299
- // Take the "read" path and allow the get method to determine
4300
- // which value to return, respectively either:
4301
- //
4302
- // 1. The entire cache object
4303
- // 2. The data stored at the key
4304
- //
4305
- if ( key === undefined ||
4306
- ( ( key && typeof key === "string" ) && value === undefined ) ) {
4307
-
4308
- return this.get( owner, key );
4309
- }
4310
-
4311
- // When the key is not a string, or both a key and value
4312
- // are specified, set or extend (existing objects) with either:
4313
- //
4314
- // 1. An object of properties
4315
- // 2. A key and value
4316
- //
4317
- this.set( owner, key, value );
4318
-
4319
- // Since the "set" path can have two possible entry points
4320
- // return the expected data based on which path was taken[*]
4321
- return value !== undefined ? value : key;
4322
- },
4323
- remove: function( owner, key ) {
4324
- var i,
4325
- cache = owner[ this.expando ];
4326
-
4327
- if ( cache === undefined ) {
4328
- return;
4329
- }
4330
-
4331
- if ( key !== undefined ) {
4332
-
4333
- // Support array or space separated string of keys
4334
- if ( Array.isArray( key ) ) {
4335
-
4336
- // If key is an array of keys...
4337
- // We always set camelCase keys, so remove that.
4338
- key = key.map( camelCase );
4339
- } else {
4340
- key = camelCase( key );
4341
-
4342
- // If a key with the spaces exists, use it.
4343
- // Otherwise, create an array by matching non-whitespace
4344
- key = key in cache ?
4345
- [ key ] :
4346
- ( key.match( rnothtmlwhite ) || [] );
4347
- }
4348
-
4349
- i = key.length;
4350
-
4351
- while ( i-- ) {
4352
- delete cache[ key[ i ] ];
4353
- }
4354
- }
4355
-
4356
- // Remove the expando if there's no more data
4357
- if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4358
-
4359
- // Support: Chrome <=35 - 45
4360
- // Webkit & Blink performance suffers when deleting properties
4361
- // from DOM nodes, so set to undefined instead
4362
- // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4363
- if ( owner.nodeType ) {
4364
- owner[ this.expando ] = undefined;
4365
- } else {
4366
- delete owner[ this.expando ];
4367
- }
4368
- }
4369
- },
4370
- hasData: function( owner ) {
4371
- var cache = owner[ this.expando ];
4372
- return cache !== undefined && !jQuery.isEmptyObject( cache );
4373
- }
4374
- };
4375
- var dataPriv = new Data();
4376
-
4377
- var dataUser = new Data();
4378
-
4379
-
4380
-
4381
- // Implementation Summary
4382
- //
4383
- // 1. Enforce API surface and semantic compatibility with 1.9.x branch
4384
- // 2. Improve the module's maintainability by reducing the storage
4385
- // paths to a single mechanism.
4386
- // 3. Use the same single mechanism to support "private" and "user" data.
4387
- // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4388
- // 5. Avoid exposing implementation details on user objects (eg. expando properties)
4389
- // 6. Provide a clear path for implementation upgrade to WeakMap in 2014
4390
-
4391
- var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4392
- rmultiDash = /[A-Z]/g;
4393
-
4394
- function getData( data ) {
4395
- if ( data === "true" ) {
4396
- return true;
4397
- }
4398
-
4399
- if ( data === "false" ) {
4400
- return false;
4401
- }
4402
-
4403
- if ( data === "null" ) {
4404
- return null;
4405
- }
4406
-
4407
- // Only convert to a number if it doesn't change the string
4408
- if ( data === +data + "" ) {
4409
- return +data;
4410
- }
4411
-
4412
- if ( rbrace.test( data ) ) {
4413
- return JSON.parse( data );
4414
- }
4415
-
4416
- return data;
4417
- }
4418
-
4419
- function dataAttr( elem, key, data ) {
4420
- var name;
4421
-
4422
- // If nothing was found internally, try to fetch any
4423
- // data from the HTML5 data-* attribute
4424
- if ( data === undefined && elem.nodeType === 1 ) {
4425
- name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4426
- data = elem.getAttribute( name );
4427
-
4428
- if ( typeof data === "string" ) {
4429
- try {
4430
- data = getData( data );
4431
- } catch ( e ) {}
4432
-
4433
- // Make sure we set the data so it isn't changed later
4434
- dataUser.set( elem, key, data );
4435
- } else {
4436
- data = undefined;
4437
- }
4438
- }
4439
- return data;
4440
- }
4441
-
4442
- jQuery.extend( {
4443
- hasData: function( elem ) {
4444
- return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4445
- },
4446
-
4447
- data: function( elem, name, data ) {
4448
- return dataUser.access( elem, name, data );
4449
- },
4450
-
4451
- removeData: function( elem, name ) {
4452
- dataUser.remove( elem, name );
4453
- },
4454
-
4455
- // TODO: Now that all calls to _data and _removeData have been replaced
4456
- // with direct calls to dataPriv methods, these can be deprecated.
4457
- _data: function( elem, name, data ) {
4458
- return dataPriv.access( elem, name, data );
4459
- },
4460
-
4461
- _removeData: function( elem, name ) {
4462
- dataPriv.remove( elem, name );
4463
- }
4464
- } );
4465
-
4466
- jQuery.fn.extend( {
4467
- data: function( key, value ) {
4468
- var i, name, data,
4469
- elem = this[ 0 ],
4470
- attrs = elem && elem.attributes;
4471
-
4472
- // Gets all values
4473
- if ( key === undefined ) {
4474
- if ( this.length ) {
4475
- data = dataUser.get( elem );
4476
-
4477
- if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4478
- i = attrs.length;
4479
- while ( i-- ) {
4480
-
4481
- // Support: IE 11 only
4482
- // The attrs elements can be null (#14894)
4483
- if ( attrs[ i ] ) {
4484
- name = attrs[ i ].name;
4485
- if ( name.indexOf( "data-" ) === 0 ) {
4486
- name = camelCase( name.slice( 5 ) );
4487
- dataAttr( elem, name, data[ name ] );
4488
- }
4489
- }
4490
- }
4491
- dataPriv.set( elem, "hasDataAttrs", true );
4492
- }
4493
- }
4494
-
4495
- return data;
4496
- }
4497
-
4498
- // Sets multiple values
4499
- if ( typeof key === "object" ) {
4500
- return this.each( function() {
4501
- dataUser.set( this, key );
4502
- } );
4503
- }
4504
-
4505
- return access( this, function( value ) {
4506
- var data;
4507
-
4508
- // The calling jQuery object (element matches) is not empty
4509
- // (and therefore has an element appears at this[ 0 ]) and the
4510
- // `value` parameter was not undefined. An empty jQuery object
4511
- // will result in `undefined` for elem = this[ 0 ] which will
4512
- // throw an exception if an attempt to read a data cache is made.
4513
- if ( elem && value === undefined ) {
4514
-
4515
- // Attempt to get data from the cache
4516
- // The key will always be camelCased in Data
4517
- data = dataUser.get( elem, key );
4518
- if ( data !== undefined ) {
4519
- return data;
4520
- }
4521
-
4522
- // Attempt to "discover" the data in
4523
- // HTML5 custom data-* attrs
4524
- data = dataAttr( elem, key );
4525
- if ( data !== undefined ) {
4526
- return data;
4527
- }
4528
-
4529
- // We tried really hard, but the data doesn't exist.
4530
- return;
4531
- }
4532
-
4533
- // Set the data...
4534
- this.each( function() {
4535
-
4536
- // We always store the camelCased key
4537
- dataUser.set( this, key, value );
4538
- } );
4539
- }, null, value, arguments.length > 1, null, true );
4540
- },
4541
-
4542
- removeData: function( key ) {
4543
- return this.each( function() {
4544
- dataUser.remove( this, key );
4545
- } );
4546
- }
4547
- } );
4548
-
4549
-
4550
- jQuery.extend( {
4551
- queue: function( elem, type, data ) {
4552
- var queue;
4553
-
4554
- if ( elem ) {
4555
- type = ( type || "fx" ) + "queue";
4556
- queue = dataPriv.get( elem, type );
4557
-
4558
- // Speed up dequeue by getting out quickly if this is just a lookup
4559
- if ( data ) {
4560
- if ( !queue || Array.isArray( data ) ) {
4561
- queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4562
- } else {
4563
- queue.push( data );
4564
- }
4565
- }
4566
- return queue || [];
4567
- }
4568
- },
4569
-
4570
- dequeue: function( elem, type ) {
4571
- type = type || "fx";
4572
-
4573
- var queue = jQuery.queue( elem, type ),
4574
- startLength = queue.length,
4575
- fn = queue.shift(),
4576
- hooks = jQuery._queueHooks( elem, type ),
4577
- next = function() {
4578
- jQuery.dequeue( elem, type );
4579
- };
4580
-
4581
- // If the fx queue is dequeued, always remove the progress sentinel
4582
- if ( fn === "inprogress" ) {
4583
- fn = queue.shift();
4584
- startLength--;
4585
- }
4586
-
4587
- if ( fn ) {
4588
-
4589
- // Add a progress sentinel to prevent the fx queue from being
4590
- // automatically dequeued
4591
- if ( type === "fx" ) {
4592
- queue.unshift( "inprogress" );
4593
- }
4594
-
4595
- // Clear up the last queue stop function
4596
- delete hooks.stop;
4597
- fn.call( elem, next, hooks );
4598
- }
4599
-
4600
- if ( !startLength && hooks ) {
4601
- hooks.empty.fire();
4602
- }
4603
- },
4604
-
4605
- // Not public - generate a queueHooks object, or return the current one
4606
- _queueHooks: function( elem, type ) {
4607
- var key = type + "queueHooks";
4608
- return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4609
- empty: jQuery.Callbacks( "once memory" ).add( function() {
4610
- dataPriv.remove( elem, [ type + "queue", key ] );
4611
- } )
4612
- } );
4613
- }
4614
- } );
4615
-
4616
- jQuery.fn.extend( {
4617
- queue: function( type, data ) {
4618
- var setter = 2;
4619
-
4620
- if ( typeof type !== "string" ) {
4621
- data = type;
4622
- type = "fx";
4623
- setter--;
4624
- }
4625
-
4626
- if ( arguments.length < setter ) {
4627
- return jQuery.queue( this[ 0 ], type );
4628
- }
4629
-
4630
- return data === undefined ?
4631
- this :
4632
- this.each( function() {
4633
- var queue = jQuery.queue( this, type, data );
4634
-
4635
- // Ensure a hooks for this queue
4636
- jQuery._queueHooks( this, type );
4637
-
4638
- if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4639
- jQuery.dequeue( this, type );
4640
- }
4641
- } );
4642
- },
4643
- dequeue: function( type ) {
4644
- return this.each( function() {
4645
- jQuery.dequeue( this, type );
4646
- } );
4647
- },
4648
- clearQueue: function( type ) {
4649
- return this.queue( type || "fx", [] );
4650
- },
4651
-
4652
- // Get a promise resolved when queues of a certain type
4653
- // are emptied (fx is the type by default)
4654
- promise: function( type, obj ) {
4655
- var tmp,
4656
- count = 1,
4657
- defer = jQuery.Deferred(),
4658
- elements = this,
4659
- i = this.length,
4660
- resolve = function() {
4661
- if ( !( --count ) ) {
4662
- defer.resolveWith( elements, [ elements ] );
4663
- }
4664
- };
4665
-
4666
- if ( typeof type !== "string" ) {
4667
- obj = type;
4668
- type = undefined;
4669
- }
4670
- type = type || "fx";
4671
-
4672
- while ( i-- ) {
4673
- tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4674
- if ( tmp && tmp.empty ) {
4675
- count++;
4676
- tmp.empty.add( resolve );
4677
- }
4678
- }
4679
- resolve();
4680
- return defer.promise( obj );
4681
- }
4682
- } );
4683
- var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4684
-
4685
- var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4686
-
4687
-
4688
- var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4689
-
4690
- var isHiddenWithinTree = function( elem, el ) {
4691
-
4692
- // isHiddenWithinTree might be called from jQuery#filter function;
4693
- // in that case, element will be second argument
4694
- elem = el || elem;
4695
-
4696
- // Inline style trumps all
4697
- return elem.style.display === "none" ||
4698
- elem.style.display === "" &&
4699
-
4700
- // Otherwise, check computed style
4701
- // Support: Firefox <=43 - 45
4702
- // Disconnected elements can have computed display: none, so first confirm that elem is
4703
- // in the document.
4704
- jQuery.contains( elem.ownerDocument, elem ) &&
4705
-
4706
- jQuery.css( elem, "display" ) === "none";
4707
- };
4708
-
4709
- var swap = function( elem, options, callback, args ) {
4710
- var ret, name,
4711
- old = {};
4712
-
4713
- // Remember the old values, and insert the new ones
4714
- for ( name in options ) {
4715
- old[ name ] = elem.style[ name ];
4716
- elem.style[ name ] = options[ name ];
4717
- }
4718
-
4719
- ret = callback.apply( elem, args || [] );
4720
-
4721
- // Revert the old values
4722
- for ( name in options ) {
4723
- elem.style[ name ] = old[ name ];
4724
- }
4725
-
4726
- return ret;
4727
- };
4728
-
4729
-
4730
-
4731
-
4732
- function adjustCSS( elem, prop, valueParts, tween ) {
4733
- var adjusted, scale,
4734
- maxIterations = 20,
4735
- currentValue = tween ?
4736
- function() {
4737
- return tween.cur();
4738
- } :
4739
- function() {
4740
- return jQuery.css( elem, prop, "" );
4741
- },
4742
- initial = currentValue(),
4743
- unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4744
-
4745
- // Starting value computation is required for potential unit mismatches
4746
- initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4747
- rcssNum.exec( jQuery.css( elem, prop ) );
4748
-
4749
- if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4750
-
4751
- // Support: Firefox <=54
4752
- // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4753
- initial = initial / 2;
4754
-
4755
- // Trust units reported by jQuery.css
4756
- unit = unit || initialInUnit[ 3 ];
4757
-
4758
- // Iteratively approximate from a nonzero starting point
4759
- initialInUnit = +initial || 1;
4760
-
4761
- while ( maxIterations-- ) {
4762
-
4763
- // Evaluate and update our best guess (doubling guesses that zero out).
4764
- // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4765
- jQuery.style( elem, prop, initialInUnit + unit );
4766
- if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4767
- maxIterations = 0;
4768
- }
4769
- initialInUnit = initialInUnit / scale;
4770
-
4771
- }
4772
-
4773
- initialInUnit = initialInUnit * 2;
4774
- jQuery.style( elem, prop, initialInUnit + unit );
4775
-
4776
- // Make sure we update the tween properties later on
4777
- valueParts = valueParts || [];
4778
- }
4779
-
4780
- if ( valueParts ) {
4781
- initialInUnit = +initialInUnit || +initial || 0;
4782
-
4783
- // Apply relative offset (+=/-=) if specified
4784
- adjusted = valueParts[ 1 ] ?
4785
- initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4786
- +valueParts[ 2 ];
4787
- if ( tween ) {
4788
- tween.unit = unit;
4789
- tween.start = initialInUnit;
4790
- tween.end = adjusted;
4791
- }
4792
- }
4793
- return adjusted;
4794
- }
4795
-
4796
-
4797
- var defaultDisplayMap = {};
4798
-
4799
- function getDefaultDisplay( elem ) {
4800
- var temp,
4801
- doc = elem.ownerDocument,
4802
- nodeName = elem.nodeName,
4803
- display = defaultDisplayMap[ nodeName ];
4804
-
4805
- if ( display ) {
4806
- return display;
4807
- }
4808
-
4809
- temp = doc.body.appendChild( doc.createElement( nodeName ) );
4810
- display = jQuery.css( temp, "display" );
4811
-
4812
- temp.parentNode.removeChild( temp );
4813
-
4814
- if ( display === "none" ) {
4815
- display = "block";
4816
- }
4817
- defaultDisplayMap[ nodeName ] = display;
4818
-
4819
- return display;
4820
- }
4821
-
4822
- function showHide( elements, show ) {
4823
- var display, elem,
4824
- values = [],
4825
- index = 0,
4826
- length = elements.length;
4827
-
4828
- // Determine new display value for elements that need to change
4829
- for ( ; index < length; index++ ) {
4830
- elem = elements[ index ];
4831
- if ( !elem.style ) {
4832
- continue;
4833
- }
4834
-
4835
- display = elem.style.display;
4836
- if ( show ) {
4837
-
4838
- // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4839
- // check is required in this first loop unless we have a nonempty display value (either
4840
- // inline or about-to-be-restored)
4841
- if ( display === "none" ) {
4842
- values[ index ] = dataPriv.get( elem, "display" ) || null;
4843
- if ( !values[ index ] ) {
4844
- elem.style.display = "";
4845
- }
4846
- }
4847
- if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4848
- values[ index ] = getDefaultDisplay( elem );
4849
- }
4850
- } else {
4851
- if ( display !== "none" ) {
4852
- values[ index ] = "none";
4853
-
4854
- // Remember what we're overwriting
4855
- dataPriv.set( elem, "display", display );
4856
- }
4857
- }
4858
- }
4859
-
4860
- // Set the display of the elements in a second loop to avoid constant reflow
4861
- for ( index = 0; index < length; index++ ) {
4862
- if ( values[ index ] != null ) {
4863
- elements[ index ].style.display = values[ index ];
4864
- }
4865
- }
4866
-
4867
- return elements;
4868
- }
4869
-
4870
- jQuery.fn.extend( {
4871
- show: function() {
4872
- return showHide( this, true );
4873
- },
4874
- hide: function() {
4875
- return showHide( this );
4876
- },
4877
- toggle: function( state ) {
4878
- if ( typeof state === "boolean" ) {
4879
- return state ? this.show() : this.hide();
4880
- }
4881
-
4882
- return this.each( function() {
4883
- if ( isHiddenWithinTree( this ) ) {
4884
- jQuery( this ).show();
4885
- } else {
4886
- jQuery( this ).hide();
4887
- }
4888
- } );
4889
- }
4890
- } );
4891
- var rcheckableType = ( /^(?:checkbox|radio)$/i );
4892
-
4893
- var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4894
-
4895
- var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4896
-
4897
-
4898
-
4899
- // We have to close these tags to support XHTML (#13200)
4900
- var wrapMap = {
4901
-
4902
- // Support: IE <=9 only
4903
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
4904
-
4905
- // XHTML parsers do not magically insert elements in the
4906
- // same way that tag soup parsers do. So we cannot shorten
4907
- // this by omitting <tbody> or other required elements.
4908
- thead: [ 1, "<table>", "</table>" ],
4909
- col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4910
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4911
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4912
-
4913
- _default: [ 0, "", "" ]
4914
- };
4915
-
4916
- // Support: IE <=9 only
4917
- wrapMap.optgroup = wrapMap.option;
4918
-
4919
- wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4920
- wrapMap.th = wrapMap.td;
4921
-
4922
-
4923
- function getAll( context, tag ) {
4924
-
4925
- // Support: IE <=9 - 11 only
4926
- // Use typeof to avoid zero-argument method invocation on host objects (#15151)
4927
- var ret;
4928
-
4929
- if ( typeof context.getElementsByTagName !== "undefined" ) {
4930
- ret = context.getElementsByTagName( tag || "*" );
4931
-
4932
- } else if ( typeof context.querySelectorAll !== "undefined" ) {
4933
- ret = context.querySelectorAll( tag || "*" );
4934
-
4935
- } else {
4936
- ret = [];
4937
- }
4938
-
4939
- if ( tag === undefined || tag && nodeName( context, tag ) ) {
4940
- return jQuery.merge( [ context ], ret );
4941
- }
4942
-
4943
- return ret;
4944
- }
4945
-
4946
-
4947
- // Mark scripts as having already been evaluated
4948
- function setGlobalEval( elems, refElements ) {
4949
- var i = 0,
4950
- l = elems.length;
4951
-
4952
- for ( ; i < l; i++ ) {
4953
- dataPriv.set(
4954
- elems[ i ],
4955
- "globalEval",
4956
- !refElements || dataPriv.get( refElements[ i ], "globalEval" )
4957
- );
4958
- }
4959
- }
4960
-
4961
-
4962
- var rhtml = /<|&#?\w+;/;
4963
-
4964
- function buildFragment( elems, context, scripts, selection, ignored ) {
4965
- var elem, tmp, tag, wrap, contains, j,
4966
- fragment = context.createDocumentFragment(),
4967
- nodes = [],
4968
- i = 0,
4969
- l = elems.length;
4970
-
4971
- for ( ; i < l; i++ ) {
4972
- elem = elems[ i ];
4973
-
4974
- if ( elem || elem === 0 ) {
4975
-
4976
- // Add nodes directly
4977
- if ( toType( elem ) === "object" ) {
4978
-
4979
- // Support: Android <=4.0 only, PhantomJS 1 only
4980
- // push.apply(_, arraylike) throws on ancient WebKit
4981
- jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
4982
-
4983
- // Convert non-html into a text node
4984
- } else if ( !rhtml.test( elem ) ) {
4985
- nodes.push( context.createTextNode( elem ) );
4986
-
4987
- // Convert html into DOM nodes
4988
- } else {
4989
- tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
4990
-
4991
- // Deserialize a standard representation
4992
- tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
4993
- wrap = wrapMap[ tag ] || wrapMap._default;
4994
- tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
4995
-
4996
- // Descend through wrappers to the right content
4997
- j = wrap[ 0 ];
4998
- while ( j-- ) {
4999
- tmp = tmp.lastChild;
5000
- }
5001
-
5002
- // Support: Android <=4.0 only, PhantomJS 1 only
5003
- // push.apply(_, arraylike) throws on ancient WebKit
5004
- jQuery.merge( nodes, tmp.childNodes );
5005
-
5006
- // Remember the top-level container
5007
- tmp = fragment.firstChild;
5008
-
5009
- // Ensure the created nodes are orphaned (#12392)
5010
- tmp.textContent = "";
5011
- }
5012
- }
5013
- }
5014
-
5015
- // Remove wrapper from fragment
5016
- fragment.textContent = "";
5017
-
5018
- i = 0;
5019
- while ( ( elem = nodes[ i++ ] ) ) {
5020
-
5021
- // Skip elements already in the context collection (trac-4087)
5022
- if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
5023
- if ( ignored ) {
5024
- ignored.push( elem );
5025
- }
5026
- continue;
5027
- }
5028
-
5029
- contains = jQuery.contains( elem.ownerDocument, elem );
5030
-
5031
- // Append to fragment
5032
- tmp = getAll( fragment.appendChild( elem ), "script" );
5033
-
5034
- // Preserve script evaluation history
5035
- if ( contains ) {
5036
- setGlobalEval( tmp );
5037
- }
5038
-
5039
- // Capture executables
5040
- if ( scripts ) {
5041
- j = 0;
5042
- while ( ( elem = tmp[ j++ ] ) ) {
5043
- if ( rscriptType.test( elem.type || "" ) ) {
5044
- scripts.push( elem );
5045
- }
5046
- }
5047
- }
5048
- }
5049
-
5050
- return fragment;
5051
- }
5052
-
5053
-
5054
- ( function() {
5055
- var fragment = document.createDocumentFragment(),
5056
- div = fragment.appendChild( document.createElement( "div" ) ),
5057
- input = document.createElement( "input" );
5058
-
5059
- // Support: Android 4.0 - 4.3 only
5060
- // Check state lost if the name is set (#11217)
5061
- // Support: Windows Web Apps (WWA)
5062
- // `name` and `type` must use .setAttribute for WWA (#14901)
5063
- input.setAttribute( "type", "radio" );
5064
- input.setAttribute( "checked", "checked" );
5065
- input.setAttribute( "name", "t" );
5066
-
5067
- div.appendChild( input );
5068
-
5069
- // Support: Android <=4.1 only
5070
- // Older WebKit doesn't clone checked state correctly in fragments
5071
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
5072
-
5073
- // Support: IE <=11 only
5074
- // Make sure textarea (and checkbox) defaultValue is properly cloned
5075
- div.innerHTML = "<textarea>x</textarea>";
5076
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
5077
- } )();
5078
- var documentElement = document.documentElement;
5079
-
5080
-
5081
-
5082
- var
5083
- rkeyEvent = /^key/,
5084
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
5085
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
5086
-
5087
- function returnTrue() {
5088
- return true;
5089
- }
5090
-
5091
- function returnFalse() {
5092
- return false;
5093
- }
5094
-
5095
- // Support: IE <=9 only
5096
- // See #13393 for more info
5097
- function safeActiveElement() {
5098
- try {
5099
- return document.activeElement;
5100
- } catch ( err ) { }
5101
- }
5102
-
5103
- function on( elem, types, selector, data, fn, one ) {
5104
- var origFn, type;
5105
-
5106
- // Types can be a map of types/handlers
5107
- if ( typeof types === "object" ) {
5108
-
5109
- // ( types-Object, selector, data )
5110
- if ( typeof selector !== "string" ) {
5111
-
5112
- // ( types-Object, data )
5113
- data = data || selector;
5114
- selector = undefined;
5115
- }
5116
- for ( type in types ) {
5117
- on( elem, type, selector, data, types[ type ], one );
5118
- }
5119
- return elem;
5120
- }
5121
-
5122
- if ( data == null && fn == null ) {
5123
-
5124
- // ( types, fn )
5125
- fn = selector;
5126
- data = selector = undefined;
5127
- } else if ( fn == null ) {
5128
- if ( typeof selector === "string" ) {
5129
-
5130
- // ( types, selector, fn )
5131
- fn = data;
5132
- data = undefined;
5133
- } else {
5134
-
5135
- // ( types, data, fn )
5136
- fn = data;
5137
- data = selector;
5138
- selector = undefined;
5139
- }
5140
- }
5141
- if ( fn === false ) {
5142
- fn = returnFalse;
5143
- } else if ( !fn ) {
5144
- return elem;
5145
- }
5146
-
5147
- if ( one === 1 ) {
5148
- origFn = fn;
5149
- fn = function( event ) {
5150
-
5151
- // Can use an empty set, since event contains the info
5152
- jQuery().off( event );
5153
- return origFn.apply( this, arguments );
5154
- };
5155
-
5156
- // Use same guid so caller can remove using origFn
5157
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5158
- }
5159
- return elem.each( function() {
5160
- jQuery.event.add( this, types, fn, data, selector );
5161
- } );
5162
- }
5163
-
5164
- /*
5165
- * Helper functions for managing events -- not part of the public interface.
5166
- * Props to Dean Edwards' addEvent library for many of the ideas.
5167
- */
5168
- jQuery.event = {
5169
-
5170
- global: {},
5171
-
5172
- add: function( elem, types, handler, data, selector ) {
5173
-
5174
- var handleObjIn, eventHandle, tmp,
5175
- events, t, handleObj,
5176
- special, handlers, type, namespaces, origType,
5177
- elemData = dataPriv.get( elem );
5178
-
5179
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
5180
- if ( !elemData ) {
5181
- return;
5182
- }
5183
-
5184
- // Caller can pass in an object of custom data in lieu of the handler
5185
- if ( handler.handler ) {
5186
- handleObjIn = handler;
5187
- handler = handleObjIn.handler;
5188
- selector = handleObjIn.selector;
5189
- }
5190
-
5191
- // Ensure that invalid selectors throw exceptions at attach time
5192
- // Evaluate against documentElement in case elem is a non-element node (e.g., document)
5193
- if ( selector ) {
5194
- jQuery.find.matchesSelector( documentElement, selector );
5195
- }
5196
-
5197
- // Make sure that the handler has a unique ID, used to find/remove it later
5198
- if ( !handler.guid ) {
5199
- handler.guid = jQuery.guid++;
5200
- }
5201
-
5202
- // Init the element's event structure and main handler, if this is the first
5203
- if ( !( events = elemData.events ) ) {
5204
- events = elemData.events = {};
5205
- }
5206
- if ( !( eventHandle = elemData.handle ) ) {
5207
- eventHandle = elemData.handle = function( e ) {
5208
-
5209
- // Discard the second event of a jQuery.event.trigger() and
5210
- // when an event is called after a page has unloaded
5211
- return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5212
- jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5213
- };
5214
- }
5215
-
5216
- // Handle multiple events separated by a space
5217
- types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5218
- t = types.length;
5219
- while ( t-- ) {
5220
- tmp = rtypenamespace.exec( types[ t ] ) || [];
5221
- type = origType = tmp[ 1 ];
5222
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5223
-
5224
- // There *must* be a type, no attaching namespace-only handlers
5225
- if ( !type ) {
5226
- continue;
5227
- }
5228
-
5229
- // If event changes its type, use the special event handlers for the changed type
5230
- special = jQuery.event.special[ type ] || {};
5231
-
5232
- // If selector defined, determine special event api type, otherwise given type
5233
- type = ( selector ? special.delegateType : special.bindType ) || type;
5234
-
5235
- // Update special based on newly reset type
5236
- special = jQuery.event.special[ type ] || {};
5237
-
5238
- // handleObj is passed to all event handlers
5239
- handleObj = jQuery.extend( {
5240
- type: type,
5241
- origType: origType,
5242
- data: data,
5243
- handler: handler,
5244
- guid: handler.guid,
5245
- selector: selector,
5246
- needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5247
- namespace: namespaces.join( "." )
5248
- }, handleObjIn );
5249
-
5250
- // Init the event handler queue if we're the first
5251
- if ( !( handlers = events[ type ] ) ) {
5252
- handlers = events[ type ] = [];
5253
- handlers.delegateCount = 0;
5254
-
5255
- // Only use addEventListener if the special events handler returns false
5256
- if ( !special.setup ||
5257
- special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5258
-
5259
- if ( elem.addEventListener ) {
5260
- elem.addEventListener( type, eventHandle );
5261
- }
5262
- }
5263
- }
5264
-
5265
- if ( special.add ) {
5266
- special.add.call( elem, handleObj );
5267
-
5268
- if ( !handleObj.handler.guid ) {
5269
- handleObj.handler.guid = handler.guid;
5270
- }
5271
- }
5272
-
5273
- // Add to the element's handler list, delegates in front
5274
- if ( selector ) {
5275
- handlers.splice( handlers.delegateCount++, 0, handleObj );
5276
- } else {
5277
- handlers.push( handleObj );
5278
- }
5279
-
5280
- // Keep track of which events have ever been used, for event optimization
5281
- jQuery.event.global[ type ] = true;
5282
- }
5283
-
5284
- },
5285
-
5286
- // Detach an event or set of events from an element
5287
- remove: function( elem, types, handler, selector, mappedTypes ) {
5288
-
5289
- var j, origCount, tmp,
5290
- events, t, handleObj,
5291
- special, handlers, type, namespaces, origType,
5292
- elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5293
-
5294
- if ( !elemData || !( events = elemData.events ) ) {
5295
- return;
5296
- }
5297
-
5298
- // Once for each type.namespace in types; type may be omitted
5299
- types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5300
- t = types.length;
5301
- while ( t-- ) {
5302
- tmp = rtypenamespace.exec( types[ t ] ) || [];
5303
- type = origType = tmp[ 1 ];
5304
- namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5305
-
5306
- // Unbind all events (on this namespace, if provided) for the element
5307
- if ( !type ) {
5308
- for ( type in events ) {
5309
- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5310
- }
5311
- continue;
5312
- }
5313
-
5314
- special = jQuery.event.special[ type ] || {};
5315
- type = ( selector ? special.delegateType : special.bindType ) || type;
5316
- handlers = events[ type ] || [];
5317
- tmp = tmp[ 2 ] &&
5318
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5319
-
5320
- // Remove matching events
5321
- origCount = j = handlers.length;
5322
- while ( j-- ) {
5323
- handleObj = handlers[ j ];
5324
-
5325
- if ( ( mappedTypes || origType === handleObj.origType ) &&
5326
- ( !handler || handler.guid === handleObj.guid ) &&
5327
- ( !tmp || tmp.test( handleObj.namespace ) ) &&
5328
- ( !selector || selector === handleObj.selector ||
5329
- selector === "**" && handleObj.selector ) ) {
5330
- handlers.splice( j, 1 );
5331
-
5332
- if ( handleObj.selector ) {
5333
- handlers.delegateCount--;
5334
- }
5335
- if ( special.remove ) {
5336
- special.remove.call( elem, handleObj );
5337
- }
5338
- }
5339
- }
5340
-
5341
- // Remove generic event handler if we removed something and no more handlers exist
5342
- // (avoids potential for endless recursion during removal of special event handlers)
5343
- if ( origCount && !handlers.length ) {
5344
- if ( !special.teardown ||
5345
- special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5346
-
5347
- jQuery.removeEvent( elem, type, elemData.handle );
5348
- }
5349
-
5350
- delete events[ type ];
5351
- }
5352
- }
5353
-
5354
- // Remove data and the expando if it's no longer used
5355
- if ( jQuery.isEmptyObject( events ) ) {
5356
- dataPriv.remove( elem, "handle events" );
5357
- }
5358
- },
5359
-
5360
- dispatch: function( nativeEvent ) {
5361
-
5362
- // Make a writable jQuery.Event from the native event object
5363
- var event = jQuery.event.fix( nativeEvent );
5364
-
5365
- var i, j, ret, matched, handleObj, handlerQueue,
5366
- args = new Array( arguments.length ),
5367
- handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5368
- special = jQuery.event.special[ event.type ] || {};
5369
-
5370
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
5371
- args[ 0 ] = event;
5372
-
5373
- for ( i = 1; i < arguments.length; i++ ) {
5374
- args[ i ] = arguments[ i ];
5375
- }
5376
-
5377
- event.delegateTarget = this;
5378
-
5379
- // Call the preDispatch hook for the mapped type, and let it bail if desired
5380
- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5381
- return;
5382
- }
5383
-
5384
- // Determine handlers
5385
- handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5386
-
5387
- // Run delegates first; they may want to stop propagation beneath us
5388
- i = 0;
5389
- while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5390
- event.currentTarget = matched.elem;
5391
-
5392
- j = 0;
5393
- while ( ( handleObj = matched.handlers[ j++ ] ) &&
5394
- !event.isImmediatePropagationStopped() ) {
5395
-
5396
- // Triggered event must either 1) have no namespace, or 2) have namespace(s)
5397
- // a subset or equal to those in the bound event (both can have no namespace).
5398
- if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
5399
-
5400
- event.handleObj = handleObj;
5401
- event.data = handleObj.data;
5402
-
5403
- ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5404
- handleObj.handler ).apply( matched.elem, args );
5405
-
5406
- if ( ret !== undefined ) {
5407
- if ( ( event.result = ret ) === false ) {
5408
- event.preventDefault();
5409
- event.stopPropagation();
5410
- }
5411
- }
5412
- }
5413
- }
5414
- }
5415
-
5416
- // Call the postDispatch hook for the mapped type
5417
- if ( special.postDispatch ) {
5418
- special.postDispatch.call( this, event );
5419
- }
5420
-
5421
- return event.result;
5422
- },
5423
-
5424
- handlers: function( event, handlers ) {
5425
- var i, handleObj, sel, matchedHandlers, matchedSelectors,
5426
- handlerQueue = [],
5427
- delegateCount = handlers.delegateCount,
5428
- cur = event.target;
5429
-
5430
- // Find delegate handlers
5431
- if ( delegateCount &&
5432
-
5433
- // Support: IE <=9
5434
- // Black-hole SVG <use> instance trees (trac-13180)
5435
- cur.nodeType &&
5436
-
5437
- // Support: Firefox <=42
5438
- // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5439
- // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5440
- // Support: IE 11 only
5441
- // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5442
- !( event.type === "click" && event.button >= 1 ) ) {
5443
-
5444
- for ( ; cur !== this; cur = cur.parentNode || this ) {
5445
-
5446
- // Don't check non-elements (#13208)
5447
- // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5448
- if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5449
- matchedHandlers = [];
5450
- matchedSelectors = {};
5451
- for ( i = 0; i < delegateCount; i++ ) {
5452
- handleObj = handlers[ i ];
5453
-
5454
- // Don't conflict with Object.prototype properties (#13203)
5455
- sel = handleObj.selector + " ";
5456
-
5457
- if ( matchedSelectors[ sel ] === undefined ) {
5458
- matchedSelectors[ sel ] = handleObj.needsContext ?
5459
- jQuery( sel, this ).index( cur ) > -1 :
5460
- jQuery.find( sel, this, null, [ cur ] ).length;
5461
- }
5462
- if ( matchedSelectors[ sel ] ) {
5463
- matchedHandlers.push( handleObj );
5464
- }
5465
- }
5466
- if ( matchedHandlers.length ) {
5467
- handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5468
- }
5469
- }
5470
- }
5471
- }
5472
-
5473
- // Add the remaining (directly-bound) handlers
5474
- cur = this;
5475
- if ( delegateCount < handlers.length ) {
5476
- handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5477
- }
5478
-
5479
- return handlerQueue;
5480
- },
5481
-
5482
- addProp: function( name, hook ) {
5483
- Object.defineProperty( jQuery.Event.prototype, name, {
5484
- enumerable: true,
5485
- configurable: true,
5486
-
5487
- get: isFunction( hook ) ?
5488
- function() {
5489
- if ( this.originalEvent ) {
5490
- return hook( this.originalEvent );
5491
- }
5492
- } :
5493
- function() {
5494
- if ( this.originalEvent ) {
5495
- return this.originalEvent[ name ];
5496
- }
5497
- },
5498
-
5499
- set: function( value ) {
5500
- Object.defineProperty( this, name, {
5501
- enumerable: true,
5502
- configurable: true,
5503
- writable: true,
5504
- value: value
5505
- } );
5506
- }
5507
- } );
5508
- },
5509
-
5510
- fix: function( originalEvent ) {
5511
- return originalEvent[ jQuery.expando ] ?
5512
- originalEvent :
5513
- new jQuery.Event( originalEvent );
5514
- },
5515
-
5516
- special: {
5517
- load: {
5518
-
5519
- // Prevent triggered image.load events from bubbling to window.load
5520
- noBubble: true
5521
- },
5522
- focus: {
5523
-
5524
- // Fire native event if possible so blur/focus sequence is correct
5525
- trigger: function() {
5526
- if ( this !== safeActiveElement() && this.focus ) {
5527
- this.focus();
5528
- return false;
5529
- }
5530
- },
5531
- delegateType: "focusin"
5532
- },
5533
- blur: {
5534
- trigger: function() {
5535
- if ( this === safeActiveElement() && this.blur ) {
5536
- this.blur();
5537
- return false;
5538
- }
5539
- },
5540
- delegateType: "focusout"
5541
- },
5542
- click: {
5543
-
5544
- // For checkbox, fire native event so checked state will be right
5545
- trigger: function() {
5546
- if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
5547
- this.click();
5548
- return false;
5549
- }
5550
- },
5551
-
5552
- // For cross-browser consistency, don't fire native .click() on links
5553
- _default: function( event ) {
5554
- return nodeName( event.target, "a" );
5555
- }
5556
- },
5557
-
5558
- beforeunload: {
5559
- postDispatch: function( event ) {
5560
-
5561
- // Support: Firefox 20+
5562
- // Firefox doesn't alert if the returnValue field is not set.
5563
- if ( event.result !== undefined && event.originalEvent ) {
5564
- event.originalEvent.returnValue = event.result;
5565
- }
5566
- }
5567
- }
5568
- }
5569
- };
5570
-
5571
- jQuery.removeEvent = function( elem, type, handle ) {
5572
-
5573
- // This "if" is needed for plain objects
5574
- if ( elem.removeEventListener ) {
5575
- elem.removeEventListener( type, handle );
5576
- }
5577
- };
5578
-
5579
- jQuery.Event = function( src, props ) {
5580
-
5581
- // Allow instantiation without the 'new' keyword
5582
- if ( !( this instanceof jQuery.Event ) ) {
5583
- return new jQuery.Event( src, props );
5584
- }
5585
-
5586
- // Event object
5587
- if ( src && src.type ) {
5588
- this.originalEvent = src;
5589
- this.type = src.type;
5590
-
5591
- // Events bubbling up the document may have been marked as prevented
5592
- // by a handler lower down the tree; reflect the correct value.
5593
- this.isDefaultPrevented = src.defaultPrevented ||
5594
- src.defaultPrevented === undefined &&
5595
-
5596
- // Support: Android <=2.3 only
5597
- src.returnValue === false ?
5598
- returnTrue :
5599
- returnFalse;
5600
-
5601
- // Create target properties
5602
- // Support: Safari <=6 - 7 only
5603
- // Target should not be a text node (#504, #13143)
5604
- this.target = ( src.target && src.target.nodeType === 3 ) ?
5605
- src.target.parentNode :
5606
- src.target;
5607
-
5608
- this.currentTarget = src.currentTarget;
5609
- this.relatedTarget = src.relatedTarget;
5610
-
5611
- // Event type
5612
- } else {
5613
- this.type = src;
5614
- }
5615
-
5616
- // Put explicitly provided properties onto the event object
5617
- if ( props ) {
5618
- jQuery.extend( this, props );
5619
- }
5620
-
5621
- // Create a timestamp if incoming event doesn't have one
5622
- this.timeStamp = src && src.timeStamp || Date.now();
5623
-
5624
- // Mark it as fixed
5625
- this[ jQuery.expando ] = true;
5626
- };
5627
-
5628
- // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5629
- // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5630
- jQuery.Event.prototype = {
5631
- constructor: jQuery.Event,
5632
- isDefaultPrevented: returnFalse,
5633
- isPropagationStopped: returnFalse,
5634
- isImmediatePropagationStopped: returnFalse,
5635
- isSimulated: false,
5636
-
5637
- preventDefault: function() {
5638
- var e = this.originalEvent;
5639
-
5640
- this.isDefaultPrevented = returnTrue;
5641
-
5642
- if ( e && !this.isSimulated ) {
5643
- e.preventDefault();
5644
- }
5645
- },
5646
- stopPropagation: function() {
5647
- var e = this.originalEvent;
5648
-
5649
- this.isPropagationStopped = returnTrue;
5650
-
5651
- if ( e && !this.isSimulated ) {
5652
- e.stopPropagation();
5653
- }
5654
- },
5655
- stopImmediatePropagation: function() {
5656
- var e = this.originalEvent;
5657
-
5658
- this.isImmediatePropagationStopped = returnTrue;
5659
-
5660
- if ( e && !this.isSimulated ) {
5661
- e.stopImmediatePropagation();
5662
- }
5663
-
5664
- this.stopPropagation();
5665
- }
5666
- };
5667
-
5668
- // Includes all common event props including KeyEvent and MouseEvent specific props
5669
- jQuery.each( {
5670
- altKey: true,
5671
- bubbles: true,
5672
- cancelable: true,
5673
- changedTouches: true,
5674
- ctrlKey: true,
5675
- detail: true,
5676
- eventPhase: true,
5677
- metaKey: true,
5678
- pageX: true,
5679
- pageY: true,
5680
- shiftKey: true,
5681
- view: true,
5682
- "char": true,
5683
- charCode: true,
5684
- key: true,
5685
- keyCode: true,
5686
- button: true,
5687
- buttons: true,
5688
- clientX: true,
5689
- clientY: true,
5690
- offsetX: true,
5691
- offsetY: true,
5692
- pointerId: true,
5693
- pointerType: true,
5694
- screenX: true,
5695
- screenY: true,
5696
- targetTouches: true,
5697
- toElement: true,
5698
- touches: true,
5699
-
5700
- which: function( event ) {
5701
- var button = event.button;
5702
-
5703
- // Add which for key events
5704
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
5705
- return event.charCode != null ? event.charCode : event.keyCode;
5706
- }
5707
-
5708
- // Add which for click: 1 === left; 2 === middle; 3 === right
5709
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5710
- if ( button & 1 ) {
5711
- return 1;
5712
- }
5713
-
5714
- if ( button & 2 ) {
5715
- return 3;
5716
- }
5717
-
5718
- if ( button & 4 ) {
5719
- return 2;
5720
- }
5721
-
5722
- return 0;
5723
- }
5724
-
5725
- return event.which;
5726
- }
5727
- }, jQuery.event.addProp );
5728
-
5729
- // Create mouseenter/leave events using mouseover/out and event-time checks
5730
- // so that event delegation works in jQuery.
5731
- // Do the same for pointerenter/pointerleave and pointerover/pointerout
5732
- //
5733
- // Support: Safari 7 only
5734
- // Safari sends mouseenter too often; see:
5735
- // https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5736
- // for the description of the bug (it existed in older Chrome versions as well).
5737
- jQuery.each( {
5738
- mouseenter: "mouseover",
5739
- mouseleave: "mouseout",
5740
- pointerenter: "pointerover",
5741
- pointerleave: "pointerout"
5742
- }, function( orig, fix ) {
5743
- jQuery.event.special[ orig ] = {
5744
- delegateType: fix,
5745
- bindType: fix,
5746
-
5747
- handle: function( event ) {
5748
- var ret,
5749
- target = this,
5750
- related = event.relatedTarget,
5751
- handleObj = event.handleObj;
5752
-
5753
- // For mouseenter/leave call the handler if related is outside the target.
5754
- // NB: No relatedTarget if the mouse left/entered the browser window
5755
- if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5756
- event.type = handleObj.origType;
5757
- ret = handleObj.handler.apply( this, arguments );
5758
- event.type = fix;
5759
- }
5760
- return ret;
5761
- }
5762
- };
5763
- } );
5764
-
5765
- jQuery.fn.extend( {
5766
-
5767
- on: function( types, selector, data, fn ) {
5768
- return on( this, types, selector, data, fn );
5769
- },
5770
- one: function( types, selector, data, fn ) {
5771
- return on( this, types, selector, data, fn, 1 );
5772
- },
5773
- off: function( types, selector, fn ) {
5774
- var handleObj, type;
5775
- if ( types && types.preventDefault && types.handleObj ) {
5776
-
5777
- // ( event ) dispatched jQuery.Event
5778
- handleObj = types.handleObj;
5779
- jQuery( types.delegateTarget ).off(
5780
- handleObj.namespace ?
5781
- handleObj.origType + "." + handleObj.namespace :
5782
- handleObj.origType,
5783
- handleObj.selector,
5784
- handleObj.handler
5785
- );
5786
- return this;
5787
- }
5788
- if ( typeof types === "object" ) {
5789
-
5790
- // ( types-object [, selector] )
5791
- for ( type in types ) {
5792
- this.off( type, selector, types[ type ] );
5793
- }
5794
- return this;
5795
- }
5796
- if ( selector === false || typeof selector === "function" ) {
5797
-
5798
- // ( types [, fn] )
5799
- fn = selector;
5800
- selector = undefined;
5801
- }
5802
- if ( fn === false ) {
5803
- fn = returnFalse;
5804
- }
5805
- return this.each( function() {
5806
- jQuery.event.remove( this, types, fn, selector );
5807
- } );
5808
- }
5809
- } );
5810
-
5811
-
5812
- var
5813
-
5814
- /* eslint-disable max-len */
5815
-
5816
- // See https://github.com/eslint/eslint/issues/3229
5817
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5818
-
5819
- /* eslint-enable */
5820
-
5821
- // Support: IE <=10 - 11, Edge 12 - 13 only
5822
- // In IE/Edge using regex groups here causes severe slowdowns.
5823
- // See https://connect.microsoft.com/IE/feedback/details/1736512/
5824
- rnoInnerhtml = /<script|<style|<link/i,
5825
-
5826
- // checked="checked" or checked
5827
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5828
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5829
-
5830
- // Prefer a tbody over its parent table for containing new rows
5831
- function manipulationTarget( elem, content ) {
5832
- if ( nodeName( elem, "table" ) &&
5833
- nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5834
-
5835
- return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5836
- }
5837
-
5838
- return elem;
5839
- }
5840
-
5841
- // Replace/restore the type attribute of script elements for safe DOM manipulation
5842
- function disableScript( elem ) {
5843
- elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5844
- return elem;
5845
- }
5846
- function restoreScript( elem ) {
5847
- if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5848
- elem.type = elem.type.slice( 5 );
5849
- } else {
5850
- elem.removeAttribute( "type" );
5851
- }
5852
-
5853
- return elem;
5854
- }
5855
-
5856
- function cloneCopyEvent( src, dest ) {
5857
- var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
5858
-
5859
- if ( dest.nodeType !== 1 ) {
5860
- return;
5861
- }
5862
-
5863
- // 1. Copy private data: events, handlers, etc.
5864
- if ( dataPriv.hasData( src ) ) {
5865
- pdataOld = dataPriv.access( src );
5866
- pdataCur = dataPriv.set( dest, pdataOld );
5867
- events = pdataOld.events;
5868
-
5869
- if ( events ) {
5870
- delete pdataCur.handle;
5871
- pdataCur.events = {};
5872
-
5873
- for ( type in events ) {
5874
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5875
- jQuery.event.add( dest, type, events[ type ][ i ] );
5876
- }
5877
- }
5878
- }
5879
- }
5880
-
5881
- // 2. Copy user data
5882
- if ( dataUser.hasData( src ) ) {
5883
- udataOld = dataUser.access( src );
5884
- udataCur = jQuery.extend( {}, udataOld );
5885
-
5886
- dataUser.set( dest, udataCur );
5887
- }
5888
- }
5889
-
5890
- // Fix IE bugs, see support tests
5891
- function fixInput( src, dest ) {
5892
- var nodeName = dest.nodeName.toLowerCase();
5893
-
5894
- // Fails to persist the checked state of a cloned checkbox or radio button.
5895
- if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5896
- dest.checked = src.checked;
5897
-
5898
- // Fails to return the selected option to the default selected state when cloning options
5899
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
5900
- dest.defaultValue = src.defaultValue;
5901
- }
5902
- }
5903
-
5904
- function domManip( collection, args, callback, ignored ) {
5905
-
5906
- // Flatten any nested arrays
5907
- args = concat.apply( [], args );
5908
-
5909
- var fragment, first, scripts, hasScripts, node, doc,
5910
- i = 0,
5911
- l = collection.length,
5912
- iNoClone = l - 1,
5913
- value = args[ 0 ],
5914
- valueIsFunction = isFunction( value );
5915
-
5916
- // We can't cloneNode fragments that contain checked, in WebKit
5917
- if ( valueIsFunction ||
5918
- ( l > 1 && typeof value === "string" &&
5919
- !support.checkClone && rchecked.test( value ) ) ) {
5920
- return collection.each( function( index ) {
5921
- var self = collection.eq( index );
5922
- if ( valueIsFunction ) {
5923
- args[ 0 ] = value.call( this, index, self.html() );
5924
- }
5925
- domManip( self, args, callback, ignored );
5926
- } );
5927
- }
5928
-
5929
- if ( l ) {
5930
- fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
5931
- first = fragment.firstChild;
5932
-
5933
- if ( fragment.childNodes.length === 1 ) {
5934
- fragment = first;
5935
- }
5936
-
5937
- // Require either new content or an interest in ignored elements to invoke the callback
5938
- if ( first || ignored ) {
5939
- scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5940
- hasScripts = scripts.length;
5941
-
5942
- // Use the original fragment for the last item
5943
- // instead of the first because it can end up
5944
- // being emptied incorrectly in certain situations (#8070).
5945
- for ( ; i < l; i++ ) {
5946
- node = fragment;
5947
-
5948
- if ( i !== iNoClone ) {
5949
- node = jQuery.clone( node, true, true );
5950
-
5951
- // Keep references to cloned scripts for later restoration
5952
- if ( hasScripts ) {
5953
-
5954
- // Support: Android <=4.0 only, PhantomJS 1 only
5955
- // push.apply(_, arraylike) throws on ancient WebKit
5956
- jQuery.merge( scripts, getAll( node, "script" ) );
5957
- }
5958
- }
5959
-
5960
- callback.call( collection[ i ], node, i );
5961
- }
5962
-
5963
- if ( hasScripts ) {
5964
- doc = scripts[ scripts.length - 1 ].ownerDocument;
5965
-
5966
- // Reenable scripts
5967
- jQuery.map( scripts, restoreScript );
5968
-
5969
- // Evaluate executable scripts on first document insertion
5970
- for ( i = 0; i < hasScripts; i++ ) {
5971
- node = scripts[ i ];
5972
- if ( rscriptType.test( node.type || "" ) &&
5973
- !dataPriv.access( node, "globalEval" ) &&
5974
- jQuery.contains( doc, node ) ) {
5975
-
5976
- if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
5977
-
5978
- // Optional AJAX dependency, but won't run scripts if not present
5979
- if ( jQuery._evalUrl ) {
5980
- jQuery._evalUrl( node.src );
5981
- }
5982
- } else {
5983
- DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
5984
- }
5985
- }
5986
- }
5987
- }
5988
- }
5989
- }
5990
-
5991
- return collection;
5992
- }
5993
-
5994
- function remove( elem, selector, keepData ) {
5995
- var node,
5996
- nodes = selector ? jQuery.filter( selector, elem ) : elem,
5997
- i = 0;
5998
-
5999
- for ( ; ( node = nodes[ i ] ) != null; i++ ) {
6000
- if ( !keepData && node.nodeType === 1 ) {
6001
- jQuery.cleanData( getAll( node ) );
6002
- }
6003
-
6004
- if ( node.parentNode ) {
6005
- if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
6006
- setGlobalEval( getAll( node, "script" ) );
6007
- }
6008
- node.parentNode.removeChild( node );
6009
- }
6010
- }
6011
-
6012
- return elem;
6013
- }
6014
-
6015
- jQuery.extend( {
6016
- htmlPrefilter: function( html ) {
6017
- return html.replace( rxhtmlTag, "<$1></$2>" );
6018
- },
6019
-
6020
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6021
- var i, l, srcElements, destElements,
6022
- clone = elem.cloneNode( true ),
6023
- inPage = jQuery.contains( elem.ownerDocument, elem );
6024
-
6025
- // Fix IE cloning issues
6026
- if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
6027
- !jQuery.isXMLDoc( elem ) ) {
6028
-
6029
- // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
6030
- destElements = getAll( clone );
6031
- srcElements = getAll( elem );
6032
-
6033
- for ( i = 0, l = srcElements.length; i < l; i++ ) {
6034
- fixInput( srcElements[ i ], destElements[ i ] );
6035
- }
6036
- }
6037
-
6038
- // Copy the events from the original to the clone
6039
- if ( dataAndEvents ) {
6040
- if ( deepDataAndEvents ) {
6041
- srcElements = srcElements || getAll( elem );
6042
- destElements = destElements || getAll( clone );
6043
-
6044
- for ( i = 0, l = srcElements.length; i < l; i++ ) {
6045
- cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6046
- }
6047
- } else {
6048
- cloneCopyEvent( elem, clone );
6049
- }
6050
- }
6051
-
6052
- // Preserve script evaluation history
6053
- destElements = getAll( clone, "script" );
6054
- if ( destElements.length > 0 ) {
6055
- setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6056
- }
6057
-
6058
- // Return the cloned set
6059
- return clone;
6060
- },
6061
-
6062
- cleanData: function( elems ) {
6063
- var data, elem, type,
6064
- special = jQuery.event.special,
6065
- i = 0;
6066
-
6067
- for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6068
- if ( acceptData( elem ) ) {
6069
- if ( ( data = elem[ dataPriv.expando ] ) ) {
6070
- if ( data.events ) {
6071
- for ( type in data.events ) {
6072
- if ( special[ type ] ) {
6073
- jQuery.event.remove( elem, type );
6074
-
6075
- // This is a shortcut to avoid jQuery.event.remove's overhead
6076
- } else {
6077
- jQuery.removeEvent( elem, type, data.handle );
6078
- }
6079
- }
6080
- }
6081
-
6082
- // Support: Chrome <=35 - 45+
6083
- // Assign undefined instead of using delete, see Data#remove
6084
- elem[ dataPriv.expando ] = undefined;
6085
- }
6086
- if ( elem[ dataUser.expando ] ) {
6087
-
6088
- // Support: Chrome <=35 - 45+
6089
- // Assign undefined instead of using delete, see Data#remove
6090
- elem[ dataUser.expando ] = undefined;
6091
- }
6092
- }
6093
- }
6094
- }
6095
- } );
6096
-
6097
- jQuery.fn.extend( {
6098
- detach: function( selector ) {
6099
- return remove( this, selector, true );
6100
- },
6101
-
6102
- remove: function( selector ) {
6103
- return remove( this, selector );
6104
- },
6105
-
6106
- text: function( value ) {
6107
- return access( this, function( value ) {
6108
- return value === undefined ?
6109
- jQuery.text( this ) :
6110
- this.empty().each( function() {
6111
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6112
- this.textContent = value;
6113
- }
6114
- } );
6115
- }, null, value, arguments.length );
6116
- },
6117
-
6118
- append: function() {
6119
- return domManip( this, arguments, function( elem ) {
6120
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6121
- var target = manipulationTarget( this, elem );
6122
- target.appendChild( elem );
6123
- }
6124
- } );
6125
- },
6126
-
6127
- prepend: function() {
6128
- return domManip( this, arguments, function( elem ) {
6129
- if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6130
- var target = manipulationTarget( this, elem );
6131
- target.insertBefore( elem, target.firstChild );
6132
- }
6133
- } );
6134
- },
6135
-
6136
- before: function() {
6137
- return domManip( this, arguments, function( elem ) {
6138
- if ( this.parentNode ) {
6139
- this.parentNode.insertBefore( elem, this );
6140
- }
6141
- } );
6142
- },
6143
-
6144
- after: function() {
6145
- return domManip( this, arguments, function( elem ) {
6146
- if ( this.parentNode ) {
6147
- this.parentNode.insertBefore( elem, this.nextSibling );
6148
- }
6149
- } );
6150
- },
6151
-
6152
- empty: function() {
6153
- var elem,
6154
- i = 0;
6155
-
6156
- for ( ; ( elem = this[ i ] ) != null; i++ ) {
6157
- if ( elem.nodeType === 1 ) {
6158
-
6159
- // Prevent memory leaks
6160
- jQuery.cleanData( getAll( elem, false ) );
6161
-
6162
- // Remove any remaining nodes
6163
- elem.textContent = "";
6164
- }
6165
- }
6166
-
6167
- return this;
6168
- },
6169
-
6170
- clone: function( dataAndEvents, deepDataAndEvents ) {
6171
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6172
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6173
-
6174
- return this.map( function() {
6175
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6176
- } );
6177
- },
6178
-
6179
- html: function( value ) {
6180
- return access( this, function( value ) {
6181
- var elem = this[ 0 ] || {},
6182
- i = 0,
6183
- l = this.length;
6184
-
6185
- if ( value === undefined && elem.nodeType === 1 ) {
6186
- return elem.innerHTML;
6187
- }
6188
-
6189
- // See if we can take a shortcut and just use innerHTML
6190
- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6191
- !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6192
-
6193
- value = jQuery.htmlPrefilter( value );
6194
-
6195
- try {
6196
- for ( ; i < l; i++ ) {
6197
- elem = this[ i ] || {};
6198
-
6199
- // Remove element nodes and prevent memory leaks
6200
- if ( elem.nodeType === 1 ) {
6201
- jQuery.cleanData( getAll( elem, false ) );
6202
- elem.innerHTML = value;
6203
- }
6204
- }
6205
-
6206
- elem = 0;
6207
-
6208
- // If using innerHTML throws an exception, use the fallback method
6209
- } catch ( e ) {}
6210
- }
6211
-
6212
- if ( elem ) {
6213
- this.empty().append( value );
6214
- }
6215
- }, null, value, arguments.length );
6216
- },
6217
-
6218
- replaceWith: function() {
6219
- var ignored = [];
6220
-
6221
- // Make the changes, replacing each non-ignored context element with the new content
6222
- return domManip( this, arguments, function( elem ) {
6223
- var parent = this.parentNode;
6224
-
6225
- if ( jQuery.inArray( this, ignored ) < 0 ) {
6226
- jQuery.cleanData( getAll( this ) );
6227
- if ( parent ) {
6228
- parent.replaceChild( elem, this );
6229
- }
6230
- }
6231
-
6232
- // Force callback invocation
6233
- }, ignored );
6234
- }
6235
- } );
6236
-
6237
- jQuery.each( {
6238
- appendTo: "append",
6239
- prependTo: "prepend",
6240
- insertBefore: "before",
6241
- insertAfter: "after",
6242
- replaceAll: "replaceWith"
6243
- }, function( name, original ) {
6244
- jQuery.fn[ name ] = function( selector ) {
6245
- var elems,
6246
- ret = [],
6247
- insert = jQuery( selector ),
6248
- last = insert.length - 1,
6249
- i = 0;
6250
-
6251
- for ( ; i <= last; i++ ) {
6252
- elems = i === last ? this : this.clone( true );
6253
- jQuery( insert[ i ] )[ original ]( elems );
6254
-
6255
- // Support: Android <=4.0 only, PhantomJS 1 only
6256
- // .get() because push.apply(_, arraylike) throws on ancient WebKit
6257
- push.apply( ret, elems.get() );
6258
- }
6259
-
6260
- return this.pushStack( ret );
6261
- };
6262
- } );
6263
- var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6264
-
6265
- var getStyles = function( elem ) {
6266
-
6267
- // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6268
- // IE throws on elements created in popups
6269
- // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6270
- var view = elem.ownerDocument.defaultView;
6271
-
6272
- if ( !view || !view.opener ) {
6273
- view = window;
6274
- }
6275
-
6276
- return view.getComputedStyle( elem );
6277
- };
6278
-
6279
- var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6280
-
6281
-
6282
-
6283
- ( function() {
6284
-
6285
- // Executing both pixelPosition & boxSizingReliable tests require only one layout
6286
- // so they're executed at the same time to save the second computation.
6287
- function computeStyleTests() {
6288
-
6289
- // This is a singleton, we need to execute it only once
6290
- if ( !div ) {
6291
- return;
6292
- }
6293
-
6294
- container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6295
- "margin-top:1px;padding:0;border:0";
6296
- div.style.cssText =
6297
- "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6298
- "margin:auto;border:1px;padding:1px;" +
6299
- "width:60%;top:1%";
6300
- documentElement.appendChild( container ).appendChild( div );
6301
-
6302
- var divStyle = window.getComputedStyle( div );
6303
- pixelPositionVal = divStyle.top !== "1%";
6304
-
6305
- // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6306
- reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6307
-
6308
- // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6309
- // Some styles come back with percentage values, even though they shouldn't
6310
- div.style.right = "60%";
6311
- pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6312
-
6313
- // Support: IE 9 - 11 only
6314
- // Detect misreporting of content dimensions for box-sizing:border-box elements
6315
- boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6316
-
6317
- // Support: IE 9 only
6318
- // Detect overflow:scroll screwiness (gh-3699)
6319
- div.style.position = "absolute";
6320
- scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
6321
-
6322
- documentElement.removeChild( container );
6323
-
6324
- // Nullify the div so it wouldn't be stored in the memory and
6325
- // it will also be a sign that checks already performed
6326
- div = null;
6327
- }
6328
-
6329
- function roundPixelMeasures( measure ) {
6330
- return Math.round( parseFloat( measure ) );
6331
- }
6332
-
6333
- var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6334
- reliableMarginLeftVal,
6335
- container = document.createElement( "div" ),
6336
- div = document.createElement( "div" );
6337
-
6338
- // Finish early in limited (non-browser) environments
6339
- if ( !div.style ) {
6340
- return;
6341
- }
6342
-
6343
- // Support: IE <=9 - 11 only
6344
- // Style of cloned element affects source element cloned (#8908)
6345
- div.style.backgroundClip = "content-box";
6346
- div.cloneNode( true ).style.backgroundClip = "";
6347
- support.clearCloneStyle = div.style.backgroundClip === "content-box";
6348
-
6349
- jQuery.extend( support, {
6350
- boxSizingReliable: function() {
6351
- computeStyleTests();
6352
- return boxSizingReliableVal;
6353
- },
6354
- pixelBoxStyles: function() {
6355
- computeStyleTests();
6356
- return pixelBoxStylesVal;
6357
- },
6358
- pixelPosition: function() {
6359
- computeStyleTests();
6360
- return pixelPositionVal;
6361
- },
6362
- reliableMarginLeft: function() {
6363
- computeStyleTests();
6364
- return reliableMarginLeftVal;
6365
- },
6366
- scrollboxSize: function() {
6367
- computeStyleTests();
6368
- return scrollboxSizeVal;
6369
- }
6370
- } );
6371
- } )();
6372
-
6373
-
6374
- function curCSS( elem, name, computed ) {
6375
- var width, minWidth, maxWidth, ret,
6376
-
6377
- // Support: Firefox 51+
6378
- // Retrieving style before computed somehow
6379
- // fixes an issue with getting wrong values
6380
- // on detached elements
6381
- style = elem.style;
6382
-
6383
- computed = computed || getStyles( elem );
6384
-
6385
- // getPropertyValue is needed for:
6386
- // .css('filter') (IE 9 only, #12537)
6387
- // .css('--customProperty) (#3144)
6388
- if ( computed ) {
6389
- ret = computed.getPropertyValue( name ) || computed[ name ];
6390
-
6391
- if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6392
- ret = jQuery.style( elem, name );
6393
- }
6394
-
6395
- // A tribute to the "awesome hack by Dean Edwards"
6396
- // Android Browser returns percentage for some values,
6397
- // but width seems to be reliably pixels.
6398
- // This is against the CSSOM draft spec:
6399
- // https://drafts.csswg.org/cssom/#resolved-values
6400
- if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6401
-
6402
- // Remember the original values
6403
- width = style.width;
6404
- minWidth = style.minWidth;
6405
- maxWidth = style.maxWidth;
6406
-
6407
- // Put in the new values to get a computed value out
6408
- style.minWidth = style.maxWidth = style.width = ret;
6409
- ret = computed.width;
6410
-
6411
- // Revert the changed values
6412
- style.width = width;
6413
- style.minWidth = minWidth;
6414
- style.maxWidth = maxWidth;
6415
- }
6416
- }
6417
-
6418
- return ret !== undefined ?
6419
-
6420
- // Support: IE <=9 - 11 only
6421
- // IE returns zIndex value as an integer.
6422
- ret + "" :
6423
- ret;
6424
- }
6425
-
6426
-
6427
- function addGetHookIf( conditionFn, hookFn ) {
6428
-
6429
- // Define the hook, we'll check on the first run if it's really needed.
6430
- return {
6431
- get: function() {
6432
- if ( conditionFn() ) {
6433
-
6434
- // Hook not needed (or it's not possible to use it due
6435
- // to missing dependency), remove it.
6436
- delete this.get;
6437
- return;
6438
- }
6439
-
6440
- // Hook needed; redefine it so that the support test is not executed again.
6441
- return ( this.get = hookFn ).apply( this, arguments );
6442
- }
6443
- };
6444
- }
6445
-
6446
-
6447
- var
6448
-
6449
- // Swappable if display is none or starts with table
6450
- // except "table", "table-cell", or "table-caption"
6451
- // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6452
- rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6453
- rcustomProp = /^--/,
6454
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6455
- cssNormalTransform = {
6456
- letterSpacing: "0",
6457
- fontWeight: "400"
6458
- },
6459
-
6460
- cssPrefixes = [ "Webkit", "Moz", "ms" ],
6461
- emptyStyle = document.createElement( "div" ).style;
6462
-
6463
- // Return a css property mapped to a potentially vendor prefixed property
6464
- function vendorPropName( name ) {
6465
-
6466
- // Shortcut for names that are not vendor prefixed
6467
- if ( name in emptyStyle ) {
6468
- return name;
6469
- }
6470
-
6471
- // Check for vendor prefixed names
6472
- var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6473
- i = cssPrefixes.length;
6474
-
6475
- while ( i-- ) {
6476
- name = cssPrefixes[ i ] + capName;
6477
- if ( name in emptyStyle ) {
6478
- return name;
6479
- }
6480
- }
6481
- }
6482
-
6483
- // Return a property mapped along what jQuery.cssProps suggests or to
6484
- // a vendor prefixed property.
6485
- function finalPropName( name ) {
6486
- var ret = jQuery.cssProps[ name ];
6487
- if ( !ret ) {
6488
- ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6489
- }
6490
- return ret;
6491
- }
6492
-
6493
- function setPositiveNumber( elem, value, subtract ) {
6494
-
6495
- // Any relative (+/-) values have already been
6496
- // normalized at this point
6497
- var matches = rcssNum.exec( value );
6498
- return matches ?
6499
-
6500
- // Guard against undefined "subtract", e.g., when used as in cssHooks
6501
- Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6502
- value;
6503
- }
6504
-
6505
- function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6506
- var i = dimension === "width" ? 1 : 0,
6507
- extra = 0,
6508
- delta = 0;
6509
-
6510
- // Adjustment may not be necessary
6511
- if ( box === ( isBorderBox ? "border" : "content" ) ) {
6512
- return 0;
6513
- }
6514
-
6515
- for ( ; i < 4; i += 2 ) {
6516
-
6517
- // Both box models exclude margin
6518
- if ( box === "margin" ) {
6519
- delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6520
- }
6521
-
6522
- // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6523
- if ( !isBorderBox ) {
6524
-
6525
- // Add padding
6526
- delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6527
-
6528
- // For "border" or "margin", add border
6529
- if ( box !== "padding" ) {
6530
- delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6531
-
6532
- // But still keep track of it otherwise
6533
- } else {
6534
- extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6535
- }
6536
-
6537
- // If we get here with a border-box (content + padding + border), we're seeking "content" or
6538
- // "padding" or "margin"
6539
- } else {
6540
-
6541
- // For "content", subtract padding
6542
- if ( box === "content" ) {
6543
- delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6544
- }
6545
-
6546
- // For "content" or "padding", subtract border
6547
- if ( box !== "margin" ) {
6548
- delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6549
- }
6550
- }
6551
- }
6552
-
6553
- // Account for positive content-box scroll gutter when requested by providing computedVal
6554
- if ( !isBorderBox && computedVal >= 0 ) {
6555
-
6556
- // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6557
- // Assuming integer scroll gutter, subtract the rest and round down
6558
- delta += Math.max( 0, Math.ceil(
6559
- elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6560
- computedVal -
6561
- delta -
6562
- extra -
6563
- 0.5
6564
- ) );
6565
- }
6566
-
6567
- return delta;
6568
- }
6569
-
6570
- function getWidthOrHeight( elem, dimension, extra ) {
6571
-
6572
- // Start with computed style
6573
- var styles = getStyles( elem ),
6574
- val = curCSS( elem, dimension, styles ),
6575
- isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6576
- valueIsBorderBox = isBorderBox;
6577
-
6578
- // Support: Firefox <=54
6579
- // Return a confounding non-pixel value or feign ignorance, as appropriate.
6580
- if ( rnumnonpx.test( val ) ) {
6581
- if ( !extra ) {
6582
- return val;
6583
- }
6584
- val = "auto";
6585
- }
6586
-
6587
- // Check for style in case a browser which returns unreliable values
6588
- // for getComputedStyle silently falls back to the reliable elem.style
6589
- valueIsBorderBox = valueIsBorderBox &&
6590
- ( support.boxSizingReliable() || val === elem.style[ dimension ] );
6591
-
6592
- // Fall back to offsetWidth/offsetHeight when value is "auto"
6593
- // This happens for inline elements with no explicit setting (gh-3571)
6594
- // Support: Android <=4.1 - 4.3 only
6595
- // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6596
- if ( val === "auto" ||
6597
- !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
6598
-
6599
- val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
6600
-
6601
- // offsetWidth/offsetHeight provide border-box values
6602
- valueIsBorderBox = true;
6603
- }
6604
-
6605
- // Normalize "" and auto
6606
- val = parseFloat( val ) || 0;
6607
-
6608
- // Adjust for the element's box model
6609
- return ( val +
6610
- boxModelAdjustment(
6611
- elem,
6612
- dimension,
6613
- extra || ( isBorderBox ? "border" : "content" ),
6614
- valueIsBorderBox,
6615
- styles,
6616
-
6617
- // Provide the current computed size to request scroll gutter calculation (gh-3589)
6618
- val
6619
- )
6620
- ) + "px";
6621
- }
6622
-
6623
- jQuery.extend( {
6624
-
6625
- // Add in style property hooks for overriding the default
6626
- // behavior of getting and setting a style property
6627
- cssHooks: {
6628
- opacity: {
6629
- get: function( elem, computed ) {
6630
- if ( computed ) {
6631
-
6632
- // We should always get a number back from opacity
6633
- var ret = curCSS( elem, "opacity" );
6634
- return ret === "" ? "1" : ret;
6635
- }
6636
- }
6637
- }
6638
- },
6639
-
6640
- // Don't automatically add "px" to these possibly-unitless properties
6641
- cssNumber: {
6642
- "animationIterationCount": true,
6643
- "columnCount": true,
6644
- "fillOpacity": true,
6645
- "flexGrow": true,
6646
- "flexShrink": true,
6647
- "fontWeight": true,
6648
- "lineHeight": true,
6649
- "opacity": true,
6650
- "order": true,
6651
- "orphans": true,
6652
- "widows": true,
6653
- "zIndex": true,
6654
- "zoom": true
6655
- },
6656
-
6657
- // Add in properties whose names you wish to fix before
6658
- // setting or getting the value
6659
- cssProps: {},
6660
-
6661
- // Get and set the style property on a DOM Node
6662
- style: function( elem, name, value, extra ) {
6663
-
6664
- // Don't set styles on text and comment nodes
6665
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6666
- return;
6667
- }
6668
-
6669
- // Make sure that we're working with the right name
6670
- var ret, type, hooks,
6671
- origName = camelCase( name ),
6672
- isCustomProp = rcustomProp.test( name ),
6673
- style = elem.style;
6674
-
6675
- // Make sure that we're working with the right name. We don't
6676
- // want to query the value if it is a CSS custom property
6677
- // since they are user-defined.
6678
- if ( !isCustomProp ) {
6679
- name = finalPropName( origName );
6680
- }
6681
-
6682
- // Gets hook for the prefixed version, then unprefixed version
6683
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6684
-
6685
- // Check if we're setting a value
6686
- if ( value !== undefined ) {
6687
- type = typeof value;
6688
-
6689
- // Convert "+=" or "-=" to relative numbers (#7345)
6690
- if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6691
- value = adjustCSS( elem, name, ret );
6692
-
6693
- // Fixes bug #9237
6694
- type = "number";
6695
- }
6696
-
6697
- // Make sure that null and NaN values aren't set (#7116)
6698
- if ( value == null || value !== value ) {
6699
- return;
6700
- }
6701
-
6702
- // If a number was passed in, add the unit (except for certain CSS properties)
6703
- if ( type === "number" ) {
6704
- value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6705
- }
6706
-
6707
- // background-* props affect original clone's values
6708
- if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6709
- style[ name ] = "inherit";
6710
- }
6711
-
6712
- // If a hook was provided, use that value, otherwise just set the specified value
6713
- if ( !hooks || !( "set" in hooks ) ||
6714
- ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6715
-
6716
- if ( isCustomProp ) {
6717
- style.setProperty( name, value );
6718
- } else {
6719
- style[ name ] = value;
6720
- }
6721
- }
6722
-
6723
- } else {
6724
-
6725
- // If a hook was provided get the non-computed value from there
6726
- if ( hooks && "get" in hooks &&
6727
- ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6728
-
6729
- return ret;
6730
- }
6731
-
6732
- // Otherwise just get the value from the style object
6733
- return style[ name ];
6734
- }
6735
- },
6736
-
6737
- css: function( elem, name, extra, styles ) {
6738
- var val, num, hooks,
6739
- origName = camelCase( name ),
6740
- isCustomProp = rcustomProp.test( name );
6741
-
6742
- // Make sure that we're working with the right name. We don't
6743
- // want to modify the value if it is a CSS custom property
6744
- // since they are user-defined.
6745
- if ( !isCustomProp ) {
6746
- name = finalPropName( origName );
6747
- }
6748
-
6749
- // Try prefixed name followed by the unprefixed name
6750
- hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6751
-
6752
- // If a hook was provided get the computed value from there
6753
- if ( hooks && "get" in hooks ) {
6754
- val = hooks.get( elem, true, extra );
6755
- }
6756
-
6757
- // Otherwise, if a way to get the computed value exists, use that
6758
- if ( val === undefined ) {
6759
- val = curCSS( elem, name, styles );
6760
- }
6761
-
6762
- // Convert "normal" to computed value
6763
- if ( val === "normal" && name in cssNormalTransform ) {
6764
- val = cssNormalTransform[ name ];
6765
- }
6766
-
6767
- // Make numeric if forced or a qualifier was provided and val looks numeric
6768
- if ( extra === "" || extra ) {
6769
- num = parseFloat( val );
6770
- return extra === true || isFinite( num ) ? num || 0 : val;
6771
- }
6772
-
6773
- return val;
6774
- }
6775
- } );
6776
-
6777
- jQuery.each( [ "height", "width" ], function( i, dimension ) {
6778
- jQuery.cssHooks[ dimension ] = {
6779
- get: function( elem, computed, extra ) {
6780
- if ( computed ) {
6781
-
6782
- // Certain elements can have dimension info if we invisibly show them
6783
- // but it must have a current display style that would benefit
6784
- return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
6785
-
6786
- // Support: Safari 8+
6787
- // Table columns in Safari have non-zero offsetWidth & zero
6788
- // getBoundingClientRect().width unless display is changed.
6789
- // Support: IE <=11 only
6790
- // Running getBoundingClientRect on a disconnected node
6791
- // in IE throws an error.
6792
- ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6793
- swap( elem, cssShow, function() {
6794
- return getWidthOrHeight( elem, dimension, extra );
6795
- } ) :
6796
- getWidthOrHeight( elem, dimension, extra );
6797
- }
6798
- },
6799
-
6800
- set: function( elem, value, extra ) {
6801
- var matches,
6802
- styles = getStyles( elem ),
6803
- isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6804
- subtract = extra && boxModelAdjustment(
6805
- elem,
6806
- dimension,
6807
- extra,
6808
- isBorderBox,
6809
- styles
6810
- );
6811
-
6812
- // Account for unreliable border-box dimensions by comparing offset* to computed and
6813
- // faking a content-box to get border and padding (gh-3699)
6814
- if ( isBorderBox && support.scrollboxSize() === styles.position ) {
6815
- subtract -= Math.ceil(
6816
- elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6817
- parseFloat( styles[ dimension ] ) -
6818
- boxModelAdjustment( elem, dimension, "border", false, styles ) -
6819
- 0.5
6820
- );
6821
- }
6822
-
6823
- // Convert to pixels if value adjustment is needed
6824
- if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6825
- ( matches[ 3 ] || "px" ) !== "px" ) {
6826
-
6827
- elem.style[ dimension ] = value;
6828
- value = jQuery.css( elem, dimension );
6829
- }
6830
-
6831
- return setPositiveNumber( elem, value, subtract );
6832
- }
6833
- };
6834
- } );
6835
-
6836
- jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6837
- function( elem, computed ) {
6838
- if ( computed ) {
6839
- return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
6840
- elem.getBoundingClientRect().left -
6841
- swap( elem, { marginLeft: 0 }, function() {
6842
- return elem.getBoundingClientRect().left;
6843
- } )
6844
- ) + "px";
6845
- }
6846
- }
6847
- );
6848
-
6849
- // These hooks are used by animate to expand properties
6850
- jQuery.each( {
6851
- margin: "",
6852
- padding: "",
6853
- border: "Width"
6854
- }, function( prefix, suffix ) {
6855
- jQuery.cssHooks[ prefix + suffix ] = {
6856
- expand: function( value ) {
6857
- var i = 0,
6858
- expanded = {},
6859
-
6860
- // Assumes a single number if not a string
6861
- parts = typeof value === "string" ? value.split( " " ) : [ value ];
6862
-
6863
- for ( ; i < 4; i++ ) {
6864
- expanded[ prefix + cssExpand[ i ] + suffix ] =
6865
- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6866
- }
6867
-
6868
- return expanded;
6869
- }
6870
- };
6871
-
6872
- if ( prefix !== "margin" ) {
6873
- jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6874
- }
6875
- } );
6876
-
6877
- jQuery.fn.extend( {
6878
- css: function( name, value ) {
6879
- return access( this, function( elem, name, value ) {
6880
- var styles, len,
6881
- map = {},
6882
- i = 0;
6883
-
6884
- if ( Array.isArray( name ) ) {
6885
- styles = getStyles( elem );
6886
- len = name.length;
6887
-
6888
- for ( ; i < len; i++ ) {
6889
- map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6890
- }
6891
-
6892
- return map;
6893
- }
6894
-
6895
- return value !== undefined ?
6896
- jQuery.style( elem, name, value ) :
6897
- jQuery.css( elem, name );
6898
- }, name, value, arguments.length > 1 );
6899
- }
6900
- } );
6901
-
6902
-
6903
- function Tween( elem, options, prop, end, easing ) {
6904
- return new Tween.prototype.init( elem, options, prop, end, easing );
6905
- }
6906
- jQuery.Tween = Tween;
6907
-
6908
- Tween.prototype = {
6909
- constructor: Tween,
6910
- init: function( elem, options, prop, end, easing, unit ) {
6911
- this.elem = elem;
6912
- this.prop = prop;
6913
- this.easing = easing || jQuery.easing._default;
6914
- this.options = options;
6915
- this.start = this.now = this.cur();
6916
- this.end = end;
6917
- this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6918
- },
6919
- cur: function() {
6920
- var hooks = Tween.propHooks[ this.prop ];
6921
-
6922
- return hooks && hooks.get ?
6923
- hooks.get( this ) :
6924
- Tween.propHooks._default.get( this );
6925
- },
6926
- run: function( percent ) {
6927
- var eased,
6928
- hooks = Tween.propHooks[ this.prop ];
6929
-
6930
- if ( this.options.duration ) {
6931
- this.pos = eased = jQuery.easing[ this.easing ](
6932
- percent, this.options.duration * percent, 0, 1, this.options.duration
6933
- );
6934
- } else {
6935
- this.pos = eased = percent;
6936
- }
6937
- this.now = ( this.end - this.start ) * eased + this.start;
6938
-
6939
- if ( this.options.step ) {
6940
- this.options.step.call( this.elem, this.now, this );
6941
- }
6942
-
6943
- if ( hooks && hooks.set ) {
6944
- hooks.set( this );
6945
- } else {
6946
- Tween.propHooks._default.set( this );
6947
- }
6948
- return this;
6949
- }
6950
- };
6951
-
6952
- Tween.prototype.init.prototype = Tween.prototype;
6953
-
6954
- Tween.propHooks = {
6955
- _default: {
6956
- get: function( tween ) {
6957
- var result;
6958
-
6959
- // Use a property on the element directly when it is not a DOM element,
6960
- // or when there is no matching style property that exists.
6961
- if ( tween.elem.nodeType !== 1 ||
6962
- tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
6963
- return tween.elem[ tween.prop ];
6964
- }
6965
-
6966
- // Passing an empty string as a 3rd parameter to .css will automatically
6967
- // attempt a parseFloat and fallback to a string if the parse fails.
6968
- // Simple values such as "10px" are parsed to Float;
6969
- // complex values such as "rotate(1rad)" are returned as-is.
6970
- result = jQuery.css( tween.elem, tween.prop, "" );
6971
-
6972
- // Empty strings, null, undefined and "auto" are converted to 0.
6973
- return !result || result === "auto" ? 0 : result;
6974
- },
6975
- set: function( tween ) {
6976
-
6977
- // Use step hook for back compat.
6978
- // Use cssHook if its there.
6979
- // Use .style if available and use plain properties where available.
6980
- if ( jQuery.fx.step[ tween.prop ] ) {
6981
- jQuery.fx.step[ tween.prop ]( tween );
6982
- } else if ( tween.elem.nodeType === 1 &&
6983
- ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
6984
- jQuery.cssHooks[ tween.prop ] ) ) {
6985
- jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6986
- } else {
6987
- tween.elem[ tween.prop ] = tween.now;
6988
- }
6989
- }
6990
- }
6991
- };
6992
-
6993
- // Support: IE <=9 only
6994
- // Panic based approach to setting things on disconnected nodes
6995
- Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
6996
- set: function( tween ) {
6997
- if ( tween.elem.nodeType && tween.elem.parentNode ) {
6998
- tween.elem[ tween.prop ] = tween.now;
6999
- }
7000
- }
7001
- };
7002
-
7003
- jQuery.easing = {
7004
- linear: function( p ) {
7005
- return p;
7006
- },
7007
- swing: function( p ) {
7008
- return 0.5 - Math.cos( p * Math.PI ) / 2;
7009
- },
7010
- _default: "swing"
7011
- };
7012
-
7013
- jQuery.fx = Tween.prototype.init;
7014
-
7015
- // Back compat <1.8 extension point
7016
- jQuery.fx.step = {};
7017
-
7018
-
7019
-
7020
-
7021
- var
7022
- fxNow, inProgress,
7023
- rfxtypes = /^(?:toggle|show|hide)$/,
7024
- rrun = /queueHooks$/;
7025
-
7026
- function schedule() {
7027
- if ( inProgress ) {
7028
- if ( document.hidden === false && window.requestAnimationFrame ) {
7029
- window.requestAnimationFrame( schedule );
7030
- } else {
7031
- window.setTimeout( schedule, jQuery.fx.interval );
7032
- }
7033
-
7034
- jQuery.fx.tick();
7035
- }
7036
- }
7037
-
7038
- // Animations created synchronously will run synchronously
7039
- function createFxNow() {
7040
- window.setTimeout( function() {
7041
- fxNow = undefined;
7042
- } );
7043
- return ( fxNow = Date.now() );
7044
- }
7045
-
7046
- // Generate parameters to create a standard animation
7047
- function genFx( type, includeWidth ) {
7048
- var which,
7049
- i = 0,
7050
- attrs = { height: type };
7051
-
7052
- // If we include width, step value is 1 to do all cssExpand values,
7053
- // otherwise step value is 2 to skip over Left and Right
7054
- includeWidth = includeWidth ? 1 : 0;
7055
- for ( ; i < 4; i += 2 - includeWidth ) {
7056
- which = cssExpand[ i ];
7057
- attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7058
- }
7059
-
7060
- if ( includeWidth ) {
7061
- attrs.opacity = attrs.width = type;
7062
- }
7063
-
7064
- return attrs;
7065
- }
7066
-
7067
- function createTween( value, prop, animation ) {
7068
- var tween,
7069
- collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
7070
- index = 0,
7071
- length = collection.length;
7072
- for ( ; index < length; index++ ) {
7073
- if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
7074
-
7075
- // We're done with this property
7076
- return tween;
7077
- }
7078
- }
7079
- }
7080
-
7081
- function defaultPrefilter( elem, props, opts ) {
7082
- var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7083
- isBox = "width" in props || "height" in props,
7084
- anim = this,
7085
- orig = {},
7086
- style = elem.style,
7087
- hidden = elem.nodeType && isHiddenWithinTree( elem ),
7088
- dataShow = dataPriv.get( elem, "fxshow" );
7089
-
7090
- // Queue-skipping animations hijack the fx hooks
7091
- if ( !opts.queue ) {
7092
- hooks = jQuery._queueHooks( elem, "fx" );
7093
- if ( hooks.unqueued == null ) {
7094
- hooks.unqueued = 0;
7095
- oldfire = hooks.empty.fire;
7096
- hooks.empty.fire = function() {
7097
- if ( !hooks.unqueued ) {
7098
- oldfire();
7099
- }
7100
- };
7101
- }
7102
- hooks.unqueued++;
7103
-
7104
- anim.always( function() {
7105
-
7106
- // Ensure the complete handler is called before this completes
7107
- anim.always( function() {
7108
- hooks.unqueued--;
7109
- if ( !jQuery.queue( elem, "fx" ).length ) {
7110
- hooks.empty.fire();
7111
- }
7112
- } );
7113
- } );
7114
- }
7115
-
7116
- // Detect show/hide animations
7117
- for ( prop in props ) {
7118
- value = props[ prop ];
7119
- if ( rfxtypes.test( value ) ) {
7120
- delete props[ prop ];
7121
- toggle = toggle || value === "toggle";
7122
- if ( value === ( hidden ? "hide" : "show" ) ) {
7123
-
7124
- // Pretend to be hidden if this is a "show" and
7125
- // there is still data from a stopped show/hide
7126
- if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7127
- hidden = true;
7128
-
7129
- // Ignore all other no-op show/hide data
7130
- } else {
7131
- continue;
7132
- }
7133
- }
7134
- orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7135
- }
7136
- }
7137
-
7138
- // Bail out if this is a no-op like .hide().hide()
7139
- propTween = !jQuery.isEmptyObject( props );
7140
- if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7141
- return;
7142
- }
7143
-
7144
- // Restrict "overflow" and "display" styles during box animations
7145
- if ( isBox && elem.nodeType === 1 ) {
7146
-
7147
- // Support: IE <=9 - 11, Edge 12 - 15
7148
- // Record all 3 overflow attributes because IE does not infer the shorthand
7149
- // from identically-valued overflowX and overflowY and Edge just mirrors
7150
- // the overflowX value there.
7151
- opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7152
-
7153
- // Identify a display type, preferring old show/hide data over the CSS cascade
7154
- restoreDisplay = dataShow && dataShow.display;
7155
- if ( restoreDisplay == null ) {
7156
- restoreDisplay = dataPriv.get( elem, "display" );
7157
- }
7158
- display = jQuery.css( elem, "display" );
7159
- if ( display === "none" ) {
7160
- if ( restoreDisplay ) {
7161
- display = restoreDisplay;
7162
- } else {
7163
-
7164
- // Get nonempty value(s) by temporarily forcing visibility
7165
- showHide( [ elem ], true );
7166
- restoreDisplay = elem.style.display || restoreDisplay;
7167
- display = jQuery.css( elem, "display" );
7168
- showHide( [ elem ] );
7169
- }
7170
- }
7171
-
7172
- // Animate inline elements as inline-block
7173
- if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7174
- if ( jQuery.css( elem, "float" ) === "none" ) {
7175
-
7176
- // Restore the original display value at the end of pure show/hide animations
7177
- if ( !propTween ) {
7178
- anim.done( function() {
7179
- style.display = restoreDisplay;
7180
- } );
7181
- if ( restoreDisplay == null ) {
7182
- display = style.display;
7183
- restoreDisplay = display === "none" ? "" : display;
7184
- }
7185
- }
7186
- style.display = "inline-block";
7187
- }
7188
- }
7189
- }
7190
-
7191
- if ( opts.overflow ) {
7192
- style.overflow = "hidden";
7193
- anim.always( function() {
7194
- style.overflow = opts.overflow[ 0 ];
7195
- style.overflowX = opts.overflow[ 1 ];
7196
- style.overflowY = opts.overflow[ 2 ];
7197
- } );
7198
- }
7199
-
7200
- // Implement show/hide animations
7201
- propTween = false;
7202
- for ( prop in orig ) {
7203
-
7204
- // General show/hide setup for this element animation
7205
- if ( !propTween ) {
7206
- if ( dataShow ) {
7207
- if ( "hidden" in dataShow ) {
7208
- hidden = dataShow.hidden;
7209
- }
7210
- } else {
7211
- dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7212
- }
7213
-
7214
- // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7215
- if ( toggle ) {
7216
- dataShow.hidden = !hidden;
7217
- }
7218
-
7219
- // Show elements before animating them
7220
- if ( hidden ) {
7221
- showHide( [ elem ], true );
7222
- }
7223
-
7224
- /* eslint-disable no-loop-func */
7225
-
7226
- anim.done( function() {
7227
-
7228
- /* eslint-enable no-loop-func */
7229
-
7230
- // The final step of a "hide" animation is actually hiding the element
7231
- if ( !hidden ) {
7232
- showHide( [ elem ] );
7233
- }
7234
- dataPriv.remove( elem, "fxshow" );
7235
- for ( prop in orig ) {
7236
- jQuery.style( elem, prop, orig[ prop ] );
7237
- }
7238
- } );
7239
- }
7240
-
7241
- // Per-property setup
7242
- propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7243
- if ( !( prop in dataShow ) ) {
7244
- dataShow[ prop ] = propTween.start;
7245
- if ( hidden ) {
7246
- propTween.end = propTween.start;
7247
- propTween.start = 0;
7248
- }
7249
- }
7250
- }
7251
- }
7252
-
7253
- function propFilter( props, specialEasing ) {
7254
- var index, name, easing, value, hooks;
7255
-
7256
- // camelCase, specialEasing and expand cssHook pass
7257
- for ( index in props ) {
7258
- name = camelCase( index );
7259
- easing = specialEasing[ name ];
7260
- value = props[ index ];
7261
- if ( Array.isArray( value ) ) {
7262
- easing = value[ 1 ];
7263
- value = props[ index ] = value[ 0 ];
7264
- }
7265
-
7266
- if ( index !== name ) {
7267
- props[ name ] = value;
7268
- delete props[ index ];
7269
- }
7270
-
7271
- hooks = jQuery.cssHooks[ name ];
7272
- if ( hooks && "expand" in hooks ) {
7273
- value = hooks.expand( value );
7274
- delete props[ name ];
7275
-
7276
- // Not quite $.extend, this won't overwrite existing keys.
7277
- // Reusing 'index' because we have the correct "name"
7278
- for ( index in value ) {
7279
- if ( !( index in props ) ) {
7280
- props[ index ] = value[ index ];
7281
- specialEasing[ index ] = easing;
7282
- }
7283
- }
7284
- } else {
7285
- specialEasing[ name ] = easing;
7286
- }
7287
- }
7288
- }
7289
-
7290
- function Animation( elem, properties, options ) {
7291
- var result,
7292
- stopped,
7293
- index = 0,
7294
- length = Animation.prefilters.length,
7295
- deferred = jQuery.Deferred().always( function() {
7296
-
7297
- // Don't match elem in the :animated selector
7298
- delete tick.elem;
7299
- } ),
7300
- tick = function() {
7301
- if ( stopped ) {
7302
- return false;
7303
- }
7304
- var currentTime = fxNow || createFxNow(),
7305
- remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7306
-
7307
- // Support: Android 2.3 only
7308
- // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7309
- temp = remaining / animation.duration || 0,
7310
- percent = 1 - temp,
7311
- index = 0,
7312
- length = animation.tweens.length;
7313
-
7314
- for ( ; index < length; index++ ) {
7315
- animation.tweens[ index ].run( percent );
7316
- }
7317
-
7318
- deferred.notifyWith( elem, [ animation, percent, remaining ] );
7319
-
7320
- // If there's more to do, yield
7321
- if ( percent < 1 && length ) {
7322
- return remaining;
7323
- }
7324
-
7325
- // If this was an empty animation, synthesize a final progress notification
7326
- if ( !length ) {
7327
- deferred.notifyWith( elem, [ animation, 1, 0 ] );
7328
- }
7329
-
7330
- // Resolve the animation and report its conclusion
7331
- deferred.resolveWith( elem, [ animation ] );
7332
- return false;
7333
- },
7334
- animation = deferred.promise( {
7335
- elem: elem,
7336
- props: jQuery.extend( {}, properties ),
7337
- opts: jQuery.extend( true, {
7338
- specialEasing: {},
7339
- easing: jQuery.easing._default
7340
- }, options ),
7341
- originalProperties: properties,
7342
- originalOptions: options,
7343
- startTime: fxNow || createFxNow(),
7344
- duration: options.duration,
7345
- tweens: [],
7346
- createTween: function( prop, end ) {
7347
- var tween = jQuery.Tween( elem, animation.opts, prop, end,
7348
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
7349
- animation.tweens.push( tween );
7350
- return tween;
7351
- },
7352
- stop: function( gotoEnd ) {
7353
- var index = 0,
7354
-
7355
- // If we are going to the end, we want to run all the tweens
7356
- // otherwise we skip this part
7357
- length = gotoEnd ? animation.tweens.length : 0;
7358
- if ( stopped ) {
7359
- return this;
7360
- }
7361
- stopped = true;
7362
- for ( ; index < length; index++ ) {
7363
- animation.tweens[ index ].run( 1 );
7364
- }
7365
-
7366
- // Resolve when we played the last frame; otherwise, reject
7367
- if ( gotoEnd ) {
7368
- deferred.notifyWith( elem, [ animation, 1, 0 ] );
7369
- deferred.resolveWith( elem, [ animation, gotoEnd ] );
7370
- } else {
7371
- deferred.rejectWith( elem, [ animation, gotoEnd ] );
7372
- }
7373
- return this;
7374
- }
7375
- } ),
7376
- props = animation.props;
7377
-
7378
- propFilter( props, animation.opts.specialEasing );
7379
-
7380
- for ( ; index < length; index++ ) {
7381
- result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7382
- if ( result ) {
7383
- if ( isFunction( result.stop ) ) {
7384
- jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7385
- result.stop.bind( result );
7386
- }
7387
- return result;
7388
- }
7389
- }
7390
-
7391
- jQuery.map( props, createTween, animation );
7392
-
7393
- if ( isFunction( animation.opts.start ) ) {
7394
- animation.opts.start.call( elem, animation );
7395
- }
7396
-
7397
- // Attach callbacks from options
7398
- animation
7399
- .progress( animation.opts.progress )
7400
- .done( animation.opts.done, animation.opts.complete )
7401
- .fail( animation.opts.fail )
7402
- .always( animation.opts.always );
7403
-
7404
- jQuery.fx.timer(
7405
- jQuery.extend( tick, {
7406
- elem: elem,
7407
- anim: animation,
7408
- queue: animation.opts.queue
7409
- } )
7410
- );
7411
-
7412
- return animation;
7413
- }
7414
-
7415
- jQuery.Animation = jQuery.extend( Animation, {
7416
-
7417
- tweeners: {
7418
- "*": [ function( prop, value ) {
7419
- var tween = this.createTween( prop, value );
7420
- adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7421
- return tween;
7422
- } ]
7423
- },
7424
-
7425
- tweener: function( props, callback ) {
7426
- if ( isFunction( props ) ) {
7427
- callback = props;
7428
- props = [ "*" ];
7429
- } else {
7430
- props = props.match( rnothtmlwhite );
7431
- }
7432
-
7433
- var prop,
7434
- index = 0,
7435
- length = props.length;
7436
-
7437
- for ( ; index < length; index++ ) {
7438
- prop = props[ index ];
7439
- Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7440
- Animation.tweeners[ prop ].unshift( callback );
7441
- }
7442
- },
7443
-
7444
- prefilters: [ defaultPrefilter ],
7445
-
7446
- prefilter: function( callback, prepend ) {
7447
- if ( prepend ) {
7448
- Animation.prefilters.unshift( callback );
7449
- } else {
7450
- Animation.prefilters.push( callback );
7451
- }
7452
- }
7453
- } );
7454
-
7455
- jQuery.speed = function( speed, easing, fn ) {
7456
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7457
- complete: fn || !fn && easing ||
7458
- isFunction( speed ) && speed,
7459
- duration: speed,
7460
- easing: fn && easing || easing && !isFunction( easing ) && easing
7461
- };
7462
-
7463
- // Go to the end state if fx are off
7464
- if ( jQuery.fx.off ) {
7465
- opt.duration = 0;
7466
-
7467
- } else {
7468
- if ( typeof opt.duration !== "number" ) {
7469
- if ( opt.duration in jQuery.fx.speeds ) {
7470
- opt.duration = jQuery.fx.speeds[ opt.duration ];
7471
-
7472
- } else {
7473
- opt.duration = jQuery.fx.speeds._default;
7474
- }
7475
- }
7476
- }
7477
-
7478
- // Normalize opt.queue - true/undefined/null -> "fx"
7479
- if ( opt.queue == null || opt.queue === true ) {
7480
- opt.queue = "fx";
7481
- }
7482
-
7483
- // Queueing
7484
- opt.old = opt.complete;
7485
-
7486
- opt.complete = function() {
7487
- if ( isFunction( opt.old ) ) {
7488
- opt.old.call( this );
7489
- }
7490
-
7491
- if ( opt.queue ) {
7492
- jQuery.dequeue( this, opt.queue );
7493
- }
7494
- };
7495
-
7496
- return opt;
7497
- };
7498
-
7499
- jQuery.fn.extend( {
7500
- fadeTo: function( speed, to, easing, callback ) {
7501
-
7502
- // Show any hidden elements after setting opacity to 0
7503
- return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7504
-
7505
- // Animate to the value specified
7506
- .end().animate( { opacity: to }, speed, easing, callback );
7507
- },
7508
- animate: function( prop, speed, easing, callback ) {
7509
- var empty = jQuery.isEmptyObject( prop ),
7510
- optall = jQuery.speed( speed, easing, callback ),
7511
- doAnimation = function() {
7512
-
7513
- // Operate on a copy of prop so per-property easing won't be lost
7514
- var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7515
-
7516
- // Empty animations, or finishing resolves immediately
7517
- if ( empty || dataPriv.get( this, "finish" ) ) {
7518
- anim.stop( true );
7519
- }
7520
- };
7521
- doAnimation.finish = doAnimation;
7522
-
7523
- return empty || optall.queue === false ?
7524
- this.each( doAnimation ) :
7525
- this.queue( optall.queue, doAnimation );
7526
- },
7527
- stop: function( type, clearQueue, gotoEnd ) {
7528
- var stopQueue = function( hooks ) {
7529
- var stop = hooks.stop;
7530
- delete hooks.stop;
7531
- stop( gotoEnd );
7532
- };
7533
-
7534
- if ( typeof type !== "string" ) {
7535
- gotoEnd = clearQueue;
7536
- clearQueue = type;
7537
- type = undefined;
7538
- }
7539
- if ( clearQueue && type !== false ) {
7540
- this.queue( type || "fx", [] );
7541
- }
7542
-
7543
- return this.each( function() {
7544
- var dequeue = true,
7545
- index = type != null && type + "queueHooks",
7546
- timers = jQuery.timers,
7547
- data = dataPriv.get( this );
7548
-
7549
- if ( index ) {
7550
- if ( data[ index ] && data[ index ].stop ) {
7551
- stopQueue( data[ index ] );
7552
- }
7553
- } else {
7554
- for ( index in data ) {
7555
- if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7556
- stopQueue( data[ index ] );
7557
- }
7558
- }
7559
- }
7560
-
7561
- for ( index = timers.length; index--; ) {
7562
- if ( timers[ index ].elem === this &&
7563
- ( type == null || timers[ index ].queue === type ) ) {
7564
-
7565
- timers[ index ].anim.stop( gotoEnd );
7566
- dequeue = false;
7567
- timers.splice( index, 1 );
7568
- }
7569
- }
7570
-
7571
- // Start the next in the queue if the last step wasn't forced.
7572
- // Timers currently will call their complete callbacks, which
7573
- // will dequeue but only if they were gotoEnd.
7574
- if ( dequeue || !gotoEnd ) {
7575
- jQuery.dequeue( this, type );
7576
- }
7577
- } );
7578
- },
7579
- finish: function( type ) {
7580
- if ( type !== false ) {
7581
- type = type || "fx";
7582
- }
7583
- return this.each( function() {
7584
- var index,
7585
- data = dataPriv.get( this ),
7586
- queue = data[ type + "queue" ],
7587
- hooks = data[ type + "queueHooks" ],
7588
- timers = jQuery.timers,
7589
- length = queue ? queue.length : 0;
7590
-
7591
- // Enable finishing flag on private data
7592
- data.finish = true;
7593
-
7594
- // Empty the queue first
7595
- jQuery.queue( this, type, [] );
7596
-
7597
- if ( hooks && hooks.stop ) {
7598
- hooks.stop.call( this, true );
7599
- }
7600
-
7601
- // Look for any active animations, and finish them
7602
- for ( index = timers.length; index--; ) {
7603
- if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7604
- timers[ index ].anim.stop( true );
7605
- timers.splice( index, 1 );
7606
- }
7607
- }
7608
-
7609
- // Look for any animations in the old queue and finish them
7610
- for ( index = 0; index < length; index++ ) {
7611
- if ( queue[ index ] && queue[ index ].finish ) {
7612
- queue[ index ].finish.call( this );
7613
- }
7614
- }
7615
-
7616
- // Turn off finishing flag
7617
- delete data.finish;
7618
- } );
7619
- }
7620
- } );
7621
-
7622
- jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7623
- var cssFn = jQuery.fn[ name ];
7624
- jQuery.fn[ name ] = function( speed, easing, callback ) {
7625
- return speed == null || typeof speed === "boolean" ?
7626
- cssFn.apply( this, arguments ) :
7627
- this.animate( genFx( name, true ), speed, easing, callback );
7628
- };
7629
- } );
7630
-
7631
- // Generate shortcuts for custom animations
7632
- jQuery.each( {
7633
- slideDown: genFx( "show" ),
7634
- slideUp: genFx( "hide" ),
7635
- slideToggle: genFx( "toggle" ),
7636
- fadeIn: { opacity: "show" },
7637
- fadeOut: { opacity: "hide" },
7638
- fadeToggle: { opacity: "toggle" }
7639
- }, function( name, props ) {
7640
- jQuery.fn[ name ] = function( speed, easing, callback ) {
7641
- return this.animate( props, speed, easing, callback );
7642
- };
7643
- } );
7644
-
7645
- jQuery.timers = [];
7646
- jQuery.fx.tick = function() {
7647
- var timer,
7648
- i = 0,
7649
- timers = jQuery.timers;
7650
-
7651
- fxNow = Date.now();
7652
-
7653
- for ( ; i < timers.length; i++ ) {
7654
- timer = timers[ i ];
7655
-
7656
- // Run the timer and safely remove it when done (allowing for external removal)
7657
- if ( !timer() && timers[ i ] === timer ) {
7658
- timers.splice( i--, 1 );
7659
- }
7660
- }
7661
-
7662
- if ( !timers.length ) {
7663
- jQuery.fx.stop();
7664
- }
7665
- fxNow = undefined;
7666
- };
7667
-
7668
- jQuery.fx.timer = function( timer ) {
7669
- jQuery.timers.push( timer );
7670
- jQuery.fx.start();
7671
- };
7672
-
7673
- jQuery.fx.interval = 13;
7674
- jQuery.fx.start = function() {
7675
- if ( inProgress ) {
7676
- return;
7677
- }
7678
-
7679
- inProgress = true;
7680
- schedule();
7681
- };
7682
-
7683
- jQuery.fx.stop = function() {
7684
- inProgress = null;
7685
- };
7686
-
7687
- jQuery.fx.speeds = {
7688
- slow: 600,
7689
- fast: 200,
7690
-
7691
- // Default speed
7692
- _default: 400
7693
- };
7694
-
7695
-
7696
- // Based off of the plugin by Clint Helfers, with permission.
7697
- // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7698
- jQuery.fn.delay = function( time, type ) {
7699
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7700
- type = type || "fx";
7701
-
7702
- return this.queue( type, function( next, hooks ) {
7703
- var timeout = window.setTimeout( next, time );
7704
- hooks.stop = function() {
7705
- window.clearTimeout( timeout );
7706
- };
7707
- } );
7708
- };
7709
-
7710
-
7711
- ( function() {
7712
- var input = document.createElement( "input" ),
7713
- select = document.createElement( "select" ),
7714
- opt = select.appendChild( document.createElement( "option" ) );
7715
-
7716
- input.type = "checkbox";
7717
-
7718
- // Support: Android <=4.3 only
7719
- // Default value for a checkbox should be "on"
7720
- support.checkOn = input.value !== "";
7721
-
7722
- // Support: IE <=11 only
7723
- // Must access selectedIndex to make default options select
7724
- support.optSelected = opt.selected;
7725
-
7726
- // Support: IE <=11 only
7727
- // An input loses its value after becoming a radio
7728
- input = document.createElement( "input" );
7729
- input.value = "t";
7730
- input.type = "radio";
7731
- support.radioValue = input.value === "t";
7732
- } )();
7733
-
7734
-
7735
- var boolHook,
7736
- attrHandle = jQuery.expr.attrHandle;
7737
-
7738
- jQuery.fn.extend( {
7739
- attr: function( name, value ) {
7740
- return access( this, jQuery.attr, name, value, arguments.length > 1 );
7741
- },
7742
-
7743
- removeAttr: function( name ) {
7744
- return this.each( function() {
7745
- jQuery.removeAttr( this, name );
7746
- } );
7747
- }
7748
- } );
7749
-
7750
- jQuery.extend( {
7751
- attr: function( elem, name, value ) {
7752
- var ret, hooks,
7753
- nType = elem.nodeType;
7754
-
7755
- // Don't get/set attributes on text, comment and attribute nodes
7756
- if ( nType === 3 || nType === 8 || nType === 2 ) {
7757
- return;
7758
- }
7759
-
7760
- // Fallback to prop when attributes are not supported
7761
- if ( typeof elem.getAttribute === "undefined" ) {
7762
- return jQuery.prop( elem, name, value );
7763
- }
7764
-
7765
- // Attribute hooks are determined by the lowercase version
7766
- // Grab necessary hook if one is defined
7767
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7768
- hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
7769
- ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
7770
- }
7771
-
7772
- if ( value !== undefined ) {
7773
- if ( value === null ) {
7774
- jQuery.removeAttr( elem, name );
7775
- return;
7776
- }
7777
-
7778
- if ( hooks && "set" in hooks &&
7779
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7780
- return ret;
7781
- }
7782
-
7783
- elem.setAttribute( name, value + "" );
7784
- return value;
7785
- }
7786
-
7787
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7788
- return ret;
7789
- }
7790
-
7791
- ret = jQuery.find.attr( elem, name );
7792
-
7793
- // Non-existent attributes return null, we normalize to undefined
7794
- return ret == null ? undefined : ret;
7795
- },
7796
-
7797
- attrHooks: {
7798
- type: {
7799
- set: function( elem, value ) {
7800
- if ( !support.radioValue && value === "radio" &&
7801
- nodeName( elem, "input" ) ) {
7802
- var val = elem.value;
7803
- elem.setAttribute( "type", value );
7804
- if ( val ) {
7805
- elem.value = val;
7806
- }
7807
- return value;
7808
- }
7809
- }
7810
- }
7811
- },
7812
-
7813
- removeAttr: function( elem, value ) {
7814
- var name,
7815
- i = 0,
7816
-
7817
- // Attribute names can contain non-HTML whitespace characters
7818
- // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
7819
- attrNames = value && value.match( rnothtmlwhite );
7820
-
7821
- if ( attrNames && elem.nodeType === 1 ) {
7822
- while ( ( name = attrNames[ i++ ] ) ) {
7823
- elem.removeAttribute( name );
7824
- }
7825
- }
7826
- }
7827
- } );
7828
-
7829
- // Hooks for boolean attributes
7830
- boolHook = {
7831
- set: function( elem, value, name ) {
7832
- if ( value === false ) {
7833
-
7834
- // Remove boolean attributes when set to false
7835
- jQuery.removeAttr( elem, name );
7836
- } else {
7837
- elem.setAttribute( name, name );
7838
- }
7839
- return name;
7840
- }
7841
- };
7842
-
7843
- jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7844
- var getter = attrHandle[ name ] || jQuery.find.attr;
7845
-
7846
- attrHandle[ name ] = function( elem, name, isXML ) {
7847
- var ret, handle,
7848
- lowercaseName = name.toLowerCase();
7849
-
7850
- if ( !isXML ) {
7851
-
7852
- // Avoid an infinite loop by temporarily removing this function from the getter
7853
- handle = attrHandle[ lowercaseName ];
7854
- attrHandle[ lowercaseName ] = ret;
7855
- ret = getter( elem, name, isXML ) != null ?
7856
- lowercaseName :
7857
- null;
7858
- attrHandle[ lowercaseName ] = handle;
7859
- }
7860
- return ret;
7861
- };
7862
- } );
7863
-
7864
-
7865
-
7866
-
7867
- var rfocusable = /^(?:input|select|textarea|button)$/i,
7868
- rclickable = /^(?:a|area)$/i;
7869
-
7870
- jQuery.fn.extend( {
7871
- prop: function( name, value ) {
7872
- return access( this, jQuery.prop, name, value, arguments.length > 1 );
7873
- },
7874
-
7875
- removeProp: function( name ) {
7876
- return this.each( function() {
7877
- delete this[ jQuery.propFix[ name ] || name ];
7878
- } );
7879
- }
7880
- } );
7881
-
7882
- jQuery.extend( {
7883
- prop: function( elem, name, value ) {
7884
- var ret, hooks,
7885
- nType = elem.nodeType;
7886
-
7887
- // Don't get/set properties on text, comment and attribute nodes
7888
- if ( nType === 3 || nType === 8 || nType === 2 ) {
7889
- return;
7890
- }
7891
-
7892
- if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7893
-
7894
- // Fix name and attach hooks
7895
- name = jQuery.propFix[ name ] || name;
7896
- hooks = jQuery.propHooks[ name ];
7897
- }
7898
-
7899
- if ( value !== undefined ) {
7900
- if ( hooks && "set" in hooks &&
7901
- ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7902
- return ret;
7903
- }
7904
-
7905
- return ( elem[ name ] = value );
7906
- }
7907
-
7908
- if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7909
- return ret;
7910
- }
7911
-
7912
- return elem[ name ];
7913
- },
7914
-
7915
- propHooks: {
7916
- tabIndex: {
7917
- get: function( elem ) {
7918
-
7919
- // Support: IE <=9 - 11 only
7920
- // elem.tabIndex doesn't always return the
7921
- // correct value when it hasn't been explicitly set
7922
- // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
7923
- // Use proper attribute retrieval(#12072)
7924
- var tabindex = jQuery.find.attr( elem, "tabindex" );
7925
-
7926
- if ( tabindex ) {
7927
- return parseInt( tabindex, 10 );
7928
- }
7929
-
7930
- if (
7931
- rfocusable.test( elem.nodeName ) ||
7932
- rclickable.test( elem.nodeName ) &&
7933
- elem.href
7934
- ) {
7935
- return 0;
7936
- }
7937
-
7938
- return -1;
7939
- }
7940
- }
7941
- },
7942
-
7943
- propFix: {
7944
- "for": "htmlFor",
7945
- "class": "className"
7946
- }
7947
- } );
7948
-
7949
- // Support: IE <=11 only
7950
- // Accessing the selectedIndex property
7951
- // forces the browser to respect setting selected
7952
- // on the option
7953
- // The getter ensures a default option is selected
7954
- // when in an optgroup
7955
- // eslint rule "no-unused-expressions" is disabled for this code
7956
- // since it considers such accessions noop
7957
- if ( !support.optSelected ) {
7958
- jQuery.propHooks.selected = {
7959
- get: function( elem ) {
7960
-
7961
- /* eslint no-unused-expressions: "off" */
7962
-
7963
- var parent = elem.parentNode;
7964
- if ( parent && parent.parentNode ) {
7965
- parent.parentNode.selectedIndex;
7966
- }
7967
- return null;
7968
- },
7969
- set: function( elem ) {
7970
-
7971
- /* eslint no-unused-expressions: "off" */
7972
-
7973
- var parent = elem.parentNode;
7974
- if ( parent ) {
7975
- parent.selectedIndex;
7976
-
7977
- if ( parent.parentNode ) {
7978
- parent.parentNode.selectedIndex;
7979
- }
7980
- }
7981
- }
7982
- };
7983
- }
7984
-
7985
- jQuery.each( [
7986
- "tabIndex",
7987
- "readOnly",
7988
- "maxLength",
7989
- "cellSpacing",
7990
- "cellPadding",
7991
- "rowSpan",
7992
- "colSpan",
7993
- "useMap",
7994
- "frameBorder",
7995
- "contentEditable"
7996
- ], function() {
7997
- jQuery.propFix[ this.toLowerCase() ] = this;
7998
- } );
7999
-
8000
-
8001
-
8002
-
8003
- // Strip and collapse whitespace according to HTML spec
8004
- // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
8005
- function stripAndCollapse( value ) {
8006
- var tokens = value.match( rnothtmlwhite ) || [];
8007
- return tokens.join( " " );
8008
- }
8009
-
8010
-
8011
- function getClass( elem ) {
8012
- return elem.getAttribute && elem.getAttribute( "class" ) || "";
8013
- }
8014
-
8015
- function classesToArray( value ) {
8016
- if ( Array.isArray( value ) ) {
8017
- return value;
8018
- }
8019
- if ( typeof value === "string" ) {
8020
- return value.match( rnothtmlwhite ) || [];
8021
- }
8022
- return [];
8023
- }
8024
-
8025
- jQuery.fn.extend( {
8026
- addClass: function( value ) {
8027
- var classes, elem, cur, curValue, clazz, j, finalValue,
8028
- i = 0;
8029
-
8030
- if ( isFunction( value ) ) {
8031
- return this.each( function( j ) {
8032
- jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
8033
- } );
8034
- }
8035
-
8036
- classes = classesToArray( value );
8037
-
8038
- if ( classes.length ) {
8039
- while ( ( elem = this[ i++ ] ) ) {
8040
- curValue = getClass( elem );
8041
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8042
-
8043
- if ( cur ) {
8044
- j = 0;
8045
- while ( ( clazz = classes[ j++ ] ) ) {
8046
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8047
- cur += clazz + " ";
8048
- }
8049
- }
8050
-
8051
- // Only assign if different to avoid unneeded rendering.
8052
- finalValue = stripAndCollapse( cur );
8053
- if ( curValue !== finalValue ) {
8054
- elem.setAttribute( "class", finalValue );
8055
- }
8056
- }
8057
- }
8058
- }
8059
-
8060
- return this;
8061
- },
8062
-
8063
- removeClass: function( value ) {
8064
- var classes, elem, cur, curValue, clazz, j, finalValue,
8065
- i = 0;
8066
-
8067
- if ( isFunction( value ) ) {
8068
- return this.each( function( j ) {
8069
- jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
8070
- } );
8071
- }
8072
-
8073
- if ( !arguments.length ) {
8074
- return this.attr( "class", "" );
8075
- }
8076
-
8077
- classes = classesToArray( value );
8078
-
8079
- if ( classes.length ) {
8080
- while ( ( elem = this[ i++ ] ) ) {
8081
- curValue = getClass( elem );
8082
-
8083
- // This expression is here for better compressibility (see addClass)
8084
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8085
-
8086
- if ( cur ) {
8087
- j = 0;
8088
- while ( ( clazz = classes[ j++ ] ) ) {
8089
-
8090
- // Remove *all* instances
8091
- while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8092
- cur = cur.replace( " " + clazz + " ", " " );
8093
- }
8094
- }
8095
-
8096
- // Only assign if different to avoid unneeded rendering.
8097
- finalValue = stripAndCollapse( cur );
8098
- if ( curValue !== finalValue ) {
8099
- elem.setAttribute( "class", finalValue );
8100
- }
8101
- }
8102
- }
8103
- }
8104
-
8105
- return this;
8106
- },
8107
-
8108
- toggleClass: function( value, stateVal ) {
8109
- var type = typeof value,
8110
- isValidValue = type === "string" || Array.isArray( value );
8111
-
8112
- if ( typeof stateVal === "boolean" && isValidValue ) {
8113
- return stateVal ? this.addClass( value ) : this.removeClass( value );
8114
- }
8115
-
8116
- if ( isFunction( value ) ) {
8117
- return this.each( function( i ) {
8118
- jQuery( this ).toggleClass(
8119
- value.call( this, i, getClass( this ), stateVal ),
8120
- stateVal
8121
- );
8122
- } );
8123
- }
8124
-
8125
- return this.each( function() {
8126
- var className, i, self, classNames;
8127
-
8128
- if ( isValidValue ) {
8129
-
8130
- // Toggle individual class names
8131
- i = 0;
8132
- self = jQuery( this );
8133
- classNames = classesToArray( value );
8134
-
8135
- while ( ( className = classNames[ i++ ] ) ) {
8136
-
8137
- // Check each className given, space separated list
8138
- if ( self.hasClass( className ) ) {
8139
- self.removeClass( className );
8140
- } else {
8141
- self.addClass( className );
8142
- }
8143
- }
8144
-
8145
- // Toggle whole class name
8146
- } else if ( value === undefined || type === "boolean" ) {
8147
- className = getClass( this );
8148
- if ( className ) {
8149
-
8150
- // Store className if set
8151
- dataPriv.set( this, "__className__", className );
8152
- }
8153
-
8154
- // If the element has a class name or if we're passed `false`,
8155
- // then remove the whole classname (if there was one, the above saved it).
8156
- // Otherwise bring back whatever was previously saved (if anything),
8157
- // falling back to the empty string if nothing was stored.
8158
- if ( this.setAttribute ) {
8159
- this.setAttribute( "class",
8160
- className || value === false ?
8161
- "" :
8162
- dataPriv.get( this, "__className__" ) || ""
8163
- );
8164
- }
8165
- }
8166
- } );
8167
- },
8168
-
8169
- hasClass: function( selector ) {
8170
- var className, elem,
8171
- i = 0;
8172
-
8173
- className = " " + selector + " ";
8174
- while ( ( elem = this[ i++ ] ) ) {
8175
- if ( elem.nodeType === 1 &&
8176
- ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8177
- return true;
8178
- }
8179
- }
8180
-
8181
- return false;
8182
- }
8183
- } );
8184
-
8185
-
8186
-
8187
-
8188
- var rreturn = /\r/g;
8189
-
8190
- jQuery.fn.extend( {
8191
- val: function( value ) {
8192
- var hooks, ret, valueIsFunction,
8193
- elem = this[ 0 ];
8194
-
8195
- if ( !arguments.length ) {
8196
- if ( elem ) {
8197
- hooks = jQuery.valHooks[ elem.type ] ||
8198
- jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8199
-
8200
- if ( hooks &&
8201
- "get" in hooks &&
8202
- ( ret = hooks.get( elem, "value" ) ) !== undefined
8203
- ) {
8204
- return ret;
8205
- }
8206
-
8207
- ret = elem.value;
8208
-
8209
- // Handle most common string cases
8210
- if ( typeof ret === "string" ) {
8211
- return ret.replace( rreturn, "" );
8212
- }
8213
-
8214
- // Handle cases where value is null/undef or number
8215
- return ret == null ? "" : ret;
8216
- }
8217
-
8218
- return;
8219
- }
8220
-
8221
- valueIsFunction = isFunction( value );
8222
-
8223
- return this.each( function( i ) {
8224
- var val;
8225
-
8226
- if ( this.nodeType !== 1 ) {
8227
- return;
8228
- }
8229
-
8230
- if ( valueIsFunction ) {
8231
- val = value.call( this, i, jQuery( this ).val() );
8232
- } else {
8233
- val = value;
8234
- }
8235
-
8236
- // Treat null/undefined as ""; convert numbers to string
8237
- if ( val == null ) {
8238
- val = "";
8239
-
8240
- } else if ( typeof val === "number" ) {
8241
- val += "";
8242
-
8243
- } else if ( Array.isArray( val ) ) {
8244
- val = jQuery.map( val, function( value ) {
8245
- return value == null ? "" : value + "";
8246
- } );
8247
- }
8248
-
8249
- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8250
-
8251
- // If set returns undefined, fall back to normal setting
8252
- if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8253
- this.value = val;
8254
- }
8255
- } );
8256
- }
8257
- } );
8258
-
8259
- jQuery.extend( {
8260
- valHooks: {
8261
- option: {
8262
- get: function( elem ) {
8263
-
8264
- var val = jQuery.find.attr( elem, "value" );
8265
- return val != null ?
8266
- val :
8267
-
8268
- // Support: IE <=10 - 11 only
8269
- // option.text throws exceptions (#14686, #14858)
8270
- // Strip and collapse whitespace
8271
- // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8272
- stripAndCollapse( jQuery.text( elem ) );
8273
- }
8274
- },
8275
- select: {
8276
- get: function( elem ) {
8277
- var value, option, i,
8278
- options = elem.options,
8279
- index = elem.selectedIndex,
8280
- one = elem.type === "select-one",
8281
- values = one ? null : [],
8282
- max = one ? index + 1 : options.length;
8283
-
8284
- if ( index < 0 ) {
8285
- i = max;
8286
-
8287
- } else {
8288
- i = one ? index : 0;
8289
- }
8290
-
8291
- // Loop through all the selected options
8292
- for ( ; i < max; i++ ) {
8293
- option = options[ i ];
8294
-
8295
- // Support: IE <=9 only
8296
- // IE8-9 doesn't update selected after form reset (#2551)
8297
- if ( ( option.selected || i === index ) &&
8298
-
8299
- // Don't return options that are disabled or in a disabled optgroup
8300
- !option.disabled &&
8301
- ( !option.parentNode.disabled ||
8302
- !nodeName( option.parentNode, "optgroup" ) ) ) {
8303
-
8304
- // Get the specific value for the option
8305
- value = jQuery( option ).val();
8306
-
8307
- // We don't need an array for one selects
8308
- if ( one ) {
8309
- return value;
8310
- }
8311
-
8312
- // Multi-Selects return an array
8313
- values.push( value );
8314
- }
8315
- }
8316
-
8317
- return values;
8318
- },
8319
-
8320
- set: function( elem, value ) {
8321
- var optionSet, option,
8322
- options = elem.options,
8323
- values = jQuery.makeArray( value ),
8324
- i = options.length;
8325
-
8326
- while ( i-- ) {
8327
- option = options[ i ];
8328
-
8329
- /* eslint-disable no-cond-assign */
8330
-
8331
- if ( option.selected =
8332
- jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8333
- ) {
8334
- optionSet = true;
8335
- }
8336
-
8337
- /* eslint-enable no-cond-assign */
8338
- }
8339
-
8340
- // Force browsers to behave consistently when non-matching value is set
8341
- if ( !optionSet ) {
8342
- elem.selectedIndex = -1;
8343
- }
8344
- return values;
8345
- }
8346
- }
8347
- }
8348
- } );
8349
-
8350
- // Radios and checkboxes getter/setter
8351
- jQuery.each( [ "radio", "checkbox" ], function() {
8352
- jQuery.valHooks[ this ] = {
8353
- set: function( elem, value ) {
8354
- if ( Array.isArray( value ) ) {
8355
- return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8356
- }
8357
- }
8358
- };
8359
- if ( !support.checkOn ) {
8360
- jQuery.valHooks[ this ].get = function( elem ) {
8361
- return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8362
- };
8363
- }
8364
- } );
8365
-
8366
-
8367
-
8368
-
8369
- // Return jQuery for attributes-only inclusion
8370
-
8371
-
8372
- support.focusin = "onfocusin" in window;
8373
-
8374
-
8375
- var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8376
- stopPropagationCallback = function( e ) {
8377
- e.stopPropagation();
8378
- };
8379
-
8380
- jQuery.extend( jQuery.event, {
8381
-
8382
- trigger: function( event, data, elem, onlyHandlers ) {
8383
-
8384
- var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8385
- eventPath = [ elem || document ],
8386
- type = hasOwn.call( event, "type" ) ? event.type : event,
8387
- namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8388
-
8389
- cur = lastElement = tmp = elem = elem || document;
8390
-
8391
- // Don't do events on text and comment nodes
8392
- if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8393
- return;
8394
- }
8395
-
8396
- // focus/blur morphs to focusin/out; ensure we're not firing them right now
8397
- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8398
- return;
8399
- }
8400
-
8401
- if ( type.indexOf( "." ) > -1 ) {
8402
-
8403
- // Namespaced trigger; create a regexp to match event type in handle()
8404
- namespaces = type.split( "." );
8405
- type = namespaces.shift();
8406
- namespaces.sort();
8407
- }
8408
- ontype = type.indexOf( ":" ) < 0 && "on" + type;
8409
-
8410
- // Caller can pass in a jQuery.Event object, Object, or just an event type string
8411
- event = event[ jQuery.expando ] ?
8412
- event :
8413
- new jQuery.Event( type, typeof event === "object" && event );
8414
-
8415
- // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8416
- event.isTrigger = onlyHandlers ? 2 : 3;
8417
- event.namespace = namespaces.join( "." );
8418
- event.rnamespace = event.namespace ?
8419
- new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8420
- null;
8421
-
8422
- // Clean up the event in case it is being reused
8423
- event.result = undefined;
8424
- if ( !event.target ) {
8425
- event.target = elem;
8426
- }
8427
-
8428
- // Clone any incoming data and prepend the event, creating the handler arg list
8429
- data = data == null ?
8430
- [ event ] :
8431
- jQuery.makeArray( data, [ event ] );
8432
-
8433
- // Allow special events to draw outside the lines
8434
- special = jQuery.event.special[ type ] || {};
8435
- if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8436
- return;
8437
- }
8438
-
8439
- // Determine event propagation path in advance, per W3C events spec (#9951)
8440
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8441
- if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8442
-
8443
- bubbleType = special.delegateType || type;
8444
- if ( !rfocusMorph.test( bubbleType + type ) ) {
8445
- cur = cur.parentNode;
8446
- }
8447
- for ( ; cur; cur = cur.parentNode ) {
8448
- eventPath.push( cur );
8449
- tmp = cur;
8450
- }
8451
-
8452
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
8453
- if ( tmp === ( elem.ownerDocument || document ) ) {
8454
- eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8455
- }
8456
- }
8457
-
8458
- // Fire handlers on the event path
8459
- i = 0;
8460
- while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8461
- lastElement = cur;
8462
- event.type = i > 1 ?
8463
- bubbleType :
8464
- special.bindType || type;
8465
-
8466
- // jQuery handler
8467
- handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8468
- dataPriv.get( cur, "handle" );
8469
- if ( handle ) {
8470
- handle.apply( cur, data );
8471
- }
8472
-
8473
- // Native handler
8474
- handle = ontype && cur[ ontype ];
8475
- if ( handle && handle.apply && acceptData( cur ) ) {
8476
- event.result = handle.apply( cur, data );
8477
- if ( event.result === false ) {
8478
- event.preventDefault();
8479
- }
8480
- }
8481
- }
8482
- event.type = type;
8483
-
8484
- // If nobody prevented the default action, do it now
8485
- if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8486
-
8487
- if ( ( !special._default ||
8488
- special._default.apply( eventPath.pop(), data ) === false ) &&
8489
- acceptData( elem ) ) {
8490
-
8491
- // Call a native DOM method on the target with the same name as the event.
8492
- // Don't do default actions on window, that's where global variables be (#6170)
8493
- if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8494
-
8495
- // Don't re-trigger an onFOO event when we call its FOO() method
8496
- tmp = elem[ ontype ];
8497
-
8498
- if ( tmp ) {
8499
- elem[ ontype ] = null;
8500
- }
8501
-
8502
- // Prevent re-triggering of the same event, since we already bubbled it above
8503
- jQuery.event.triggered = type;
8504
-
8505
- if ( event.isPropagationStopped() ) {
8506
- lastElement.addEventListener( type, stopPropagationCallback );
8507
- }
8508
-
8509
- elem[ type ]();
8510
-
8511
- if ( event.isPropagationStopped() ) {
8512
- lastElement.removeEventListener( type, stopPropagationCallback );
8513
- }
8514
-
8515
- jQuery.event.triggered = undefined;
8516
-
8517
- if ( tmp ) {
8518
- elem[ ontype ] = tmp;
8519
- }
8520
- }
8521
- }
8522
- }
8523
-
8524
- return event.result;
8525
- },
8526
-
8527
- // Piggyback on a donor event to simulate a different one
8528
- // Used only for `focus(in | out)` events
8529
- simulate: function( type, elem, event ) {
8530
- var e = jQuery.extend(
8531
- new jQuery.Event(),
8532
- event,
8533
- {
8534
- type: type,
8535
- isSimulated: true
8536
- }
8537
- );
8538
-
8539
- jQuery.event.trigger( e, null, elem );
8540
- }
8541
-
8542
- } );
8543
-
8544
- jQuery.fn.extend( {
8545
-
8546
- trigger: function( type, data ) {
8547
- return this.each( function() {
8548
- jQuery.event.trigger( type, data, this );
8549
- } );
8550
- },
8551
- triggerHandler: function( type, data ) {
8552
- var elem = this[ 0 ];
8553
- if ( elem ) {
8554
- return jQuery.event.trigger( type, data, elem, true );
8555
- }
8556
- }
8557
- } );
8558
-
8559
-
8560
- // Support: Firefox <=44
8561
- // Firefox doesn't have focus(in | out) events
8562
- // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8563
- //
8564
- // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8565
- // focus(in | out) events fire after focus & blur events,
8566
- // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8567
- // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8568
- if ( !support.focusin ) {
8569
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8570
-
8571
- // Attach a single capturing handler on the document while someone wants focusin/focusout
8572
- var handler = function( event ) {
8573
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8574
- };
8575
-
8576
- jQuery.event.special[ fix ] = {
8577
- setup: function() {
8578
- var doc = this.ownerDocument || this,
8579
- attaches = dataPriv.access( doc, fix );
8580
-
8581
- if ( !attaches ) {
8582
- doc.addEventListener( orig, handler, true );
8583
- }
8584
- dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8585
- },
8586
- teardown: function() {
8587
- var doc = this.ownerDocument || this,
8588
- attaches = dataPriv.access( doc, fix ) - 1;
8589
-
8590
- if ( !attaches ) {
8591
- doc.removeEventListener( orig, handler, true );
8592
- dataPriv.remove( doc, fix );
8593
-
8594
- } else {
8595
- dataPriv.access( doc, fix, attaches );
8596
- }
8597
- }
8598
- };
8599
- } );
8600
- }
8601
- var location = window.location;
8602
-
8603
- var nonce = Date.now();
8604
-
8605
- var rquery = ( /\?/ );
8606
-
8607
-
8608
-
8609
- // Cross-browser xml parsing
8610
- jQuery.parseXML = function( data ) {
8611
- var xml;
8612
- if ( !data || typeof data !== "string" ) {
8613
- return null;
8614
- }
8615
-
8616
- // Support: IE 9 - 11 only
8617
- // IE throws on parseFromString with invalid input.
8618
- try {
8619
- xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8620
- } catch ( e ) {
8621
- xml = undefined;
8622
- }
8623
-
8624
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8625
- jQuery.error( "Invalid XML: " + data );
8626
- }
8627
- return xml;
8628
- };
8629
-
8630
-
8631
- var
8632
- rbracket = /\[\]$/,
8633
- rCRLF = /\r?\n/g,
8634
- rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8635
- rsubmittable = /^(?:input|select|textarea|keygen)/i;
8636
-
8637
- function buildParams( prefix, obj, traditional, add ) {
8638
- var name;
8639
-
8640
- if ( Array.isArray( obj ) ) {
8641
-
8642
- // Serialize array item.
8643
- jQuery.each( obj, function( i, v ) {
8644
- if ( traditional || rbracket.test( prefix ) ) {
8645
-
8646
- // Treat each array item as a scalar.
8647
- add( prefix, v );
8648
-
8649
- } else {
8650
-
8651
- // Item is non-scalar (array or object), encode its numeric index.
8652
- buildParams(
8653
- prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8654
- v,
8655
- traditional,
8656
- add
8657
- );
8658
- }
8659
- } );
8660
-
8661
- } else if ( !traditional && toType( obj ) === "object" ) {
8662
-
8663
- // Serialize object item.
8664
- for ( name in obj ) {
8665
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8666
- }
8667
-
8668
- } else {
8669
-
8670
- // Serialize scalar item.
8671
- add( prefix, obj );
8672
- }
8673
- }
8674
-
8675
- // Serialize an array of form elements or a set of
8676
- // key/values into a query string
8677
- jQuery.param = function( a, traditional ) {
8678
- var prefix,
8679
- s = [],
8680
- add = function( key, valueOrFunction ) {
8681
-
8682
- // If value is a function, invoke it and use its return value
8683
- var value = isFunction( valueOrFunction ) ?
8684
- valueOrFunction() :
8685
- valueOrFunction;
8686
-
8687
- s[ s.length ] = encodeURIComponent( key ) + "=" +
8688
- encodeURIComponent( value == null ? "" : value );
8689
- };
8690
-
8691
- // If an array was passed in, assume that it is an array of form elements.
8692
- if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8693
-
8694
- // Serialize the form elements
8695
- jQuery.each( a, function() {
8696
- add( this.name, this.value );
8697
- } );
8698
-
8699
- } else {
8700
-
8701
- // If traditional, encode the "old" way (the way 1.3.2 or older
8702
- // did it), otherwise encode params recursively.
8703
- for ( prefix in a ) {
8704
- buildParams( prefix, a[ prefix ], traditional, add );
8705
- }
8706
- }
8707
-
8708
- // Return the resulting serialization
8709
- return s.join( "&" );
8710
- };
8711
-
8712
- jQuery.fn.extend( {
8713
- serialize: function() {
8714
- return jQuery.param( this.serializeArray() );
8715
- },
8716
- serializeArray: function() {
8717
- return this.map( function() {
8718
-
8719
- // Can add propHook for "elements" to filter or add form elements
8720
- var elements = jQuery.prop( this, "elements" );
8721
- return elements ? jQuery.makeArray( elements ) : this;
8722
- } )
8723
- .filter( function() {
8724
- var type = this.type;
8725
-
8726
- // Use .is( ":disabled" ) so that fieldset[disabled] works
8727
- return this.name && !jQuery( this ).is( ":disabled" ) &&
8728
- rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8729
- ( this.checked || !rcheckableType.test( type ) );
8730
- } )
8731
- .map( function( i, elem ) {
8732
- var val = jQuery( this ).val();
8733
-
8734
- if ( val == null ) {
8735
- return null;
8736
- }
8737
-
8738
- if ( Array.isArray( val ) ) {
8739
- return jQuery.map( val, function( val ) {
8740
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8741
- } );
8742
- }
8743
-
8744
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8745
- } ).get();
8746
- }
8747
- } );
8748
-
8749
-
8750
- var
8751
- r20 = /%20/g,
8752
- rhash = /#.*$/,
8753
- rantiCache = /([?&])_=[^&]*/,
8754
- rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8755
-
8756
- // #7653, #8125, #8152: local protocol detection
8757
- rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8758
- rnoContent = /^(?:GET|HEAD)$/,
8759
- rprotocol = /^\/\//,
8760
-
8761
- /* Prefilters
8762
- * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8763
- * 2) These are called:
8764
- * - BEFORE asking for a transport
8765
- * - AFTER param serialization (s.data is a string if s.processData is true)
8766
- * 3) key is the dataType
8767
- * 4) the catchall symbol "*" can be used
8768
- * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8769
- */
8770
- prefilters = {},
8771
-
8772
- /* Transports bindings
8773
- * 1) key is the dataType
8774
- * 2) the catchall symbol "*" can be used
8775
- * 3) selection will start with transport dataType and THEN go to "*" if needed
8776
- */
8777
- transports = {},
8778
-
8779
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8780
- allTypes = "*/".concat( "*" ),
8781
-
8782
- // Anchor tag for parsing the document origin
8783
- originAnchor = document.createElement( "a" );
8784
- originAnchor.href = location.href;
8785
-
8786
- // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8787
- function addToPrefiltersOrTransports( structure ) {
8788
-
8789
- // dataTypeExpression is optional and defaults to "*"
8790
- return function( dataTypeExpression, func ) {
8791
-
8792
- if ( typeof dataTypeExpression !== "string" ) {
8793
- func = dataTypeExpression;
8794
- dataTypeExpression = "*";
8795
- }
8796
-
8797
- var dataType,
8798
- i = 0,
8799
- dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8800
-
8801
- if ( isFunction( func ) ) {
8802
-
8803
- // For each dataType in the dataTypeExpression
8804
- while ( ( dataType = dataTypes[ i++ ] ) ) {
8805
-
8806
- // Prepend if requested
8807
- if ( dataType[ 0 ] === "+" ) {
8808
- dataType = dataType.slice( 1 ) || "*";
8809
- ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
8810
-
8811
- // Otherwise append
8812
- } else {
8813
- ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
8814
- }
8815
- }
8816
- }
8817
- };
8818
- }
8819
-
8820
- // Base inspection function for prefilters and transports
8821
- function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8822
-
8823
- var inspected = {},
8824
- seekingTransport = ( structure === transports );
8825
-
8826
- function inspect( dataType ) {
8827
- var selected;
8828
- inspected[ dataType ] = true;
8829
- jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8830
- var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8831
- if ( typeof dataTypeOrTransport === "string" &&
8832
- !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8833
-
8834
- options.dataTypes.unshift( dataTypeOrTransport );
8835
- inspect( dataTypeOrTransport );
8836
- return false;
8837
- } else if ( seekingTransport ) {
8838
- return !( selected = dataTypeOrTransport );
8839
- }
8840
- } );
8841
- return selected;
8842
- }
8843
-
8844
- return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8845
- }
8846
-
8847
- // A special extend for ajax options
8848
- // that takes "flat" options (not to be deep extended)
8849
- // Fixes #9887
8850
- function ajaxExtend( target, src ) {
8851
- var key, deep,
8852
- flatOptions = jQuery.ajaxSettings.flatOptions || {};
8853
-
8854
- for ( key in src ) {
8855
- if ( src[ key ] !== undefined ) {
8856
- ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8857
- }
8858
- }
8859
- if ( deep ) {
8860
- jQuery.extend( true, target, deep );
8861
- }
8862
-
8863
- return target;
8864
- }
8865
-
8866
- /* Handles responses to an ajax request:
8867
- * - finds the right dataType (mediates between content-type and expected dataType)
8868
- * - returns the corresponding response
8869
- */
8870
- function ajaxHandleResponses( s, jqXHR, responses ) {
8871
-
8872
- var ct, type, finalDataType, firstDataType,
8873
- contents = s.contents,
8874
- dataTypes = s.dataTypes;
8875
-
8876
- // Remove auto dataType and get content-type in the process
8877
- while ( dataTypes[ 0 ] === "*" ) {
8878
- dataTypes.shift();
8879
- if ( ct === undefined ) {
8880
- ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
8881
- }
8882
- }
8883
-
8884
- // Check if we're dealing with a known content-type
8885
- if ( ct ) {
8886
- for ( type in contents ) {
8887
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
8888
- dataTypes.unshift( type );
8889
- break;
8890
- }
8891
- }
8892
- }
8893
-
8894
- // Check to see if we have a response for the expected dataType
8895
- if ( dataTypes[ 0 ] in responses ) {
8896
- finalDataType = dataTypes[ 0 ];
8897
- } else {
8898
-
8899
- // Try convertible dataTypes
8900
- for ( type in responses ) {
8901
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
8902
- finalDataType = type;
8903
- break;
8904
- }
8905
- if ( !firstDataType ) {
8906
- firstDataType = type;
8907
- }
8908
- }
8909
-
8910
- // Or just use first one
8911
- finalDataType = finalDataType || firstDataType;
8912
- }
8913
-
8914
- // If we found a dataType
8915
- // We add the dataType to the list if needed
8916
- // and return the corresponding response
8917
- if ( finalDataType ) {
8918
- if ( finalDataType !== dataTypes[ 0 ] ) {
8919
- dataTypes.unshift( finalDataType );
8920
- }
8921
- return responses[ finalDataType ];
8922
- }
8923
- }
8924
-
8925
- /* Chain conversions given the request and the original response
8926
- * Also sets the responseXXX fields on the jqXHR instance
8927
- */
8928
- function ajaxConvert( s, response, jqXHR, isSuccess ) {
8929
- var conv2, current, conv, tmp, prev,
8930
- converters = {},
8931
-
8932
- // Work with a copy of dataTypes in case we need to modify it for conversion
8933
- dataTypes = s.dataTypes.slice();
8934
-
8935
- // Create converters map with lowercased keys
8936
- if ( dataTypes[ 1 ] ) {
8937
- for ( conv in s.converters ) {
8938
- converters[ conv.toLowerCase() ] = s.converters[ conv ];
8939
- }
8940
- }
8941
-
8942
- current = dataTypes.shift();
8943
-
8944
- // Convert to each sequential dataType
8945
- while ( current ) {
8946
-
8947
- if ( s.responseFields[ current ] ) {
8948
- jqXHR[ s.responseFields[ current ] ] = response;
8949
- }
8950
-
8951
- // Apply the dataFilter if provided
8952
- if ( !prev && isSuccess && s.dataFilter ) {
8953
- response = s.dataFilter( response, s.dataType );
8954
- }
8955
-
8956
- prev = current;
8957
- current = dataTypes.shift();
8958
-
8959
- if ( current ) {
8960
-
8961
- // There's only work to do if current dataType is non-auto
8962
- if ( current === "*" ) {
8963
-
8964
- current = prev;
8965
-
8966
- // Convert response if prev dataType is non-auto and differs from current
8967
- } else if ( prev !== "*" && prev !== current ) {
8968
-
8969
- // Seek a direct converter
8970
- conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8971
-
8972
- // If none found, seek a pair
8973
- if ( !conv ) {
8974
- for ( conv2 in converters ) {
8975
-
8976
- // If conv2 outputs current
8977
- tmp = conv2.split( " " );
8978
- if ( tmp[ 1 ] === current ) {
8979
-
8980
- // If prev can be converted to accepted input
8981
- conv = converters[ prev + " " + tmp[ 0 ] ] ||
8982
- converters[ "* " + tmp[ 0 ] ];
8983
- if ( conv ) {
8984
-
8985
- // Condense equivalence converters
8986
- if ( conv === true ) {
8987
- conv = converters[ conv2 ];
8988
-
8989
- // Otherwise, insert the intermediate dataType
8990
- } else if ( converters[ conv2 ] !== true ) {
8991
- current = tmp[ 0 ];
8992
- dataTypes.unshift( tmp[ 1 ] );
8993
- }
8994
- break;
8995
- }
8996
- }
8997
- }
8998
- }
8999
-
9000
- // Apply converter (if not an equivalence)
9001
- if ( conv !== true ) {
9002
-
9003
- // Unless errors are allowed to bubble, catch and return them
9004
- if ( conv && s.throws ) {
9005
- response = conv( response );
9006
- } else {
9007
- try {
9008
- response = conv( response );
9009
- } catch ( e ) {
9010
- return {
9011
- state: "parsererror",
9012
- error: conv ? e : "No conversion from " + prev + " to " + current
9013
- };
9014
- }
9015
- }
9016
- }
9017
- }
9018
- }
9019
- }
9020
-
9021
- return { state: "success", data: response };
9022
- }
9023
-
9024
- jQuery.extend( {
9025
-
9026
- // Counter for holding the number of active queries
9027
- active: 0,
9028
-
9029
- // Last-Modified header cache for next request
9030
- lastModified: {},
9031
- etag: {},
9032
-
9033
- ajaxSettings: {
9034
- url: location.href,
9035
- type: "GET",
9036
- isLocal: rlocalProtocol.test( location.protocol ),
9037
- global: true,
9038
- processData: true,
9039
- async: true,
9040
- contentType: "application/x-www-form-urlencoded; charset=UTF-8",
9041
-
9042
- /*
9043
- timeout: 0,
9044
- data: null,
9045
- dataType: null,
9046
- username: null,
9047
- password: null,
9048
- cache: null,
9049
- throws: false,
9050
- traditional: false,
9051
- headers: {},
9052
- */
9053
-
9054
- accepts: {
9055
- "*": allTypes,
9056
- text: "text/plain",
9057
- html: "text/html",
9058
- xml: "application/xml, text/xml",
9059
- json: "application/json, text/javascript"
9060
- },
9061
-
9062
- contents: {
9063
- xml: /\bxml\b/,
9064
- html: /\bhtml/,
9065
- json: /\bjson\b/
9066
- },
9067
-
9068
- responseFields: {
9069
- xml: "responseXML",
9070
- text: "responseText",
9071
- json: "responseJSON"
9072
- },
9073
-
9074
- // Data converters
9075
- // Keys separate source (or catchall "*") and destination types with a single space
9076
- converters: {
9077
-
9078
- // Convert anything to text
9079
- "* text": String,
9080
-
9081
- // Text to html (true = no transformation)
9082
- "text html": true,
9083
-
9084
- // Evaluate text as a json expression
9085
- "text json": JSON.parse,
9086
-
9087
- // Parse text as xml
9088
- "text xml": jQuery.parseXML
9089
- },
9090
-
9091
- // For options that shouldn't be deep extended:
9092
- // you can add your own custom options here if
9093
- // and when you create one that shouldn't be
9094
- // deep extended (see ajaxExtend)
9095
- flatOptions: {
9096
- url: true,
9097
- context: true
9098
- }
9099
- },
9100
-
9101
- // Creates a full fledged settings object into target
9102
- // with both ajaxSettings and settings fields.
9103
- // If target is omitted, writes into ajaxSettings.
9104
- ajaxSetup: function( target, settings ) {
9105
- return settings ?
9106
-
9107
- // Building a settings object
9108
- ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9109
-
9110
- // Extending ajaxSettings
9111
- ajaxExtend( jQuery.ajaxSettings, target );
9112
- },
9113
-
9114
- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9115
- ajaxTransport: addToPrefiltersOrTransports( transports ),
9116
-
9117
- // Main method
9118
- ajax: function( url, options ) {
9119
-
9120
- // If url is an object, simulate pre-1.5 signature
9121
- if ( typeof url === "object" ) {
9122
- options = url;
9123
- url = undefined;
9124
- }
9125
-
9126
- // Force options to be an object
9127
- options = options || {};
9128
-
9129
- var transport,
9130
-
9131
- // URL without anti-cache param
9132
- cacheURL,
9133
-
9134
- // Response headers
9135
- responseHeadersString,
9136
- responseHeaders,
9137
-
9138
- // timeout handle
9139
- timeoutTimer,
9140
-
9141
- // Url cleanup var
9142
- urlAnchor,
9143
-
9144
- // Request state (becomes false upon send and true upon completion)
9145
- completed,
9146
-
9147
- // To know if global events are to be dispatched
9148
- fireGlobals,
9149
-
9150
- // Loop variable
9151
- i,
9152
-
9153
- // uncached part of the url
9154
- uncached,
9155
-
9156
- // Create the final options object
9157
- s = jQuery.ajaxSetup( {}, options ),
9158
-
9159
- // Callbacks context
9160
- callbackContext = s.context || s,
9161
-
9162
- // Context for global events is callbackContext if it is a DOM node or jQuery collection
9163
- globalEventContext = s.context &&
9164
- ( callbackContext.nodeType || callbackContext.jquery ) ?
9165
- jQuery( callbackContext ) :
9166
- jQuery.event,
9167
-
9168
- // Deferreds
9169
- deferred = jQuery.Deferred(),
9170
- completeDeferred = jQuery.Callbacks( "once memory" ),
9171
-
9172
- // Status-dependent callbacks
9173
- statusCode = s.statusCode || {},
9174
-
9175
- // Headers (they are sent all at once)
9176
- requestHeaders = {},
9177
- requestHeadersNames = {},
9178
-
9179
- // Default abort message
9180
- strAbort = "canceled",
9181
-
9182
- // Fake xhr
9183
- jqXHR = {
9184
- readyState: 0,
9185
-
9186
- // Builds headers hashtable if needed
9187
- getResponseHeader: function( key ) {
9188
- var match;
9189
- if ( completed ) {
9190
- if ( !responseHeaders ) {
9191
- responseHeaders = {};
9192
- while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9193
- responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9194
- }
9195
- }
9196
- match = responseHeaders[ key.toLowerCase() ];
9197
- }
9198
- return match == null ? null : match;
9199
- },
9200
-
9201
- // Raw string
9202
- getAllResponseHeaders: function() {
9203
- return completed ? responseHeadersString : null;
9204
- },
9205
-
9206
- // Caches the header
9207
- setRequestHeader: function( name, value ) {
9208
- if ( completed == null ) {
9209
- name = requestHeadersNames[ name.toLowerCase() ] =
9210
- requestHeadersNames[ name.toLowerCase() ] || name;
9211
- requestHeaders[ name ] = value;
9212
- }
9213
- return this;
9214
- },
9215
-
9216
- // Overrides response content-type header
9217
- overrideMimeType: function( type ) {
9218
- if ( completed == null ) {
9219
- s.mimeType = type;
9220
- }
9221
- return this;
9222
- },
9223
-
9224
- // Status-dependent callbacks
9225
- statusCode: function( map ) {
9226
- var code;
9227
- if ( map ) {
9228
- if ( completed ) {
9229
-
9230
- // Execute the appropriate callbacks
9231
- jqXHR.always( map[ jqXHR.status ] );
9232
- } else {
9233
-
9234
- // Lazy-add the new callbacks in a way that preserves old ones
9235
- for ( code in map ) {
9236
- statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9237
- }
9238
- }
9239
- }
9240
- return this;
9241
- },
9242
-
9243
- // Cancel the request
9244
- abort: function( statusText ) {
9245
- var finalText = statusText || strAbort;
9246
- if ( transport ) {
9247
- transport.abort( finalText );
9248
- }
9249
- done( 0, finalText );
9250
- return this;
9251
- }
9252
- };
9253
-
9254
- // Attach deferreds
9255
- deferred.promise( jqXHR );
9256
-
9257
- // Add protocol if not provided (prefilters might expect it)
9258
- // Handle falsy url in the settings object (#10093: consistency with old signature)
9259
- // We also use the url parameter if available
9260
- s.url = ( ( url || s.url || location.href ) + "" )
9261
- .replace( rprotocol, location.protocol + "//" );
9262
-
9263
- // Alias method option to type as per ticket #12004
9264
- s.type = options.method || options.type || s.method || s.type;
9265
-
9266
- // Extract dataTypes list
9267
- s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9268
-
9269
- // A cross-domain request is in order when the origin doesn't match the current origin.
9270
- if ( s.crossDomain == null ) {
9271
- urlAnchor = document.createElement( "a" );
9272
-
9273
- // Support: IE <=8 - 11, Edge 12 - 15
9274
- // IE throws exception on accessing the href property if url is malformed,
9275
- // e.g. http://example.com:80x/
9276
- try {
9277
- urlAnchor.href = s.url;
9278
-
9279
- // Support: IE <=8 - 11 only
9280
- // Anchor's host property isn't correctly set when s.url is relative
9281
- urlAnchor.href = urlAnchor.href;
9282
- s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9283
- urlAnchor.protocol + "//" + urlAnchor.host;
9284
- } catch ( e ) {
9285
-
9286
- // If there is an error parsing the URL, assume it is crossDomain,
9287
- // it can be rejected by the transport if it is invalid
9288
- s.crossDomain = true;
9289
- }
9290
- }
9291
-
9292
- // Convert data if not already a string
9293
- if ( s.data && s.processData && typeof s.data !== "string" ) {
9294
- s.data = jQuery.param( s.data, s.traditional );
9295
- }
9296
-
9297
- // Apply prefilters
9298
- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9299
-
9300
- // If request was aborted inside a prefilter, stop there
9301
- if ( completed ) {
9302
- return jqXHR;
9303
- }
9304
-
9305
- // We can fire global events as of now if asked to
9306
- // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9307
- fireGlobals = jQuery.event && s.global;
9308
-
9309
- // Watch for a new set of requests
9310
- if ( fireGlobals && jQuery.active++ === 0 ) {
9311
- jQuery.event.trigger( "ajaxStart" );
9312
- }
9313
-
9314
- // Uppercase the type
9315
- s.type = s.type.toUpperCase();
9316
-
9317
- // Determine if request has content
9318
- s.hasContent = !rnoContent.test( s.type );
9319
-
9320
- // Save the URL in case we're toying with the If-Modified-Since
9321
- // and/or If-None-Match header later on
9322
- // Remove hash to simplify url manipulation
9323
- cacheURL = s.url.replace( rhash, "" );
9324
-
9325
- // More options handling for requests with no content
9326
- if ( !s.hasContent ) {
9327
-
9328
- // Remember the hash so we can put it back
9329
- uncached = s.url.slice( cacheURL.length );
9330
-
9331
- // If data is available and should be processed, append data to url
9332
- if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9333
- cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9334
-
9335
- // #9682: remove data so that it's not used in an eventual retry
9336
- delete s.data;
9337
- }
9338
-
9339
- // Add or update anti-cache param if needed
9340
- if ( s.cache === false ) {
9341
- cacheURL = cacheURL.replace( rantiCache, "$1" );
9342
- uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9343
- }
9344
-
9345
- // Put hash and anti-cache on the URL that will be requested (gh-1732)
9346
- s.url = cacheURL + uncached;
9347
-
9348
- // Change '%20' to '+' if this is encoded form body content (gh-2658)
9349
- } else if ( s.data && s.processData &&
9350
- ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9351
- s.data = s.data.replace( r20, "+" );
9352
- }
9353
-
9354
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9355
- if ( s.ifModified ) {
9356
- if ( jQuery.lastModified[ cacheURL ] ) {
9357
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9358
- }
9359
- if ( jQuery.etag[ cacheURL ] ) {
9360
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9361
- }
9362
- }
9363
-
9364
- // Set the correct header, if data is being sent
9365
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9366
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
9367
- }
9368
-
9369
- // Set the Accepts header for the server, depending on the dataType
9370
- jqXHR.setRequestHeader(
9371
- "Accept",
9372
- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9373
- s.accepts[ s.dataTypes[ 0 ] ] +
9374
- ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9375
- s.accepts[ "*" ]
9376
- );
9377
-
9378
- // Check for headers option
9379
- for ( i in s.headers ) {
9380
- jqXHR.setRequestHeader( i, s.headers[ i ] );
9381
- }
9382
-
9383
- // Allow custom headers/mimetypes and early abort
9384
- if ( s.beforeSend &&
9385
- ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9386
-
9387
- // Abort if not done already and return
9388
- return jqXHR.abort();
9389
- }
9390
-
9391
- // Aborting is no longer a cancellation
9392
- strAbort = "abort";
9393
-
9394
- // Install callbacks on deferreds
9395
- completeDeferred.add( s.complete );
9396
- jqXHR.done( s.success );
9397
- jqXHR.fail( s.error );
9398
-
9399
- // Get transport
9400
- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9401
-
9402
- // If no transport, we auto-abort
9403
- if ( !transport ) {
9404
- done( -1, "No Transport" );
9405
- } else {
9406
- jqXHR.readyState = 1;
9407
-
9408
- // Send global event
9409
- if ( fireGlobals ) {
9410
- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9411
- }
9412
-
9413
- // If request was aborted inside ajaxSend, stop there
9414
- if ( completed ) {
9415
- return jqXHR;
9416
- }
9417
-
9418
- // Timeout
9419
- if ( s.async && s.timeout > 0 ) {
9420
- timeoutTimer = window.setTimeout( function() {
9421
- jqXHR.abort( "timeout" );
9422
- }, s.timeout );
9423
- }
9424
-
9425
- try {
9426
- completed = false;
9427
- transport.send( requestHeaders, done );
9428
- } catch ( e ) {
9429
-
9430
- // Rethrow post-completion exceptions
9431
- if ( completed ) {
9432
- throw e;
9433
- }
9434
-
9435
- // Propagate others as results
9436
- done( -1, e );
9437
- }
9438
- }
9439
-
9440
- // Callback for when everything is done
9441
- function done( status, nativeStatusText, responses, headers ) {
9442
- var isSuccess, success, error, response, modified,
9443
- statusText = nativeStatusText;
9444
-
9445
- // Ignore repeat invocations
9446
- if ( completed ) {
9447
- return;
9448
- }
9449
-
9450
- completed = true;
9451
-
9452
- // Clear timeout if it exists
9453
- if ( timeoutTimer ) {
9454
- window.clearTimeout( timeoutTimer );
9455
- }
9456
-
9457
- // Dereference transport for early garbage collection
9458
- // (no matter how long the jqXHR object will be used)
9459
- transport = undefined;
9460
-
9461
- // Cache response headers
9462
- responseHeadersString = headers || "";
9463
-
9464
- // Set readyState
9465
- jqXHR.readyState = status > 0 ? 4 : 0;
9466
-
9467
- // Determine if successful
9468
- isSuccess = status >= 200 && status < 300 || status === 304;
9469
-
9470
- // Get response data
9471
- if ( responses ) {
9472
- response = ajaxHandleResponses( s, jqXHR, responses );
9473
- }
9474
-
9475
- // Convert no matter what (that way responseXXX fields are always set)
9476
- response = ajaxConvert( s, response, jqXHR, isSuccess );
9477
-
9478
- // If successful, handle type chaining
9479
- if ( isSuccess ) {
9480
-
9481
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9482
- if ( s.ifModified ) {
9483
- modified = jqXHR.getResponseHeader( "Last-Modified" );
9484
- if ( modified ) {
9485
- jQuery.lastModified[ cacheURL ] = modified;
9486
- }
9487
- modified = jqXHR.getResponseHeader( "etag" );
9488
- if ( modified ) {
9489
- jQuery.etag[ cacheURL ] = modified;
9490
- }
9491
- }
9492
-
9493
- // if no content
9494
- if ( status === 204 || s.type === "HEAD" ) {
9495
- statusText = "nocontent";
9496
-
9497
- // if not modified
9498
- } else if ( status === 304 ) {
9499
- statusText = "notmodified";
9500
-
9501
- // If we have data, let's convert it
9502
- } else {
9503
- statusText = response.state;
9504
- success = response.data;
9505
- error = response.error;
9506
- isSuccess = !error;
9507
- }
9508
- } else {
9509
-
9510
- // Extract error from statusText and normalize for non-aborts
9511
- error = statusText;
9512
- if ( status || !statusText ) {
9513
- statusText = "error";
9514
- if ( status < 0 ) {
9515
- status = 0;
9516
- }
9517
- }
9518
- }
9519
-
9520
- // Set data for the fake xhr object
9521
- jqXHR.status = status;
9522
- jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9523
-
9524
- // Success/Error
9525
- if ( isSuccess ) {
9526
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9527
- } else {
9528
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9529
- }
9530
-
9531
- // Status-dependent callbacks
9532
- jqXHR.statusCode( statusCode );
9533
- statusCode = undefined;
9534
-
9535
- if ( fireGlobals ) {
9536
- globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9537
- [ jqXHR, s, isSuccess ? success : error ] );
9538
- }
9539
-
9540
- // Complete
9541
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9542
-
9543
- if ( fireGlobals ) {
9544
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9545
-
9546
- // Handle the global AJAX counter
9547
- if ( !( --jQuery.active ) ) {
9548
- jQuery.event.trigger( "ajaxStop" );
9549
- }
9550
- }
9551
- }
9552
-
9553
- return jqXHR;
9554
- },
9555
-
9556
- getJSON: function( url, data, callback ) {
9557
- return jQuery.get( url, data, callback, "json" );
9558
- },
9559
-
9560
- getScript: function( url, callback ) {
9561
- return jQuery.get( url, undefined, callback, "script" );
9562
- }
9563
- } );
9564
-
9565
- jQuery.each( [ "get", "post" ], function( i, method ) {
9566
- jQuery[ method ] = function( url, data, callback, type ) {
9567
-
9568
- // Shift arguments if data argument was omitted
9569
- if ( isFunction( data ) ) {
9570
- type = type || callback;
9571
- callback = data;
9572
- data = undefined;
9573
- }
9574
-
9575
- // The url can be an options object (which then must have .url)
9576
- return jQuery.ajax( jQuery.extend( {
9577
- url: url,
9578
- type: method,
9579
- dataType: type,
9580
- data: data,
9581
- success: callback
9582
- }, jQuery.isPlainObject( url ) && url ) );
9583
- };
9584
- } );
9585
-
9586
-
9587
- jQuery._evalUrl = function( url ) {
9588
- return jQuery.ajax( {
9589
- url: url,
9590
-
9591
- // Make this explicit, since user can override this through ajaxSetup (#11264)
9592
- type: "GET",
9593
- dataType: "script",
9594
- cache: true,
9595
- async: false,
9596
- global: false,
9597
- "throws": true
9598
- } );
9599
- };
9600
-
9601
-
9602
- jQuery.fn.extend( {
9603
- wrapAll: function( html ) {
9604
- var wrap;
9605
-
9606
- if ( this[ 0 ] ) {
9607
- if ( isFunction( html ) ) {
9608
- html = html.call( this[ 0 ] );
9609
- }
9610
-
9611
- // The elements to wrap the target around
9612
- wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9613
-
9614
- if ( this[ 0 ].parentNode ) {
9615
- wrap.insertBefore( this[ 0 ] );
9616
- }
9617
-
9618
- wrap.map( function() {
9619
- var elem = this;
9620
-
9621
- while ( elem.firstElementChild ) {
9622
- elem = elem.firstElementChild;
9623
- }
9624
-
9625
- return elem;
9626
- } ).append( this );
9627
- }
9628
-
9629
- return this;
9630
- },
9631
-
9632
- wrapInner: function( html ) {
9633
- if ( isFunction( html ) ) {
9634
- return this.each( function( i ) {
9635
- jQuery( this ).wrapInner( html.call( this, i ) );
9636
- } );
9637
- }
9638
-
9639
- return this.each( function() {
9640
- var self = jQuery( this ),
9641
- contents = self.contents();
9642
-
9643
- if ( contents.length ) {
9644
- contents.wrapAll( html );
9645
-
9646
- } else {
9647
- self.append( html );
9648
- }
9649
- } );
9650
- },
9651
-
9652
- wrap: function( html ) {
9653
- var htmlIsFunction = isFunction( html );
9654
-
9655
- return this.each( function( i ) {
9656
- jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9657
- } );
9658
- },
9659
-
9660
- unwrap: function( selector ) {
9661
- this.parent( selector ).not( "body" ).each( function() {
9662
- jQuery( this ).replaceWith( this.childNodes );
9663
- } );
9664
- return this;
9665
- }
9666
- } );
9667
-
9668
-
9669
- jQuery.expr.pseudos.hidden = function( elem ) {
9670
- return !jQuery.expr.pseudos.visible( elem );
9671
- };
9672
- jQuery.expr.pseudos.visible = function( elem ) {
9673
- return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9674
- };
9675
-
9676
-
9677
-
9678
-
9679
- jQuery.ajaxSettings.xhr = function() {
9680
- try {
9681
- return new window.XMLHttpRequest();
9682
- } catch ( e ) {}
9683
- };
9684
-
9685
- var xhrSuccessStatus = {
9686
-
9687
- // File protocol always yields status code 0, assume 200
9688
- 0: 200,
9689
-
9690
- // Support: IE <=9 only
9691
- // #1450: sometimes IE returns 1223 when it should be 204
9692
- 1223: 204
9693
- },
9694
- xhrSupported = jQuery.ajaxSettings.xhr();
9695
-
9696
- support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9697
- support.ajax = xhrSupported = !!xhrSupported;
9698
-
9699
- jQuery.ajaxTransport( function( options ) {
9700
- var callback, errorCallback;
9701
-
9702
- // Cross domain only allowed if supported through XMLHttpRequest
9703
- if ( support.cors || xhrSupported && !options.crossDomain ) {
9704
- return {
9705
- send: function( headers, complete ) {
9706
- var i,
9707
- xhr = options.xhr();
9708
-
9709
- xhr.open(
9710
- options.type,
9711
- options.url,
9712
- options.async,
9713
- options.username,
9714
- options.password
9715
- );
9716
-
9717
- // Apply custom fields if provided
9718
- if ( options.xhrFields ) {
9719
- for ( i in options.xhrFields ) {
9720
- xhr[ i ] = options.xhrFields[ i ];
9721
- }
9722
- }
9723
-
9724
- // Override mime type if needed
9725
- if ( options.mimeType && xhr.overrideMimeType ) {
9726
- xhr.overrideMimeType( options.mimeType );
9727
- }
9728
-
9729
- // X-Requested-With header
9730
- // For cross-domain requests, seeing as conditions for a preflight are
9731
- // akin to a jigsaw puzzle, we simply never set it to be sure.
9732
- // (it can always be set on a per-request basis or even using ajaxSetup)
9733
- // For same-domain requests, won't change header if already provided.
9734
- if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
9735
- headers[ "X-Requested-With" ] = "XMLHttpRequest";
9736
- }
9737
-
9738
- // Set headers
9739
- for ( i in headers ) {
9740
- xhr.setRequestHeader( i, headers[ i ] );
9741
- }
9742
-
9743
- // Callback
9744
- callback = function( type ) {
9745
- return function() {
9746
- if ( callback ) {
9747
- callback = errorCallback = xhr.onload =
9748
- xhr.onerror = xhr.onabort = xhr.ontimeout =
9749
- xhr.onreadystatechange = null;
9750
-
9751
- if ( type === "abort" ) {
9752
- xhr.abort();
9753
- } else if ( type === "error" ) {
9754
-
9755
- // Support: IE <=9 only
9756
- // On a manual native abort, IE9 throws
9757
- // errors on any property access that is not readyState
9758
- if ( typeof xhr.status !== "number" ) {
9759
- complete( 0, "error" );
9760
- } else {
9761
- complete(
9762
-
9763
- // File: protocol always yields status 0; see #8605, #14207
9764
- xhr.status,
9765
- xhr.statusText
9766
- );
9767
- }
9768
- } else {
9769
- complete(
9770
- xhrSuccessStatus[ xhr.status ] || xhr.status,
9771
- xhr.statusText,
9772
-
9773
- // Support: IE <=9 only
9774
- // IE9 has no XHR2 but throws on binary (trac-11426)
9775
- // For XHR2 non-text, let the caller handle it (gh-2498)
9776
- ( xhr.responseType || "text" ) !== "text" ||
9777
- typeof xhr.responseText !== "string" ?
9778
- { binary: xhr.response } :
9779
- { text: xhr.responseText },
9780
- xhr.getAllResponseHeaders()
9781
- );
9782
- }
9783
- }
9784
- };
9785
- };
9786
-
9787
- // Listen to events
9788
- xhr.onload = callback();
9789
- errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
9790
-
9791
- // Support: IE 9 only
9792
- // Use onreadystatechange to replace onabort
9793
- // to handle uncaught aborts
9794
- if ( xhr.onabort !== undefined ) {
9795
- xhr.onabort = errorCallback;
9796
- } else {
9797
- xhr.onreadystatechange = function() {
9798
-
9799
- // Check readyState before timeout as it changes
9800
- if ( xhr.readyState === 4 ) {
9801
-
9802
- // Allow onerror to be called first,
9803
- // but that will not handle a native abort
9804
- // Also, save errorCallback to a variable
9805
- // as xhr.onerror cannot be accessed
9806
- window.setTimeout( function() {
9807
- if ( callback ) {
9808
- errorCallback();
9809
- }
9810
- } );
9811
- }
9812
- };
9813
- }
9814
-
9815
- // Create the abort callback
9816
- callback = callback( "abort" );
9817
-
9818
- try {
9819
-
9820
- // Do send the request (this may raise an exception)
9821
- xhr.send( options.hasContent && options.data || null );
9822
- } catch ( e ) {
9823
-
9824
- // #14683: Only rethrow if this hasn't been notified as an error yet
9825
- if ( callback ) {
9826
- throw e;
9827
- }
9828
- }
9829
- },
9830
-
9831
- abort: function() {
9832
- if ( callback ) {
9833
- callback();
9834
- }
9835
- }
9836
- };
9837
- }
9838
- } );
9839
-
9840
-
9841
-
9842
-
9843
- // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
9844
- jQuery.ajaxPrefilter( function( s ) {
9845
- if ( s.crossDomain ) {
9846
- s.contents.script = false;
9847
- }
9848
- } );
9849
-
9850
- // Install script dataType
9851
- jQuery.ajaxSetup( {
9852
- accepts: {
9853
- script: "text/javascript, application/javascript, " +
9854
- "application/ecmascript, application/x-ecmascript"
9855
- },
9856
- contents: {
9857
- script: /\b(?:java|ecma)script\b/
9858
- },
9859
- converters: {
9860
- "text script": function( text ) {
9861
- jQuery.globalEval( text );
9862
- return text;
9863
- }
9864
- }
9865
- } );
9866
-
9867
- // Handle cache's special case and crossDomain
9868
- jQuery.ajaxPrefilter( "script", function( s ) {
9869
- if ( s.cache === undefined ) {
9870
- s.cache = false;
9871
- }
9872
- if ( s.crossDomain ) {
9873
- s.type = "GET";
9874
- }
9875
- } );
9876
-
9877
- // Bind script tag hack transport
9878
- jQuery.ajaxTransport( "script", function( s ) {
9879
-
9880
- // This transport only deals with cross domain requests
9881
- if ( s.crossDomain ) {
9882
- var script, callback;
9883
- return {
9884
- send: function( _, complete ) {
9885
- script = jQuery( "<script>" ).prop( {
9886
- charset: s.scriptCharset,
9887
- src: s.url
9888
- } ).on(
9889
- "load error",
9890
- callback = function( evt ) {
9891
- script.remove();
9892
- callback = null;
9893
- if ( evt ) {
9894
- complete( evt.type === "error" ? 404 : 200, evt.type );
9895
- }
9896
- }
9897
- );
9898
-
9899
- // Use native DOM manipulation to avoid our domManip AJAX trickery
9900
- document.head.appendChild( script[ 0 ] );
9901
- },
9902
- abort: function() {
9903
- if ( callback ) {
9904
- callback();
9905
- }
9906
- }
9907
- };
9908
- }
9909
- } );
9910
-
9911
-
9912
-
9913
-
9914
- var oldCallbacks = [],
9915
- rjsonp = /(=)\?(?=&|$)|\?\?/;
9916
-
9917
- // Default jsonp settings
9918
- jQuery.ajaxSetup( {
9919
- jsonp: "callback",
9920
- jsonpCallback: function() {
9921
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9922
- this[ callback ] = true;
9923
- return callback;
9924
- }
9925
- } );
9926
-
9927
- // Detect, normalize options and install callbacks for jsonp requests
9928
- jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9929
-
9930
- var callbackName, overwritten, responseContainer,
9931
- jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9932
- "url" :
9933
- typeof s.data === "string" &&
9934
- ( s.contentType || "" )
9935
- .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
9936
- rjsonp.test( s.data ) && "data"
9937
- );
9938
-
9939
- // Handle iff the expected data type is "jsonp" or we have a parameter to set
9940
- if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9941
-
9942
- // Get callback name, remembering preexisting value associated with it
9943
- callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
9944
- s.jsonpCallback() :
9945
- s.jsonpCallback;
9946
-
9947
- // Insert callback into url or form data
9948
- if ( jsonProp ) {
9949
- s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9950
- } else if ( s.jsonp !== false ) {
9951
- s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9952
- }
9953
-
9954
- // Use data converter to retrieve json after script execution
9955
- s.converters[ "script json" ] = function() {
9956
- if ( !responseContainer ) {
9957
- jQuery.error( callbackName + " was not called" );
9958
- }
9959
- return responseContainer[ 0 ];
9960
- };
9961
-
9962
- // Force json dataType
9963
- s.dataTypes[ 0 ] = "json";
9964
-
9965
- // Install callback
9966
- overwritten = window[ callbackName ];
9967
- window[ callbackName ] = function() {
9968
- responseContainer = arguments;
9969
- };
9970
-
9971
- // Clean-up function (fires after converters)
9972
- jqXHR.always( function() {
9973
-
9974
- // If previous value didn't exist - remove it
9975
- if ( overwritten === undefined ) {
9976
- jQuery( window ).removeProp( callbackName );
9977
-
9978
- // Otherwise restore preexisting value
9979
- } else {
9980
- window[ callbackName ] = overwritten;
9981
- }
9982
-
9983
- // Save back as free
9984
- if ( s[ callbackName ] ) {
9985
-
9986
- // Make sure that re-using the options doesn't screw things around
9987
- s.jsonpCallback = originalSettings.jsonpCallback;
9988
-
9989
- // Save the callback name for future use
9990
- oldCallbacks.push( callbackName );
9991
- }
9992
-
9993
- // Call if it was a function and we have a response
9994
- if ( responseContainer && isFunction( overwritten ) ) {
9995
- overwritten( responseContainer[ 0 ] );
9996
- }
9997
-
9998
- responseContainer = overwritten = undefined;
9999
- } );
10000
-
10001
- // Delegate to script
10002
- return "script";
10003
- }
10004
- } );
10005
-
10006
-
10007
-
10008
-
10009
- // Support: Safari 8 only
10010
- // In Safari 8 documents created via document.implementation.createHTMLDocument
10011
- // collapse sibling forms: the second one becomes a child of the first one.
10012
- // Because of that, this security measure has to be disabled in Safari 8.
10013
- // https://bugs.webkit.org/show_bug.cgi?id=137337
10014
- support.createHTMLDocument = ( function() {
10015
- var body = document.implementation.createHTMLDocument( "" ).body;
10016
- body.innerHTML = "<form></form><form></form>";
10017
- return body.childNodes.length === 2;
10018
- } )();
10019
-
10020
-
10021
- // Argument "data" should be string of html
10022
- // context (optional): If specified, the fragment will be created in this context,
10023
- // defaults to document
10024
- // keepScripts (optional): If true, will include scripts passed in the html string
10025
- jQuery.parseHTML = function( data, context, keepScripts ) {
10026
- if ( typeof data !== "string" ) {
10027
- return [];
10028
- }
10029
- if ( typeof context === "boolean" ) {
10030
- keepScripts = context;
10031
- context = false;
10032
- }
10033
-
10034
- var base, parsed, scripts;
10035
-
10036
- if ( !context ) {
10037
-
10038
- // Stop scripts or inline event handlers from being executed immediately
10039
- // by using document.implementation
10040
- if ( support.createHTMLDocument ) {
10041
- context = document.implementation.createHTMLDocument( "" );
10042
-
10043
- // Set the base href for the created document
10044
- // so any parsed elements with URLs
10045
- // are based on the document's URL (gh-2965)
10046
- base = context.createElement( "base" );
10047
- base.href = document.location.href;
10048
- context.head.appendChild( base );
10049
- } else {
10050
- context = document;
10051
- }
10052
- }
10053
-
10054
- parsed = rsingleTag.exec( data );
10055
- scripts = !keepScripts && [];
10056
-
10057
- // Single tag
10058
- if ( parsed ) {
10059
- return [ context.createElement( parsed[ 1 ] ) ];
10060
- }
10061
-
10062
- parsed = buildFragment( [ data ], context, scripts );
10063
-
10064
- if ( scripts && scripts.length ) {
10065
- jQuery( scripts ).remove();
10066
- }
10067
-
10068
- return jQuery.merge( [], parsed.childNodes );
10069
- };
10070
-
10071
-
10072
- /**
10073
- * Load a url into a page
10074
- */
10075
- jQuery.fn.load = function( url, params, callback ) {
10076
- var selector, type, response,
10077
- self = this,
10078
- off = url.indexOf( " " );
10079
-
10080
- if ( off > -1 ) {
10081
- selector = stripAndCollapse( url.slice( off ) );
10082
- url = url.slice( 0, off );
10083
- }
10084
-
10085
- // If it's a function
10086
- if ( isFunction( params ) ) {
10087
-
10088
- // We assume that it's the callback
10089
- callback = params;
10090
- params = undefined;
10091
-
10092
- // Otherwise, build a param string
10093
- } else if ( params && typeof params === "object" ) {
10094
- type = "POST";
10095
- }
10096
-
10097
- // If we have elements to modify, make the request
10098
- if ( self.length > 0 ) {
10099
- jQuery.ajax( {
10100
- url: url,
10101
-
10102
- // If "type" variable is undefined, then "GET" method will be used.
10103
- // Make value of this field explicit since
10104
- // user can override it through ajaxSetup method
10105
- type: type || "GET",
10106
- dataType: "html",
10107
- data: params
10108
- } ).done( function( responseText ) {
10109
-
10110
- // Save response for use in complete callback
10111
- response = arguments;
10112
-
10113
- self.html( selector ?
10114
-
10115
- // If a selector was specified, locate the right elements in a dummy div
10116
- // Exclude scripts to avoid IE 'Permission Denied' errors
10117
- jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10118
-
10119
- // Otherwise use the full result
10120
- responseText );
10121
-
10122
- // If the request succeeds, this function gets "data", "status", "jqXHR"
10123
- // but they are ignored because response was set above.
10124
- // If it fails, this function gets "jqXHR", "status", "error"
10125
- } ).always( callback && function( jqXHR, status ) {
10126
- self.each( function() {
10127
- callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10128
- } );
10129
- } );
10130
- }
10131
-
10132
- return this;
10133
- };
10134
-
10135
-
10136
-
10137
-
10138
- // Attach a bunch of functions for handling common AJAX events
10139
- jQuery.each( [
10140
- "ajaxStart",
10141
- "ajaxStop",
10142
- "ajaxComplete",
10143
- "ajaxError",
10144
- "ajaxSuccess",
10145
- "ajaxSend"
10146
- ], function( i, type ) {
10147
- jQuery.fn[ type ] = function( fn ) {
10148
- return this.on( type, fn );
10149
- };
10150
- } );
10151
-
10152
-
10153
-
10154
-
10155
- jQuery.expr.pseudos.animated = function( elem ) {
10156
- return jQuery.grep( jQuery.timers, function( fn ) {
10157
- return elem === fn.elem;
10158
- } ).length;
10159
- };
10160
-
10161
-
10162
-
10163
-
10164
- jQuery.offset = {
10165
- setOffset: function( elem, options, i ) {
10166
- var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10167
- position = jQuery.css( elem, "position" ),
10168
- curElem = jQuery( elem ),
10169
- props = {};
10170
-
10171
- // Set position first, in-case top/left are set even on static elem
10172
- if ( position === "static" ) {
10173
- elem.style.position = "relative";
10174
- }
10175
-
10176
- curOffset = curElem.offset();
10177
- curCSSTop = jQuery.css( elem, "top" );
10178
- curCSSLeft = jQuery.css( elem, "left" );
10179
- calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10180
- ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10181
-
10182
- // Need to be able to calculate position if either
10183
- // top or left is auto and position is either absolute or fixed
10184
- if ( calculatePosition ) {
10185
- curPosition = curElem.position();
10186
- curTop = curPosition.top;
10187
- curLeft = curPosition.left;
10188
-
10189
- } else {
10190
- curTop = parseFloat( curCSSTop ) || 0;
10191
- curLeft = parseFloat( curCSSLeft ) || 0;
10192
- }
10193
-
10194
- if ( isFunction( options ) ) {
10195
-
10196
- // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10197
- options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10198
- }
10199
-
10200
- if ( options.top != null ) {
10201
- props.top = ( options.top - curOffset.top ) + curTop;
10202
- }
10203
- if ( options.left != null ) {
10204
- props.left = ( options.left - curOffset.left ) + curLeft;
10205
- }
10206
-
10207
- if ( "using" in options ) {
10208
- options.using.call( elem, props );
10209
-
10210
- } else {
10211
- curElem.css( props );
10212
- }
10213
- }
10214
- };
10215
-
10216
- jQuery.fn.extend( {
10217
-
10218
- // offset() relates an element's border box to the document origin
10219
- offset: function( options ) {
10220
-
10221
- // Preserve chaining for setter
10222
- if ( arguments.length ) {
10223
- return options === undefined ?
10224
- this :
10225
- this.each( function( i ) {
10226
- jQuery.offset.setOffset( this, options, i );
10227
- } );
10228
- }
10229
-
10230
- var rect, win,
10231
- elem = this[ 0 ];
10232
-
10233
- if ( !elem ) {
10234
- return;
10235
- }
10236
-
10237
- // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
10238
- // Support: IE <=11 only
10239
- // Running getBoundingClientRect on a
10240
- // disconnected node in IE throws an error
10241
- if ( !elem.getClientRects().length ) {
10242
- return { top: 0, left: 0 };
10243
- }
10244
-
10245
- // Get document-relative position by adding viewport scroll to viewport-relative gBCR
10246
- rect = elem.getBoundingClientRect();
10247
- win = elem.ownerDocument.defaultView;
10248
- return {
10249
- top: rect.top + win.pageYOffset,
10250
- left: rect.left + win.pageXOffset
10251
- };
10252
- },
10253
-
10254
- // position() relates an element's margin box to its offset parent's padding box
10255
- // This corresponds to the behavior of CSS absolute positioning
10256
- position: function() {
10257
- if ( !this[ 0 ] ) {
10258
- return;
10259
- }
10260
-
10261
- var offsetParent, offset, doc,
10262
- elem = this[ 0 ],
10263
- parentOffset = { top: 0, left: 0 };
10264
-
10265
- // position:fixed elements are offset from the viewport, which itself always has zero offset
10266
- if ( jQuery.css( elem, "position" ) === "fixed" ) {
10267
-
10268
- // Assume position:fixed implies availability of getBoundingClientRect
10269
- offset = elem.getBoundingClientRect();
10270
-
10271
- } else {
10272
- offset = this.offset();
10273
-
10274
- // Account for the *real* offset parent, which can be the document or its root element
10275
- // when a statically positioned element is identified
10276
- doc = elem.ownerDocument;
10277
- offsetParent = elem.offsetParent || doc.documentElement;
10278
- while ( offsetParent &&
10279
- ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10280
- jQuery.css( offsetParent, "position" ) === "static" ) {
10281
-
10282
- offsetParent = offsetParent.parentNode;
10283
- }
10284
- if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10285
-
10286
- // Incorporate borders into its offset, since they are outside its content origin
10287
- parentOffset = jQuery( offsetParent ).offset();
10288
- parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10289
- parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10290
- }
10291
- }
10292
-
10293
- // Subtract parent offsets and element margins
10294
- return {
10295
- top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10296
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10297
- };
10298
- },
10299
-
10300
- // This method will return documentElement in the following cases:
10301
- // 1) For the element inside the iframe without offsetParent, this method will return
10302
- // documentElement of the parent window
10303
- // 2) For the hidden or detached element
10304
- // 3) For body or html element, i.e. in case of the html node - it will return itself
10305
- //
10306
- // but those exceptions were never presented as a real life use-cases
10307
- // and might be considered as more preferable results.
10308
- //
10309
- // This logic, however, is not guaranteed and can change at any point in the future
10310
- offsetParent: function() {
10311
- return this.map( function() {
10312
- var offsetParent = this.offsetParent;
10313
-
10314
- while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10315
- offsetParent = offsetParent.offsetParent;
10316
- }
10317
-
10318
- return offsetParent || documentElement;
10319
- } );
10320
- }
10321
- } );
10322
-
10323
- // Create scrollLeft and scrollTop methods
10324
- jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10325
- var top = "pageYOffset" === prop;
10326
-
10327
- jQuery.fn[ method ] = function( val ) {
10328
- return access( this, function( elem, method, val ) {
10329
-
10330
- // Coalesce documents and windows
10331
- var win;
10332
- if ( isWindow( elem ) ) {
10333
- win = elem;
10334
- } else if ( elem.nodeType === 9 ) {
10335
- win = elem.defaultView;
10336
- }
10337
-
10338
- if ( val === undefined ) {
10339
- return win ? win[ prop ] : elem[ method ];
10340
- }
10341
-
10342
- if ( win ) {
10343
- win.scrollTo(
10344
- !top ? val : win.pageXOffset,
10345
- top ? val : win.pageYOffset
10346
- );
10347
-
10348
- } else {
10349
- elem[ method ] = val;
10350
- }
10351
- }, method, val, arguments.length );
10352
- };
10353
- } );
10354
-
10355
- // Support: Safari <=7 - 9.1, Chrome <=37 - 49
10356
- // Add the top/left cssHooks using jQuery.fn.position
10357
- // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10358
- // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10359
- // getComputedStyle returns percent when specified for top/left/bottom/right;
10360
- // rather than make the css module depend on the offset module, just check for it here
10361
- jQuery.each( [ "top", "left" ], function( i, prop ) {
10362
- jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10363
- function( elem, computed ) {
10364
- if ( computed ) {
10365
- computed = curCSS( elem, prop );
10366
-
10367
- // If curCSS returns percentage, fallback to offset
10368
- return rnumnonpx.test( computed ) ?
10369
- jQuery( elem ).position()[ prop ] + "px" :
10370
- computed;
10371
- }
10372
- }
10373
- );
10374
- } );
10375
-
10376
-
10377
- // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10378
- jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10379
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10380
- function( defaultExtra, funcName ) {
10381
-
10382
- // Margin is only for outerHeight, outerWidth
10383
- jQuery.fn[ funcName ] = function( margin, value ) {
10384
- var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10385
- extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10386
-
10387
- return access( this, function( elem, type, value ) {
10388
- var doc;
10389
-
10390
- if ( isWindow( elem ) ) {
10391
-
10392
- // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10393
- return funcName.indexOf( "outer" ) === 0 ?
10394
- elem[ "inner" + name ] :
10395
- elem.document.documentElement[ "client" + name ];
10396
- }
10397
-
10398
- // Get document width or height
10399
- if ( elem.nodeType === 9 ) {
10400
- doc = elem.documentElement;
10401
-
10402
- // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10403
- // whichever is greatest
10404
- return Math.max(
10405
- elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10406
- elem.body[ "offset" + name ], doc[ "offset" + name ],
10407
- doc[ "client" + name ]
10408
- );
10409
- }
10410
-
10411
- return value === undefined ?
10412
-
10413
- // Get width or height on the element, requesting but not forcing parseFloat
10414
- jQuery.css( elem, type, extra ) :
10415
-
10416
- // Set width or height on the element
10417
- jQuery.style( elem, type, value, extra );
10418
- }, type, chainable ? margin : undefined, chainable );
10419
- };
10420
- } );
10421
- } );
10422
-
10423
-
10424
- jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10425
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10426
- "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10427
- function( i, name ) {
10428
-
10429
- // Handle event binding
10430
- jQuery.fn[ name ] = function( data, fn ) {
10431
- return arguments.length > 0 ?
10432
- this.on( name, null, data, fn ) :
10433
- this.trigger( name );
10434
- };
10435
- } );
10436
-
10437
- jQuery.fn.extend( {
10438
- hover: function( fnOver, fnOut ) {
10439
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10440
- }
10441
- } );
10442
-
10443
-
10444
-
10445
-
10446
- jQuery.fn.extend( {
10447
-
10448
- bind: function( types, data, fn ) {
10449
- return this.on( types, null, data, fn );
10450
- },
10451
- unbind: function( types, fn ) {
10452
- return this.off( types, null, fn );
10453
- },
10454
-
10455
- delegate: function( selector, types, data, fn ) {
10456
- return this.on( types, selector, data, fn );
10457
- },
10458
- undelegate: function( selector, types, fn ) {
10459
-
10460
- // ( namespace ) or ( selector, types [, fn] )
10461
- return arguments.length === 1 ?
10462
- this.off( selector, "**" ) :
10463
- this.off( types, selector || "**", fn );
10464
- }
10465
- } );
10466
-
10467
- // Bind a function to a context, optionally partially applying any
10468
- // arguments.
10469
- // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10470
- // However, it is not slated for removal any time soon
10471
- jQuery.proxy = function( fn, context ) {
10472
- var tmp, args, proxy;
10473
-
10474
- if ( typeof context === "string" ) {
10475
- tmp = fn[ context ];
10476
- context = fn;
10477
- fn = tmp;
10478
- }
10479
-
10480
- // Quick check to determine if target is callable, in the spec
10481
- // this throws a TypeError, but we will just return undefined.
10482
- if ( !isFunction( fn ) ) {
10483
- return undefined;
10484
- }
10485
-
10486
- // Simulated bind
10487
- args = slice.call( arguments, 2 );
10488
- proxy = function() {
10489
- return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10490
- };
10491
-
10492
- // Set the guid of unique handler to the same of original handler, so it can be removed
10493
- proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10494
-
10495
- return proxy;
10496
- };
10497
-
10498
- jQuery.holdReady = function( hold ) {
10499
- if ( hold ) {
10500
- jQuery.readyWait++;
10501
- } else {
10502
- jQuery.ready( true );
10503
- }
10504
- };
10505
- jQuery.isArray = Array.isArray;
10506
- jQuery.parseJSON = JSON.parse;
10507
- jQuery.nodeName = nodeName;
10508
- jQuery.isFunction = isFunction;
10509
- jQuery.isWindow = isWindow;
10510
- jQuery.camelCase = camelCase;
10511
- jQuery.type = toType;
10512
-
10513
- jQuery.now = Date.now;
10514
-
10515
- jQuery.isNumeric = function( obj ) {
10516
-
10517
- // As of jQuery 3.0, isNumeric is limited to
10518
- // strings and numbers (primitives or objects)
10519
- // that can be coerced to finite numbers (gh-2662)
10520
- var type = jQuery.type( obj );
10521
- return ( type === "number" || type === "string" ) &&
10522
-
10523
- // parseFloat NaNs numeric-cast false positives ("")
10524
- // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10525
- // subtraction forces infinities to NaN
10526
- !isNaN( obj - parseFloat( obj ) );
10527
- };
10528
-
10529
-
10530
-
10531
-
10532
- // Register as a named AMD module, since jQuery can be concatenated with other
10533
- // files that may use define, but not via a proper concatenation script that
10534
- // understands anonymous AMD modules. A named AMD is safest and most robust
10535
- // way to register. Lowercase jquery is used because AMD module names are
10536
- // derived from file names, and jQuery is normally delivered in a lowercase
10537
- // file name. Do this after creating the global so that if an AMD module wants
10538
- // to call noConflict to hide this version of jQuery, it will work.
10539
-
10540
- // Note that for maximum portability, libraries that are not jQuery should
10541
- // declare themselves as anonymous modules, and avoid setting a global if an
10542
- // AMD loader is present. jQuery is a special case. For more information, see
10543
- // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10544
-
10545
- if ( true ) {
10546
- !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {
10547
- return jQuery;
10548
- }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
10549
- __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
10550
- }
10551
-
10552
-
10553
-
10554
-
10555
- var
10556
-
10557
- // Map over jQuery in case of overwrite
10558
- _jQuery = window.jQuery,
10559
-
10560
- // Map over the $ in case of overwrite
10561
- _$ = window.$;
10562
-
10563
- jQuery.noConflict = function( deep ) {
10564
- if ( window.$ === jQuery ) {
10565
- window.$ = _$;
10566
- }
10567
-
10568
- if ( deep && window.jQuery === jQuery ) {
10569
- window.jQuery = _jQuery;
10570
- }
10571
-
10572
- return jQuery;
10573
- };
10574
-
10575
- // Expose jQuery and $ identifiers, even in AMD
10576
- // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10577
- // and CommonJS for browser emulators (#13566)
10578
- if ( !noGlobal ) {
10579
- window.jQuery = window.$ = jQuery;
10580
- }
10581
-
10582
-
10583
-
10584
-
10585
- return jQuery;
10586
- } );
10587
-
10588
-
10589
- /***/ })
10590
-
10591
- /******/ });
10592
- //# sourceMappingURL=wsal-wizard.js.map
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  /**
2
  * WSAL Wizard
3
  *
 
 
4
  * @since 3.2.3
5
  */
6
 
7
+ jQuery( document ).ready( function() {
 
8
 
9
  /**
10
+ * Step: `Access`
11
+ *
12
+ * Usernames & roles access setting.
13
+ */
14
+ jQuery( '#editor-users-add, #editor-roles-add, #exuser-query-add, #exrole-query-add, #ipaddr-query-add' ).click( function() {
15
+ const type = jQuery( this ).attr( 'id' ).substr( 0, 6 );
16
+ const tokenType = jQuery( this ).attr( 'id' ).substr( 7, 5 );
17
+ const tokenValue = jQuery.trim( jQuery( `#${type}-${tokenType}-box` ).val() );
18
+ const existing = jQuery( `#${type}-list input` ).filter( function() {
19
  return this.value === tokenValue;
20
  });
21
 
22
+ if ( ! tokenValue || existing.length ) {
23
  return;
24
  } // if value is empty or already used, stop here
25
 
26
  // checkDataToken( 'user' );
27
+ jQuery( `#${type}-${tokenType}-box, #${type}-${tokenType}-add` ).attr( 'disabled', true );
28
 
29
+ jQuery.ajax({
30
  type: 'POST',
31
  url: wsalData.ajaxURL,
32
  async: true,
36
  nonce: wsalData.nonce
37
  },
38
  dataType: 'json',
39
+ success: function( data ) {
40
 
41
  // Remove disabled attribute.
42
+ jQuery( `#${type}-${tokenType}-box, #${type}-${tokenType}-add` ).removeAttr( 'disabled' );
43
+ jQuery( `#${type}-${tokenType}-box` ).val( '' );
44
 
45
+ if ( data.success ) {
46
 
47
  // Error handling.
48
+ if ( 'other' === data.tokenType && ( 'users' === tokenType || 'exuser' === type ) ) {
49
+ alert( wsalData.usersError );
50
  return;
51
+ } else if ( 'other' === data.tokenType && ( 'roles' === tokenType || 'exrole' === type ) ) {
52
+ alert( wsalData.rolesError );
53
  return;
54
+ } else if ( 'other' === data.tokenType && ( 'ip' === tokenType || 'ipaddr' === type ) ) {
55
+ alert( wsalData.ipError );
56
  return;
57
  }
58
 
59
+ jQuery( `#${type}-list` ).append( jQuery( `<span class="sectoken-${data.tokenType}"/>` ).text( data.token ).append(
60
+ jQuery( `<input type="hidden" name="${type}s[]"/>` ).val( data.token ),
61
+ jQuery( '<a href="javascript:;" title="Remove">&times;</a>' ).click( removeSecToken )
62
+ ) );
63
  } else {
64
+ alert( data.message );
65
  }
66
  },
67
+ error: function( xhr, textStatus, error ) {
68
+ console.log( xhr.statusText );
69
+ console.log( textStatus );
70
+ console.log( error );
71
  }
72
  });
73
  });
74
 
75
+ jQuery( '#editor-users-box, #editor-roles-box, #exuser-query-box, #exrole-query-box, #ipaddr-query-box' ).keydown( function( event ) {
76
+ if ( 13 === event.keyCode ) {
77
+ const type = jQuery( this ).attr( 'id' ).substr( 0, 6 );
78
+ const tokenType = jQuery( this ).attr( 'id' ).substr( 7, 5 );
79
+ jQuery( `#${type}-${tokenType}-add` ).click();
80
  return false;
81
  }
82
  });
83
 
84
  /**
85
+ * Remove access settings token.
86
+ */
87
+ jQuery( '#editor-list>span>a, #exuser-list>span>a, #exrole-list>span>a, #ipaddr-list>span>a' ).click( removeSecToken );
88
  function removeSecToken() {
89
+ const token = jQuery( this ).parents( 'span:first' );
90
+ token.addClass( 'sectoken-del' ).fadeOut( 'fast', function() {
91
  token.remove();
92
  });
93
  };
94
  });
95
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/dist/wsal-wizard.min.js CHANGED
@@ -1,39 +1 @@
1
- !function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t,n){var r;
2
- /*!
3
- * jQuery JavaScript Library v3.3.1
4
- * https://jquery.com/
5
- *
6
- * Includes Sizzle.js
7
- * https://sizzlejs.com/
8
- *
9
- * Copyright JS Foundation and other contributors
10
- * Released under the MIT license
11
- * https://jquery.org/license
12
- *
13
- * Date: 2018-01-20T17:24Z
14
- */
15
- /*!
16
- * jQuery JavaScript Library v3.3.1
17
- * https://jquery.com/
18
- *
19
- * Includes Sizzle.js
20
- * https://sizzlejs.com/
21
- *
22
- * Copyright JS Foundation and other contributors
23
- * Released under the MIT license
24
- * https://jquery.org/license
25
- *
26
- * Date: 2018-01-20T17:24Z
27
- */
28
- !function(t,n){"use strict";"object"==typeof e&&"object"==typeof e.exports?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!=typeof window?window:this,function(n,i){"use strict";var o=[],a=n.document,s=Object.getPrototypeOf,u=o.slice,l=o.concat,c=o.push,f=o.indexOf,p={},d=p.toString,h=p.hasOwnProperty,g=h.toString,v=g.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},b={type:!0,src:!0,noModule:!0};function w(e,t,n){var r,i=(t=t||a).createElement("script");if(i.text=e,n)for(r in b)n[r]&&(i[r]=n[r]);t.head.appendChild(i).parentNode.removeChild(i)}function T(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?p[d.call(e)]||"object":typeof e}var C=function(e,t){return new C.fn.init(e,t)},k=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function E(e){var t=!!e&&"length"in e&&e.length,n=T(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}C.fn=C.prototype={jquery:"3.3.1",constructor:C,length:0,toArray:function(){return u.call(this)},get:function(e){return null==e?u.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=C.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return C.each(this,e)},map:function(e){return this.pushStack(C.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(u.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:c,sort:o.sort,splice:o.splice},C.extend=C.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(C.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&C.isPlainObject(n)?n:{},a[t]=C.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},C.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==d.call(e))&&(!(t=s(e))||"function"==typeof(n=h.call(t,"constructor")&&t.constructor)&&g.call(n)===v)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){w(e)},each:function(e,t){var n,r=0;if(E(e))for(n=e.length;r<n&&!1!==t.call(e[r],r,e[r]);r++);else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(k,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(E(Object(e))?C.merge(n,"string"==typeof e?[e]:e):c.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:f.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(E(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return l.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(C.fn[Symbol.iterator]=o[Symbol.iterator]),C.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){p["[object "+t+"]"]=t.toLowerCase()});var S=
29
- /*!
30
- * Sizzle CSS Selector Engine v2.3.3
31
- * https://sizzlejs.com/
32
- *
33
- * Copyright jQuery Foundation and other contributors
34
- * Released under the MIT license
35
- * http://jquery.org/license
36
- *
37
- * Date: 2016-08-08
38
- */
39
- function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,v,y,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,k=ae(),E=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},j={}.hasOwnProperty,N=[],A=N.pop,q=N.push,L=N.push,H=N.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",I="\\["+M+"*("+R+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+M+"*\\]",W=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+I+")*)|.*)\\)|)",$=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),F=new RegExp("^"+M+"*,"+M+"*"),_=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),U=new RegExp(W),X=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(N=H.call(w.childNodes),w.childNodes),N[w.childNodes.length].nodeType}catch(e){L={apply:N.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,y,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!v||!v.test(e))){if(1!==T)m=t,y=e;else if("object"!==t.nodeName.toLowerCase()){for((c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;s--;)h[s]="#"+c+" "+ye(h[s]);y=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(y)try{return L.apply(r,m.querySelectorAll(y)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];return function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){for(var n=e.split("|"),i=n.length;i--;)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(h=(d=a).documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&g)return t.getElementsByClassName(e)},y=[],v=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="<a id='"+b+"'></a><select id='"+b+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||v.push(".#.+[+~]")}),ue(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),y.push("!=",W)}),v=v.length&&new RegExp(v.join("|")),y=y.length&&new RegExp(y.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!y||!y.test(t))&&(!v||!v.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&j.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){for(;t=e[o++];)t===e[o]&&(i=r.push(o));for(;i--;)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&U.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=k[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&k(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",v=t.parentNode,y=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(v){if(o){for(;g;){for(p=t;p=p[g];)if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?v.firstChild:v.lastChild],a&&m){for(x=(d=(l=(c=(f=(p=v)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&v.childNodes[d];p=++d&&p&&p[g]||(x=d=0)||h.pop();)if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)for(;(p=++d&&p&&p[g]||(x=d=0)||h.pop())&&((s?p.nodeName.toLowerCase()!==y:1!==p.nodeType)||!++x||(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p!==t)););return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){for(var r,o=i(e,t),a=o.length;a--;)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return X.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=pe(t);function ve(){}function ye(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,s=C++;return t.first?function(t,n,i){for(;t=t[r];)if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f,p=[T,s];if(u){for(;t=t[r];)if((1===t.nodeType||a)&&e(t,n,u))return!0}else for(;t=t[r];)if(1===t.nodeType||a)if(c=(f=t[b]||(t[b]={}))[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===T&&l[1]===s)return p[2]=l[2];if(c[o]=p,p[2]=e(t,n,u))return!0}return!1}}function xe(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function we(e,t,n,r,i,o){return r&&!r[b]&&(r=we(r)),i&&!i[b]&&(i=we(i,o)),se(function(o,a,s,u){var l,c,f,p=[],d=[],h=a.length,g=o||function(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}(t||"*",s.nodeType?[s]:s,[]),v=!e||!o&&t?g:be(g,p,e,s,u),y=n?i||(o?e:h||r)?[]:a:v;if(n&&n(v,y,s,u),r)for(l=be(y,d),r(l,[],s,u),c=l.length;c--;)(f=l[c])&&(y[d[c]]=!(v[d[c]]=f));if(o){if(i||e){if(i){for(l=[],c=y.length;c--;)(f=y[c])&&l.push(v[c]=f);i(null,y=[],l,u)}for(c=y.length;c--;)(f=y[c])&&(l=i?O(o,f):p[c])>-1&&(o[l]=!(a[l]=f))}}else y=be(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):L.apply(a,y)})}function Te(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u<o;u++)if(n=r.relative[e[u].type])p=[me(xe(p),n)];else{if((n=r.filter[e[u].type].apply(null,e[u].matches))[b]){for(i=++u;i<o&&!r.relative[e[i].type];i++);return we(u>1&&xe(p),u>1&&ye(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u<i&&Te(e.slice(u,i)),i<o&&Te(e=e.slice(i)),i<o&&ye(e))}p.push(n)}return xe(p)}return ve.prototype=r.filters=r.pseudos,r.setFilters=new ve,a=oe.tokenize=function(e,t){var n,i,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);for(s=e,u=[],l=r.preFilter;s;){for(a in n&&!(i=F.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),n=!1,(i=_.exec(s))&&(n=i.shift(),o.push({value:n,type:i[0].replace(B," ")}),s=s.slice(n.length)),r.filter)!(i=V[a].exec(s))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),s=s.slice(n.length));if(!n)break}return t?s.length:s?oe.error(e):E(e,u).slice(0)},s=oe.compile=function(e,t){var n,i=[],o=[],s=S[e+" "];if(!s){for(t||(t=a(e)),n=t.length;n--;)(s=Te(t[n]))[b]?i.push(s):o.push(s);(s=S(e,function(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var f,h,v,y=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),k=T+=null==w?1:Math.random()||.1,E=C.length;for(c&&(l=a===d||a||c);m!==E&&null!=(f=C[m]);m++){if(i&&f){for(h=0,a||f.ownerDocument===d||(p(f),s=!g);v=e[h++];)if(v(f,a||d,s)){u.push(f);break}c&&(T=k)}n&&((f=!v&&f)&&y--,o&&x.push(f))}if(y+=m,n&&m!==y){for(h=0;v=t[h++];)v(x,b,a,s);if(o){if(y>0)for(;m--;)x[m]||b[m]||(b[m]=A.call(u));b=be(b)}L.apply(u,b),c&&!o&&b.length>0&&y+t.length>1&&oe.uniqueSort(u)}return c&&(T=k,l=w),x};return n?se(o):o}(o,i))).selector=e}return s},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}for(o=V.needsContext.test(e)?0:u.length;o--&&(l=u[o],!r.relative[c=l.type]);)if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ye(u)))return L.apply(n,i),n;break}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(n);C.find=S,C.expr=S.selectors,C.expr[":"]=C.expr.pseudos,C.uniqueSort=C.unique=S.uniqueSort,C.text=S.getText,C.isXMLDoc=S.isXML,C.contains=S.contains,C.escapeSelector=S.escape;var D=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&C(e).is(n))break;r.push(e)}return r},j=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=C.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var q=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function L(e,t,n){return m(t)?C.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?C.grep(e,function(e){return e===t!==n}):"string"!=typeof t?C.grep(e,function(e){return f.call(t,e)>-1!==n}):C.filter(t,e,n)}C.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?C.find.matchesSelector(r,e)?[r]:[]:C.find.matches(e,C.grep(t,function(e){return 1===e.nodeType}))},C.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(C(e).filter(function(){for(t=0;t<r;t++)if(C.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)C.find(e,i[t],n);return r>1?C.uniqueSort(n):n},filter:function(e){return this.pushStack(L(this,e||[],!1))},not:function(e){return this.pushStack(L(this,e||[],!0))},is:function(e){return!!L(this,"string"==typeof e&&N.test(e)?C(e):e||[],!1).length}});var H,O=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(C.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||H,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:O.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof C?t[0]:t,C.merge(this,C.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:a,!0)),q.test(r[1])&&C.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=a.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(C):C.makeArray(e,this)}).prototype=C.fn,H=C(a);var P=/^(?:parents|prev(?:Until|All))/,M={children:!0,contents:!0,next:!0,prev:!0};function R(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t=C(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(C.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&C(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&C.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?C.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?f.call(C(e),this[0]):f.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(C.uniqueSort(C.merge(this.get(),C(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),C.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return D(e,"parentNode")},parentsUntil:function(e,t,n){return D(e,"parentNode",n)},next:function(e){return R(e,"nextSibling")},prev:function(e){return R(e,"previousSibling")},nextAll:function(e){return D(e,"nextSibling")},prevAll:function(e){return D(e,"previousSibling")},nextUntil:function(e,t,n){return D(e,"nextSibling",n)},prevUntil:function(e,t,n){return D(e,"previousSibling",n)},siblings:function(e){return j((e.parentNode||{}).firstChild,e)},children:function(e){return j(e.firstChild)},contents:function(e){return A(e,"iframe")?e.contentDocument:(A(e,"template")&&(e=e.content||e),C.merge([],e.childNodes))}},function(e,t){C.fn[e]=function(n,r){var i=C.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=C.filter(r,i)),this.length>1&&(M[e]||C.uniqueSort(i),P.test(e)&&i.reverse()),this.pushStack(i)}});var I=/[^\x20\t\r\n\f]+/g;function W(e){return e}function $(e){throw e}function B(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}C.Callbacks=function(e){e="string"==typeof e?function(e){var t={};return C.each(e.match(I)||[],function(e,n){t[n]=!0}),t}(e):C.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1)for(n=a.shift();++s<o.length;)!1===o[s].apply(n[0],n[1])&&e.stopOnFalse&&(s=o.length,n=!1);e.memory||(n=!1),t=!1,i&&(o=n?[]:"")},l={add:function(){return o&&(n&&!t&&(s=o.length-1,a.push(n)),function t(n){C.each(n,function(n,r){m(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&"string"!==T(r)&&t(r)})}(arguments),n&&!t&&u()),this},remove:function(){return C.each(arguments,function(e,t){for(var n;(n=C.inArray(t,o,n))>-1;)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?C.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},C.extend({Deferred:function(e){var t=[["notify","progress",C.Callbacks("memory"),C.Callbacks("memory"),2],["resolve","done",C.Callbacks("once memory"),C.Callbacks("once memory"),0,"resolved"],["reject","fail",C.Callbacks("once memory"),C.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},pipe:function(){var e=arguments;return C.Deferred(function(n){C.each(t,function(t,r){var i=m(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&m(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(e,r,i){var o=0;function a(e,t,r,i){return function(){var s=this,u=arguments,l=function(){var n,l;if(!(e<o)){if((n=r.apply(s,u))===t.promise())throw new TypeError("Thenable self-resolution");l=n&&("object"==typeof n||"function"==typeof n)&&n.then,m(l)?i?l.call(n,a(o,t,W,i),a(o,t,$,i)):(o++,l.call(n,a(o,t,W,i),a(o,t,$,i),a(o,t,W,t.notifyWith))):(r!==W&&(s=void 0,u=[n]),(i||t.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(n){C.Deferred.exceptionHook&&C.Deferred.exceptionHook(n,c.stackTrace),e+1>=o&&(r!==$&&(s=void 0,u=[n]),t.rejectWith(s,u))}};e?c():(C.Deferred.getStackHook&&(c.stackTrace=C.Deferred.getStackHook()),n.setTimeout(c))}}return C.Deferred(function(n){t[0][3].add(a(0,n,m(i)?i:W,n.notifyWith)),t[1][3].add(a(0,n,m(e)?e:W)),t[2][3].add(a(0,n,m(r)?r:$))}).promise()},promise:function(e){return null!=e?C.extend(e,i):i}},o={};return C.each(t,function(e,n){var a=n[2],s=n[5];i[n[1]]=a.add,s&&a.add(function(){r=s},t[3-e][2].disable,t[3-e][3].disable,t[0][2].lock,t[0][3].lock),a.add(n[3].fire),o[n[0]]=function(){return o[n[0]+"With"](this===o?void 0:this,arguments),this},o[n[0]+"With"]=a.fireWith}),i.promise(o),e&&e.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=u.call(arguments),o=C.Deferred(),a=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?u.call(arguments):n,--t||o.resolveWith(r,i)}};if(t<=1&&(B(e,o.done(a(n)).resolve,o.reject,!t),"pending"===o.state()||m(i[n]&&i[n].then)))return o.then();for(;n--;)B(i[n],a(n),o.reject);return o.promise()}});var F=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;C.Deferred.exceptionHook=function(e,t){n.console&&n.console.warn&&e&&F.test(e.name)&&n.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},C.readyException=function(e){n.setTimeout(function(){throw e})};var _=C.Deferred();function z(){a.removeEventListener("DOMContentLoaded",z),n.removeEventListener("load",z),C.ready()}C.fn.ready=function(e){return _.then(e).catch(function(e){C.readyException(e)}),this},C.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--C.readyWait:C.isReady)||(C.isReady=!0,!0!==e&&--C.readyWait>0||_.resolveWith(a,[C]))}}),C.ready.then=_.then,"complete"===a.readyState||"loading"!==a.readyState&&!a.documentElement.doScroll?n.setTimeout(C.ready):(a.addEventListener("DOMContentLoaded",z),n.addEventListener("load",z));var U=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===T(n))for(s in i=!0,n)U(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(C(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},X=/^-ms-/,V=/-([a-z])/g;function G(e,t){return t.toUpperCase()}function Y(e){return e.replace(X,"ms-").replace(V,G)}var Q=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function J(){this.expando=C.expando+J.uid++}J.uid=1,J.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Q(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[Y(t)]=n;else for(r in t)i[Y(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][Y(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(Y):(t=Y(t))in r?[t]:t.match(I)||[]).length;for(;n--;)delete r[t[n]]}(void 0===t||C.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!C.isEmptyObject(t)}};var K=new J,Z=new J,ee=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,te=/[A-Z]/g;function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(te,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=function(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:ee.test(e)?JSON.parse(e):e)}(n)}catch(e){}Z.set(e,t,n)}else n=void 0;return n}C.extend({hasData:function(e){return Z.hasData(e)||K.hasData(e)},data:function(e,t,n){return Z.access(e,t,n)},removeData:function(e,t){Z.remove(e,t)},_data:function(e,t,n){return K.access(e,t,n)},_removeData:function(e,t){K.remove(e,t)}}),C.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=Z.get(o),1===o.nodeType&&!K.get(o,"hasDataAttrs"))){for(n=a.length;n--;)a[n]&&0===(r=a[n].name).indexOf("data-")&&(r=Y(r.slice(5)),ne(o,r,i[r]));K.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){Z.set(this,e)}):U(this,function(t){var n;if(o&&void 0===t)return void 0!==(n=Z.get(o,e))?n:void 0!==(n=ne(o,e))?n:void 0;this.each(function(){Z.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Z.remove(this,e)})}}),C.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=K.get(e,t),n&&(!r||Array.isArray(n)?r=K.access(e,t,C.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=C.queue(e,t),r=n.length,i=n.shift(),o=C._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){C.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return K.get(e,n)||K.access(e,n,{empty:C.Callbacks("once memory").add(function(){K.remove(e,[t+"queue",n])})})}}),C.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?C.queue(this[0],e):void 0===t?this:this.each(function(){var n=C.queue(this,e,t);C._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&C.dequeue(this,e)})},dequeue:function(e){return this.each(function(){C.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=C.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};for("string"!=typeof e&&(t=e,e=void 0),e=e||"fx";a--;)(n=K.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var re=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ie=new RegExp("^(?:([+-])=|)("+re+")([a-z%]*)$","i"),oe=["Top","Right","Bottom","Left"],ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&C.contains(e.ownerDocument,e)&&"none"===C.css(e,"display")},se=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return C.css(e,t,"")},u=s(),l=n&&n[3]||(C.cssNumber[t]?"":"px"),c=(C.cssNumber[t]||"px"!==l&&+u)&&ie.exec(C.css(e,t));if(c&&c[3]!==l){for(u/=2,l=l||c[3],c=+u||1;a--;)C.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,C.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=C.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?("none"===n&&(i[o]=K.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&ae(r)&&(i[o]=ce(r))):"none"!==n&&(i[o]="none",K.set(r,"display",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}C.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?C(this).show():C(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?C.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)K.set(e[n],"globalEval",!t||K.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===T(o))C.merge(p,o.nodeType?[o]:o);else if(me.test(o)){for(a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+C.htmlPrefilter(o)+u[2],c=u[0];c--;)a=a.lastChild;C.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));for(f.textContent="",d=0;o=p[d++];)if(r&&C.inArray(o,r)>-1)i&&i.push(o);else if(l=C.contains(o.ownerDocument,o),a=ve(f.appendChild(o),"script"),l&&ye(a),n)for(c=0;o=a[c++];)he.test(o.type||"")&&n.push(o);return f}!function(){var e=a.createDocumentFragment().appendChild(a.createElement("div")),t=a.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),y.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=a.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Ee(){return!1}function Se(){try{return a.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return C().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=C.guid++)),e.each(function(){C.event.add(this,t,i,r,n)})}C.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=K.get(e);if(v)for(n.handler&&(n=(o=n).handler,i=o.selector),i&&C.find.matchesSelector(be,i),n.guid||(n.guid=C.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(t){return void 0!==C&&C.event.triggered!==t.type?C.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(I)||[""]).length;l--;)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=C.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=C.event.special[d]||{},c=C.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&C.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),C.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=K.hasData(e)&&K.get(e);if(v&&(u=v.events)){for(l=(t=(t||"").match(I)||[""]).length;l--;)if(d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){for(f=C.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||C.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)C.event.remove(e,d+t[l],n,r,!0);C.isEmptyObject(u)&&K.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=C.event.fix(e),u=new Array(arguments.length),l=(K.get(this,"events")||{})[s.type]||[],c=C.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){for(a=C.event.handlers.call(this,s,l),t=0;(i=a[t++])&&!s.isPropagationStopped();)for(s.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!s.isImmediatePropagationStopped();)s.rnamespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((C.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?C(i,this).index(l)>-1:C.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(C.Event.prototype,e,{enumerable:!0,configurable:!0,get:m(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[C.expando]?e:new C.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Se()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===Se()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&A(this,"input"))return this.click(),!1},_default:function(e){return A(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},C.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},C.Event=function(e,t){if(!(this instanceof C.Event))return new C.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&C.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[C.expando]=!0},C.Event.prototype={constructor:C.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},C.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,char:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Te.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},C.event.addProp),C.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){C.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=e.relatedTarget,i=e.handleObj;return r&&(r===this||C.contains(this,r))||(e.type=i.origType,n=i.handler.apply(this,arguments),e.type=t),n}}}),C.fn.extend({on:function(e,t,n,r){return De(this,e,t,n,r)},one:function(e,t,n,r){return De(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,C(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){C.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Ne=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,qe=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Le(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&C(e).children("tbody")[0]||e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(K.hasData(e)&&(o=K.access(e),a=K.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)C.event.add(t,i,l[i][n]);Z.hasData(e)&&(s=Z.access(e),u=C.extend({},s),Z.set(t,u))}}function Me(e,t){var n=t.nodeName.toLowerCase();"input"===n&&pe.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=l.apply([],t);var i,o,a,s,u,c,f=0,p=e.length,d=p-1,h=t[0],g=m(h);if(g||p>1&&"string"==typeof h&&!y.checkClone&&Ae.test(h))return e.each(function(i){var o=e.eq(i);g&&(t[0]=h.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(o=(i=xe(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(a=C.map(ve(i,"script"),He)).length;f<p;f++)u=i,f!==d&&(u=C.clone(u,!0,!0),s&&C.merge(a,ve(u,"script"))),n.call(e[f],u,f);if(s)for(c=a[a.length-1].ownerDocument,C.map(a,Oe),f=0;f<s;f++)u=a[f],he.test(u.type||"")&&!K.access(u,"globalEval")&&C.contains(c,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?C._evalUrl&&C._evalUrl(u.src):w(u.textContent.replace(qe,""),c,u))}return e}function Ie(e,t,n){for(var r,i=t?C.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||C.cleanData(ve(r)),r.parentNode&&(n&&C.contains(r.ownerDocument,r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}C.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=C.contains(e.ownerDocument,e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||C.isXMLDoc(e)))for(a=ve(s),r=0,i=(o=ve(e)).length;r<i;r++)Me(o[r],a[r]);if(t)if(n)for(o=o||ve(e),a=a||ve(s),r=0,i=o.length;r<i;r++)Pe(o[r],a[r]);else Pe(e,s);return(a=ve(s,"script")).length>0&&ye(a,!u&&ve(e,"script")),s},cleanData:function(e){for(var t,n,r,i=C.event.special,o=0;void 0!==(n=e[o]);o++)if(Q(n)){if(t=n[K.expando]){if(t.events)for(r in t.events)i[r]?C.event.remove(n,r):C.removeEvent(n,r,t.handle);n[K.expando]=void 0}n[Z.expando]&&(n[Z.expando]=void 0)}}}),C.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return U(this,function(e){return void 0===e?C.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(C.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return C.clone(this,e,t)})},html:function(e){return U(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=C.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(C.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;C.inArray(this,e)<0&&(C.cleanData(ve(this)),n&&n.replaceChild(t,this))},e)}}),C.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){C.fn[e]=function(e){for(var n,r=[],i=C(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),C(i[a])[t](n),c.apply(r,n.get());return this.pushStack(r)}});var We=new RegExp("^("+re+")(?!px)[a-z%]+$","i"),$e=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=n),t.getComputedStyle(e)},Be=new RegExp(oe.join("|"),"i");function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||C.contains(e.ownerDocument,e)||(a=C.style(e,t)),!y.pixelBoxStyles()&&We.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(c){l.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",be.appendChild(l).appendChild(c);var e=n.getComputedStyle(c);r="1%"!==e.top,u=12===t(e.marginLeft),c.style.right="60%",s=36===t(e.right),i=36===t(e.width),c.style.position="absolute",o=36===c.offsetWidth||"absolute",be.removeChild(l),c=null}}function t(e){return Math.round(parseFloat(e))}var r,i,o,s,u,l=a.createElement("div"),c=a.createElement("div");c.style&&(c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===c.style.backgroundClip,C.extend(y,{boxSizingReliable:function(){return e(),i},pixelBoxStyles:function(){return e(),s},pixelPosition:function(){return e(),r},reliableMarginLeft:function(){return e(),u},scrollboxSize:function(){return e(),o}}))}();var ze=/^(none|table(?!-c[ea]).+)/,Ue=/^--/,Xe={position:"absolute",visibility:"hidden",display:"block"},Ve={letterSpacing:"0",fontWeight:"400"},Ge=["Webkit","Moz","ms"],Ye=a.createElement("div").style;function Qe(e){var t=C.cssProps[e];return t||(t=C.cssProps[e]=function(e){if(e in Ye)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=Ge.length;n--;)if((e=Ge[n]+t)in Ye)return e}(e)||e),t}function Je(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=C.css(e,n+oe[a],!0,i)),r?("content"===n&&(u-=C.css(e,"padding"+oe[a],!0,i)),"margin"!==n&&(u-=C.css(e,"border"+oe[a]+"Width",!0,i))):(u+=C.css(e,"padding"+oe[a],!0,i),"padding"!==n?u+=C.css(e,"border"+oe[a]+"Width",!0,i):s+=C.css(e,"border"+oe[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function Ze(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===C.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(y.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===C.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ke(e,t,n||(o?"border":"content"),a,r,i)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}C.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=Y(t),u=Ue.test(t),l=e.style;if(u||(t=Qe(s)),a=C.cssHooks[t]||C.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n==n&&("number"===o&&(n+=i&&i[3]||(C.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=Y(t);return Ue.test(t)||(t=Qe(s)),(a=C.cssHooks[t]||C.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),C.each(["height","width"],function(e,t){C.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(C.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,t,r):se(e,Xe,function(){return Ze(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===C.css(e,"boxSizing",!1,o),s=r&&Ke(e,t,r,a,o);return a&&y.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ke(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=C.css(e,t)),Je(0,n,s)}}}),C.cssHooks.marginLeft=_e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),C.each({margin:"",padding:"",border:"Width"},function(e,t){C.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(C.cssHooks[e+t].set=Je)}),C.fn.extend({css:function(e,t){return U(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a<i;a++)o[t[a]]=C.css(e,t[a],!1,r);return o}return void 0!==n?C.style(e,t,n):C.css(e,t)},e,t,arguments.length>1)}}),C.Tween=et,et.prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||C.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(C.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=C.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}},et.prototype.init.prototype=et.prototype,et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=C.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){C.fx.step[e.prop]?C.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[C.cssProps[e.prop]]&&!C.cssHooks[e.prop]?e.elem[e.prop]=e.now:C.style(e.elem,e.prop,e.now+e.unit)}}},et.propHooks.scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},C.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},C.fx=et.prototype.init,C.fx.step={};var tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){nt&&(!1===a.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(ot):n.setTimeout(ot,C.fx.interval),C.fx.tick())}function at(){return n.setTimeout(function(){tt=void 0}),tt=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(e,t,n){var r,i,o=0,a=lt.prefilters.length,s=C.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=tt||at(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return s.notifyWith(e,[l,r,n]),r<1&&a?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:C.extend({},t),opts:C.extend(!0,{specialEasing:{},easing:C.easing._default},n),originalProperties:t,originalOptions:n,startTime:tt||at(),duration:n.duration,tweens:[],createTween:function(t,n){var r=C.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=Y(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=C.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);o<a;o++)if(r=lt.prefilters[o].call(l,e,c,l.opts))return m(r.stop)&&(C._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return C.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),C.fx.timer(C.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}C.Animation=C.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ie.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(I);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=K.get(e,"fxshow");for(r in n.queue||(null==(a=C._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,C.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||C.style(e,r)}if((u=!C.isEmptyObject(t))||!C.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=K.get(e,"display")),"none"===(c=C.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=C.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===C.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=K.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),K.remove(e,"fxshow"),d)C.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),C.speed=function(e,t,n){var r=e&&"object"==typeof e?C.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return C.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in C.fx.speeds?r.duration=C.fx.speeds[r.duration]:r.duration=C.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&C.dequeue(this,r.queue)},r},C.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=C.isEmptyObject(e),o=C.speed(t,n,r),a=function(){var t=lt(this,C.extend({},e),o);(i||K.get(this,"finish"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=C.timers,a=K.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&it.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||C.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||"fx"),this.each(function(){var t,n=K.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=C.timers,a=r?r.length:0;for(n.finish=!0,C.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),C.each(["toggle","show","hide"],function(e,t){var n=C.fn[t];C.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(st(t,!0),e,r,i)}}),C.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){C.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),C.timers=[],C.fx.tick=function(){var e,t=0,n=C.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||C.fx.stop(),tt=void 0},C.fx.timer=function(e){C.timers.push(e),C.fx.start()},C.fx.interval=13,C.fx.start=function(){nt||(nt=!0,ot())},C.fx.stop=function(){nt=null},C.fx.speeds={slow:600,fast:200,_default:400},C.fn.delay=function(e,t){return e=C.fx&&C.fx.speeds[e]||e,t=t||"fx",this.queue(t,function(t,r){var i=n.setTimeout(t,e);r.stop=function(){n.clearTimeout(i)}})},function(){var e=a.createElement("input"),t=a.createElement("select").appendChild(a.createElement("option"));e.type="checkbox",y.checkOn=""!==e.value,y.optSelected=t.selected,(e=a.createElement("input")).value="t",e.type="radio",y.radioValue="t"===e.value}();var ct,ft=C.expr.attrHandle;C.fn.extend({attr:function(e,t){return U(this,C.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){C.removeAttr(this,e)})}}),C.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?C.prop(e,t,n):(1===o&&C.isXMLDoc(e)||(i=C.attrHooks[t.toLowerCase()]||(C.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void C.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=C.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(I);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?C.removeAttr(e,n):e.setAttribute(n,n),n}},C.each(C.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ft[t]||C.find.attr;ft[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ft[a],ft[a]=i,i=null!=n(e,t,r)?a:null,ft[a]=o),i}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(I)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(I)||[]}C.fn.extend({prop:function(e,t){return U(this,C.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[C.propFix[e]||e]})}}),C.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&C.isXMLDoc(e)||(t=C.propFix[t]||t,i=C.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=C.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),y.optSelected||(C.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),C.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){C.propFix[this.toLowerCase()]=this}),C.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(m(e))return this.each(function(t){C(this).addClass(e.call(this,t,gt(this)))});if((t=vt(e)).length)for(;n=this[u++];)if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(m(e))return this.each(function(t){C(this).removeClass(e.call(this,t,gt(this)))});if(!arguments.length)return this.attr("class","");if((t=vt(e)).length)for(;n=this[u++];)if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):m(e)?this.each(function(n){C(this).toggleClass(e.call(this,n,gt(this),t),t)}):this.each(function(){var t,i,o,a;if(r)for(i=0,o=C(this),a=vt(e);t=a[i++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||((t=gt(this))&&K.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":K.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+ht(gt(n))+" ").indexOf(t)>-1)return!0;return!1}});var yt=/\r/g;C.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=m(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,C(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=C.map(i,function(e){return null==e?"":e+""})),(t=C.valHooks[this.type]||C.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=C.valHooks[i.type]||C.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(yt,""):null==n?"":n:void 0}}),C.extend({valHooks:{option:{get:function(e){var t=C.find.attr(e,"value");return null!=t?t:ht(C.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=C(n).val(),a)return t;s.push(t)}return s},set:function(e,t){for(var n,r,i=e.options,o=C.makeArray(t),a=i.length;a--;)((r=i[a]).selected=C.inArray(C.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),C.each(["radio","checkbox"],function(){C.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=C.inArray(C(e).val(),t)>-1}},y.checkOn||(C.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in n;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};C.extend(C.event,{trigger:function(e,t,r,i){var o,s,u,l,c,f,p,d,g=[r||a],v=h.call(e,"type")?e.type:e,y=h.call(e,"namespace")?e.namespace.split("."):[];if(s=d=u=r=r||a,3!==r.nodeType&&8!==r.nodeType&&!mt.test(v+C.event.triggered)&&(v.indexOf(".")>-1&&(v=(y=v.split(".")).shift(),y.sort()),c=v.indexOf(":")<0&&"on"+v,(e=e[C.expando]?e:new C.Event(v,"object"==typeof e&&e)).isTrigger=i?2:3,e.namespace=y.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+y.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),t=null==t?[e]:C.makeArray(t,[e]),p=C.event.special[v]||{},i||!p.trigger||!1!==p.trigger.apply(r,t))){if(!i&&!p.noBubble&&!x(r)){for(l=p.delegateType||v,mt.test(l+v)||(s=s.parentNode);s;s=s.parentNode)g.push(s),u=s;u===(r.ownerDocument||a)&&g.push(u.defaultView||u.parentWindow||n)}for(o=0;(s=g[o++])&&!e.isPropagationStopped();)d=s,e.type=o>1?l:p.bindType||v,(f=(K.get(s,"events")||{})[e.type]&&K.get(s,"handle"))&&f.apply(s,t),(f=c&&s[c])&&f.apply&&Q(s)&&(e.result=f.apply(s,t),!1===e.result&&e.preventDefault());return e.type=v,i||e.isDefaultPrevented()||p._default&&!1!==p._default.apply(g.pop(),t)||!Q(r)||c&&m(r[v])&&!x(r)&&((u=r[c])&&(r[c]=null),C.event.triggered=v,e.isPropagationStopped()&&d.addEventListener(v,xt),r[v](),e.isPropagationStopped()&&d.removeEventListener(v,xt),C.event.triggered=void 0,u&&(r[c]=u)),e.result}},simulate:function(e,t,n){var r=C.extend(new C.Event,n,{type:e,isSimulated:!0});C.event.trigger(r,null,t)}}),C.fn.extend({trigger:function(e,t){return this.each(function(){C.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return C.event.trigger(e,t,n,!0)}}),y.focusin||C.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){C.event.simulate(t,e.target,C.event.fix(e))};C.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=K.access(r,t);i||r.addEventListener(e,n,!0),K.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=K.access(r,t)-1;i?K.access(r,t,i):(r.removeEventListener(e,n,!0),K.remove(r,t))}}});var bt=n.location,wt=Date.now(),Tt=/\?/;C.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new n.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||C.error("Invalid XML: "+e),t};var Ct=/\[\]$/,kt=/\r?\n/g,Et=/^(?:submit|button|image|reset|file)$/i,St=/^(?:input|select|textarea|keygen)/i;function Dt(e,t,n,r){var i;if(Array.isArray(t))C.each(t,function(t,i){n||Ct.test(e)?r(e,i):Dt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==T(t))r(e,t);else for(i in t)Dt(e+"["+i+"]",t[i],n,r)}C.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!C.isPlainObject(e))C.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},C.fn.extend({serialize:function(){return C.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=C.prop(this,"elements");return e?C.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!C(this).is(":disabled")&&St.test(this.nodeName)&&!Et.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=C(this).val();return null==n?null:Array.isArray(n)?C.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,Nt=/#.*$/,At=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Mt="*/".concat("*"),Rt=a.createElement("a");function It(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(I)||[];if(m(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Wt(e,t,n,r){var i={},o=e===Pt;function a(s){var u;return i[s]=!0,C.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function $t(e,t){var n,r,i=C.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&C.extend(!0,e,r),e}Rt.href=bt.href,C.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Mt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":C.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,C.ajaxSettings),t):$t(C.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,o,s,u,l,c,f,p,d,h=C.ajaxSetup({},t),g=h.context||h,v=h.context&&(g.nodeType||g.jquery)?C(g):C.event,y=C.Deferred(),m=C.Callbacks("once memory"),x=h.statusCode||{},b={},w={},T="canceled",k={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s)for(s={};t=qt.exec(o);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?o:null},setRequestHeader:function(e,t){return null==c&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)k.always(e[k.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||T;return r&&r.abort(t),E(0,t),this}};if(y.promise(k),h.url=((e||h.url||bt.href)+"").replace(Ht,bt.protocol+"//"),h.type=t.method||t.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(I)||[""],null==h.crossDomain){l=a.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Rt.protocol+"//"+Rt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=C.param(h.data,h.traditional)),Wt(Ot,h,t,k),c)return k;for(p in(f=C.event&&h.global)&&0==C.active++&&C.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Lt.test(h.type),i=h.url.replace(Nt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(jt,"+")):(d=h.url.slice(i.length),h.data&&(h.processData||"string"==typeof h.data)&&(i+=(Tt.test(i)?"&":"?")+h.data,delete h.data),!1===h.cache&&(i=i.replace(At,"$1"),d=(Tt.test(i)?"&":"?")+"_="+wt+++d),h.url=i+d),h.ifModified&&(C.lastModified[i]&&k.setRequestHeader("If-Modified-Since",C.lastModified[i]),C.etag[i]&&k.setRequestHeader("If-None-Match",C.etag[i])),(h.data&&h.hasContent&&!1!==h.contentType||t.contentType)&&k.setRequestHeader("Content-Type",h.contentType),k.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Mt+"; q=0.01":""):h.accepts["*"]),h.headers)k.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,k,h)||c))return k.abort();if(T="abort",m.add(h.complete),k.done(h.success),k.fail(h.error),r=Wt(Pt,h,t,k)){if(k.readyState=1,f&&v.trigger("ajaxSend",[k,h]),c)return k;h.async&&h.timeout>0&&(u=n.setTimeout(function(){k.abort("timeout")},h.timeout));try{c=!1,r.send(b,E)}catch(e){if(c)throw e;E(-1,e)}}else E(-1,"No Transport");function E(e,t,a,s){var l,p,d,b,w,T=t;c||(c=!0,u&&n.clearTimeout(u),r=void 0,o=s||"",k.readyState=e>0?4:0,l=e>=200&&e<300||304===e,a&&(b=function(e,t,n){for(var r,i,o,a,s=e.contents,u=e.dataTypes;"*"===u[0];)u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(h,k,a)),b=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(h,b,k,l),l?(h.ifModified&&((w=k.getResponseHeader("Last-Modified"))&&(C.lastModified[i]=w),(w=k.getResponseHeader("etag"))&&(C.etag[i]=w)),204===e||"HEAD"===h.type?T="nocontent":304===e?T="notmodified":(T=b.state,p=b.data,l=!(d=b.error))):(d=T,!e&&T||(T="error",e<0&&(e=0))),k.status=e,k.statusText=(t||T)+"",l?y.resolveWith(g,[p,T,k]):y.rejectWith(g,[k,T,d]),k.statusCode(x),x=void 0,f&&v.trigger(l?"ajaxSuccess":"ajaxError",[k,h,l?p:d]),m.fireWith(g,[k,T]),f&&(v.trigger("ajaxComplete",[k,h]),--C.active||C.event.trigger("ajaxStop")))}return k},getJSON:function(e,t,n){return C.get(e,t,n,"json")},getScript:function(e,t){return C.get(e,void 0,t,"script")}}),C.each(["get","post"],function(e,t){C[t]=function(e,n,r,i){return m(n)&&(i=i||r,r=n,n=void 0),C.ajax(C.extend({url:e,type:t,dataType:i,data:n,success:r},C.isPlainObject(e)&&e))}}),C._evalUrl=function(e){return C.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},C.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=C(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return m(e)?this.each(function(t){C(this).wrapInner(e.call(this,t))}):this.each(function(){var t=C(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=m(e);return this.each(function(n){C(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){C(this).replaceWith(this.childNodes)}),this}}),C.expr.pseudos.hidden=function(e){return!C.expr.pseudos.visible(e)},C.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},C.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},Ft=C.ajaxSettings.xhr();y.cors=!!Ft&&"withCredentials"in Ft,y.ajax=Ft=!!Ft,C.ajaxTransport(function(e){var t,r;if(y.cors||Ft&&!e.crossDomain)return{send:function(i,o){var a,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)s[a]=e.xhrFields[a];for(a in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)s.setRequestHeader(a,i[a]);t=function(e){return function(){t&&(t=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Bt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),r=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&n.setTimeout(function(){t&&r()})},t=t("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}}),C.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),C.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return C.globalEval(e),e}}}),C.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),C.ajaxTransport("script",function(e){var t,n;if(e.crossDomain)return{send:function(r,i){t=C("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&i("error"===e.type?404:200,e.type)}),a.head.appendChild(t[0])},abort:function(){n&&n()}}});var _t=[],zt=/(=)\?(?=&|$)|\?\?/;C.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=_t.pop()||C.expando+"_"+wt++;return this[e]=!0,e}}),C.ajaxPrefilter("json jsonp",function(e,t,r){var i,o,a,s=!1!==e.jsonp&&(zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&zt.test(e.data)&&"data");if(s||"jsonp"===e.dataTypes[0])return i=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,s?e[s]=e[s].replace(zt,"$1"+i):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+i),e.converters["script json"]=function(){return a||C.error(i+" was not called"),a[0]},e.dataTypes[0]="json",o=n[i],n[i]=function(){a=arguments},r.always(function(){void 0===o?C(n).removeProp(i):n[i]=o,e[i]&&(e.jsonpCallback=t.jsonpCallback,_t.push(i)),a&&m(o)&&o(a[0]),a=o=void 0}),"script"}),y.createHTMLDocument=function(){var e=a.implementation.createHTMLDocument("").body;return e.innerHTML="<form></form><form></form>",2===e.childNodes.length}(),C.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=a.implementation.createHTMLDocument("")).createElement("base")).href=a.location.href,t.head.appendChild(r)):t=a),i=q.exec(e),o=!n&&[],i?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&C(o).remove(),C.merge([],i.childNodes)));var r,i,o},C.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&C.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?C("<div>").append(C.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},C.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){C.fn[t]=function(e){return this.on(t,e)}}),C.expr.pseudos.animated=function(e){return C.grep(C.timers,function(t){return e===t.elem}).length},C.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=C.css(e,"position"),c=C(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=C.css(e,"top"),u=C.css(e,"left"),("absolute"===l||"fixed"===l)&&(o+u).indexOf("auto")>-1?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,C.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},C.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){C.offset.setOffset(this,e,t)});var t,n,r=this[0];return r?r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===C.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===C.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=C(e).offset()).top+=C.css(e,"borderTopWidth",!0),i.left+=C.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-C.css(r,"marginTop",!0),left:t.left-i.left-C.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===C.css(e,"position");)e=e.offsetParent;return e||be})}}),C.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;C.fn[e]=function(r){return U(this,function(e,r,i){var o;if(x(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),C.each(["top","left"],function(e,t){C.cssHooks[t]=_e(y.pixelPosition,function(e,n){if(n)return n=Fe(e,t),We.test(n)?C(e).position()[t]+"px":n})}),C.each({Height:"height",Width:"width"},function(e,t){C.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){C.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),s=n||(!0===i||!0===o?"margin":"border");return U(this,function(t,n,i){var o;return x(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?C.css(t,n,s):C.style(t,n,i,s)},t,a?i:void 0,a)}})}),C.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){C.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),C.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),C.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),C.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=u.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(u.call(arguments)))}).guid=e.guid=e.guid||C.guid++,i},C.holdReady=function(e){e?C.readyWait++:C.ready(!0)},C.isArray=Array.isArray,C.parseJSON=JSON.parse,C.nodeName=A,C.isFunction=m,C.isWindow=x,C.camelCase=Y,C.type=T,C.now=Date.now,C.isNumeric=function(e){var t=C.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},void 0===(r=function(){return C}.apply(t,[]))||(e.exports=r);var Ut=n.jQuery,Xt=n.$;return C.noConflict=function(e){return n.$===C&&(n.$=Xt),e&&n.jQuery===C&&(n.jQuery=Ut),C},i||(n.jQuery=n.$=C),C})},function(e,t,n){"use strict";n(2);var r=function(e){return e&&e.__esModule?e:{default:e}}(n(0));(0,r.default)(document).ready(function(){function e(){var e=(0,r.default)(this).parents("span:first");e.addClass("sectoken-del").fadeOut("fast",function(){e.remove()})}(0,r.default)("#editor-users-add, #editor-roles-add, #exuser-query-add, #exrole-query-add, #ipaddr-query-add").click(function(){var t=(0,r.default)(this).attr("id").substr(0,6),n=(0,r.default)(this).attr("id").substr(7,5),i=r.default.trim((0,r.default)("#"+t+"-"+n+"-box").val()),o=(0,r.default)("#"+t+"-list input").filter(function(){return this.value===i});i&&!o.length&&((0,r.default)("#"+t+"-"+n+"-box, #"+t+"-"+n+"-add").attr("disabled",!0),r.default.ajax({type:"POST",url:wsalData.ajaxURL,async:!0,data:{action:"setup_check_security_token",token:i,nonce:wsalData.nonce},dataType:"json",success:function(i){if((0,r.default)("#"+t+"-"+n+"-box, #"+t+"-"+n+"-add").removeAttr("disabled"),(0,r.default)("#"+t+"-"+n+"-box").val(""),i.success){if("other"===i.tokenType&&("users"===n||"exuser"===t))return void alert(wsalData.usersError);if("other"===i.tokenType&&("roles"===n||"exrole"===t))return void alert(wsalData.rolesError);if("other"===i.tokenType&&("ip"===n||"ipaddr"===t))return void alert(wsalData.ipError);(0,r.default)("#"+t+"-list").append((0,r.default)('<span class="sectoken-'+i.tokenType+'"/>').text(i.token).append((0,r.default)('<input type="hidden" name="'+t+'s[]"/>').val(i.token),(0,r.default)('<a href="javascript:;" title="Remove">&times;</a>').click(e)))}else alert(i.message)},error:function(e,t,n){console.log(e.statusText),console.log(t),console.log(n)}}))}),(0,r.default)("#editor-users-box, #editor-roles-box, #exuser-query-box, #exrole-query-box, #ipaddr-query-box").keydown(function(e){if(13===e.keyCode){var t=(0,r.default)(this).attr("id").substr(0,6),n=(0,r.default)(this).attr("id").substr(7,5);return(0,r.default)("#"+t+"-"+n+"-add").click(),!1}}),(0,r.default)("#editor-list>span>a, #exuser-list>span>a, #exrole-list>span>a, #ipaddr-list>span>a").click(e)})},function(e,t){}]);
1
+ jQuery(document).ready(function(){function e(){const e=jQuery(this).parents("span:first");e.addClass("sectoken-del").fadeOut("fast",function(){e.remove()})}jQuery("#editor-users-add, #editor-roles-add, #exuser-query-add, #exrole-query-add, #ipaddr-query-add").click(function(){const r=jQuery(this).attr("id").substr(0,6),t=jQuery(this).attr("id").substr(7,5),s=jQuery.trim(jQuery(`#${r}-${t}-box`).val()),a=jQuery(`#${r}-list input`).filter(function(){return this.value===s});s&&!a.length&&(jQuery(`#${r}-${t}-box, #${r}-${t}-add`).attr("disabled",!0),jQuery.ajax({type:"POST",url:wsalData.ajaxURL,async:!0,data:{action:"setup_check_security_token",token:s,nonce:wsalData.nonce},dataType:"json",success:function(s){if(jQuery(`#${r}-${t}-box, #${r}-${t}-add`).removeAttr("disabled"),jQuery(`#${r}-${t}-box`).val(""),s.success){if("other"===s.tokenType&&("users"===t||"exuser"===r))return void alert(wsalData.usersError);if("other"===s.tokenType&&("roles"===t||"exrole"===r))return void alert(wsalData.rolesError);if("other"===s.tokenType&&("ip"===t||"ipaddr"===r))return void alert(wsalData.ipError);jQuery(`#${r}-list`).append(jQuery(`<span class="sectoken-${s.tokenType}"/>`).text(s.token).append(jQuery(`<input type="hidden" name="${r}s[]"/>`).val(s.token),jQuery('<a href="javascript:;" title="Remove">&times;</a>').click(e)))}else alert(s.message)},error:function(e,r,t){console.log(e.statusText),console.log(r),console.log(t)}}))}),jQuery("#editor-users-box, #editor-roles-box, #exuser-query-box, #exrole-query-box, #ipaddr-query-box").keydown(function(e){if(13===e.keyCode){const e=jQuery(this).attr("id").substr(0,6),r=jQuery(this).attr("id").substr(7,5);return jQuery(`#${e}-${r}-add`).click(),!1}}),jQuery("#editor-list>span>a, #exuser-list>span>a, #exrole-list>span>a, #ipaddr-list>span>a").click(e)});
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/settings.js CHANGED
@@ -113,14 +113,12 @@ jQuery( document ).ready( function() {
113
  }
114
 
115
  // Reset settings handler.
116
- var resetSettings = jQuery( '[data-remodal-id=wsal_reset_settings] button[data-remodal-action=confirm]' );
117
- resetSettings.click( function() {
118
- resetWSAL( 'wsal_reset_settings', jQuery( '#wsal-reset-settings-nonce' ).val() );
119
  });
120
 
121
  // Purge activity handler.
122
- var purgeActivity = jQuery( '[data-remodal-id=wsal_purge_activity] button[data-remodal-action=confirm]' );
123
- purgeActivity.click( function() {
124
  resetWSAL( 'wsal_purge_activity', jQuery( '#wsal-purge-activity-nonce' ).val() );
125
  });
126
 
@@ -129,8 +127,22 @@ jQuery( document ).ready( function() {
129
  *
130
  * @param {string} action – Ajax action hook.
131
  * @param {string} nonce – Nonce for security.
 
132
  */
133
- function resetWSAL( action, nonce ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
134
  jQuery.ajax({
135
  type: 'POST',
136
  url: ajaxurl,
@@ -140,7 +152,16 @@ jQuery( document ).ready( function() {
140
  nonce: nonce
141
  },
142
  success: function( data ) {
143
- console.log( data );
 
 
 
 
 
 
 
 
 
144
  },
145
  error: function( xhr, textStatus, error ) {
146
  console.log( xhr.statusText );
@@ -193,4 +214,22 @@ jQuery( document ).ready( function() {
193
  }
194
  }
195
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  });
113
  }
114
 
115
  // Reset settings handler.
116
+ jQuery( '[data-remodal-id=wsal_reset_settings] button[data-remodal-action=confirm]' ).click( function() {
117
+ resetWSAL( 'wsal_reset_settings', jQuery( '#wsal-reset-settings-nonce' ).val(), '.js-settings-reset' );
 
118
  });
119
 
120
  // Purge activity handler.
121
+ jQuery( '[data-remodal-id=wsal_purge_activity] button[data-remodal-action=confirm]' ).click( function() {
 
122
  resetWSAL( 'wsal_purge_activity', jQuery( '#wsal-purge-activity-nonce' ).val() );
123
  });
124
 
127
  *
128
  * @param {string} action – Ajax action hook.
129
  * @param {string} nonce – Nonce for security.
130
+ * @param {string} triggerSelector - Selector expression of the event trigger element.
131
  */
132
+ function resetWSAL( action, nonce, triggerSelector ) {
133
+ var triggerElm = null;
134
+ if ( typeof triggerSelector != 'undefined' && triggerSelector.length != 0 ){
135
+ triggerElm = jQuery( triggerSelector );
136
+ if ( triggerElm.length == 0) {
137
+ triggerElm = null
138
+ };
139
+ }
140
+
141
+ if ( triggerElm != null ) {
142
+ jQuery( triggerSelector ).attr( 'disabled', 'disabled' );
143
+ jQuery( triggerSelector ).after( '<span class="spinner is-active" style="float: none; margin-top: 0;"></span>');
144
+ jQuery( triggerSelector ).siblings( '.notice' ).remove();
145
+ }
146
  jQuery.ajax({
147
  type: 'POST',
148
  url: ajaxurl,
152
  nonce: nonce
153
  },
154
  success: function( data ) {
155
+ if ( null != triggerElm ) {
156
+ jQuery( triggerSelector ).removeAttr( 'disabled' );
157
+ jQuery( triggerSelector ).siblings( '.spinner' ).remove();
158
+ if ( 'success' in data ) {
159
+ var noticeCssClass = data.success ? 'notice-success' : 'notice-error';
160
+ jQuery( triggerSelector ).after( '<span class="notice ' + noticeCssClass + '" style="margin-left: 10px; padding: 6px 10px;">' + data.data + '</span>');
161
+ }
162
+ } else {
163
+ console.log(data);
164
+ }
165
  },
166
  error: function( xhr, textStatus, error ) {
167
  console.log( xhr.statusText );
214
  }
215
  }
216
  });
217
+
218
+ /**
219
+ * Alert user to save settings before switching tabs.
220
+ */
221
+ jQuery(function() {
222
+ // Get form values as of page load.
223
+ var $form = jQuery('form#audit-log-settings');
224
+ var initialState = $form.serialize();
225
+
226
+ jQuery( 'body' ).on( 'click', '.nav-tab:not(.nav-tab-active)', function ( e ) {
227
+ // If the form has been modified, alert user.
228
+ if (initialState !== $form.serialize()) {
229
+ e.preventDefault();
230
+ alert( wsal_data.saveSettingsChanges );
231
+ }
232
+ });
233
+ });
234
+
235
  });
js/src/wsal-wizard.js CHANGED
@@ -1,16 +1,9 @@
1
  /**
2
  * WSAL Wizard
3
  *
4
- * Entry file for webpack.
5
- *
6
  * @since 3.2.3
7
  */
8
 
9
- // Wizard styles.
10
- import '../../css/src/wsal-wizard.scss';
11
-
12
- import jQuery from 'jquery';
13
-
14
  jQuery( document ).ready( function() {
15
 
16
  /**
1
  /**
2
  * WSAL Wizard
3
  *
 
 
4
  * @since 3.2.3
5
  */
6
 
 
 
 
 
 
7
  jQuery( document ).ready( function() {
8
 
9
  /**
languages/wp-security-audit-log.pot CHANGED
@@ -1,5359 +1,4106 @@
1
- #, fuzzy
 
2
  msgid ""
3
  msgstr ""
4
- "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
5
- "Project-Id-Version: WP Activity Log\n"
6
- "POT-Creation-Date: 2020-08-10 10:44+0100\n"
7
- "PO-Revision-Date: 2020-08-10 10:43+0100\n"
8
- "Last-Translator: \n"
9
- "Language-Team: \n"
10
  "MIME-Version: 1.0\n"
11
  "Content-Type: text/plain; charset=UTF-8\n"
12
  "Content-Transfer-Encoding: 8bit\n"
13
- "X-Generator: Poedit 1.8.13\n"
 
 
14
  "X-Poedit-Basepath: ..\n"
15
- "X-Poedit-WPHeader: wp-security-audit-log.php\n"
16
- "X-Poedit-SourceCharset: UTF-8\n"
17
- "X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
18
- "esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
19
- "_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
20
  "X-Poedit-SearchPath-0: .\n"
21
  "X-Poedit-SearchPathExcluded-0: *.js\n"
 
 
22
 
23
- #: classes/AlertManager.php:363
24
- #, php-format
25
- msgid "Event with code %d has not be registered."
26
  msgstr ""
27
 
28
- #: classes/AlertManager.php:419
29
- #, php-format
30
- msgid "Event %s already registered with WP Activity Log."
31
  msgstr ""
32
 
33
- #: classes/AlertManager.php:492
34
- msgid ""
35
- "You have custom events that are using the same ID or IDs which are already "
36
- "registered in the plugin, so they have been disabled."
37
  msgstr ""
38
 
39
- #: classes/AlertManager.php:495
40
- #, php-format
41
- msgid "%4$s to help you solve this issue."
42
  msgstr ""
43
 
44
- #: classes/AlertManager.php:497
45
- msgid "ERROR:"
46
  msgstr ""
47
 
48
- #: classes/AlertManager.php:499
49
- msgid "Contact us"
50
  msgstr ""
51
 
52
- #: classes/AlertManager.php:1106 classes/AuditLogListView.php:333
53
- #: classes/AuditLogListView.php:367 classes/Views/Settings.php:1168
54
- #: classes/WidgetManager.php:76
55
- #: extensions/search/classes/Filters/UserNameFilter.php:44
56
- #: extensions/search/classes/Filters/userfirstnamefilter.php:50
57
- #: extensions/search/classes/Filters/userlastnamefilter.php:50
58
- #: extensions/user-sessions/classes/View/Sessions.php:172
59
- msgid "User"
60
  msgstr ""
61
 
62
- #: classes/AlertManager.php:1107 classes/AlertManager.php:1893
63
- #: classes/AuditLogGridView.php:517 classes/AuditLogListView.php:543
64
- #: defaults.php:373
65
- #: extensions/email-notifications/classes/DailyNotification.php:241
66
- #: extensions/email-notifications/classes/Notifier.php:633
67
- #: extensions/reports/classes/Common.php:688
68
- msgid "System"
69
  msgstr ""
70
 
71
- #: classes/AlertManager.php:1108 classes/AuditLogGridView.php:508
72
- #: classes/AuditLogListView.php:531
73
- msgid "Plugin"
74
  msgstr ""
75
 
76
- #: classes/AlertManager.php:1109
77
- msgid "Database"
78
  msgstr ""
79
 
80
- #: classes/AlertManager.php:1110
81
- msgid "Post"
82
  msgstr ""
83
 
84
- #: classes/AlertManager.php:1111 classes/AlertManager.php:1115
85
- msgid "File"
86
  msgstr ""
87
 
88
- #: classes/AlertManager.php:1112
89
- msgid "Tag"
90
  msgstr ""
91
 
92
- #: classes/AlertManager.php:1113
93
- msgid "Comment"
94
  msgstr ""
95
 
96
- #: classes/AlertManager.php:1114
97
- msgid "Setting"
98
  msgstr ""
99
 
100
- #: classes/AlertManager.php:1116
101
- msgid "System Setting"
102
  msgstr ""
103
 
104
- #: classes/AlertManager.php:1117
105
- msgid "MainWP Network"
106
  msgstr ""
107
 
108
- #: classes/AlertManager.php:1118
109
- msgid "MainWP"
110
  msgstr ""
111
 
112
- #: classes/AlertManager.php:1119 classes/Views/ToggleAlerts.php:214
113
- #: classes/Views/ToggleAlerts.php:344 defaults.php:427
114
- msgid "Yoast SEO"
115
  msgstr ""
116
 
117
- #: classes/AlertManager.php:1120
118
- msgid "Yoast SEO Meta Box"
119
  msgstr ""
120
 
121
- #: classes/AlertManager.php:1121
122
- msgid "Category"
123
  msgstr ""
124
 
125
- #: classes/AlertManager.php:1122
126
- msgid "Custom Field"
127
  msgstr ""
128
 
129
- #: classes/AlertManager.php:1123
130
- msgid "Widget"
131
  msgstr ""
132
 
133
- #: classes/AlertManager.php:1124
134
- msgid "Menu"
135
  msgstr ""
136
 
137
- #: classes/AlertManager.php:1125
138
- msgid "Theme"
139
  msgstr ""
140
 
141
- #: classes/AlertManager.php:1126
142
- msgid "Activity Logs"
143
  msgstr ""
144
 
145
- #: classes/AlertManager.php:1127
146
- msgid "Multisite Network"
147
  msgstr ""
148
 
149
- #: classes/AlertManager.php:1128
150
- #: extensions/email-notifications/classes/Common.php:1204
151
- #: extensions/search/classes/Filters/IpFilter.php:87
152
- #: extensions/user-sessions/classes/View/Sessions.php:352
153
- msgid "IP Address"
154
  msgstr ""
155
 
156
- #: classes/AlertManager.php:1144
157
- msgid "unknown object"
158
  msgstr ""
159
 
160
- #: classes/AlertManager.php:1181
161
- msgid "Login"
162
  msgstr ""
163
 
164
- #: classes/AlertManager.php:1182
165
- msgid "Logout"
166
  msgstr ""
167
 
168
- #: classes/AlertManager.php:1183
169
- msgid "Installed"
170
  msgstr ""
171
 
172
- #: classes/AlertManager.php:1184
173
- msgid "Activated"
174
  msgstr ""
175
 
176
- #: classes/AlertManager.php:1185
177
- msgid "Deactivated"
178
  msgstr ""
179
 
180
- #: classes/AlertManager.php:1186
181
- msgid "Uninstalled"
182
  msgstr ""
183
 
184
- #: classes/AlertManager.php:1187
185
- msgid "Updated"
186
  msgstr ""
187
 
188
- #: classes/AlertManager.php:1188
189
- #: extensions/user-sessions/classes/View/Sessions.php:179
190
- msgid "Created"
191
  msgstr ""
192
 
193
- #: classes/AlertManager.php:1189
194
- msgid "Modified"
195
  msgstr ""
196
 
197
- #: classes/AlertManager.php:1190 extensions/search/search-init.php:332
198
- msgid "Deleted"
199
  msgstr ""
200
 
201
- #: classes/AlertManager.php:1191
202
- msgid "Published"
203
  msgstr ""
204
 
205
- #: classes/AlertManager.php:1192
206
- msgid "Approved"
207
  msgstr ""
208
 
209
- #: classes/AlertManager.php:1193
210
- msgid "Unapproved"
211
  msgstr ""
212
 
213
- #: classes/AlertManager.php:1194
214
- msgid "Enabled"
215
  msgstr ""
216
 
217
- #: classes/AlertManager.php:1195
218
- #: extensions/email-notifications/classes/Notifications.php:1922
219
- msgid "Disabled"
220
  msgstr ""
221
 
222
- #: classes/AlertManager.php:1196
223
- msgid "Added"
224
  msgstr ""
225
 
226
- #: classes/AlertManager.php:1197
227
- msgid "Failed Login"
228
  msgstr ""
229
 
230
- #: classes/AlertManager.php:1198
231
- msgid "Blocked"
232
  msgstr ""
233
 
234
- #: classes/AlertManager.php:1199
235
- msgid "Uploaded"
236
  msgstr ""
237
 
238
- #: classes/AlertManager.php:1200
239
- msgid "Restored"
240
  msgstr ""
241
 
242
- #: classes/AlertManager.php:1201
243
- msgid "Opened"
244
  msgstr ""
245
 
246
- #: classes/AlertManager.php:1202
247
- msgid "Viewed"
248
  msgstr ""
249
 
250
- #: classes/AlertManager.php:1203
251
- msgid "Started"
252
  msgstr ""
253
 
254
- #: classes/AlertManager.php:1204
255
- msgid "Stopped"
256
  msgstr ""
257
 
258
- #: classes/AlertManager.php:1205
259
- msgid "Removed"
260
  msgstr ""
261
 
262
- #: classes/AlertManager.php:1206
263
- msgid "Unblocked"
264
  msgstr ""
265
 
266
- #: classes/AlertManager.php:1207
267
- msgid "Renamed"
268
  msgstr ""
269
 
270
- #: classes/AlertManager.php:1208
271
- msgid "Duplicated"
272
  msgstr ""
273
 
274
- #: classes/AlertManager.php:1225
275
- msgid "unknown type"
276
  msgstr ""
277
 
278
- #: classes/AlertManager.php:1470 classes/Views/ToggleAlerts.php:235
279
- #: classes/Views/ToggleAlerts.php:267 defaults.php:268
280
- #: extensions/external-db/classes/Mirroring.php:457
281
- #: extensions/external-db/classes/Mirroring.php:490
282
- #: extensions/reports/inc/wsal-reporting-view.inc.php:74
283
- msgid "Pages"
284
  msgstr ""
285
 
286
- #: classes/AlertManager.php:1470 classes/Views/ToggleAlerts.php:235
287
- #: classes/Views/ToggleAlerts.php:267 defaults.php:228
288
- #: extensions/external-db/classes/Mirroring.php:457
289
- #: extensions/external-db/classes/Mirroring.php:490
290
- #: extensions/reports/inc/wsal-reporting-view.inc.php:74
291
- msgid "Custom Post Types"
292
  msgstr ""
293
 
294
- #: classes/AlertManager.php:1792 extensions/reports/classes/Common.php:1595
295
- msgid "System Activity"
296
  msgstr ""
297
 
298
- #: classes/AlertManager.php:1852 classes/ConstantManager.php:146
299
- #: extensions/external-db/classes/Common.php:719
300
- #: extensions/external-db/classes/Common.php:960
301
- msgid "Unknown error code."
302
  msgstr ""
303
 
304
- #: classes/AlertManager.php:1859 classes/AlertManager.php:1871
305
- #: extensions/reports/classes/Common.php:658
306
- #: extensions/reports/classes/Common.php:668
307
- msgid "Unknown Site"
308
  msgstr ""
309
 
310
- #: classes/AuditLogGridView.php:129 classes/AuditLogListView.php:129
311
- msgid "No events so far."
312
  msgstr ""
313
 
314
- #: classes/AuditLogGridView.php:167 classes/AuditLogListView.php:173
315
- msgid "List View"
316
  msgstr ""
317
 
318
- #: classes/AuditLogGridView.php:168 classes/AuditLogListView.php:174
319
- msgid "Grid View"
320
  msgstr ""
321
 
322
- #: classes/AuditLogGridView.php:193 classes/AuditLogListView.php:199
323
- msgid "Show "
324
  msgstr ""
325
 
326
- #: classes/AuditLogGridView.php:201 classes/AuditLogListView.php:207
327
- msgid " Items"
328
  msgstr ""
329
 
330
- #: classes/AuditLogGridView.php:208 classes/AuditLogListView.php:214
331
- msgid " End of Activity Log "
332
  msgstr ""
333
 
334
- #: classes/AuditLogGridView.php:229 classes/AuditLogListView.php:235
335
- #: classes/Views/AuditLog.php:628
336
- #: extensions/reports/inc/wsal-reporting-view.inc.php:605
337
- msgid "All Sites"
338
  msgstr ""
339
 
340
- #: classes/AuditLogGridView.php:257 classes/AuditLogListView.php:264
341
- msgid "Live Database"
342
  msgstr ""
343
 
344
- #: classes/AuditLogGridView.php:260 classes/AuditLogListView.php:267
345
- msgid "Archive Database"
346
  msgstr ""
347
 
348
- #: classes/AuditLogGridView.php:314 classes/AuditLogGridView.php:338
349
- #: classes/AuditLogListView.php:330 classes/AuditLogListView.php:358
350
- msgid "ID"
351
  msgstr ""
352
 
353
- #: classes/AuditLogGridView.php:315 classes/AuditLogGridView.php:341
354
- #: classes/AuditLogListView.php:331 classes/AuditLogListView.php:361
355
- #: classes/Views/Settings.php:1164 classes/Views/ToggleAlerts.php:318
356
- #: extensions/search/classes/Filters/CodeFilter.php:38
357
- #: extensions/search/classes/Filters/CodeFilter.php:64
358
- msgid "Severity"
359
  msgstr ""
360
 
361
- #: classes/AuditLogGridView.php:316
362
- #: extensions/search/classes/Filters/CodeFilter.php:71
363
- msgid "Info"
364
  msgstr ""
365
 
366
- #: classes/AuditLogGridView.php:321 classes/AuditLogListView.php:341
367
- #: classes/AuditLogListView.php:373
368
- #: extensions/email-notifications/classes/Common.php:1202
369
- #: extensions/email-notifications/classes/Common.php:1261
370
- #: extensions/search/classes/Filters/SiteFilter.php:29
371
- msgid "Site"
372
  msgstr ""
373
 
374
- #: classes/AuditLogGridView.php:324 classes/AuditLogGridView.php:347
375
- #: classes/AuditLogListView.php:344 classes/AuditLogListView.php:382
376
- #: extensions/email-notifications/classes/Common.php:1235
377
- msgid "Message"
378
  msgstr ""
379
 
380
- #: classes/AuditLogGridView.php:344
381
- msgid "Grid"
382
  msgstr ""
383
 
384
- #: classes/AuditLogGridView.php:416 classes/AuditLogListView.php:466
385
- msgid "Disable this type of events."
386
  msgstr ""
387
 
388
- #: classes/AuditLogGridView.php:435
389
- msgid "Message:"
390
  msgstr ""
391
 
392
- #: classes/AuditLogGridView.php:459 classes/AuditLogGridView.php:466
393
- #: classes/AuditLogGridView.php:505 classes/AuditLogListView.php:486
394
- #: classes/AuditLogListView.php:527
395
- msgid "Unknown"
396
  msgstr ""
397
 
398
- #: classes/AuditLogGridView.php:490 classes/AuditLogListView.php:512
399
- msgid "Show me all activity by this User"
400
  msgstr ""
401
 
402
- #: classes/AuditLogGridView.php:511 classes/AuditLogListView.php:535
403
- #: defaults.php:332
404
- msgid "Plugins"
405
  msgstr ""
406
 
407
- #: classes/AuditLogGridView.php:514 classes/AuditLogListView.php:539
408
- msgid "Website Visitor"
409
  msgstr ""
410
 
411
- #: classes/AuditLogGridView.php:551 classes/AuditLogGridView.php:564
412
- #: classes/AuditLogListView.php:575 classes/AuditLogListView.php:588
413
- msgid "Show me all activity originating from this IP Address"
414
  msgstr ""
415
 
416
- #: classes/AuditLogGridView.php:593
417
- msgid "Date:"
418
  msgstr ""
419
 
420
- #: classes/AuditLogGridView.php:597
421
- msgid "Time:"
422
  msgstr ""
423
 
424
- #: classes/AuditLogGridView.php:601
425
- msgid "User:"
426
  msgstr ""
427
 
428
- #: classes/AuditLogGridView.php:605
429
- msgid "IP:"
430
  msgstr ""
431
 
432
- #: classes/AuditLogGridView.php:609
433
- msgid "Object:"
434
  msgstr ""
435
 
436
- #: classes/AuditLogGridView.php:613
437
- msgid "Event Type:"
438
  msgstr ""
439
 
440
- #: classes/AuditLogGridView.php:621 classes/AuditLogListView.php:617
441
- msgid "View all details of this change"
442
  msgstr ""
443
 
444
- #: classes/AuditLogGridView.php:622 classes/AuditLogGridView.php:772
445
- #: classes/AuditLogListView.php:618 classes/AuditLogListView.php:772
446
- msgid "Alert Data Inspector"
447
  msgstr ""
448
 
449
- #: classes/AuditLogGridView.php:724 classes/AuditLogListView.php:724
450
- #: classes/Settings.php:1794
451
- msgid "Download the log file"
452
  msgstr ""
453
 
454
- #: classes/AuditLogGridView.php:744 classes/AuditLogListView.php:744
455
- #: classes/Settings.php:1836
456
- msgid "Download the log file."
457
  msgstr ""
458
 
459
- #: classes/AuditLogGridView.php:752 classes/AuditLogListView.php:752
460
- #: classes/Settings.php:1849 classes/Settings.php:2089
461
- #: extensions/email-notifications/classes/Notifier.php:794
462
- msgid "published"
463
  msgstr ""
464
 
465
- #: classes/AuditLogGridView.php:780 classes/AuditLogListView.php:780
466
- #: classes/Settings.php:1875 classes/Settings.php:2115
467
- #: extensions/email-notifications/classes/Notifier.php:820
468
- #: extensions/reports/classes/Common.php:582
469
- #, php-format
470
- msgid "Contact us on %s for assistance"
471
  msgstr ""
472
 
473
- #: classes/AuditLogGridView.php:914 classes/AuditLogListView.php:914
474
- #: extensions/email-notifications/classes/Notifications.php:1956
475
- #: extensions/email-notifications/classes/Notifications.php:1967
476
- #: extensions/reports/inc/wsal-reporting-view.inc.php:739
477
- msgid "Select All"
478
  msgstr ""
479
 
480
- #: classes/AuditLogListView.php:332 classes/AuditLogListView.php:364
481
- #: extensions/search/classes/Filters/DateFilter.php:27
482
- msgid "Date"
483
  msgstr ""
484
 
485
- #: classes/AuditLogListView.php:334 classes/AuditLogListView.php:370
486
- #: extensions/search/classes/Filters/IpFilter.php:45
487
- msgid "IP"
488
  msgstr ""
489
 
490
- #: classes/AuditLogListView.php:335 classes/AuditLogListView.php:376
491
- #: extensions/email-notifications/classes/Common.php:1175
492
- #: extensions/search/classes/Filters/ObjectFilter.php:29
493
- #: extensions/search/classes/Filters/ObjectFilter.php:53
494
- msgid "Object"
495
  msgstr ""
496
 
497
- #: classes/AuditLogListView.php:336 classes/AuditLogListView.php:379
498
- #: extensions/email-notifications/classes/Common.php:1176
499
- #: extensions/search/classes/Filters/EventTypeFilter.php:29
500
- #: extensions/search/classes/Filters/EventTypeFilter.php:53
501
- msgid "Event Type"
502
  msgstr ""
503
 
504
- #: classes/AuditLogListView.php:441
505
- msgid "Click to toggle."
506
  msgstr ""
507
 
508
- #: classes/AuditLogListView.php:446 classes/Models/Occurrence.php:83
509
- #: classes/ViewManager.php:510
510
- msgid "Alert message not found."
511
  msgstr ""
512
 
513
- #: classes/AuditLogListView.php:447 classes/Models/Occurrence.php:84
514
- #: classes/ViewManager.php:511
515
- msgid "Alert description not found."
516
  msgstr ""
517
 
518
- #: classes/Connector/MySQLDB.php:61
519
- msgid ""
520
- "Error establishing a database connection. DB username or password are not "
521
- "valid."
522
  msgstr ""
523
 
524
- #: classes/Connector/MySQLDB.php:69
525
- #, php-format
526
- msgid "Code %1$d: %2$s"
527
  msgstr ""
528
 
529
- #: classes/Connector/wp-db-custom.php:212
530
- msgid "Error establishing a database connection"
531
  msgstr ""
532
 
533
- #: classes/Connector/wp-db-custom.php:216
534
- #, php-format
535
- msgid ""
536
- "This either means that the username and password information in your %1$s "
537
- "file is incorrect or we can&#8217;t contact the database server at %2$s. "
538
- "This could mean your host&#8217;s database server is down."
539
  msgstr ""
540
 
541
- #: classes/Connector/wp-db-custom.php:222
542
- msgid "Are you sure you have the correct username and password?"
543
  msgstr ""
544
 
545
- #: classes/Connector/wp-db-custom.php:223
546
- msgid "Are you sure that you have typed the correct hostname?"
547
  msgstr ""
548
 
549
- #: classes/Connector/wp-db-custom.php:224
550
- msgid "Are you sure that the database server is running?"
551
  msgstr ""
552
 
553
- #: classes/Connector/wp-db-custom.php:229
554
- #, php-format
555
- msgid ""
556
- "If you&#8217;re unsure what these terms mean you should probably contact "
557
- "your host. If you still need help you can always visit the <a href=\"%s"
558
- "\">WordPress Support Forums</a>."
559
  msgstr ""
560
 
561
- #: classes/Connector/wp-db-custom.php:230
562
- msgid "https://wordpress.org/support/"
563
  msgstr ""
564
 
565
- #: classes/Connector/wp-db-custom.php:283
566
- msgid "Can&#8217;t select database"
567
  msgstr ""
568
 
569
- #: classes/Connector/wp-db-custom.php:287
570
- #, php-format
571
- msgid ""
572
- "We were able to connect to the database server (which means your username "
573
- "and password is okay) but not able to select the %s database."
574
  msgstr ""
575
 
576
- #: classes/Connector/wp-db-custom.php:292
577
- msgid "Are you sure it exists?"
578
  msgstr ""
579
 
580
- #: classes/Connector/wp-db-custom.php:296
581
- #, php-format
582
- msgid "Does the user %1$s have permission to use the %2$s database?"
583
  msgstr ""
584
 
585
- #: classes/Connector/wp-db-custom.php:303
586
- #, php-format
587
- msgid ""
588
- "On some systems the name of your database is prefixed with your username, so "
589
- "it would be like <code>username_%1$s</code>. Could that be the problem?"
590
  msgstr ""
591
 
592
- #: classes/Connector/wp-db-custom.php:311
593
- #, php-format
594
- msgid ""
595
- "If you don&#8217;t know how to set up a database you should <strong>contact "
596
- "your host</strong>. If all else fails you may find help at the <a href=\"%s"
597
- "\">WordPress Support Forums</a>."
598
  msgstr ""
599
 
600
- #: classes/Connector/wp-db-custom.php:312
601
- msgid "https://wordpress.org/support/forums/"
602
  msgstr ""
603
 
604
- #: classes/ConstantManager.php:152 classes/ConstantManager.php:158
605
- #: classes/Views/ToggleAlerts.php:442 classes/Views/ToggleAlerts.php:448
606
- #: extensions/search/classes/Filters/CodeFilter.php:67
607
- msgid "Critical"
608
  msgstr ""
609
 
610
- #: classes/ConstantManager.php:154 classes/Views/ToggleAlerts.php:444
611
- msgid "Warning"
612
  msgstr ""
613
 
614
- #: classes/ConstantManager.php:156 classes/Views/ToggleAlerts.php:446
615
- #: classes/Views/ToggleAlerts.php:458
616
- msgid "Notification"
617
  msgstr ""
618
 
619
- #: classes/ConstantManager.php:160 classes/Views/ToggleAlerts.php:450
620
- #: extensions/search/classes/Filters/CodeFilter.php:68
621
- msgid "High"
622
  msgstr ""
623
 
624
- #: classes/ConstantManager.php:162 classes/Views/ToggleAlerts.php:452
625
- #: extensions/search/classes/Filters/CodeFilter.php:69
626
- msgid "Medium"
627
  msgstr ""
628
 
629
- #: classes/ConstantManager.php:164 classes/Views/ToggleAlerts.php:454
630
- #: extensions/search/classes/Filters/CodeFilter.php:70
631
- msgid "Low"
632
  msgstr ""
633
 
634
- #: classes/ConstantManager.php:166 classes/Views/ToggleAlerts.php:456
635
- msgid "Informational"
636
  msgstr ""
637
 
638
- #: classes/Loggers/Database.php:235 classes/Views/addons/html-view.php:92
639
- #: classes/Views/addons/html-view.php:117
640
- msgid "Upgrade to Premium"
641
  msgstr ""
642
 
643
- #: classes/Loggers/Database.php:236 classes/Views/addons/html-view.php:93
644
- msgid "More Information"
645
  msgstr ""
646
 
647
- #: classes/Models/Occurrence.php:200
648
- msgid "WPForms"
649
  msgstr ""
650
 
651
- #: classes/Models/Occurrence.php:204
652
- msgid "BBPress"
653
  msgstr ""
654
 
655
- #: classes/Models/Occurrence.php:208 classes/Views/ToggleAlerts.php:329
656
- #: extensions/email-notifications/classes/Notifications.php:179
657
- msgid "WooCommerce"
658
  msgstr ""
659
 
660
- #: classes/Models/Occurrence.php:212
661
- msgid "WFCM"
662
  msgstr ""
663
 
664
- #: classes/Models/Occurrence.php:234
665
- #, php-format
666
- msgid ""
667
- "Alert message was not available, this may have been a custom alert that no "
668
- "longer exists. Read more about custom events %1$shere%2$s."
669
  msgstr ""
670
 
671
- #: classes/Sensors/Content.php:996 classes/Sensors/Content.php:1004
672
- msgid "Password Protected"
673
  msgstr ""
674
 
675
- #: classes/Sensors/Content.php:998 classes/Sensors/Content.php:1006
676
- msgid "Private"
677
  msgstr ""
678
 
679
- #: classes/Sensors/Content.php:1000 classes/Sensors/Content.php:1008
680
- msgid "Public"
681
  msgstr ""
682
 
683
- #: classes/Sensors/FrontendWooCommerce.php:228 classes/Sensors/Public.php:413
684
- msgid "In stock"
685
  msgstr ""
686
 
687
- #: classes/Sensors/FrontendWooCommerce.php:230 classes/Sensors/Public.php:415
688
- msgid "Out of stock"
689
  msgstr ""
690
 
691
- #: classes/Sensors/FrontendWooCommerce.php:232 classes/Sensors/Public.php:417
692
- msgid "On backorder"
693
  msgstr ""
694
 
695
- #: classes/Settings.php:272
696
- #, php-format
697
- msgid ""
698
- "Unable to create directory %s. Is its parent directory writable by the "
699
- "server?"
700
  msgstr ""
701
 
702
- #: classes/Settings.php:593
703
- msgid "This function is deprecated"
704
  msgstr ""
705
 
706
- #: classes/Settings.php:1753
707
- #: extensions/email-notifications/classes/Notifier.php:742
708
- #: extensions/reports/classes/Common.php:523
709
- msgid "View the content changes"
710
  msgstr ""
711
 
712
- #: classes/Settings.php:1758
713
- #: extensions/email-notifications/classes/Notifier.php:747
714
- #: extensions/email-notifications/classes/Notifier.php:753
715
- #: extensions/reports/classes/Common.php:528
716
- #: extensions/reports/classes/Common.php:534
717
- msgid "View post in the editor"
718
  msgstr ""
719
 
720
- #: classes/Settings.php:1761
721
- #: extensions/email-notifications/classes/Notifier.php:750
722
- #: extensions/reports/classes/Common.php:531
723
- msgid "View Order"
724
  msgstr ""
725
 
726
- #: classes/Settings.php:1766
727
- #: extensions/email-notifications/classes/Notifier.php:756
728
- #: extensions/reports/classes/Common.php:537
729
- msgid "View category"
730
  msgstr ""
731
 
732
- #: classes/Settings.php:1769
733
- #: extensions/email-notifications/classes/Notifier.php:759
734
- #: extensions/reports/classes/Common.php:540
735
- msgid "View tag"
736
  msgstr ""
737
 
738
- #: classes/Settings.php:1773
739
- #: extensions/email-notifications/classes/Notifier.php:769
740
- #: extensions/reports/classes/Common.php:550
741
- msgid "User profile page"
742
  msgstr ""
743
 
744
- #: classes/Settings.php:1887 extensions/reports/classes/Common.php:594
745
- msgid "Increase maximum file size limit"
746
  msgstr ""
747
 
748
- #: classes/Settings.php:1890 extensions/reports/classes/Common.php:597
749
- msgid "Contact Support"
750
  msgstr ""
751
 
752
- #: classes/Settings.php:2127
753
- #: extensions/email-notifications/classes/Notifier.php:831
754
- #: extensions/email-notifications/classes/Notifier.php:959
755
- msgid "plugin settings"
756
  msgstr ""
757
 
758
- #: classes/Settings.php:2130
759
- #: extensions/email-notifications/classes/Notifier.php:834
760
- #: extensions/email-notifications/classes/Notifier.php:964
761
- msgid "contact our support"
762
  msgstr ""
763
 
764
- #: classes/Settings.php:2336
765
- msgid "Root directory of WordPress (excluding sub directories)"
766
  msgstr ""
767
 
768
- #: classes/Settings.php:2337
769
- msgid "WP Admin directory (/wp-admin/)"
770
  msgstr ""
771
 
772
- #: classes/Settings.php:2338
773
- msgid "WP Includes directory (/wp-includes/)"
774
  msgstr ""
775
 
776
- #: classes/Settings.php:2339
777
- msgid ""
778
- "/wp-content/ directory (excluding plugins, themes & uploads directories)"
779
  msgstr ""
780
 
781
- #: classes/Settings.php:2340
782
- msgid "Themes directory (/wp-content/themes/)"
783
  msgstr ""
784
 
785
- #: classes/Settings.php:2341
786
- msgid "Plugins directory (/wp-content/plugins/)"
787
  msgstr ""
788
 
789
- #: classes/Settings.php:2342
790
- msgid "Uploads directory (/wp-content/uploads/)"
791
  msgstr ""
792
 
793
- #: classes/Settings.php:2347
794
- msgid ""
795
- "Uploads directory of all sub sites on this network (/wp-content/sites/*)"
796
  msgstr ""
797
 
798
- #: classes/Utilities/Emailer.php:53
799
- #, php-format
800
- msgid "WP Activity Log plugin disabled on %s"
801
  msgstr ""
802
 
803
- #: classes/Utilities/Emailer.php:56
804
- msgid "Hello admin,"
805
  msgstr ""
806
 
807
- #: classes/Utilities/Emailer.php:61
808
- #, php-format
809
- msgid ""
810
- "This is a notification to let you know that the user %1$s has deactivated "
811
- "the plugin WP Activity Log on the website %2$s on %3$s."
812
  msgstr ""
813
 
814
- #: classes/Utilities/PluginInstallAndActivate.php:79
815
- msgid ""
816
- "WP Activity Log can keep a log of changes done on other plugins. Install the "
817
- "relevant extension from the below list to keep a log of changes done on that "
818
- "plugin."
819
  msgstr ""
820
 
821
- #: classes/Utilities/PluginInstallAndActivate.php:100
822
- #: classes/Views/SetupWizard.php:890
823
- msgid "Extension for "
824
  msgstr ""
825
 
826
- #: classes/Utilities/PluginInstallAndActivate.php:105
827
- #: classes/Views/SetupWizard.php:895
828
- msgid "Extension installed, activate now?"
829
  msgstr ""
830
 
831
- #: classes/Utilities/PluginInstallAndActivate.php:107
832
- #: classes/Views/SetupWizard.php:274 classes/Views/SetupWizard.php:897
833
- #: wp-security-audit-log.php:1283
834
- msgid "Extension installed"
835
  msgstr ""
836
 
837
- #: classes/Utilities/PluginInstallAndActivate.php:109
838
- #: classes/Views/AuditLog.php:283 classes/Views/SetupWizard.php:899
839
- msgid "Install Extension"
840
  msgstr ""
841
 
842
- #: classes/Utilities/PluginInstallerAction.php:76
843
- msgid "Tried to install a zip or slug that was not in the allowed list"
844
  msgstr ""
845
 
846
- #: classes/ViewManager.php:163
847
- msgid ""
848
- "WP Activity Log requires Website File Changes Monitor 1.6.0. Please upgrade "
849
- "that plugin."
850
  msgstr ""
851
 
852
- #: classes/ViewManager.php:304
853
- msgid "Free Premium Trial"
854
  msgstr ""
855
 
856
- #: classes/ViewManager.php:536 classes/Views/Settings.php:219
857
- #: classes/Views/Settings.php:1887 classes/Views/Settings.php:1916
858
- #: classes/Views/SetupWizard.php:83
859
- #: extensions/email-notifications/classes/Notifications.php:117
860
- #: extensions/external-db/classes/Connections.php:738
861
- #: extensions/external-db/classes/Connections.php:772
862
- #: extensions/external-db/classes/Connections.php:969
863
- #: extensions/external-db/classes/Settings.php:282
864
- #: extensions/external-db/classes/Settings.php:373
865
- #: extensions/external-db/classes/Settings.php:1078
866
- #: extensions/external-db/classes/Settings.php:1317
867
- #: extensions/external-db/classes/Settings.php:1381
868
- #: extensions/external-db/classes/Settings.php:1433
869
- msgid "Access Denied."
870
  msgstr ""
871
 
872
- #: classes/ViewManager.php:567
873
- msgid "Log count parameter expected."
874
  msgstr ""
875
 
876
- #: classes/ViewManager.php:575 classes/Views/AuditLog.php:816
877
- #: classes/Views/AuditLog.php:877 classes/Views/AuditLog.php:903
878
- #: classes/Views/AuditLog.php:1223 classes/Views/AuditLog.php:1293
879
- #: classes/Views/Settings.php:234 classes/Views/Settings.php:1799
880
- #: classes/Views/Settings.php:1827 classes/Views/Settings.php:1857
881
- #: classes/Views/SetupWizard.php:96
882
- #: extensions/email-notifications/classes/Notifications.php:492
883
- #: extensions/external-db/classes/Connections.php:757
884
- #: extensions/external-db/classes/Connections.php:953
885
- #: extensions/external-db/classes/Connections.php:1021
886
- #: extensions/external-db/classes/Settings.php:312
887
- #: extensions/external-db/classes/Settings.php:400
888
- #: extensions/external-db/classes/Settings.php:1147
889
- #: extensions/external-db/classes/Settings.php:1364
890
- #: extensions/external-db/classes/Settings.php:1416
891
- #: extensions/external-db/classes/Settings.php:1449
892
- #: extensions/reports/classes/Views/Main.php:768
893
- #: extensions/search/search-init.php:470 extensions/search/search-init.php:541
894
- #: extensions/user-sessions/classes/Views.php:581
895
- msgid "Nonce verification failed."
896
  msgstr ""
897
 
898
- #: classes/Views/AuditLog.php:99
899
- msgid ""
900
- "Get instantly alerted of critical changes via SMS & email, search the "
901
- "activity log, generate user reports, see who is logged in and more!"
902
  msgstr ""
903
 
904
- #: classes/Views/AuditLog.php:100
905
- msgid ""
906
- "Upgrade to premium to unlock these powerful activity log features & more!"
907
  msgstr ""
908
 
909
- #: classes/Views/AuditLog.php:103
910
- msgid ""
911
- "Instant SMS & email alerts, search & filters, reports, users sessions "
912
- "management and much more!"
913
  msgstr ""
914
 
915
- #: classes/Views/AuditLog.php:104
916
- msgid "Upgrade to premium to get more out of your activity logs!"
917
  msgstr ""
918
 
919
- #: classes/Views/AuditLog.php:107
920
- msgid ""
921
- "See who logged in on your site in real-time, generate reports, get SMS & "
922
- "email alerts of critical changes and more!"
923
  msgstr ""
924
 
925
- #: classes/Views/AuditLog.php:108
926
- msgid "Unlock these and other powerful features with WP Activity Log Premium."
927
  msgstr ""
928
 
929
- #: classes/Views/AuditLog.php:186
930
- msgid "UPGRADE NOW"
931
  msgstr ""
932
 
933
- #: classes/Views/AuditLog.php:187
934
- msgid "Start Free Trial"
935
  msgstr ""
936
 
937
- #: classes/Views/AuditLog.php:188
938
- msgid "Tell me more"
939
  msgstr ""
940
 
941
- #: classes/Views/AuditLog.php:190
942
- msgid "Dismiss the banner"
943
  msgstr ""
944
 
945
- #: classes/Views/AuditLog.php:190
946
- msgid "Close"
947
  msgstr ""
948
 
949
- #: classes/Views/AuditLog.php:215
950
- msgid ""
951
- "There are connectivity issues with the database where the WordPress activity "
952
- "log is stored. The logs will be temporary buffered in the WordPress database "
953
- "until the connection is fully restored."
954
  msgstr ""
955
 
956
- #: classes/Views/AuditLog.php:233
957
- msgid "Help WP Activity Log improve."
958
  msgstr ""
959
 
960
- #: classes/Views/AuditLog.php:234
961
- msgid ""
962
- "Gathering non-sensitive diagnostic data about the plugin install helps us "
963
- "improve the plugin. When you opt-in, you also subscribe to our announcements "
964
- "(you can opt-out at any time). If you would rather opt-out, we will not "
965
- "collect any data."
966
  msgstr ""
967
 
968
- #: classes/Views/AuditLog.php:234
969
- msgid "Read more about what we collect."
970
  msgstr ""
971
 
972
- #: classes/Views/AuditLog.php:236
973
- msgid "Sure, opt-in"
974
  msgstr ""
975
 
976
- #: classes/Views/AuditLog.php:237
977
- msgid "No, thank you"
978
  msgstr ""
979
 
980
- #: classes/Views/AuditLog.php:286
981
- msgid "Install Extensions"
982
  msgstr ""
983
 
984
- #: classes/Views/AuditLog.php:298
985
- msgid "You have"
986
  msgstr ""
987
 
988
- #: classes/Views/AuditLog.php:300
989
- msgid "installed. Keep a log of changes in"
990
  msgstr ""
991
 
992
- #: classes/Views/AuditLog.php:360 classes/Views/Settings.php:92
993
- msgid "Activity Log Viewer"
994
  msgstr ""
995
 
996
- #: classes/Views/AuditLog.php:387
997
- msgid "Log Viewer"
998
  msgstr ""
999
 
1000
- #: classes/Views/AuditLog.php:542 classes/Views/Settings.php:325
1001
- #: classes/Views/ToggleAlerts.php:132
1002
- #: extensions/email-notifications/classes/AddNotification.php:246
1003
- #: extensions/email-notifications/classes/AddNotification.php:279
1004
- #: extensions/email-notifications/classes/EditNotification.php:250
1005
- #: extensions/email-notifications/classes/EditNotification.php:254
1006
- #: extensions/email-notifications/classes/EditNotification.php:258
1007
- #: extensions/email-notifications/classes/EditNotification.php:263
1008
- #: extensions/email-notifications/classes/EditNotification.php:291
1009
- #: extensions/external-db/classes/Settings.php:420
1010
- msgid "You do not have sufficient permissions to access this page."
1011
  msgstr ""
1012
 
1013
- #: classes/Views/AuditLog.php:590
1014
- msgid ""
1015
- "Thank you for installing WP Activity Log. Do you want to run the wizard to "
1016
- "configure the basic plugin settings?"
1017
  msgstr ""
1018
 
1019
- #: classes/Views/AuditLog.php:592 classes/Views/Settings.php:528
1020
- #: classes/Views/Settings.php:555 classes/Views/Settings.php:621
1021
- #: classes/Views/Settings.php:679 classes/Views/Settings.php:1200
1022
- #: classes/Views/Settings.php:1491 classes/Views/Settings.php:1550
1023
- #: classes/Views/Settings.php:1591 classes/Views/Settings.php:1612
1024
- #: classes/Views/Settings.php:1622 classes/Views/SetupWizard.php:564
1025
- #: classes/Views/SetupWizard.php:612
1026
- msgid "Yes"
1027
  msgstr ""
1028
 
1029
- #: classes/Views/AuditLog.php:593 classes/Views/Settings.php:533
1030
- #: classes/Views/Settings.php:560 classes/Views/Settings.php:651
1031
- #: classes/Views/Settings.php:689 classes/Views/Settings.php:1205
1032
- #: classes/Views/Settings.php:1496 classes/Views/Settings.php:1557
1033
- #: classes/Views/Settings.php:1598 classes/Views/Settings.php:1613
1034
- #: classes/Views/Settings.php:1623 classes/Views/SetupWizard.php:569
1035
- #: classes/Views/SetupWizard.php:617
1036
- msgid "No"
1037
  msgstr ""
1038
 
1039
- #: classes/Views/AuditLog.php:627
1040
- msgid "Please enter the number of alerts you would like to see on one page:"
1041
  msgstr ""
1042
 
1043
- #: classes/Views/AuditLog.php:629
1044
- msgid "No Results"
1045
  msgstr ""
1046
 
1047
- #: classes/Views/AuditLog.php:813
1048
- msgid "No users found."
1049
  msgstr ""
1050
 
1051
- #: classes/Views/AuditLog.php:835
1052
- msgid "Log file does not exist."
1053
  msgstr ""
1054
 
1055
- #: classes/Views/AuditLog.php:868
1056
- msgid "Request to get log file failed."
1057
  msgstr ""
1058
 
1059
- #: classes/Views/AuditLog.php:943
1060
- msgid "Freemius opt choice selected."
1061
  msgstr ""
1062
 
1063
- #: classes/Views/AuditLog.php:950
1064
- msgid "Freemius opt choice not found."
1065
  msgstr ""
1066
 
1067
- #: classes/Views/AuditLog.php:1038
1068
- #, php-format
1069
- msgid ""
1070
- "<br>An error occurred when trying to install and activate the plugin. Please "
1071
- "try install it again from the %1$sevent settings%2$s page."
1072
  msgstr ""
1073
 
1074
- #: classes/Views/AuditLog.php:1137
1075
- msgid "WordPress Activity Log"
1076
  msgstr ""
1077
 
1078
- #: classes/Views/AuditLog.php:1138
1079
- msgid ""
1080
- "When a user makes a change on your website the plugin will keep a record of "
1081
- "that event here. Right now there is nothing because this is a new install."
1082
  msgstr ""
1083
 
1084
- #: classes/Views/AuditLog.php:1139
1085
- msgid "Thank you for using WP Activity Log"
1086
  msgstr ""
1087
 
1088
- #: classes/Views/AuditLog.php:1160
1089
- msgid "Error: You do not have sufficient permissions to exclude this URL."
1090
  msgstr ""
1091
 
1092
- #: classes/Views/AuditLog.php:1206
1093
- msgid "You do not have sufficient permissions to dismiss this notice."
1094
  msgstr ""
1095
 
1096
- #: classes/Views/AuditLog.php:1276
1097
- msgid "Access Denied"
1098
  msgstr ""
1099
 
1100
- #: classes/Views/EmailNotifications.php:28
1101
- msgid "Notifications Extension"
1102
  msgstr ""
1103
 
1104
- #: classes/Views/EmailNotifications.php:42
1105
- msgid "Notifications &#8682;"
1106
  msgstr ""
1107
 
1108
- #: classes/Views/EmailNotifications.php:114
1109
- msgid "SMS & Email Notifications"
1110
  msgstr ""
1111
 
1112
- #: classes/Views/EmailNotifications.php:115
1113
- msgid ""
1114
- "Get instantly alerted of important changes on your site via SMS and email "
1115
- "notifications. Upgrade to premium and:"
1116
  msgstr ""
1117
 
1118
- #: classes/Views/EmailNotifications.php:118
1119
- msgid "Configure any type of SMS & email notifications"
1120
  msgstr ""
1121
 
1122
- #: classes/Views/EmailNotifications.php:119
1123
- msgid ""
1124
- "Receive notifications for when users login, change their password or change "
1125
- "content"
1126
  msgstr ""
1127
 
1128
- #: classes/Views/EmailNotifications.php:120
1129
- msgid "Get alerted of site changes like plugin installs, theme changes etc"
1130
  msgstr ""
1131
 
1132
- #: classes/Views/EmailNotifications.php:121
1133
- msgid ""
1134
- "Enable built-in security email notifications of suspicious user activity"
1135
  msgstr ""
1136
 
1137
- #: classes/Views/EmailNotifications.php:122
1138
- msgid "Personalize all email and SMS templates"
1139
  msgstr ""
1140
 
1141
- #: classes/Views/EmailNotifications.php:123
1142
- msgid "Use the trigger builder to configure any type of notification criteria!"
1143
  msgstr ""
1144
 
1145
- #: classes/Views/EmailNotifications.php:125
1146
- msgid ""
1147
- "Getting started is really easy. You can use one of the plugin’s built-in "
1148
- "notifications or create your own using the easy to use trigger builder."
1149
  msgstr ""
1150
 
1151
- #: classes/Views/EmailNotifications.php:128
1152
- msgid ""
1153
- "Email and SMS notifications instantly alert you of important changes on your "
1154
- "WordPress site."
1155
  msgstr ""
1156
 
1157
- #: classes/Views/EmailNotifications.php:132
1158
- msgid ""
1159
- "Easily enable any of the built-in security and user management notifications."
1160
  msgstr ""
1161
 
1162
- #: classes/Views/EmailNotifications.php:136
1163
- msgid ""
1164
- "Use the trigger builder to configure any type of email and SMS notification "
1165
- "to get instantly alerted of site changes that are important to you and your "
1166
- "business."
1167
  msgstr ""
1168
 
1169
- #: classes/Views/EmailNotifications.php:140
1170
- msgid ""
1171
- "All email and SMS templates are configurable, allowing you to personalize "
1172
- "them."
1173
  msgstr ""
1174
 
1175
- #: classes/Views/ExternalDB.php:28
1176
- msgid "External DB Extension"
1177
  msgstr ""
1178
 
1179
- #: classes/Views/ExternalDB.php:42
1180
- msgid "DB & Integrations &#8682;"
1181
  msgstr ""
1182
 
1183
- #: classes/Views/ExternalDB.php:114
1184
- msgid "Activity log database & integration tools"
1185
  msgstr ""
1186
 
1187
- #: classes/Views/ExternalDB.php:115
1188
- msgid ""
1189
- "There are several benefits to segregating the logs from the main site "
1190
- "database, and to be able to mirror the logs to third party and centralized "
1191
- "business solutions. Upgrade to premium and:"
1192
  msgstr ""
1193
 
1194
- #: classes/Views/ExternalDB.php:118
1195
- msgid "Store the audit logs of your sites on an external database"
1196
  msgstr ""
1197
 
1198
- #: classes/Views/ExternalDB.php:119
1199
- msgid "Configuring archiving and store older log data in a segregated database"
1200
  msgstr ""
1201
 
1202
- #: classes/Views/ExternalDB.php:120
1203
- msgid ""
1204
- "Mirror the logs to syslog, Slack, Papertrail and central business "
1205
- "communication services"
1206
  msgstr ""
1207
 
1208
- #: classes/Views/ExternalDB.php:121
1209
- msgid ""
1210
- "Configure filters to filter what is mirrored and archived in the databases "
1211
- "and services"
1212
  msgstr ""
1213
 
1214
- #: classes/Views/ExternalDB.php:126
1215
- msgid ""
1216
- "Easily configure integration and database connections thanks to a user "
1217
- "friendly wizard."
1218
  msgstr ""
1219
 
1220
- #: classes/Views/ExternalDB.php:130
1221
- msgid "Configure activity log filters for third party services connections."
1222
  msgstr ""
1223
 
1224
- #: classes/Views/ExternalDB.php:134
1225
- msgid ""
1226
- "Configure an unlimited number of connections to different databases and "
1227
- "third party services."
1228
  msgstr ""
1229
 
1230
- #: classes/Views/Help.php:62 classes/Views/Help.php:104
1231
- #: classes/Views/Help.php:118
1232
- msgid "Help"
1233
  msgstr ""
1234
 
1235
- #: classes/Views/Help.php:68 classes/Views/Help.php:232
1236
- msgid "System Info"
1237
  msgstr ""
1238
 
1239
- #: classes/Views/Help.php:177
1240
- msgid "Getting Started"
1241
  msgstr ""
1242
 
1243
- #: classes/Views/Help.php:178
1244
- msgid ""
1245
- "Getting started with WP Activity Log is really easy; once the plugin is "
1246
- "installed it will automatically keep a log of everything that is happening "
1247
- "on your website and you do not need to do anything. Watch the video below "
1248
- "for a quick overview of the plugin."
1249
  msgstr ""
1250
 
1251
- #: classes/Views/Help.php:182
1252
- msgid "Plugin Support"
1253
  msgstr ""
1254
 
1255
- #: classes/Views/Help.php:184
1256
- msgid ""
1257
- "Have you encountered or noticed any issues while using WP Activity Log "
1258
- "plugin?"
1259
  msgstr ""
1260
 
1261
- #: classes/Views/Help.php:185
1262
- msgid ""
1263
- "Or you want to report something to us? Click any of the options below to "
1264
- "post on the plugin's forum or contact our support directly."
1265
  msgstr ""
1266
 
1267
- #: classes/Views/Help.php:187
1268
- msgid "Free Support Forum"
1269
  msgstr ""
1270
 
1271
- #: classes/Views/Help.php:189
1272
- msgid "Free Support Email"
1273
  msgstr ""
1274
 
1275
- #: classes/Views/Help.php:193
1276
- msgid "Plugin Documentation"
1277
  msgstr ""
1278
 
1279
- #: classes/Views/Help.php:195
1280
- msgid ""
1281
- "For more technical information about the WP Activity Log plugin please visit "
1282
- "the plugin’s knowledge base."
1283
  msgstr ""
1284
 
1285
- #: classes/Views/Help.php:196
1286
- msgid ""
1287
- "Refer to the list of WordPress security events for a complete list of Events "
1288
- "and IDs that the plugin uses to keep a log of all the changes in the "
1289
- "WordPress activity log."
1290
  msgstr ""
1291
 
1292
- #: classes/Views/Help.php:198
1293
- msgid "Plugin Website"
1294
  msgstr ""
1295
 
1296
- #: classes/Views/Help.php:200
1297
- msgid "Knowledge Base"
1298
  msgstr ""
1299
 
1300
- #: classes/Views/Help.php:202
1301
- msgid "List of activity logs event IDs"
1302
  msgstr ""
1303
 
1304
- #: classes/Views/Help.php:206
1305
- msgid "Rate WP Activity Log"
1306
  msgstr ""
1307
 
1308
- #: classes/Views/Help.php:208
1309
- msgid ""
1310
- "We work really hard to deliver a plugin that enables you to keep a record of "
1311
- "all the changes that are happening on your WordPress."
1312
  msgstr ""
1313
 
1314
- #: classes/Views/Help.php:209
1315
- msgid ""
1316
- "It takes thousands of man-hours every year and endless amount of dedication "
1317
- "to research, develop and maintain the free edition of WP Activity Log."
1318
  msgstr ""
1319
 
1320
- #: classes/Views/Help.php:210
1321
- msgid ""
1322
- "Therefore if you like what you see, and find WP Activity Log useful we ask "
1323
- "you nothing more than to please rate our plugin."
1324
  msgstr ""
1325
 
1326
- #: classes/Views/Help.php:211
1327
- msgid "We appreciate every star!"
1328
  msgstr ""
1329
 
1330
- #: classes/Views/Help.php:221
1331
- msgid "Rate Plugin"
1332
  msgstr ""
1333
 
1334
- #: classes/Views/Help.php:250
1335
- msgid "Enforce strong password policies on WordPress"
1336
  msgstr ""
1337
 
1338
- #: classes/Views/Help.php:256
1339
- msgid "Automatically identify unauthorized file changes on WordPress"
1340
  msgstr ""
1341
 
1342
- #: classes/Views/Help.php:262
1343
- msgid ""
1344
- "Add an extra layer of security to your login pages with 2FA & require your "
1345
- "users to use it."
1346
  msgstr ""
1347
 
1348
- #: classes/Views/Help.php:268
1349
- msgid "See the child sites activity logs from the central MainWP dashboard"
1350
  msgstr ""
1351
 
1352
- #: classes/Views/Help.php:274
1353
- msgid "Our other WordPress plugins"
1354
  msgstr ""
1355
 
1356
- #: classes/Views/Help.php:285
1357
- msgid "LEARN MORE"
1358
  msgstr ""
1359
 
1360
- #: classes/Views/LogInUsers.php:28
1361
- msgid "User Sessions Management Extension"
1362
  msgstr ""
1363
 
1364
- #: classes/Views/LogInUsers.php:42
1365
- msgid "Logged In Users &#8682;"
1366
  msgstr ""
1367
 
1368
- #: classes/Views/LogInUsers.php:114
1369
- msgid "Real-Time Users Sessions Management"
1370
  msgstr ""
1371
 
1372
- #: classes/Views/LogInUsers.php:115
1373
- msgid "Better manage your users’ logins and sessions. Upgrade to premium and:"
1374
  msgstr ""
1375
 
1376
- #: classes/Views/LogInUsers.php:119
1377
- msgid "See who is logged in to your site"
1378
  msgstr ""
1379
 
1380
- #: classes/Views/LogInUsers.php:120
1381
- msgid "When they logged in and from where"
1382
  msgstr ""
1383
 
1384
- #: classes/Views/LogInUsers.php:121
1385
- msgid "The last change they have done in real-time"
1386
  msgstr ""
1387
 
1388
- #: classes/Views/LogInUsers.php:122
1389
- msgid "Terminate any users’ session with a click of a button"
1390
  msgstr ""
1391
 
1392
- #: classes/Views/LogInUsers.php:123
1393
- msgid "Limit or block multiple sessions for the same user"
1394
  msgstr ""
1395
 
1396
- #: classes/Views/LogInUsers.php:124
1397
- msgid "Get alerted of multiple same user sessions"
1398
  msgstr ""
1399
 
1400
- #: classes/Views/LogInUsers.php:128
1401
- msgid ""
1402
- "See who is logged in to your WordPress site and multisite network in real-"
1403
- "time."
1404
  msgstr ""
1405
 
1406
- #: classes/Views/LogInUsers.php:132
1407
- msgid "Limit, manage and block multiple same user sessions easily."
1408
  msgstr ""
1409
 
1410
- #: classes/Views/Reports.php:28
1411
- msgid "Reports Extension"
1412
  msgstr ""
1413
 
1414
- #: classes/Views/Reports.php:42
1415
- msgid "Reports &#8682;"
1416
  msgstr ""
1417
 
1418
- #: classes/Views/Reports.php:114
1419
- msgid "Individual, Scheduled & Automated Reports"
1420
  msgstr ""
1421
 
1422
- #: classes/Views/Reports.php:115
1423
- msgid ""
1424
- "Many are not fans of reports, however reports are vital in business. With "
1425
- "them you can make informed decisions that allow you to improve user "
1426
- "productivity and the business. Upgrade to Premium so you can:"
1427
  msgstr ""
1428
 
1429
- #: classes/Views/Reports.php:118
1430
- msgid "Generate any type of user and site (in multisite) activity report"
1431
  msgstr ""
1432
 
1433
- #: classes/Views/Reports.php:119
1434
- msgid "Automate and schedule daily, weekly, monthly and quarterly reports"
1435
  msgstr ""
1436
 
1437
- #: classes/Views/Reports.php:120
1438
- msgid "Received reports automatically via email"
1439
  msgstr ""
1440
 
1441
- #: classes/Views/Reports.php:121
1442
- msgid ""
1443
- "Create statistics reports about users’ views, logins, activity from IP "
1444
- "addresses & more"
1445
  msgstr ""
1446
 
1447
- #: classes/Views/Reports.php:123
1448
- msgid ""
1449
- "Reports are vital to the success of your business and management of your "
1450
- "site."
1451
  msgstr ""
1452
 
1453
- #: classes/Views/Reports.php:126
1454
- msgid "Generate a HTML or CSV report."
1455
  msgstr ""
1456
 
1457
- #: classes/Views/Reports.php:130
1458
- msgid "Easily configure a criteria for your reports."
1459
  msgstr ""
1460
 
1461
- #: classes/Views/Reports.php:134
1462
- msgid "Schedule reports that are sent to you by email automatically."
1463
  msgstr ""
1464
 
1465
- #: classes/Views/Search.php:28
1466
- msgid "Search Extension"
1467
  msgstr ""
1468
 
1469
- #: classes/Views/Search.php:42
1470
- msgid "Search &#8682;"
1471
  msgstr ""
1472
 
1473
- #: classes/Views/Search.php:114
1474
- msgid "Search & Filters for the Activity Log"
1475
  msgstr ""
1476
 
1477
- #: classes/Views/Search.php:115
1478
- msgid ""
1479
- "You can find all the information you want in the activity log, if you know "
1480
- "what you are looking for and have the right tools. Upgrade to premium so you "
1481
- "can:"
1482
  msgstr ""
1483
 
1484
- #: classes/Views/Search.php:118
1485
- msgid "Do text searches and use filters to fine tune the search results"
1486
  msgstr ""
1487
 
1488
- #: classes/Views/Search.php:119
1489
- msgid "Easily find when and who did a specific change on your site"
1490
  msgstr ""
1491
 
1492
- #: classes/Views/Search.php:120
1493
- msgid "Easily identify and track back suspicious user behaviour"
1494
  msgstr ""
1495
 
1496
- #: classes/Views/Search.php:121
1497
- msgid "Search for the cause of a problem and ease troubleshooting"
1498
  msgstr ""
1499
 
1500
- #: classes/Views/Search.php:122
1501
- msgid "Save search terms and filters for future use and improved productivity"
1502
  msgstr ""
1503
 
1504
- #: classes/Views/Search.php:127
1505
- msgid "Use the text search to find a specific change."
1506
  msgstr ""
1507
 
1508
- #: classes/Views/Search.php:131
1509
- msgid ""
1510
- "Configure any filter you need to fine tune the search results and find what "
1511
- "you are looking for with much less effort."
1512
  msgstr ""
1513
 
1514
- #: classes/Views/Search.php:135
1515
- msgid ""
1516
- "Save search terms and filters to run the searches again in the future with "
1517
- "just a single click."
1518
  msgstr ""
1519
 
1520
- #: classes/Views/Settings.php:85
1521
- msgid "General"
1522
  msgstr ""
1523
 
1524
- #: classes/Views/Settings.php:99 classes/Views/ToggleAlerts.php:434
1525
- #: defaults.php:468
1526
- msgid "File Changes"
1527
  msgstr ""
1528
 
1529
- #: classes/Views/Settings.php:105
1530
- msgid "Exclude Objects"
1531
  msgstr ""
1532
 
1533
- #: classes/Views/Settings.php:112
1534
- msgid "Advanced Settings"
1535
  msgstr ""
1536
 
1537
- #: classes/Views/Settings.php:160 classes/Views/Settings.php:174
1538
- #: extensions/email-notifications/classes/SMSProviderSettings.php:143
1539
- #: extensions/user-sessions/classes/View/Settings.php:21
1540
- msgid "Settings"
1541
  msgstr ""
1542
 
1543
- #: classes/Views/Settings.php:201
1544
- msgid "Current user is not allowed to save settings."
1545
  msgstr ""
1546
 
1547
- #: classes/Views/Settings.php:207
1548
- msgid "Unknown settings tab."
1549
  msgstr ""
1550
 
1551
- #: classes/Views/Settings.php:244 classes/Views/SetupWizard.php:106
1552
- msgid "Invalid input."
1553
  msgstr ""
1554
 
1555
- #: classes/Views/Settings.php:337
1556
- msgid "Message sent successfully."
1557
  msgstr ""
1558
 
1559
- #: classes/Views/Settings.php:341 classes/Views/ToggleAlerts.php:149
1560
- #: extensions/external-db/classes/Settings.php:431
1561
- msgid "Settings have been saved."
1562
  msgstr ""
1563
 
1564
- #: classes/Views/Settings.php:347 classes/Views/ToggleAlerts.php:155
1565
- #: extensions/external-db/classes/Settings.php:436
1566
- #: extensions/user-sessions/classes/View/Sessions.php:164
1567
- msgid "Error: "
1568
  msgstr ""
1569
 
1570
- #: classes/Views/Settings.php:359
1571
- msgid "Old data successfully purged."
1572
  msgstr ""
1573
 
1574
- #: classes/Views/Settings.php:365
1575
- msgid "No data is old enough to be purged."
1576
  msgstr ""
1577
 
1578
- #: classes/Views/Settings.php:396
1579
- msgid "Send Message"
1580
  msgstr ""
1581
 
1582
- #: classes/Views/Settings.php:447
1583
- msgid ""
1584
- "Need help with setting up the plugin to meet your requirements? <a href="
1585
- "\"https://wpactivitylog.com/contact/?"
1586
- "utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=settings"
1587
- "+pages\" target=\"_blank\">Schedule a 20 minutes consultation and setup "
1588
- "call</a> with our experts for just $50."
1589
  msgstr ""
1590
 
1591
- #: classes/Views/Settings.php:449
1592
- msgid "Use infinite scroll or pagination for the event viewer?"
1593
  msgstr ""
1594
 
1595
- #: classes/Views/Settings.php:454
1596
- #, php-format
1597
- msgid ""
1598
- "When using infinite scroll the event viewer and search results %s load up "
1599
- "much faster and require less resources."
1600
  msgstr ""
1601
 
1602
- #: classes/Views/Settings.php:455
1603
- msgid "(Premium feature)"
1604
  msgstr ""
1605
 
1606
- #: classes/Views/Settings.php:462
1607
- msgid "Select event viewer view type:"
1608
  msgstr ""
1609
 
1610
- #: classes/Views/Settings.php:467
1611
- msgid "Infinite Scroll (Recommended)"
1612
  msgstr ""
1613
 
1614
- #: classes/Views/Settings.php:472
1615
- msgid "Pagination"
1616
  msgstr ""
1617
 
1618
- #: classes/Views/Settings.php:483
1619
- msgid "Do you want the activity log viewer to auto refresh?"
1620
  msgstr ""
1621
 
1622
- #: classes/Views/Settings.php:484
1623
- msgid ""
1624
- "The activity log viewer auto refreshes every 30 seconds when opened so you "
1625
- "can see the latest events as they happen almost in real time."
1626
  msgstr ""
1627
 
1628
- #: classes/Views/Settings.php:488
1629
- msgid "Refresh activity log viewer"
1630
  msgstr ""
1631
 
1632
- #: classes/Views/Settings.php:494
1633
- msgid "Auto refresh"
1634
  msgstr ""
1635
 
1636
- #: classes/Views/Settings.php:499
1637
- msgid "Do not auto refresh"
1638
  msgstr ""
1639
 
1640
- #: classes/Views/Settings.php:509
1641
- msgid "Display latest events widget in Dashboard & Admin bar"
1642
  msgstr ""
1643
 
1644
- #: classes/Views/Settings.php:514
1645
- #, php-format
1646
- msgid ""
1647
- "The events widget displays the latest %d security events in the dashboard "
1648
- "and the admin bar notification displays the latest event."
1649
  msgstr ""
1650
 
1651
- #: classes/Views/Settings.php:522
1652
- msgid "Dashboard Widget"
1653
  msgstr ""
1654
 
1655
- #: classes/Views/Settings.php:543
1656
- msgid "Admin Bar Notification"
1657
  msgstr ""
1658
 
1659
- #: classes/Views/Settings.php:546
1660
- msgid "Admin Bar Notification (Premium)"
1661
  msgstr ""
1662
 
1663
- #: classes/Views/Settings.php:570
1664
- msgid "Admin Bar Notification Updates"
1665
  msgstr ""
1666
 
1667
- #: classes/Views/Settings.php:573
1668
- msgid "Admin Bar Notification Updates (Premium)"
1669
  msgstr ""
1670
 
1671
- #: classes/Views/Settings.php:582
1672
- msgid "Update in near real time"
1673
  msgstr ""
1674
 
1675
- #: classes/Views/Settings.php:587
1676
- msgid "Update only on page refreshes"
1677
  msgstr ""
1678
 
1679
- #: classes/Views/Settings.php:597
1680
- msgid "Add user notification on the WordPress login page"
1681
  msgstr ""
1682
 
1683
- #: classes/Views/Settings.php:598
1684
- msgid ""
1685
- "Many compliance regulations (such as the GDPR) require website "
1686
- "administrators to tell the users of their website that all the changes they "
1687
- "do when logged in are being logged."
1688
  msgstr ""
1689
 
1690
- #: classes/Views/Settings.php:602
1691
- msgid "Login Page Notification"
1692
  msgstr ""
1693
 
1694
- #: classes/Views/Settings.php:627
1695
- msgid ""
1696
- "For security and auditing purposes, a record of all of your logged-in "
1697
- "actions and changes within the WordPress dashboard will be recorded in an "
1698
- "activity log with the <a href=\"https://wpactivitylog.com/?"
1699
- "utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=settings"
1700
- "+pages\" target=\"_blank\">WP Activity Log plugin</a>. The audit log also "
1701
- "includes the IP address where you accessed this site from."
1702
  msgstr ""
1703
 
1704
- #: classes/Views/Settings.php:645
1705
- msgid "<strong>Note: </strong>"
1706
  msgstr ""
1707
 
1708
- #: classes/Views/Settings.php:645
1709
- msgid ""
1710
- "The only HTML code allowed in the login page notification is for links ( < a "
1711
- "href >< /a > )."
1712
  msgstr ""
1713
 
1714
- #: classes/Views/Settings.php:661
1715
- msgid "Is your website running behind a firewall or reverse proxy?"
1716
  msgstr ""
1717
 
1718
- #: classes/Views/Settings.php:666
1719
- #, php-format
1720
- msgid ""
1721
- "If your website is running behind a firewall set this option to yes so the "
1722
- "plugin retrieves the end user’s IP address from the proxy header - %s."
1723
  msgstr ""
1724
 
1725
- #: classes/Views/Settings.php:667 classes/Views/Settings.php:713
1726
- #: classes/Views/Settings.php:769
1727
- msgid "learn more"
1728
  msgstr ""
1729
 
1730
- #: classes/Views/Settings.php:674
1731
- msgid "Reverse Proxy / Firewall Options"
1732
  msgstr ""
1733
 
1734
- #: classes/Views/Settings.php:684
1735
- msgid ""
1736
- "Filter internal IP addresses from the proxy headers. Enable this option only "
1737
- "if you are\tare still seeing the internal IP addresses of the firewall or "
1738
- "proxy."
1739
  msgstr ""
1740
 
1741
- #: classes/Views/Settings.php:700
1742
- msgid "Who can change the plugin settings?"
1743
  msgstr ""
1744
 
1745
- #: classes/Views/Settings.php:712
1746
- #, php-format
1747
- msgid ""
1748
- "By default only users with administrator role (single site) and super "
1749
- "administrator role (multisite) can change the settings of the plugin. Though "
1750
- "you can restrict the privileges to just your user - %s."
1751
  msgstr ""
1752
 
1753
- #: classes/Views/Settings.php:723
1754
- msgid "Restrict plugin access"
1755
- msgstr ""
1756
-
1757
- #: classes/Views/Settings.php:728 classes/Views/Settings.php:784
1758
- msgid "Only me"
1759
  msgstr ""
1760
 
1761
- #: classes/Views/Settings.php:735
1762
- msgid "All superadmins"
1763
  msgstr ""
1764
 
1765
- #: classes/Views/Settings.php:737
1766
- msgid "All administrators"
1767
  msgstr ""
1768
 
1769
- #: classes/Views/Settings.php:751
1770
- msgid "Allow other users to view the activity log"
1771
  msgstr ""
1772
 
1773
- #: classes/Views/Settings.php:763
1774
- msgid ""
1775
- "By default only super administrators and the child sites' administrators can "
1776
- "view the WordPress activity log. Though you can change this by using the "
1777
- "setting below."
1778
  msgstr ""
1779
 
1780
- #: classes/Views/Settings.php:765
1781
- msgid ""
1782
- "By default only users with administrator role can view the WordPress "
1783
- "activity log. To allow someone who does not have an admin role to view the "
1784
- "activity log, specify them in the below setting."
1785
  msgstr ""
1786
 
1787
- #: classes/Views/Settings.php:778 classes/Views/Settings.php:808
1788
- msgid "Can view events"
1789
  msgstr ""
1790
 
1791
- #: classes/Views/Settings.php:785
1792
- msgid "Super administators only"
1793
  msgstr ""
1794
 
1795
- #: classes/Views/Settings.php:786
1796
- msgid "Super administators and site administrators"
1797
  msgstr ""
1798
 
1799
- #: classes/Views/Settings.php:802
1800
- msgid ""
1801
- "To allow someone who does not have an admin role to view the activity log, "
1802
- "specify them in the below setting."
1803
  msgstr ""
1804
 
1805
- #: classes/Views/Settings.php:808
1806
- msgid "Can also view events"
1807
  msgstr ""
1808
 
1809
- #: classes/Views/Settings.php:817
1810
- msgid ""
1811
- "Specify the username or the users which do not have an admin role but can "
1812
- "also see the WordPress activity role. You can also specify roles."
1813
  msgstr ""
1814
 
1815
- #: classes/Views/Settings.php:843
1816
- msgid "Which email address should the plugin use as a from address?"
1817
  msgstr ""
1818
 
1819
- #: classes/Views/Settings.php:844
1820
- msgid ""
1821
- "By default when the plugin sends an email notification it uses the email "
1822
- "address specified in this website’s general settings. Though you can change "
1823
- "the email address and display name from this section."
1824
  msgstr ""
1825
 
1826
- #: classes/Views/Settings.php:848
1827
- msgid "From Email & Name"
1828
  msgstr ""
1829
 
1830
- #: classes/Views/Settings.php:854
1831
- msgid "Use the email address from the WordPress general settings"
1832
  msgstr ""
1833
 
1834
- #: classes/Views/Settings.php:859
1835
- msgid "Use another email address"
1836
  msgstr ""
1837
 
1838
- #: classes/Views/Settings.php:863
1839
- msgid "Email Address"
1840
  msgstr ""
1841
 
1842
- #: classes/Views/Settings.php:868
1843
- msgid "Display Name"
1844
  msgstr ""
1845
 
1846
- #: classes/Views/Settings.php:879
1847
- msgid "Do you want to hide the plugin from the list of installed plugins?"
1848
  msgstr ""
1849
 
1850
- #: classes/Views/Settings.php:880
1851
- msgid ""
1852
- "By default all installed plugins are listed in the plugins page. If you do "
1853
- "not want other administrators to see that you installed this plugin set this "
1854
- "option to Yes so the WP Activity Log is not listed as an installed plugin on "
1855
- "this website."
1856
  msgstr ""
1857
 
1858
- #: classes/Views/Settings.php:884
1859
- msgid "Hide Plugin in Plugins Page"
1860
  msgstr ""
1861
 
1862
- #: classes/Views/Settings.php:889
1863
- msgid "Yes, hide the plugin from the list of installed plugins"
1864
  msgstr ""
1865
 
1866
- #: classes/Views/Settings.php:894
1867
- msgid "No, do not hide the plugin"
1868
  msgstr ""
1869
 
1870
- #: classes/Views/Settings.php:960
1871
- msgid ""
1872
- "For how long do you want to keep the activity log events (Retention "
1873
- "settings) ?"
1874
  msgstr ""
1875
 
1876
- #: classes/Views/Settings.php:963
1877
- msgid ""
1878
- "The plugin uses an efficient way to store the activity log data in the "
1879
- "WordPress database, though the more data you keep the more disk space will "
1880
- "be required. "
1881
  msgstr ""
1882
 
1883
- #: classes/Views/Settings.php:964
1884
- msgid ""
1885
- "<a href=\"https://wpactivitylog.com/pricing/?"
1886
- "utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=settings"
1887
- "+pages\" target=\"_blank\">Upgrade to Premium</a> to store the activity log "
1888
- "data in an external database."
1889
  msgstr ""
1890
 
1891
- #: classes/Views/Settings.php:984
1892
- #, php-format
1893
- msgid ""
1894
- "Retention settings moved to %1$s archiving settings %2$s because archiving "
1895
- "is enabled"
1896
  msgstr ""
1897
 
1898
- #: classes/Views/Settings.php:991
1899
- msgid "Activity log retention"
1900
  msgstr ""
1901
 
1902
- #: classes/Views/Settings.php:997
1903
- msgid "Keep all data"
1904
  msgstr ""
1905
 
1906
- #: classes/Views/Settings.php:1024
1907
- #: extensions/external-db/classes/Settings.php:753
1908
- msgid "Delete events older than"
1909
  msgstr ""
1910
 
1911
- #: classes/Views/Settings.php:1031
1912
- #: extensions/external-db/classes/Settings.php:759
1913
- msgid "Months"
1914
  msgstr ""
1915
 
1916
- #: classes/Views/Settings.php:1032
1917
- #: extensions/external-db/classes/Settings.php:760
1918
- msgid "Years"
1919
  msgstr ""
1920
 
1921
- #: classes/Views/Settings.php:1040
1922
- msgid "The next scheduled purging of activity log data that is older than "
1923
  msgstr ""
1924
 
1925
- #: classes/Views/Settings.php:1047
1926
- msgid "You can run the purging process now by clicking the button below."
1927
  msgstr ""
1928
 
1929
- #: classes/Views/Settings.php:1051
1930
- msgid "Purge Old Data"
1931
  msgstr ""
1932
 
1933
- #: classes/Views/Settings.php:1062
1934
- msgid "What timestamp you would like to see in the WordPress activity log?"
1935
  msgstr ""
1936
 
1937
- #: classes/Views/Settings.php:1063
1938
- msgid ""
1939
- "Note that the WordPress' timezone might be different from that configured on "
1940
- "the server so when you switch from UTC to WordPress timezone or vice versa "
1941
- "you might notice a big difference."
1942
  msgstr ""
1943
 
1944
- #: classes/Views/Settings.php:1067
1945
- msgid "Events Timestamp"
1946
  msgstr ""
1947
 
1948
- #: classes/Views/Settings.php:1087
1949
- msgid "UTC"
1950
  msgstr ""
1951
 
1952
- #: classes/Views/Settings.php:1093
1953
- msgid "Timezone configured on this WordPress website"
1954
  msgstr ""
1955
 
1956
- #: classes/Views/Settings.php:1100
1957
- msgid "Show Milliseconds"
1958
  msgstr ""
1959
 
1960
- #: classes/Views/Settings.php:1107
1961
- msgid "Show Milliseconds in list view"
1962
  msgstr ""
1963
 
1964
- #: classes/Views/Settings.php:1117
1965
- msgid ""
1966
- "What user information should be displayed in the WordPress activity log?"
1967
  msgstr ""
1968
 
1969
- #: classes/Views/Settings.php:1118
1970
- msgid ""
1971
- "Usernames might not be the same as a user's first and last name so it can be "
1972
- "difficult to recognize whose user was that did a change. When there is no "
1973
- "first & last name or public display name configured the plugin will revert "
1974
- "back to the WordPress username."
1975
  msgstr ""
1976
 
1977
- #: classes/Views/Settings.php:1122
1978
- msgid "User information in Activity log"
1979
  msgstr ""
1980
 
1981
- #: classes/Views/Settings.php:1128
1982
- msgid "WordPress username"
1983
  msgstr ""
1984
 
1985
- #: classes/Views/Settings.php:1133
1986
- msgid "First name & last name"
1987
  msgstr ""
1988
 
1989
- #: classes/Views/Settings.php:1138
1990
- msgid "Configured public display name"
1991
  msgstr ""
1992
 
1993
- #: classes/Views/Settings.php:1148
1994
- msgid "Select the columns to be displayed in the WordPress activity log"
1995
  msgstr ""
1996
 
1997
- #: classes/Views/Settings.php:1149
1998
- msgid ""
1999
- "When you deselect a column it won’t be shown in the activity log viewer in "
2000
- "both views. The data will still be recorded by the plugin."
2001
  msgstr ""
2002
 
2003
- #: classes/Views/Settings.php:1153
2004
- msgid "Activity log columns selection"
2005
  msgstr ""
2006
 
2007
- #: classes/Views/Settings.php:1162
2008
- #: extensions/email-notifications/classes/Common.php:1171
2009
- #: extensions/email-notifications/classes/Common.php:1205
2010
- #: extensions/email-notifications/classes/Common.php:1232
2011
- #: extensions/search/classes/Filters/AlertFilter.php:26
2012
- #: extensions/search/classes/Filters/AlertFilter.php:51
2013
- msgid "Event ID"
2014
  msgstr ""
2015
 
2016
- #: classes/Views/Settings.php:1166
2017
- msgid "Date & Time"
2018
  msgstr ""
2019
 
2020
- #: classes/Views/Settings.php:1170
2021
- msgid "Source IP Address"
2022
  msgstr ""
2023
 
2024
- #: classes/Views/Settings.php:1172
2025
- msgid "Info (used in Grid view mode only)"
2026
  msgstr ""
2027
 
2028
- #: classes/Views/Settings.php:1188
2029
- msgid "Do you want to keep a log of WordPress background activity?"
2030
  msgstr ""
2031
 
2032
- #: classes/Views/Settings.php:1190
2033
- msgid ""
2034
- "WordPress does a lot of things in the background that you do not necessarily "
2035
- "need to know about, such as; deletion of post revisions, deletion of auto "
2036
- "saved drafts etc. By default the plugin does not report them since there "
2037
- "might be a lot and are irrelevant to the user."
2038
  msgstr ""
2039
 
2040
- #: classes/Views/Settings.php:1195
2041
- msgid "Enable Events for WordPress Background Activity"
2042
  msgstr ""
2043
 
2044
- #: classes/Views/Settings.php:1254 classes/Views/ToggleAlerts.php:555
2045
- msgid "Website File Changes Monitor"
2046
  msgstr ""
2047
 
2048
- #: classes/Views/Settings.php:1255 classes/Views/ToggleAlerts.php:556
2049
- msgid ""
2050
- "To keep a log of file changes please install Website File Changes Monitor, a "
2051
- "plugin which is also developed by us."
2052
  msgstr ""
2053
 
2054
- #: classes/Views/Settings.php:1256 classes/Views/ToggleAlerts.php:557
2055
- msgid "Install plugin now"
 
 
2056
  msgstr ""
2057
 
2058
- #: classes/Views/Settings.php:1256 classes/Views/ToggleAlerts.php:557
2059
- msgid "Learn More"
2060
  msgstr ""
2061
 
2062
- #: classes/Views/Settings.php:1270
2063
- msgid "Configure how often file changes scan run and other settings from the"
2064
  msgstr ""
2065
 
2066
- #: classes/Views/Settings.php:1270
2067
- msgid "Website File Changes plugin settings"
2068
  msgstr ""
2069
 
2070
- #: classes/Views/Settings.php:1285
2071
- msgid ""
2072
- "By default the plugin keeps a log of all user changes done on your WordPress "
2073
- "website. Use the setting below to exclude any objects from the activity log. "
2074
- "When an object is excluded from the activity log, any event in which that "
2075
- "object is referred will not be logged in the activity log."
2076
  msgstr ""
2077
 
2078
- #: classes/Views/Settings.php:1289
2079
- msgid "Exclude Users:"
 
2080
  msgstr ""
2081
 
2082
- #: classes/Views/Settings.php:1310
2083
- msgid "Exclude Roles:"
2084
  msgstr ""
2085
 
2086
- #: classes/Views/Settings.php:1331
2087
- msgid "Exclude IP Address(es):"
2088
  msgstr ""
2089
 
2090
- #: classes/Views/Settings.php:1347
2091
- msgid ""
2092
- "You can exclude an individual IP address or a range of IP addresses. To "
2093
- "exclude a range use the following format: [first IP]-[last octet of the last "
2094
- "IP]. Example: 172.16.180.6-127."
2095
  msgstr ""
2096
 
2097
- #: classes/Views/Settings.php:1353
2098
- msgid "Exclude Post Type:"
2099
  msgstr ""
2100
 
2101
- #: classes/Views/Settings.php:1369
2102
- msgid ""
2103
- "WordPress has the post and page post types by default though your website "
2104
- "might use more post types (custom post types). You can exclude all post "
2105
- "types, including the default WordPress ones."
2106
  msgstr ""
2107
 
2108
- #: classes/Views/Settings.php:1375
2109
- msgid "Exclude Custom Fields:"
2110
  msgstr ""
2111
 
2112
- #: classes/Views/Settings.php:1391
2113
- msgid ""
2114
- "You can use the * wildcard to exclude multiple matching custom fields. For "
2115
- "example to exclude all custom fields starting with wp123 enter wp123*"
2116
  msgstr ""
2117
 
2118
- #: classes/Views/Settings.php:1397
2119
- msgid "Exclude Non-Existing URLs:"
2120
  msgstr ""
2121
 
2122
- #: classes/Views/Settings.php:1413
2123
- msgid ""
2124
- "Add the non existing URLs for which you do not want to be alerted of HTTP "
2125
- "404 errors in the activity log by specifying the complete URL.\tExamples "
2126
- "below:"
2127
  msgstr ""
2128
 
2129
- #: classes/Views/Settings.php:1413
2130
- msgid "File: "
2131
  msgstr ""
2132
 
2133
- #: classes/Views/Settings.php:1413
2134
- msgid "Directory: "
2135
  msgstr ""
2136
 
2137
- #: classes/Views/Settings.php:1445
2138
- msgid "These settings are for advanced users."
2139
  msgstr ""
2140
 
2141
- #: classes/Views/Settings.php:1446
2142
- msgid ""
2143
- "If you have any questions <a href=\"https://wpactivitylog.com/contact/?"
2144
- "utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=settings"
2145
- "+pages\" target=\"_blank\">contact us</a>."
2146
  msgstr ""
2147
 
2148
- #: classes/Views/Settings.php:1449
2149
- msgid ""
2150
- "Where do you want the plugin's working directory for log files, reports and "
2151
- "other files?"
2152
  msgstr ""
2153
 
2154
- #: classes/Views/Settings.php:1450
2155
- msgid ""
2156
- "The plugin stores the reports it generates, a number of log files ( for "
2157
- "example to keep a log of 404 errors), and the request log in this working "
2158
- "directory. By default the directory is in the default WordPress uploads "
2159
- "directory. Use the below setting to create the working directory in a "
2160
- "different location. Note that the plugin requires write permissions to this "
2161
- "directory. Please specify the relative path of the directory."
2162
  msgstr ""
2163
 
2164
- #: classes/Views/Settings.php:1455
2165
- msgid "Working directory location"
2166
  msgstr ""
2167
 
2168
- #: classes/Views/Settings.php:1465
2169
- msgid ""
2170
- "<strong>Note:</strong> Enter a path from the root of your website: eg \"/wp-"
2171
- "content/uploads/wp-activity-log/\"."
2172
  msgstr ""
2173
 
2174
- #: classes/Views/Settings.php:1478
2175
- msgid ""
2176
- "Troubleshooting setting: Keep a debug log of all the requests this website "
2177
- "receives"
2178
  msgstr ""
2179
 
2180
- #: classes/Views/Settings.php:1479
2181
- msgid ""
2182
- "Only enable the request log on testing, staging and development website. "
2183
- "Never enable logging on a live website unless instructed to do so. Enabling "
2184
- "request logging on a live website may degrade the performance of the website."
2185
  msgstr ""
2186
 
2187
- #: classes/Views/Settings.php:1483
2188
- msgid "Request Log"
 
2189
  msgstr ""
2190
 
2191
- #: classes/Views/Settings.php:1501
2192
- msgid ""
2193
- "<strong>Note:</strong> The requests debug log file is saved as request.log."
2194
- "php in the /wp-content/uploads/wp-activity-log/ directory."
2195
  msgstr ""
2196
 
2197
- #: classes/Views/Settings.php:1513
2198
- msgid "Reset plugin settings to default"
 
2199
  msgstr ""
2200
 
2201
- #: classes/Views/Settings.php:1514
2202
- msgid ""
2203
- "Click the RESET button to reset ALL plugin settings to default. Note that "
2204
- "the activity log data will be retained and only the plugin settings will be "
2205
- "reset. To purge the data of the activity log use the setting below."
2206
  msgstr ""
2207
 
2208
- #: classes/Views/Settings.php:1518
2209
- msgid "Reset Settings"
2210
  msgstr ""
2211
 
2212
- #: classes/Views/Settings.php:1520
2213
- msgid "RESET"
2214
  msgstr ""
2215
 
2216
- #: classes/Views/Settings.php:1526
2217
- msgid "Purge the WordPress activity log"
 
2218
  msgstr ""
2219
 
2220
- #: classes/Views/Settings.php:1527
2221
- msgid ""
2222
- "Click the Purge button below to delete all the data from the WordPress "
2223
- "activity log and start afresh."
2224
  msgstr ""
2225
 
2226
- #: classes/Views/Settings.php:1531
2227
- msgid "Purge Activity Log"
2228
  msgstr ""
2229
 
2230
- #: classes/Views/Settings.php:1533
2231
- msgid "PURGE"
2232
  msgstr ""
2233
 
2234
- #: classes/Views/Settings.php:1540
2235
- msgid "MainWP Child Site Stealth Mode"
2236
  msgstr ""
2237
 
2238
- #: classes/Views/Settings.php:1541
2239
- msgid ""
2240
- "This option is enabled automatically when the plugin detects the MainWP "
2241
- "Child plugin on the site. When this setting is enabled plugin access is "
2242
- "restricted to the administrator who installs the plugin, the plugin is not "
2243
- "shown in the list of installed plugins and no admin notifications are shown. "
2244
- "Disable this option to change the plugin to the default setup."
2245
  msgstr ""
2246
 
2247
- #: classes/Views/Settings.php:1545
2248
- msgid "Enable MainWP Child Site Stealth Mode"
2249
  msgstr ""
2250
 
2251
- #: classes/Views/Settings.php:1565
2252
- msgid "Admin blocking plugins support"
2253
  msgstr ""
2254
 
2255
- #: classes/Views/Settings.php:1570
2256
- msgid "Enable early plugin loading on sites that use admin blocking plugins"
2257
  msgstr ""
2258
 
2259
- #: classes/Views/Settings.php:1579
2260
- msgid "Do you want to delete the plugin data from the database upon uninstall?"
 
2261
  msgstr ""
2262
 
2263
- #: classes/Views/Settings.php:1580
2264
- msgid ""
2265
- "The plugin saves the activity log data and settings in the WordPress "
2266
- "database. By default upon uninstalling the plugin the data is kept in the "
2267
- "database so if it is installed again, you can still access the data. If the "
2268
- "data is deleted it is not possible to recover it so you won't be able to "
2269
- "access it again even when you reinstall the plugin."
2270
  msgstr ""
2271
 
2272
- #: classes/Views/Settings.php:1584
2273
- msgid "Remove Data on Uninstall"
 
2274
  msgstr ""
2275
 
2276
- #: classes/Views/Settings.php:1609
2277
- msgid "Are you sure you want to reset all the plugin settings to default?"
2278
  msgstr ""
2279
 
2280
- #: classes/Views/Settings.php:1619
2281
- msgid "Are you sure you want to purge all the activity log data?"
 
2282
  msgstr ""
2283
 
2284
- #: classes/Views/Settings.php:1650
2285
- msgid "MainWP Child plugin is not active on this website."
2286
  msgstr ""
2287
 
2288
- #: classes/Views/Settings.php:1683
2289
- msgid ""
2290
- "The plugin cannot create the directory for the log files. Please check "
2291
- "permissions and configure it again."
2292
  msgstr ""
2293
 
2294
- #: classes/Views/Settings.php:1759
2295
- msgid "The specified value is not a valid URL!"
2296
  msgstr ""
2297
 
2298
- #: classes/Views/Settings.php:1760
2299
- msgid "The specified value is not a valid post type!"
2300
  msgstr ""
2301
 
2302
- #: classes/Views/Settings.php:1761
2303
- msgid "The specified value is not a valid IP address!"
2304
  msgstr ""
2305
 
2306
- #: classes/Views/Settings.php:1762
2307
- msgid "The specified value is not a user nor a role!"
2308
  msgstr ""
2309
 
2310
- #: classes/Views/Settings.php:1763
2311
- msgid "Filename cannot be added because it contains invalid characters."
2312
  msgstr ""
2313
 
2314
- #: classes/Views/Settings.php:1764
2315
- msgid "File extension cannot be added because it contains invalid characters."
2316
  msgstr ""
2317
 
2318
- #: classes/Views/Settings.php:1765
2319
- msgid "Directory cannot be added because it contains invalid characters."
2320
  msgstr ""
2321
 
2322
- #: classes/Views/Settings.php:1901 classes/Views/Settings.php:1928
2323
- msgid "Tables has been reset."
2324
  msgstr ""
2325
 
2326
- #: classes/Views/Settings.php:1903 classes/Views/Settings.php:1930
2327
- msgid "Reset query failed."
2328
  msgstr ""
2329
 
2330
- #: classes/Views/Settings.php:1906 classes/Views/Settings.php:1933
2331
- msgid "Nonce Verification Failed."
2332
  msgstr ""
2333
 
2334
- #: classes/Views/SetupWizard.php:178
2335
- msgid "Welcome"
2336
  msgstr ""
2337
 
2338
- #: classes/Views/SetupWizard.php:182
2339
- msgid "Log Details"
2340
  msgstr ""
2341
 
2342
- #: classes/Views/SetupWizard.php:187
2343
- msgid "Log In"
2344
  msgstr ""
2345
 
2346
- #: classes/Views/SetupWizard.php:192
2347
- msgid "404s"
2348
  msgstr ""
2349
 
2350
- #: classes/Views/SetupWizard.php:197
2351
- msgid "User Registrations"
2352
  msgstr ""
2353
 
2354
- #: classes/Views/SetupWizard.php:202
2355
- msgid "Log Retention"
2356
  msgstr ""
2357
 
2358
- #: classes/Views/SetupWizard.php:207 classes/Views/SetupWizard.php:797
2359
- #: classes/Views/SetupWizard.php:798
2360
- msgid "Finish"
2361
  msgstr ""
2362
 
2363
- #: classes/Views/SetupWizard.php:264
2364
- msgid "Specified value in not a user."
2365
  msgstr ""
2366
 
2367
- #: classes/Views/SetupWizard.php:265
2368
- msgid "Specified value in not a role."
2369
  msgstr ""
2370
 
2371
- #: classes/Views/SetupWizard.php:266
2372
- msgid "Specified value in not an IP address."
2373
  msgstr ""
2374
 
2375
- #: classes/Views/SetupWizard.php:272 wp-security-audit-log.php:1281
2376
- msgid "Installing, please wait"
2377
  msgstr ""
2378
 
2379
- #: classes/Views/SetupWizard.php:273 wp-security-audit-log.php:1282
2380
- msgid "Already installed"
2381
  msgstr ""
2382
 
2383
- #: classes/Views/SetupWizard.php:275 wp-security-audit-log.php:1284
2384
- msgid "Extension activated"
2385
  msgstr ""
2386
 
2387
- #: classes/Views/SetupWizard.php:276 wp-security-audit-log.php:1285
2388
- msgid "Install failed"
2389
  msgstr ""
2390
 
2391
- #: classes/Views/SetupWizard.php:306
2392
- msgid "WP Activity Log &rsaquo; Setup Wizard"
2393
  msgstr ""
2394
 
2395
- #: classes/Views/SetupWizard.php:324
2396
- msgid "Close Wizard"
2397
  msgstr ""
2398
 
2399
- #: classes/Views/SetupWizard.php:417
2400
- #, php-format
2401
- msgid ""
2402
- "You have reached an invaild step - %1$sreturn to the start of the wizard%2$s."
2403
  msgstr ""
2404
 
2405
- #: classes/Views/SetupWizard.php:434
2406
- msgid ""
2407
- "This wizard helps you configure the basic plugin settings. All these "
2408
- "settings can be changed at a later stage from the plugin settings."
2409
  msgstr ""
2410
 
2411
- #: classes/Views/SetupWizard.php:439
2412
- msgid "Start Configuring the Plugin"
2413
  msgstr ""
2414
 
2415
- #: classes/Views/SetupWizard.php:443
2416
- msgid "Exit Wizard"
2417
  msgstr ""
2418
 
2419
- #: classes/Views/SetupWizard.php:456
2420
- msgid "Please select the level of detail for your WordPress activity logs:"
2421
  msgstr ""
2422
 
2423
- #: classes/Views/SetupWizard.php:460
2424
- msgid ""
2425
- "Basic (I want a high level overview and I am not interested in the detail)"
2426
  msgstr ""
2427
 
2428
- #: classes/Views/SetupWizard.php:465
2429
- msgid "Geek (I want to know everything that is happening on my WordPress)"
2430
  msgstr ""
2431
 
2432
- #: classes/Views/SetupWizard.php:467
2433
- msgid ""
2434
- "Note: You can change the WordPress logging level from the plugin’s settings "
2435
- "anytime."
2436
- msgstr ""
2437
-
2438
- #: classes/Views/SetupWizard.php:470 classes/Views/SetupWizard.php:527
2439
- #: classes/Views/SetupWizard.php:575 classes/Views/SetupWizard.php:624
2440
- #: classes/Views/SetupWizard.php:684 classes/Views/SetupWizard.php:685
2441
- #: classes/Views/SetupWizard.php:912 classes/Views/SetupWizard.php:913
2442
- #: extensions/external-db/classes/Connections.php:214
2443
- #: extensions/external-db/classes/Connections.php:565
2444
- #: extensions/external-db/classes/Mirroring.php:286
2445
- #: extensions/external-db/classes/Mirroring.php:601
2446
- msgid "Next"
2447
  msgstr ""
2448
 
2449
- #: classes/Views/SetupWizard.php:511
2450
- msgid ""
2451
- "Do you or your users use other pages to log in to WordPress other than the "
2452
- "default login page ( /wp-admin/ )?"
2453
  msgstr ""
2454
 
2455
- #: classes/Views/SetupWizard.php:515
2456
- msgid "Yes, we use other pages to login to WordPress."
2457
  msgstr ""
2458
 
2459
- #: classes/Views/SetupWizard.php:520
2460
- msgid "No, we only use the default WordPress login page."
2461
  msgstr ""
2462
 
2463
- #: classes/Views/SetupWizard.php:522
2464
- msgid ""
2465
- "If your website is a membership or ecommerce website most probably you have "
2466
- "more than one area from where the users can login. If you are not sure, "
2467
- "select Yes."
2468
  msgstr ""
2469
 
2470
- #: classes/Views/SetupWizard.php:525 classes/Views/SetupWizard.php:573
2471
- #: classes/Views/SetupWizard.php:622 classes/Views/SetupWizard.php:676
2472
- msgid ""
2473
- "Note: You can change the WordPress activity log retention settings at any "
2474
- "time from the plugin settings later on."
2475
  msgstr ""
2476
 
2477
- #: classes/Views/SetupWizard.php:560
2478
- msgid ""
2479
- "Do you want to keep a log of (non-logged in) visitors’ requests to non-"
2480
- "existing URLs which generate a HTTP 404 error response?"
2481
  msgstr ""
2482
 
2483
- #: classes/Views/SetupWizard.php:608
2484
- msgid "Can visitors register for a user on your website?"
2485
  msgstr ""
2486
 
2487
- #: classes/Views/SetupWizard.php:619
2488
- msgid ""
2489
- "If you are not sure about this setting, check if the Membership setting in "
2490
- "the WordPress General settings is checked or not. If it is not checked "
2491
- "(default) select No."
2492
  msgstr ""
2493
 
2494
- #: classes/Views/SetupWizard.php:658
2495
- msgid "How long do you want to keep the data in the WordPress activity Log?"
2496
  msgstr ""
2497
 
2498
- #: classes/Views/SetupWizard.php:663
2499
- msgid "6 months (data older than 6 months will be deleted)"
2500
  msgstr ""
2501
 
2502
- #: classes/Views/SetupWizard.php:668
2503
- msgid "12 months (data older than 12 months will be deleted)"
2504
  msgstr ""
2505
 
2506
- #: classes/Views/SetupWizard.php:673
2507
- msgid "Keep all data."
2508
  msgstr ""
2509
 
2510
- #: classes/Views/SetupWizard.php:694
2511
- msgid ""
2512
- "The plugin stores the data in the WordPress database in a very efficient "
2513
- "way, though the more data you keep the more hard disk space it will consume. "
2514
- "If you need need to retain a lot of data we would recommend you to <a href="
2515
- "\"https://wpactivitylog.com/features/?"
2516
- "utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=wizard"
2517
- "+configuration\" target=\"_blank\">upgrade to Premium</a> and use the "
2518
- "Database tools to store the WordPress activity log in an external database."
2519
  msgstr ""
2520
 
2521
- #: classes/Views/SetupWizard.php:699
2522
- msgid ""
2523
- "The plugin stores the data in the WordPress database in a very efficient "
2524
- "way, though the more data you keep the more hard disk space it will consume. "
2525
- "If you need need to retain a lot of data we would recommend you to store the "
2526
- "WordPress activity log in an external database or enable archiving."
2527
  msgstr ""
2528
 
2529
- #: classes/Views/SetupWizard.php:768
2530
- msgid ""
2531
- "Your plugin is all set and it is ready to start keeping a record of "
2532
- "everything that is happening on your WordPress in a WordPress activity log."
2533
  msgstr ""
2534
 
2535
- #: classes/Views/SetupWizard.php:769
2536
- msgid "Below are a few useful links you might need to refer to:"
2537
  msgstr ""
2538
 
2539
- #: classes/Views/SetupWizard.php:774
2540
- msgid "Getting started with the WP Activity Log plugin"
2541
  msgstr ""
2542
 
2543
- #: classes/Views/SetupWizard.php:779
2544
- msgid "Knowledge Base & Support Documents"
2545
  msgstr ""
2546
 
2547
- #: classes/Views/SetupWizard.php:784
2548
- msgid "Benefits of keeping a WordPress activity log"
2549
  msgstr ""
2550
 
2551
- #: classes/Views/SetupWizard.php:789
2552
- msgid ""
2553
- "We trust this plugin meets all your activity log requirements. Should you "
2554
- "encounter any problems, have feature requests or would like to share some "
2555
- "feedback, <a href=\"https://wpactivitylog.com/contact/?"
2556
- "utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=wizard"
2557
- "+configuration\" target=\"_blank\">please get in touch!</a>"
2558
  msgstr ""
2559
 
2560
- #: classes/Views/SetupWizard.php:825
2561
- msgid "Third Party Extensions"
2562
  msgstr ""
2563
 
2564
- #: classes/Views/SetupWizard.php:866
2565
- msgid "Monitoring changes done in third party plugins"
2566
  msgstr ""
2567
 
2568
- #: classes/Views/SetupWizard.php:867
2569
- msgid ""
2570
- "We noticed that the below plugins are installed on this website. You can "
2571
- "install our extensions to also keep a log of changes users do on these "
2572
- "plugins."
2573
  msgstr ""
2574
 
2575
- #: classes/Views/ToggleAlerts.php:27 classes/Views/ToggleAlerts.php:41
2576
- msgid "Enable/Disable Events"
2577
  msgstr ""
2578
 
2579
- #: classes/Views/ToggleAlerts.php:189
2580
- msgid "Log Level: "
2581
  msgstr ""
2582
 
2583
- #: classes/Views/ToggleAlerts.php:194
2584
- msgid "Basic"
2585
  msgstr ""
2586
 
2587
- #: classes/Views/ToggleAlerts.php:199
2588
- msgid "Geek"
2589
  msgstr ""
2590
 
2591
- #: classes/Views/ToggleAlerts.php:202
2592
- msgid "Custom"
2593
  msgstr ""
2594
 
2595
- #: classes/Views/ToggleAlerts.php:206
2596
- msgid ""
2597
- "Use the Log level drop down menu above to use one of our preset log levels. "
2598
- "Alternatively you can enable or disable any of the individual events from "
2599
- "the below tabs. Refer to <a href=\"https://wpactivitylog.com/support/kb/list-"
2600
- "wordpress-activity-log-event-ids/\" target=\"_blank\">the complete list of "
2601
- "WordPress activity log event IDs</a> for reference on all the events the "
2602
- "plugin can keep a log of."
2603
  msgstr ""
2604
 
2605
- #: classes/Views/ToggleAlerts.php:216
2606
- msgid "Front-end Events"
2607
  msgstr ""
2608
 
2609
- #: classes/Views/ToggleAlerts.php:221
2610
- msgid "Third party plugins"
2611
  msgstr ""
2612
 
2613
- #: classes/Views/ToggleAlerts.php:317
2614
- msgid "Code"
2615
  msgstr ""
2616
 
2617
- #: classes/Views/ToggleAlerts.php:319 classes/WidgetManager.php:77
2618
- msgid "Description"
2619
  msgstr ""
2620
 
2621
- #: classes/Views/ToggleAlerts.php:323 defaults.php:103
2622
- msgid "Content"
2623
  msgstr ""
2624
 
2625
- #: classes/Views/ToggleAlerts.php:326
2626
- msgid ""
2627
- "<strong>Note:</strong> Post refers to any type of content, i.e. blog post, "
2628
- "page or a post with a custom post type."
2629
  msgstr ""
2630
 
2631
- #: classes/Views/ToggleAlerts.php:329 classes/Views/ToggleAlerts.php:337
2632
- msgid "WooCommerce Products"
2633
  msgstr ""
2634
 
2635
- #: classes/Views/ToggleAlerts.php:333
2636
- msgid ""
2637
- "The plugin WooCommerce is not installed on your website so these events have "
2638
- "been disabled."
2639
  msgstr ""
2640
 
2641
- #: classes/Views/ToggleAlerts.php:340
2642
- msgid "Products"
2643
  msgstr ""
2644
 
2645
- #: classes/Views/ToggleAlerts.php:348
2646
- msgid ""
2647
- "The plugin Yoast SEO is not installed on your website so these events have "
2648
- "been disabled."
2649
  msgstr ""
2650
 
2651
- #: classes/Views/ToggleAlerts.php:354 defaults.php:428
2652
- msgid "Post Changes"
2653
  msgstr ""
2654
 
2655
- #: classes/Views/ToggleAlerts.php:357 defaults.php:417
2656
- msgid "MultiSite"
2657
  msgstr ""
2658
 
2659
- #: classes/Views/ToggleAlerts.php:361
2660
- msgid ""
2661
- "Your website is a single site so the multisite events have been disabled."
2662
  msgstr ""
2663
 
2664
- #: classes/Views/ToggleAlerts.php:365
2665
- msgid "Other User Activity"
2666
  msgstr ""
2667
 
2668
- #: classes/Views/ToggleAlerts.php:368
2669
- msgid "Logins & Logouts"
2670
  msgstr ""
2671
 
2672
- #: classes/Views/ToggleAlerts.php:380 classes/Views/ToggleAlerts.php:539
2673
- #: defaults.php:469
2674
- msgid "Monitor File Changes"
 
 
 
 
 
2675
  msgstr ""
2676
 
2677
- #: classes/Views/ToggleAlerts.php:391
2678
- msgid "Not Implemented"
2679
  msgstr ""
2680
 
2681
- #: classes/Views/ToggleAlerts.php:394
2682
- msgid "Not Available"
2683
  msgstr ""
2684
 
2685
- #: classes/Views/ToggleAlerts.php:404
2686
- msgid "User Sessions"
2687
  msgstr ""
2688
 
2689
- #: classes/Views/ToggleAlerts.php:406
2690
- msgid "Files"
2691
  msgstr ""
2692
 
2693
- #: classes/Views/ToggleAlerts.php:408
2694
- msgid "Post Settings"
2695
  msgstr ""
2696
 
2697
- #: classes/Views/ToggleAlerts.php:410
2698
- msgid "Product Admin"
2699
  msgstr ""
2700
 
2701
- #: classes/Views/ToggleAlerts.php:412
2702
- msgid "Product Attributes"
2703
  msgstr ""
2704
 
2705
- #: classes/Views/ToggleAlerts.php:476 classes/Views/ToggleAlerts.php:626
2706
- msgid ""
2707
- "Capture 404 requests to file (the log file are created in the /wp-content/"
2708
- "uploads/wp-activity-log/404s/ directory)"
2709
  msgstr ""
2710
 
2711
- #: classes/Views/ToggleAlerts.php:484 classes/Views/ToggleAlerts.php:630
2712
- msgid "Purge log files older than one month"
2713
  msgstr ""
2714
 
2715
- #: classes/Views/ToggleAlerts.php:489
2716
- msgid ""
2717
- "Number of 404 Requests to Log. By default the plugin keeps up to 99 requests "
2718
- "to non-existing pages from the same IP address. Increase the value in this "
2719
- "setting to the desired amount to keep a log of more or less requests."
2720
  msgstr ""
2721
 
2722
- #: classes/Views/ToggleAlerts.php:494 classes/Views/ToggleAlerts.php:638
2723
- msgid "Record the referrer that generated the 404 error."
2724
  msgstr ""
2725
 
2726
- #: classes/Views/ToggleAlerts.php:506 classes/Views/ToggleAlerts.php:519
2727
- msgid ""
2728
- "Number of login attempts to log. Enter 0 to log all failed login attempts. "
2729
- "(By default the plugin only logs up to 10 failed login because the process "
2730
- "can be very resource intensive in case of a brute force attack)"
2731
  msgstr ""
2732
 
2733
- #: classes/Views/ToggleAlerts.php:532
2734
- msgid ""
2735
- "Log all stock changes. Disable this setting to only keep a log of stock "
2736
- "changes done manually via the WooCommerce dashboard. Therefore automated "
2737
- "stock changes typically done via customers placing orders or via other "
2738
- "plugins will not be logged."
2739
  msgstr ""
2740
 
2741
- #: classes/Views/ToggleAlerts.php:583
2742
- msgid ""
2743
- "This plugin keeps a log of what your website users are doing when they are "
2744
- "logged in. On top of that it can also keep a log of some important events of "
2745
- "(non logged in) website visitors. Use the below settings to enable / disable "
2746
- "any of the front-end sensors:"
2747
  msgstr ""
2748
 
2749
- #: classes/Views/ToggleAlerts.php:588
2750
- msgid "Front-end users registrations"
2751
  msgstr ""
2752
 
2753
- #: classes/Views/ToggleAlerts.php:594
2754
- msgid ""
2755
- "Keep a log when a visitor registers a user on the website. Only enable this "
2756
- "if you allow visitors to register as users on your website. User "
2757
- "registration is disabled by default in WordPress."
2758
  msgstr ""
2759
 
2760
- #: classes/Views/ToggleAlerts.php:599
2761
- msgid "Front-end users logins"
2762
  msgstr ""
2763
 
2764
- #: classes/Views/ToggleAlerts.php:605
2765
- msgid ""
2766
- "Keep a log when users login to the website from other login pages / forms "
2767
- "other than the default WordPress login page."
2768
  msgstr ""
2769
 
2770
- #: classes/Views/ToggleAlerts.php:610
2771
- msgid "Website visitors 404 errors"
2772
  msgstr ""
2773
 
2774
- #: classes/Views/ToggleAlerts.php:616
2775
- msgid ""
2776
- "Event ID 6023: Keep a log when a website visitor requests a non-existing URL "
2777
- "(HTTP 404 response error)."
2778
  msgstr ""
2779
 
2780
- #: classes/Views/ToggleAlerts.php:634
2781
- msgid ""
2782
- "Number of 404 Requests to Log. By default the plugin keeps up to 99 requests "
2783
- "to non-existing pages from the same IP address. Increase the value in this "
2784
- "setting to the desired amount to keep a log of more or less requests. Note "
2785
- "that by increasing this value to a high number, should your website be "
2786
- "scanned the plugin will consume more resources to log all the requests."
2787
  msgstr ""
2788
 
2789
- #: classes/Views/ToggleAlerts.php:647
2790
- msgid "Save Changes"
2791
  msgstr ""
2792
 
2793
- #: classes/Views/ToggleAlerts.php:654
2794
- msgid "Log Level Updated"
2795
  msgstr ""
2796
 
2797
- #: classes/Views/ToggleAlerts.php:658
2798
- #, php-format
2799
- msgid "The %s log level has been successfully loaded and applied."
2800
  msgstr ""
2801
 
2802
- #: classes/Views/ToggleAlerts.php:662
2803
- #: extensions/email-notifications/classes/Notifications.php:292
2804
- #: extensions/email-notifications/classes/Notifications.php:898
2805
- #: extensions/email-notifications/classes/Notifications.php:2036
2806
- msgid "OK"
2807
  msgstr ""
2808
 
2809
- #: classes/Views/ToggleAlerts.php:677
2810
- msgid "Enable File Integrity Scanner"
2811
  msgstr ""
2812
 
2813
- #: classes/Views/ToggleAlerts.php:679
2814
- msgid ""
2815
- "The file integrity scanner is switched off. To enable this event it has to "
2816
- "be switched on."
2817
  msgstr ""
2818
 
2819
- #: classes/Views/ToggleAlerts.php:683
2820
- msgid "SWITCH ON"
2821
  msgstr ""
2822
 
2823
- #: classes/Views/ToggleAlerts.php:684
2824
- msgid "DISABLE EVENT"
2825
  msgstr ""
2826
 
2827
- #: classes/Views/addons/html-view.php:101
2828
- msgid "Screenshots"
2829
  msgstr ""
2830
 
2831
- #: classes/Views/addons/html-view.php:118
2832
- msgid "Start Free 14-Day Premium Trial"
2833
  msgstr ""
2834
 
2835
- #: classes/WidgetManager.php:55
2836
- msgid "Latest Events"
2837
  msgstr ""
2838
 
2839
- #: classes/WidgetManager.php:71
2840
- msgid "No events found."
2841
  msgstr ""
2842
 
2843
- #: defaults.php:77
2844
- msgid "Critical severity events."
2845
  msgstr ""
2846
 
2847
- #: defaults.php:78
2848
- msgid "High severity events."
2849
  msgstr ""
2850
 
2851
- #: defaults.php:79
2852
- msgid "Medium severity events."
2853
  msgstr ""
2854
 
2855
- #: defaults.php:80
2856
- msgid "Low severity events."
2857
  msgstr ""
2858
 
2859
- #: defaults.php:81
2860
- msgid "Informational events."
2861
  msgstr ""
2862
 
2863
- #: defaults.php:86
2864
- msgid "Users Logins & Sessions Events"
2865
  msgstr ""
2866
 
2867
- #: defaults.php:87
2868
- #: extensions/email-notifications/classes/Notifications.php:1365
2869
- msgid "User Activity"
2870
  msgstr ""
2871
 
2872
- #: defaults.php:88
2873
- msgid "User logged in"
2874
  msgstr ""
2875
 
2876
- #: defaults.php:89
2877
- msgid "User logged out"
 
2878
  msgstr ""
2879
 
2880
- #: defaults.php:90
2881
- msgid "Login failed"
2882
  msgstr ""
2883
 
2884
- #: defaults.php:91
2885
- msgid "Login failed / non existing user"
2886
  msgstr ""
2887
 
2888
- #: defaults.php:91
2889
- msgid "%Attempts% failed login(s) %LineBreak% %LogFileText%"
2890
  msgstr ""
2891
 
2892
- #: defaults.php:92
2893
- msgid "Login blocked"
 
2894
  msgstr ""
2895
 
2896
- #: defaults.php:92
2897
- msgid ""
2898
- "Login blocked because other session(s) already exist for this user. "
2899
- "%LineBreak% IP address: %ClientIP%"
2900
  msgstr ""
2901
 
2902
- #: defaults.php:93
2903
- msgid "User logged in with existing session(s)"
2904
  msgstr ""
2905
 
2906
- #: defaults.php:93
2907
- msgid ""
2908
- "User logged in. There are other session(s) using the same username logged in "
2909
- "from these IP address(es): %IPAddress%"
2910
  msgstr ""
2911
 
2912
- #: defaults.php:94
2913
- msgid "User logged out all other sessions with the same username"
2914
  msgstr ""
2915
 
2916
- #: defaults.php:94
2917
- msgid "Logged out all other sessions with the same user."
2918
  msgstr ""
2919
 
2920
- #: defaults.php:95
2921
- msgid "User session destroyed and logged out"
2922
  msgstr ""
2923
 
2924
- #: defaults.php:95
2925
- msgid ""
2926
- "Terminated the session of another user. %LineBreak% User: %TargetUserName% "
2927
- "%LineBreak% Session ID: %TargetSessionID%"
2928
  msgstr ""
2929
 
2930
- #: defaults.php:96
2931
- msgid "Switched to another user"
2932
  msgstr ""
2933
 
2934
- #: defaults.php:96
2935
- msgid ""
2936
- "Switched to another user. %LineBreak% User: %TargetUserName% %LineBreak% "
2937
- "Role: %TargetUserRole%"
2938
  msgstr ""
2939
 
2940
- #: defaults.php:97
2941
- msgid "User uploaded file from Uploads directory"
2942
  msgstr ""
2943
 
2944
- #: defaults.php:97 defaults.php:98
2945
- msgid "Filename: %FileName% %LineBreak% Directory: %FilePath%"
2946
  msgstr ""
2947
 
2948
- #: defaults.php:98
2949
- msgid "User deleted file from Uploads directory"
2950
  msgstr ""
2951
 
2952
- #: defaults.php:102
2953
- msgid "Content & Comments"
 
2954
  msgstr ""
2955
 
2956
- #: defaults.php:104
2957
- msgid "User created a new post and saved it as draft"
2958
  msgstr ""
2959
 
2960
- #: defaults.php:104
2961
- msgid ""
2962
- "Created the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: "
2963
- "%PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak"
2964
- "% %EditorLinkPost%"
2965
  msgstr ""
2966
 
2967
- #: defaults.php:105
2968
- msgid "User published a post"
2969
  msgstr ""
2970
 
2971
- #: defaults.php:105
2972
- msgid ""
2973
- "Published the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: "
2974
- "%PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak"
2975
- "% %EditorLinkPost%"
2976
  msgstr ""
2977
 
2978
- #: defaults.php:106
2979
- msgid "User modified a post"
2980
  msgstr ""
2981
 
2982
- #: defaults.php:106
2983
- msgid ""
2984
- "Modified the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: "
2985
- "%PostType% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
2986
  msgstr ""
2987
 
2988
- #: defaults.php:107
2989
- msgid "User permanently deleted a post from the trash"
2990
  msgstr ""
2991
 
2992
- #: defaults.php:107
2993
- msgid ""
2994
- "Permanently deleted the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak"
2995
- "% Type: %PostType%"
2996
  msgstr ""
2997
 
2998
- #: defaults.php:108
2999
- msgid "User moved a post to the trash"
3000
  msgstr ""
3001
 
3002
- #: defaults.php:108
3003
- msgid ""
3004
- "Moved the post %PostTitle% to trash %LineBreak% ID: %PostID% %LineBreak% "
3005
- "Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished%"
3006
  msgstr ""
3007
 
3008
- #: defaults.php:109
3009
- msgid "User restored a post from trash"
3010
  msgstr ""
3011
 
3012
- #: defaults.php:109
3013
- msgid ""
3014
- "Restored the post %PostTitle% from trash %LineBreak% ID: %PostID% %LineBreak"
3015
- "% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% "
3016
- "%LineBreak% %EditorLinkPost%"
3017
  msgstr ""
3018
 
3019
- #: defaults.php:110
3020
- msgid "User changed post URL"
3021
  msgstr ""
3022
 
3023
- #: defaults.php:110
3024
- msgid ""
3025
- "Changed the URL of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% "
3026
- "Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous URL: "
3027
- "%OldUrl% %LineBreak% New URL: %NewUrl% %LineBreak% %EditorLinkPost%"
3028
  msgstr ""
3029
 
3030
- #: defaults.php:111
3031
- msgid "User changed post author"
3032
  msgstr ""
3033
 
3034
- #: defaults.php:111
3035
- msgid ""
3036
- "Changed the author of the post %PostTitle% %LineBreak% ID: %PostID% "
3037
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
3038
- "Previous author: %OldAuthor% %LineBreak% New author: %NewAuthor% "
3039
- "%PostUrlIfPlublished% %LineBreak% %EditorLinkPost%."
3040
  msgstr ""
3041
 
3042
- #: defaults.php:112
3043
- msgid "User changed post status"
3044
  msgstr ""
3045
 
3046
- #: defaults.php:112
3047
- msgid ""
3048
- "Changed the status of the post %PostTitle% %LineBreak% ID: %PostID% "
3049
- "%LineBreak% Type: %PostType% %LineBreak% Status was: %OldStatus% %LineBreak% "
3050
- "New status: %NewStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3051
  msgstr ""
3052
 
3053
- #: defaults.php:113
3054
- msgid "User changed the visibility of a post"
3055
  msgstr ""
3056
 
3057
- #: defaults.php:113
3058
- msgid ""
3059
- "Changed the visibility of the post %PostTitle% %LineBreak% ID: %PostID% "
3060
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
3061
- "Visibility was: %OldVisibility% %LineBreak% Visibility is: %NewVisibility% "
3062
- "%PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3063
  msgstr ""
3064
 
3065
- #: defaults.php:114
3066
- msgid "User changed the date of a post"
3067
  msgstr ""
3068
 
3069
- #: defaults.php:114
3070
- msgid ""
3071
- "Changed the date of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak"
3072
- "% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous "
3073
- "date: %OldDate% %LineBreak% New date: %NewDate% %PostUrlIfPlublished% "
3074
- "%LineBreak% %EditorLinkPost%"
3075
  msgstr ""
3076
 
3077
- #: defaults.php:115
3078
- msgid "User changed the parent of a page"
3079
  msgstr ""
3080
 
3081
- #: defaults.php:115
3082
- msgid ""
3083
- "Changed the parent of the post %PostTitle% %LineBreak% ID: %PostID% "
3084
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
3085
- "Previous parent: %OldParentName% %LineBreak% New parent: %NewParentName% "
3086
- "%PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3087
  msgstr ""
3088
 
3089
- #: defaults.php:116
3090
- msgid "User changed the template of a page"
3091
  msgstr ""
3092
 
3093
- #: defaults.php:116
3094
- msgid ""
3095
- "Changed the template of the post %PostTitle% %LineBreak% ID: %PostID% "
3096
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
3097
- "Previous template: %OldTemplate% %LineBreak% New template: %NewTemplate% "
3098
- "%PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3099
  msgstr ""
3100
 
3101
- #: defaults.php:117
3102
- msgid "User set a post as sticky"
3103
  msgstr ""
3104
 
3105
- #: defaults.php:117
3106
- msgid ""
3107
- "Set the post %PostTitle% as sticky %LineBreak% ID: %PostID% %LineBreak% "
3108
- "Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% "
3109
- "%LineBreak% %EditorLinkPost%"
3110
  msgstr ""
3111
 
3112
- #: defaults.php:118
3113
- msgid "User removed post from sticky"
3114
  msgstr ""
3115
 
3116
- #: defaults.php:118
3117
- msgid ""
3118
- "Removed the post %PostTitle% from sticky %LineBreak% ID: %PostID% %LineBreak"
3119
- "% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% "
3120
- "%LineBreak% %EditorLinkPost%"
3121
  msgstr ""
3122
 
3123
- #: defaults.php:119
3124
- msgid "User modified the content of a post"
3125
  msgstr ""
3126
 
3127
- #: defaults.php:119
3128
- msgid ""
3129
- "Modified the content of the post %PostTitle% %LineBreak% ID: %PostID% "
3130
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
3131
- "%RevisionLink% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3132
  msgstr ""
3133
 
3134
- #: defaults.php:120
3135
- msgid "User submitted a post for review"
3136
  msgstr ""
3137
 
3138
- #: defaults.php:120
3139
- msgid ""
3140
- "Submitted the post %PostTitle% for review %LineBreak% ID: %PostID% %LineBreak"
3141
- "% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% "
3142
- "%LineBreak% %EditorLinkPost%"
3143
  msgstr ""
3144
 
3145
- #: defaults.php:121
3146
- msgid "User scheduled a post"
3147
  msgstr ""
3148
 
3149
- #: defaults.php:121
3150
- msgid ""
3151
- "Scheduled the post %PostTitle% to be published on %PublishingDate% %LineBreak"
3152
- "% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% "
3153
- "%LineBreak% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3154
  msgstr ""
3155
 
3156
- #: defaults.php:122
3157
- msgid "User changed title of a post"
3158
  msgstr ""
3159
 
3160
- #: defaults.php:122
3161
- msgid ""
3162
- "Changed the title of the post %OldTitle% %LineBreak% New title: %NewTitle% "
3163
- "%LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: "
3164
- "%PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3165
  msgstr ""
3166
 
3167
- #: defaults.php:123
3168
- msgid "User opened a post in the editor"
3169
  msgstr ""
3170
 
3171
- #: defaults.php:123
3172
- msgid ""
3173
- "Opened the post %PostTitle% in the editor %LineBreak% ID: %PostID% %LineBreak"
3174
- "% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% "
3175
- "%LineBreak% %EditorLinkPost%"
3176
  msgstr ""
3177
 
3178
- #: defaults.php:124
3179
- msgid "User viewed a post"
3180
  msgstr ""
3181
 
3182
- #: defaults.php:124
3183
- msgid ""
3184
- "Viewed the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: "
3185
- "%PostType% %LineBreak% Status: %PostStatus% %LineBreak% URL: %PostUrl% "
3186
- "%LineBreak% %EditorLinkPost%"
3187
  msgstr ""
3188
 
3189
- #: defaults.php:125
3190
- msgid "A plugin modified a post"
3191
  msgstr ""
3192
 
3193
- #: defaults.php:125
3194
- msgid ""
3195
- "Plugin modified the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% "
3196
- "Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% "
3197
- "%LineBreak% %EditorLinkPost%"
3198
  msgstr ""
3199
 
3200
- #: defaults.php:126
3201
- msgid "User enabled/disabled comments in a post"
3202
  msgstr ""
3203
 
3204
- #: defaults.php:126
3205
- msgid ""
3206
- "The comments in the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% "
3207
- "Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% "
3208
- "%LineBreak% %EditorLinkPost%"
3209
  msgstr ""
3210
 
3211
- #: defaults.php:127
3212
- msgid "User enabled/disabled trackbacks and pingbacks in a post"
3213
  msgstr ""
3214
 
3215
- #: defaults.php:127
3216
- msgid ""
3217
- "Pingbacks and Trackbacks in the post %PostTitle% %LineBreak% ID: %PostID% "
3218
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% "
3219
- "%PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3220
  msgstr ""
3221
 
3222
- #: defaults.php:130
3223
- msgid "Tags"
3224
  msgstr ""
3225
 
3226
- #: defaults.php:131
3227
- msgid "User added post tag"
3228
  msgstr ""
3229
 
3230
- #: defaults.php:131
3231
- msgid ""
3232
- "Added tag(s) to the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% "
3233
- "Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Added tag(s): "
3234
- "%tag% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3235
  msgstr ""
3236
 
3237
- #: defaults.php:132
3238
- msgid "User removed post tag"
3239
  msgstr ""
3240
 
3241
- #: defaults.php:132
3242
- msgid ""
3243
- "Removed tag(s) from the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak"
3244
- "% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Removed "
3245
- "tag(s): %tag% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3246
  msgstr ""
3247
 
3248
- #: defaults.php:133
3249
- msgid "User created new tag"
3250
  msgstr ""
3251
 
3252
- #: defaults.php:133
3253
- msgid ""
3254
- "Created the tag %TagName% %LineBreak% Slug: %Slug% %LineBreak% %TagLink%"
3255
  msgstr ""
3256
 
3257
- #: defaults.php:134
3258
- msgid "User deleted tag"
3259
  msgstr ""
3260
 
3261
- #: defaults.php:134
3262
- msgid "Deleted the tag %TagName% %LineBreak% Slug: %Slug%"
3263
  msgstr ""
3264
 
3265
- #: defaults.php:135
3266
- msgid "User renamed tag"
3267
  msgstr ""
3268
 
3269
- #: defaults.php:135
3270
- msgid ""
3271
- "Old name: %old_name% %LineBreak% New name: %new_name% %LineBreak% Slug: %Slug"
3272
- "% %LineBreak% %TagLink%"
3273
  msgstr ""
3274
 
3275
- #: defaults.php:136
3276
- msgid "User changed tag slug"
3277
  msgstr ""
3278
 
3279
- #: defaults.php:136
3280
- msgid ""
3281
- "Changed the slug of the tag %tag% %LineBreak% Previous slug: %old_slug% "
3282
- "%LineBreak% New slug: %new_slug% %LineBreak% %TagLink%"
3283
  msgstr ""
3284
 
3285
- #: defaults.php:137
3286
- msgid "User changed tag description"
3287
  msgstr ""
3288
 
3289
- #: defaults.php:137
3290
- msgid ""
3291
- "Changed the description of the tag %tag% %LineBreak% Slug: %Slug% %LineBreak"
3292
- "% Previous description: %old_desc% %LineBreak% New description: %new_desc% "
3293
- "%LineBreak% %TagLink%"
3294
  msgstr ""
3295
 
3296
- #: defaults.php:140
3297
- msgid "Categories"
3298
  msgstr ""
3299
 
3300
- #: defaults.php:141
3301
- msgid "User changed post category"
3302
  msgstr ""
3303
 
3304
- #: defaults.php:141
3305
- msgid ""
3306
- "Changed the category of the post %PostTitle% %LineBreak% ID: %PostID% "
3307
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
3308
- "Previous category(ies): %OldCategories% %LineBreak% New category(ies): "
3309
- "%NewCategories% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3310
  msgstr ""
3311
 
3312
- #: defaults.php:142
3313
- msgid "User created new category"
3314
- msgstr ""
3315
-
3316
- #: defaults.php:142
3317
- msgid ""
3318
- "Created the category %CategoryName% %LineBreak% Slug: %Slug% %LineBreak% "
3319
- "%CategoryLink%"
3320
- msgstr ""
3321
-
3322
- #: defaults.php:143
3323
- msgid "User deleted category"
3324
- msgstr ""
3325
-
3326
- #: defaults.php:143
3327
- msgid "Deleted the category %CategoryName% %LineBreak% Slug: %Slug%"
3328
- msgstr ""
3329
-
3330
- #: defaults.php:144
3331
- msgid "Changed the parent of a category"
3332
- msgstr ""
3333
-
3334
- #: defaults.php:144
3335
- msgid ""
3336
- "Changed the parent of the category %CategoryName% %LineBreak% Slug: %Slug% "
3337
- "%LineBreak% Previous parent: %OldParent% %LineBreak% New parent: %NewParent% "
3338
- "%LineBreak% %CategoryLink%"
3339
- msgstr ""
3340
-
3341
- #: defaults.php:145
3342
- msgid "User changed category name"
3343
- msgstr ""
3344
-
3345
- #: defaults.php:145
3346
- msgid ""
3347
- "Previous name: %old_name% %LineBreak% New name: %new_name% %LineBreak% Slug: "
3348
- "%slug% %LineBreak% %cat_link%"
3349
- msgstr ""
3350
-
3351
- #: defaults.php:146
3352
- msgid "User changed category slug"
3353
- msgstr ""
3354
-
3355
- #: defaults.php:146
3356
- msgid ""
3357
- "Changed the slug of the category: %CategoryName% %LineBreak% Previous slug: "
3358
- "%old_slug% %LineBreak% New slug: %new_slug% %LineBreak% %cat_link%"
3359
- msgstr ""
3360
-
3361
- #: defaults.php:149
3362
- msgid "Custom Fields"
3363
- msgstr ""
3364
-
3365
- #: defaults.php:150
3366
- msgid "User created a custom field for a post"
3367
- msgstr ""
3368
-
3369
- #: defaults.php:150
3370
- msgid ""
3371
- "Created a new custom field called %MetaKey% in the post %PostTitle% "
3372
- "%LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% "
3373
- "Post Status: %PostStatus% %LineBreak% Custom field value: %MetaValue% "
3374
- "%PostUrlIfPlublished% %LineBreak% %EditorLinkPost% %LineBreak% %MetaLink%"
3375
- msgstr ""
3376
-
3377
- #: defaults.php:151
3378
- msgid "User updated a custom field value for a post"
3379
- msgstr ""
3380
-
3381
- #: defaults.php:151
3382
- msgid ""
3383
- "Modified the value of the custom field %MetaKey% in the post %PostTitle% "
3384
- "%LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% "
3385
- "Post Status: %PostStatus% %LineBreak% Previous custom field value: "
3386
- "%MetaValueOld% %LineBreak% New custom field value: %MetaValueNew% "
3387
- "%PostUrlIfPlublished% %LineBreak% %EditorLinkPost% %LineBreak% %MetaLink%."
3388
- msgstr ""
3389
-
3390
- #: defaults.php:152
3391
- msgid "User deleted a custom field from a post"
3392
- msgstr ""
3393
-
3394
- #: defaults.php:152
3395
- msgid ""
3396
- "Deleted the custom field %MetaKey% from the post %PostTitle% %LineBreak% "
3397
- "Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: "
3398
- "%PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3399
- msgstr ""
3400
-
3401
- #: defaults.php:153
3402
- msgid "User updated a custom field name for a post"
3403
- msgstr ""
3404
-
3405
- #: defaults.php:153
3406
- msgid ""
3407
- "Old custom field name: %MetaKeyOld% %LineBreak% New custom field name: "
3408
- "%MetaKeyNew% %LineBreak% Post: %PostTitle% %LineBreak% Post ID: %PostID% "
3409
- "%LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% "
3410
- "%PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
3411
- msgstr ""
3412
-
3413
- #: defaults.php:156
3414
- msgid "Custom Fields (ACF)"
3415
- msgstr ""
3416
-
3417
- #: defaults.php:159
3418
- msgid "User added relationship to a custom field value for a post"
3419
- msgstr ""
3420
-
3421
- #: defaults.php:160
3422
- msgid ""
3423
- "Modified the value of the custom field %MetaKey% in the post %PostTitle% "
3424
- "%LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% "
3425
- "Post Status: %PostStatus% %LineBreak% Added the following relationships: "
3426
- "%Relationships% %LineBreak% %LineBreak% %EditorLinkPost% %LineBreak% "
3427
- "%MetaLink%."
3428
- msgstr ""
3429
-
3430
- #: defaults.php:166
3431
- msgid "User removed relationship from a custom field value for a post"
3432
- msgstr ""
3433
-
3434
- #: defaults.php:167
3435
- msgid ""
3436
- "Modified the value of the custom field %MetaKey% in the post %PostTitle% "
3437
- "%LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% "
3438
- "Post Status: %PostStatus% %LineBreak% Removed the following relationships: "
3439
- "%Relationships% %LineBreak% %LineBreak% %EditorLinkPost% %LineBreak% "
3440
- "%MetaLink%."
3441
- msgstr ""
3442
-
3443
- #: defaults.php:176
3444
- msgid "Comments"
3445
- msgstr ""
3446
-
3447
- #: defaults.php:177
3448
- msgid "User approved a comment"
3449
- msgstr ""
3450
-
3451
- #: defaults.php:177
3452
- msgid ""
3453
- "Approved the comment posted by %Author% on the post %PostTitle% %LineBreak% "
3454
- "Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: "
3455
- "%PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% "
3456
- "%LineBreak% %CommentLink%"
3457
- msgstr ""
3458
-
3459
- #: defaults.php:178
3460
- msgid "User unapproved a comment"
3461
- msgstr ""
3462
-
3463
- #: defaults.php:178
3464
- msgid ""
3465
- "Unapproved the comment posted by %Author% on the post %PostTitle% %LineBreak"
3466
- "% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post "
3467
- "Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished"
3468
- "% %LineBreak% %CommentLink%"
3469
- msgstr ""
3470
-
3471
- #: defaults.php:179
3472
- msgid "User replied to a comment"
3473
- msgstr ""
3474
-
3475
- #: defaults.php:179
3476
- msgid ""
3477
- "Replied to the comment posted by %Author% on the post %PostTitle% %LineBreak"
3478
- "% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post "
3479
- "Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished"
3480
- "% %LineBreak% %CommentLink%"
3481
- msgstr ""
3482
-
3483
- #: defaults.php:180
3484
- msgid "User edited a comment"
3485
- msgstr ""
3486
-
3487
- #: defaults.php:180
3488
- msgid ""
3489
- "Edited the comment posted by %Author% on the post %PostTitle% %LineBreak% "
3490
- "Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: "
3491
- "%PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% "
3492
- "%LineBreak% %CommentLink%"
3493
- msgstr ""
3494
-
3495
- #: defaults.php:181
3496
- msgid "User marked a comment as Spam"
3497
- msgstr ""
3498
-
3499
- #: defaults.php:181
3500
- msgid ""
3501
- "Marked the comment posted by %Author% on the post %PostTitle% as spam "
3502
- "%LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% "
3503
- "Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% "
3504
- "%PostUrlIfPlublished% %LineBreak% %CommentLink%"
3505
- msgstr ""
3506
-
3507
- #: defaults.php:182
3508
- msgid "User marked a comment as Not Spam"
3509
- msgstr ""
3510
-
3511
- #: defaults.php:182
3512
- msgid ""
3513
- "Marked the comment posted by %Author% on the post %PostTitle% as not spam "
3514
- "%LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% "
3515
- "Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% "
3516
- "%PostUrlIfPlublished% %LineBreak% %CommentLink%"
3517
- msgstr ""
3518
-
3519
- #: defaults.php:183
3520
- msgid "User moved a comment to trash"
3521
- msgstr ""
3522
-
3523
- #: defaults.php:183
3524
- msgid ""
3525
- "Moved the comment posted by %Author% on the post %PostTitle% to trash "
3526
- "%LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% "
3527
- "Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% "
3528
- "%PostUrlIfPlublished% %LineBreak% %CommentLink%"
3529
- msgstr ""
3530
-
3531
- #: defaults.php:184
3532
- msgid "User restored a comment from the trash"
3533
- msgstr ""
3534
-
3535
- #: defaults.php:184
3536
- msgid ""
3537
- "Restored the comment posted by %Author% on the post %PostTitle% from trash "
3538
- "%LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% "
3539
- "Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% "
3540
- "%PostUrlIfPlublished% %LineBreak% %CommentLink%"
3541
- msgstr ""
3542
-
3543
- #: defaults.php:185
3544
- msgid "User permanently deleted a comment"
3545
- msgstr ""
3546
-
3547
- #: defaults.php:185
3548
- msgid ""
3549
- "Permanently deleted the comment posted by %Author% on the post %PostTitle% "
3550
- "%LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% "
3551
- "Post Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% Comment ID: "
3552
- "%CommentID%"
3553
- msgstr ""
3554
-
3555
- #: defaults.php:186
3556
- msgid "User posted a comment"
3557
- msgstr ""
3558
-
3559
- #: defaults.php:186 defaults.php:191
3560
- msgid ""
3561
- "Posted a comment on the post %PostTitle% %LineBreak% Post ID: %PostID% "
3562
- "%LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% "
3563
- "%LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% "
3564
- "%CommentLink%"
3565
- msgstr ""
3566
-
3567
- #: defaults.php:191
3568
- msgid "Visitor posted a comment"
3569
- msgstr ""
3570
-
3571
- #: defaults.php:197
3572
- msgid "Widgets"
3573
- msgstr ""
3574
-
3575
- #: defaults.php:198
3576
- msgid "User added a new widget"
3577
- msgstr ""
3578
-
3579
- #: defaults.php:198
3580
- msgid "Added a new %WidgetName% widget in %Sidebar%."
3581
- msgstr ""
3582
-
3583
- #: defaults.php:199
3584
- msgid "User modified a widget"
3585
- msgstr ""
3586
-
3587
- #: defaults.php:199
3588
- msgid "Modified the %WidgetName% widget in %Sidebar%."
3589
- msgstr ""
3590
-
3591
- #: defaults.php:200
3592
- msgid "User deleted widget"
3593
- msgstr ""
3594
-
3595
- #: defaults.php:200
3596
- msgid "Deleted the %WidgetName% widget from %Sidebar%."
3597
- msgstr ""
3598
-
3599
- #: defaults.php:201
3600
- msgid "User moved widget"
3601
- msgstr ""
3602
-
3603
- #: defaults.php:201
3604
- msgid ""
3605
- "Moved the %WidgetName% widget %LineBreak% From: %OldSidebar% %LineBreak% To: "
3606
- "%NewSidebar%"
3607
- msgstr ""
3608
-
3609
- #: defaults.php:202
3610
- msgid "User changed widget position"
3611
- msgstr ""
3612
-
3613
- #: defaults.php:202
3614
- msgid "Changed the position of the %WidgetName% widget in %Sidebar%."
3615
- msgstr ""
3616
-
3617
- #: defaults.php:208
3618
- msgid "Menus"
3619
- msgstr ""
3620
-
3621
- #: defaults.php:209
3622
- msgid "User created new menu"
3623
- msgstr ""
3624
-
3625
- #: defaults.php:209
3626
- msgid "New menu called %MenuName%."
3627
- msgstr ""
3628
-
3629
- #: defaults.php:210
3630
- msgid "User added content to a menu"
3631
- msgstr ""
3632
-
3633
- #: defaults.php:210
3634
- msgid ""
3635
- "Added new item to the menu %MenuName% %LineBreak% Item type: %ContentType% "
3636
- "%LineBreak% Item name: %ContentName% "
3637
- msgstr ""
3638
-
3639
- #: defaults.php:211
3640
- msgid "User removed content from a menu"
3641
- msgstr ""
3642
-
3643
- #: defaults.php:211
3644
- msgid ""
3645
- "Removed item from the menu %MenuName% %LineBreak% Item type: %ContentType% "
3646
- "%LineBreak% Item name: %ContentName%"
3647
- msgstr ""
3648
-
3649
- #: defaults.php:212
3650
- msgid "User deleted menu"
3651
- msgstr ""
3652
-
3653
- #: defaults.php:212
3654
- msgid "Deleted the menu %MenuName%"
3655
- msgstr ""
3656
-
3657
- #: defaults.php:213
3658
- msgid "User changed menu setting"
3659
- msgstr ""
3660
-
3661
- #: defaults.php:213
3662
- msgid "The setting in the %MenuName% %LineBreak% Setting: %MenuSetting%"
3663
- msgstr ""
3664
-
3665
- #: defaults.php:214
3666
- msgid "User modified content in a menu"
3667
- msgstr ""
3668
-
3669
- #: defaults.php:214
3670
- msgid ""
3671
- "Modified an item in the menu %MenuName% %LineBreak% Item type: %ContentType% "
3672
- "%LineBreak% Item name: %ContentName%"
3673
- msgstr ""
3674
-
3675
- #: defaults.php:215
3676
- msgid "User changed name of a menu"
3677
  msgstr ""
3678
 
3679
- #: defaults.php:215
3680
- msgid "Old name: %OldMenuName% %LineBreak% New name: %NewMenuName%"
3681
  msgstr ""
3682
 
3683
- #: defaults.php:216
3684
- msgid "User changed order of the objects in a menu"
3685
  msgstr ""
3686
 
3687
- #: defaults.php:216
3688
- msgid "Changed the order of the items in the menu %MenuName%"
3689
  msgstr ""
3690
 
3691
- #: defaults.php:217
3692
- msgid "User moved objects as a sub-item"
3693
  msgstr ""
3694
 
3695
- #: defaults.php:217
3696
- msgid ""
3697
- "Menu name: %MenuName% %LineBreak% Moved item %ItemName% as a sub-item of "
3698
- "%ParentName%"
3699
  msgstr ""
3700
 
3701
- #: defaults.php:229
3702
- msgid "User modified a draft blog post"
3703
  msgstr ""
3704
 
3705
- #: defaults.php:229
3706
- msgid "Modified the draft post with the %PostTitle%. %EditorLinkPost%."
3707
  msgstr ""
3708
 
3709
- #: defaults.php:230
3710
- msgid "User created a new post with custom post type and saved it as draft"
3711
  msgstr ""
3712
 
3713
- #: defaults.php:230
3714
- msgid ""
3715
- "Created a new custom post called %PostTitle% of type %PostType%. "
3716
- "%EditorLinkPost%."
3717
  msgstr ""
3718
 
3719
- #: defaults.php:231
3720
- msgid "User published a post with custom post type"
3721
  msgstr ""
3722
 
3723
- #: defaults.php:231
3724
- msgid ""
3725
- "Published a custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
3726
- "%. %EditorLinkPost%."
3727
  msgstr ""
3728
 
3729
- #: defaults.php:232
3730
- msgid "User modified a post with custom post type"
3731
  msgstr ""
3732
 
3733
- #: defaults.php:232
3734
- msgid ""
3735
- "Modified the custom post %PostTitle% of type %PostType%. Post URL is %PostUrl"
3736
- "%. %EditorLinkPost%."
3737
  msgstr ""
3738
 
3739
- #: defaults.php:233
3740
- msgid "User modified a draft post with custom post type"
3741
  msgstr ""
3742
 
3743
- #: defaults.php:233
3744
- msgid ""
3745
- "Modified the draft custom post %PostTitle% of type is %PostType%. "
3746
- "%EditorLinkPost%."
3747
  msgstr ""
3748
 
3749
- #: defaults.php:234
3750
- msgid "User permanently deleted post with custom post type"
3751
  msgstr ""
3752
 
3753
- #: defaults.php:234
3754
- msgid "Permanently Deleted the custom post %PostTitle% of type %PostType%."
3755
  msgstr ""
3756
 
3757
- #: defaults.php:235
3758
- msgid "User moved post with custom post type to trash"
3759
  msgstr ""
3760
 
3761
- #: defaults.php:235
3762
- msgid ""
3763
- "Moved the custom post %PostTitle% of type %PostType% to trash. Post URL was "
3764
- "%PostUrl%."
3765
  msgstr ""
3766
 
3767
- #: defaults.php:236
3768
- msgid "User restored post with custom post type from trash"
3769
  msgstr ""
3770
 
3771
- #: defaults.php:236
3772
- msgid ""
3773
- "The custom post %PostTitle% of type %PostType% has been restored from trash. "
3774
- "%EditorLinkPost%."
3775
  msgstr ""
3776
 
3777
- #: defaults.php:237
3778
- msgid "User changed the category of a post with custom post type"
3779
  msgstr ""
3780
 
3781
- #: defaults.php:237
3782
- msgid ""
3783
- "Changed the category(ies) of the custom post %PostTitle% of type %PostType% "
3784
- "from %OldCategories% to %NewCategories%. %EditorLinkPost%."
3785
  msgstr ""
3786
 
3787
- #: defaults.php:238
3788
- msgid "User changed the URL of a post with custom post type"
3789
  msgstr ""
3790
 
3791
- #: defaults.php:238
3792
- msgid ""
3793
- "Changed the URL of the custom post %PostTitle% of type %PostType% from "
3794
- "%OldUrl% to %NewUrl%. %EditorLinkPost%."
3795
  msgstr ""
3796
 
3797
- #: defaults.php:239
3798
- msgid "User changed the author or post with custom post type"
3799
  msgstr ""
3800
 
3801
- #: defaults.php:239
3802
- msgid ""
3803
- "Changed the author of custom post %PostTitle% of type %PostType% from "
3804
- "%OldAuthor% to %NewAuthor%. %EditorLinkPost%."
3805
  msgstr ""
3806
 
3807
- #: defaults.php:240
3808
- msgid "User changed the status of post with custom post type"
3809
  msgstr ""
3810
 
3811
- #: defaults.php:240
3812
- msgid ""
3813
- "Changed the status of custom post %PostTitle% of type %PostType% from "
3814
- "%OldStatus% to %NewStatus%. %EditorLinkPost%."
3815
  msgstr ""
3816
 
3817
- #: defaults.php:241
3818
- msgid "User changed the visibility of a post with custom post type"
3819
  msgstr ""
3820
 
3821
- #: defaults.php:241
3822
- msgid ""
3823
- "Changed the visibility of the custom post %PostTitle% of type %PostType% "
3824
- "from %OldVisibility% to %NewVisibility%. %EditorLinkPost%."
3825
  msgstr ""
3826
 
3827
- #: defaults.php:242
3828
- msgid "User changed the date of post with custom post type"
3829
  msgstr ""
3830
 
3831
- #: defaults.php:242
3832
- msgid ""
3833
- "Changed the date of the custom post %PostTitle% of type %PostType% from "
3834
- "%OldDate% to %NewDate%. %EditorLinkPost%."
3835
  msgstr ""
3836
 
3837
- #: defaults.php:243
3838
- msgid "User created a custom field for a custom post type"
3839
  msgstr ""
3840
 
3841
- #: defaults.php:243
3842
- msgid ""
3843
- "Created a new custom field %MetaKey% with value %MetaValue% in custom post "
3844
- "%PostTitle% of type %PostType%. %EditorLinkPost%.<br>%MetaLink%."
3845
  msgstr ""
3846
 
3847
- #: defaults.php:244
3848
- msgid "User updated a custom field for a custom post type"
3849
  msgstr ""
3850
 
3851
- #: defaults.php:244
3852
- msgid ""
3853
- "Modified the value of the custom field %MetaKey% from %MetaValueOld% to "
3854
- "%MetaValueNew% in custom post %PostTitle% of type %PostType% %EditorLinkPost"
3855
- "%.<br>%MetaLink%."
3856
  msgstr ""
3857
 
3858
- #: defaults.php:245
3859
- msgid "User deleted a custom field from a custom post type"
3860
  msgstr ""
3861
 
3862
- #: defaults.php:245
3863
- msgid ""
3864
- "Deleted the custom field %MetaKey% with id %MetaID% from custom post "
3865
- "%PostTitle% of type %PostType% %EditorLinkPost%.<br>%MetaLink%."
3866
  msgstr ""
3867
 
3868
- #: defaults.php:246
3869
- msgid "User updated a custom field name for a custom post type"
3870
  msgstr ""
3871
 
3872
- #: defaults.php:246
3873
- msgid ""
3874
- "Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in custom "
3875
- "post %PostTitle% of type %PostType% %EditorLinkPost%.<br>%MetaLink%."
3876
  msgstr ""
3877
 
3878
- #: defaults.php:247
3879
- msgid "User modified content for a published custom post type"
3880
  msgstr ""
3881
 
3882
- #: defaults.php:247
3883
- msgid ""
3884
- "Modified the content of the published custom post type %PostTitle%. Post URL "
3885
- "is %PostUrl%.%EditorLinkPost%."
3886
  msgstr ""
3887
 
3888
- #: defaults.php:248
3889
- msgid "User modified content for a draft post"
3890
  msgstr ""
3891
 
3892
- #: defaults.php:248
3893
- msgid ""
3894
- "Modified the content of the draft post %PostTitle%.%RevisionLink% "
3895
- "%EditorLinkPost%."
3896
  msgstr ""
3897
 
3898
- #: defaults.php:249
3899
- msgid "User modified content for a draft custom post type"
3900
  msgstr ""
3901
 
3902
- #: defaults.php:249
3903
- msgid ""
3904
- "Modified the content of the draft custom post type %PostTitle%."
3905
- "%EditorLinkPost%."
3906
  msgstr ""
3907
 
3908
- #: defaults.php:250
3909
- msgid "User modified content of a post"
3910
  msgstr ""
3911
 
3912
- #: defaults.php:250
3913
- msgid ""
3914
- "Modified the content of post %PostTitle% which is submitted for review."
3915
- "%RevisionLink% %EditorLinkPost%."
3916
  msgstr ""
3917
 
3918
- #: defaults.php:251
3919
- msgid "User scheduled a custom post type"
3920
  msgstr ""
3921
 
3922
- #: defaults.php:251
3923
- msgid ""
3924
- "Scheduled the custom post type %PostTitle% to be published %PublishingDate%. "
3925
- "%EditorLinkPost%."
3926
  msgstr ""
3927
 
3928
- #: defaults.php:252
3929
- msgid "User changed title of a custom post type"
3930
  msgstr ""
3931
 
3932
- #: defaults.php:252
3933
- msgid ""
3934
- "Changed the title of the custom post %OldTitle% to %NewTitle%. "
3935
- "%EditorLinkPost%."
3936
  msgstr ""
3937
 
3938
- #: defaults.php:253
3939
- msgid "User opened a custom post type in the editor"
3940
  msgstr ""
3941
 
3942
- #: defaults.php:253
3943
- msgid ""
3944
- "Opened the custom post %PostTitle% of type %PostType% in the editor. View "
3945
- "the post: %EditorLinkPost%."
3946
  msgstr ""
3947
 
3948
- #: defaults.php:254
3949
- msgid "User viewed a custom post type"
3950
  msgstr ""
3951
 
3952
- #: defaults.php:254
3953
- msgid ""
3954
- "Viewed the custom post %PostTitle% of type %PostType%. View the post: "
3955
- "%PostUrl%."
3956
  msgstr ""
3957
 
3958
- #: defaults.php:255
3959
- msgid "A plugin created a custom post"
3960
  msgstr ""
3961
 
3962
- #: defaults.php:255
3963
- msgid "A plugin automatically created the following custom post: %PostTitle%."
3964
  msgstr ""
3965
 
3966
- #: defaults.php:256
3967
- msgid "A plugin deleted a custom post"
3968
  msgstr ""
3969
 
3970
- #: defaults.php:256
3971
- msgid "A plugin automatically deleted the following custom post: %PostTitle%."
3972
  msgstr ""
3973
 
3974
- #: defaults.php:257
3975
- msgid "A plugin modified a custom post"
3976
  msgstr ""
3977
 
3978
- #: defaults.php:257
3979
- msgid ""
3980
- "Plugin modified the custom post %PostTitle%. View the post: %EditorLinkPost%."
3981
  msgstr ""
3982
 
3983
- #: defaults.php:269
3984
- msgid "User created a new WordPress page and saved it as draft"
3985
  msgstr ""
3986
 
3987
- #: defaults.php:269
3988
- msgid ""
3989
- "Created a new page called %PostTitle% and saved it as draft. %EditorLinkPage"
3990
- "%."
3991
  msgstr ""
3992
 
3993
- #: defaults.php:270
3994
- msgid "User published a WordPress page"
3995
  msgstr ""
3996
 
3997
- #: defaults.php:270
3998
- msgid ""
3999
- "Published a page called %PostTitle%. Page URL is %PostUrl%. %EditorLinkPage%."
4000
  msgstr ""
4001
 
4002
- #: defaults.php:271
4003
- msgid "User modified a published WordPress page"
4004
  msgstr ""
4005
 
4006
- #: defaults.php:271
4007
- msgid ""
4008
- "Modified the published page %PostTitle%. Page URL is %PostUrl%. "
4009
- "%EditorLinkPage%."
4010
  msgstr ""
4011
 
4012
- #: defaults.php:272
4013
- msgid "User modified a draft WordPress page"
4014
  msgstr ""
4015
 
4016
- #: defaults.php:272
4017
- msgid ""
4018
- "Modified the draft page %PostTitle%. Page ID is %PostID%. %EditorLinkPage%."
4019
  msgstr ""
4020
 
4021
- #: defaults.php:273
4022
- msgid "User permanently deleted a page from the trash"
4023
  msgstr ""
4024
 
4025
- #: defaults.php:273
4026
- msgid "Permanently deleted the page %PostTitle%."
4027
  msgstr ""
4028
 
4029
- #: defaults.php:274
4030
- msgid "User moved WordPress page to the trash"
4031
  msgstr ""
4032
 
4033
- #: defaults.php:274
4034
- msgid "Moved the page %PostTitle% to trash. Page URL was %PostUrl%."
4035
  msgstr ""
4036
 
4037
- #: defaults.php:275
4038
- msgid "User restored a WordPress page from trash"
4039
  msgstr ""
4040
 
4041
- #: defaults.php:275
4042
- msgid "Page %PostTitle% has been restored from trash. %EditorLinkPage%."
4043
  msgstr ""
4044
 
4045
- #: defaults.php:276
4046
- msgid "User changed page URL"
4047
  msgstr ""
4048
 
4049
- #: defaults.php:276
4050
- msgid ""
4051
- "Changed the URL of the page %PostTitle% from %OldUrl% to %NewUrl%. "
4052
- "%EditorLinkPage%."
4053
  msgstr ""
4054
 
4055
- #: defaults.php:277
4056
- msgid "User changed page author"
4057
  msgstr ""
4058
 
4059
- #: defaults.php:277
4060
- msgid ""
4061
- "Changed the author of the page %PostTitle% from %OldAuthor% to %NewAuthor%. "
4062
- "%EditorLinkPage%."
4063
  msgstr ""
4064
 
4065
- #: defaults.php:278
4066
- msgid "User changed page status"
4067
  msgstr ""
4068
 
4069
- #: defaults.php:278
4070
- msgid ""
4071
- "Changed the status of the page %PostTitle% from %OldStatus% to %NewStatus%. "
4072
- "%EditorLinkPage%."
4073
  msgstr ""
4074
 
4075
- #: defaults.php:279
4076
- msgid "User changed the visibility of a page post"
4077
  msgstr ""
4078
 
4079
- #: defaults.php:279
4080
- msgid ""
4081
- "Changed the visibility of the page %PostTitle% from %OldVisibility% to "
4082
- "%NewVisibility%. %EditorLinkPage%."
4083
  msgstr ""
4084
 
4085
- #: defaults.php:280
4086
- msgid "User changed the date of a page post"
4087
  msgstr ""
4088
 
4089
- #: defaults.php:280
4090
- msgid ""
4091
- "Changed the date of the page %PostTitle% from %OldDate% to %NewDate%. "
4092
- "%EditorLinkPage%."
4093
  msgstr ""
4094
 
4095
- #: defaults.php:281
4096
- msgid "User created a custom field for a page"
4097
  msgstr ""
4098
 
4099
- #: defaults.php:281
4100
- msgid ""
4101
- "Created a new custom field called %MetaKey% with value %MetaValue% in the "
4102
- "page %PostTitle% %EditorLinkPage%.<br>%MetaLink%."
4103
  msgstr ""
4104
 
4105
- #: defaults.php:282
4106
- msgid "User updated a custom field value for a page"
4107
  msgstr ""
4108
 
4109
- #: defaults.php:282
4110
- msgid ""
4111
- "Modified the value of the custom field %MetaKey% from %MetaValueOld% to "
4112
- "%MetaValueNew% in the page %PostTitle% %EditorLinkPage%.<br>%MetaLink%."
4113
  msgstr ""
4114
 
4115
- #: defaults.php:283
4116
- msgid "User deleted a custom field from a page"
4117
  msgstr ""
4118
 
4119
- #: defaults.php:283
4120
- msgid ""
4121
- "Deleted the custom field %MetaKey% with id %MetaID% from page %PostTitle% "
4122
- "%EditorLinkPage%.<br>%MetaLink%."
4123
  msgstr ""
4124
 
4125
- #: defaults.php:284
4126
- msgid "User updated a custom field name for a page"
4127
  msgstr ""
4128
 
4129
- #: defaults.php:284
4130
- msgid ""
4131
- "Changed the custom field name from %MetaKeyOld% to %MetaKeyNew% in the page "
4132
- "%PostTitle% %EditorLinkPage%.<br>%MetaLink%."
4133
  msgstr ""
4134
 
4135
- #: defaults.php:285
4136
- msgid "User modified content for a published page"
4137
  msgstr ""
4138
 
4139
- #: defaults.php:285
4140
- msgid ""
4141
- "Modified the content of the published page %PostTitle%. Page URL is %PostUrl"
4142
- "%. %RevisionLink% %EditorLinkPage%."
4143
  msgstr ""
4144
 
4145
- #: defaults.php:286
4146
- msgid "User modified content for a draft page"
 
4147
  msgstr ""
4148
 
4149
- #: defaults.php:286
4150
- msgid ""
4151
- "Modified the content of draft page %PostTitle%.%RevisionLink% %EditorLinkPage"
4152
- "%."
4153
  msgstr ""
4154
 
4155
- #: defaults.php:287
4156
- msgid "User scheduled a page"
4157
  msgstr ""
4158
 
4159
- #: defaults.php:287
4160
- msgid ""
4161
- "Scheduled the page %PostTitle% to be published %PublishingDate%. "
4162
- "%EditorLinkPage%."
4163
  msgstr ""
4164
 
4165
- #: defaults.php:288
4166
- msgid "User changed title of a page"
4167
  msgstr ""
4168
 
4169
- #: defaults.php:288
4170
- msgid ""
4171
- "Changed the title of the page %OldTitle% to %NewTitle%. %EditorLinkPage%."
4172
  msgstr ""
4173
 
4174
- #: defaults.php:289
4175
- msgid "User opened a page in the editor"
4176
  msgstr ""
4177
 
4178
- #: defaults.php:289
4179
- msgid ""
4180
- "Opened the page %PostTitle% in the editor. View the page: %EditorLinkPage%."
4181
  msgstr ""
4182
 
4183
- #: defaults.php:290
4184
- msgid "User viewed a page"
4185
  msgstr ""
4186
 
4187
- #: defaults.php:290
4188
- msgid "Viewed the page %PostTitle%. View the page: %PostUrl%."
4189
  msgstr ""
4190
 
4191
- #: defaults.php:291
4192
- msgid "User disabled Comments/Trackbacks and Pingbacks on a draft post"
4193
  msgstr ""
4194
 
4195
- #: defaults.php:291
4196
- msgid ""
4197
- "Disabled %Type% on the draft post %PostTitle%. View the post: %PostUrl%."
4198
  msgstr ""
4199
 
4200
- #: defaults.php:292
4201
- msgid "User enabled Comments/Trackbacks and Pingbacks on a draft post"
4202
  msgstr ""
4203
 
4204
- #: defaults.php:292
4205
- msgid "Enabled %Type% on the draft post %PostTitle%. View the post: %PostUrl%."
4206
  msgstr ""
4207
 
4208
- #: defaults.php:293
4209
- msgid "User disabled Comments/Trackbacks and Pingbacks on a published page"
4210
  msgstr ""
4211
 
4212
- #: defaults.php:293
4213
- msgid ""
4214
- "Disabled %Type% on the published page %PostTitle%. View the page: %PostUrl%."
4215
  msgstr ""
4216
 
4217
- #: defaults.php:294
4218
- msgid "User enabled Comments/Trackbacks and Pingbacks on a published page"
4219
  msgstr ""
4220
 
4221
- #: defaults.php:294
4222
- msgid ""
4223
- "Enabled %Type% on the published page %PostTitle%. View the page: %PostUrl%."
4224
  msgstr ""
4225
 
4226
- #: defaults.php:295
4227
- msgid "User disabled Comments/Trackbacks and Pingbacks on a draft page"
4228
  msgstr ""
4229
 
4230
- #: defaults.php:295
4231
- msgid ""
4232
- "Disabled %Type% on the draft page %PostTitle%. View the page: %PostUrl%."
4233
  msgstr ""
4234
 
4235
- #: defaults.php:296
4236
- msgid "User enabled Comments/Trackbacks and Pingbacks on a draft page"
 
4237
  msgstr ""
4238
 
4239
- #: defaults.php:296
4240
- msgid "Enabled %Type% on the draft page %PostTitle%. View the page: %PostUrl%."
4241
  msgstr ""
4242
 
4243
- #: defaults.php:297
4244
- msgid "A plugin created a page"
 
 
 
 
4245
  msgstr ""
4246
 
4247
- #: defaults.php:297
4248
- msgid "A plugin automatically created the following page: %PostTitle%."
4249
  msgstr ""
4250
 
4251
- #: defaults.php:298
4252
- msgid "A plugin deleted a page"
4253
  msgstr ""
4254
 
4255
- #: defaults.php:298
4256
- msgid "A plugin automatically deleted the following page: %PostTitle%."
4257
  msgstr ""
4258
 
4259
- #: defaults.php:299
4260
- msgid "A plugin modified a page"
4261
  msgstr ""
4262
 
4263
- #: defaults.php:299
4264
- msgid "Plugin modified the page %PostTitle%. View the page: %EditorLinkPage%."
4265
  msgstr ""
4266
 
4267
- #: defaults.php:303
4268
- msgid "User Accounts"
4269
  msgstr ""
4270
 
4271
- #: defaults.php:304
4272
- msgid "User Profiles"
4273
  msgstr ""
4274
 
4275
- #: defaults.php:305
4276
- msgid "New user was created on WordPress"
4277
  msgstr ""
4278
 
4279
- #: defaults.php:305 defaults.php:306
4280
- msgid ""
4281
- "New user: %NewUserData->Username% %LineBreak% Role: %NewUserData->Roles% "
4282
- "%LineBreak% First name: %NewUserData->FirstName% %LineBreak% Last name: "
4283
- "%NewUserData->LastName% %LineBreak% %EditUserLink%"
4284
  msgstr ""
4285
 
4286
- #: defaults.php:306
4287
- msgid "User created another WordPress user"
4288
  msgstr ""
4289
 
4290
- #: defaults.php:307
4291
- msgid "The role of a user was changed by another WordPress user"
4292
  msgstr ""
4293
 
4294
- #: defaults.php:307
4295
- msgid ""
4296
- "Changed the role of the user %TargetUsername% %LineBreak% New role: %NewRole"
4297
- "% %LineBreak% Previous role: %OldRole% %LineBreak% First name: %FirstName% "
4298
- "%LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
4299
  msgstr ""
4300
 
4301
- #: defaults.php:308
4302
- msgid "User has changed his or her password"
4303
  msgstr ""
4304
 
4305
- #: defaults.php:308
4306
- msgid ""
4307
- "Changed the password %LineBreak% First name: %TargetUserData->FirstName% "
4308
- "%LineBreak% Last name: %TargetUserData->LastName% %LineBreak% %EditUserLink%"
4309
  msgstr ""
4310
 
4311
- #: defaults.php:309
4312
- msgid "User changed another user's password"
4313
  msgstr ""
4314
 
4315
- #: defaults.php:309
4316
- msgid ""
4317
- "Changed the password of the user %TargetUserData->Username% %LineBreak% "
4318
- "Role: %TargetUserData->Roles% %LineBreak% First name: %TargetUserData-"
4319
- ">FirstName% %LineBreak% Last name: %TargetUserData->LastName% %LineBreak% "
4320
- "%EditUserLink%"
4321
  msgstr ""
4322
 
4323
- #: defaults.php:310
4324
- msgid "User changed his or her email address"
4325
  msgstr ""
4326
 
4327
- #: defaults.php:310
4328
- msgid ""
4329
- "Changed the email address to %NewEmail% %LineBreak% Role: %Roles% %LineBreak"
4330
- "% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% "
4331
- "%EditUserLink%"
4332
  msgstr ""
4333
 
4334
- #: defaults.php:311
4335
- msgid "User changed another user's email address"
4336
  msgstr ""
4337
 
4338
- #: defaults.php:311
4339
- msgid ""
4340
- "Changed the email address of the user %TargetUsername% %LineBreak% New email "
4341
- "address: %NewEmail% %LineBreak% Previous email address: %OldEmail% %LineBreak"
4342
- "% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% Last name: "
4343
- "%LastName% %LineBreak% %EditUserLink%"
4344
  msgstr ""
4345
 
4346
- #: defaults.php:312
4347
- msgid "User was deleted by another user"
4348
  msgstr ""
4349
 
4350
- #: defaults.php:312
4351
- msgid ""
4352
- "User: %TargetUserData->Username% %LineBreak% Role: %TargetUserData->Roles% "
4353
- "%LineBreak% First name: %NewUserData->FirstName% %LineBreak% Last name: "
4354
- "%NewUserData->LastName%"
4355
  msgstr ""
4356
 
4357
- #: defaults.php:313
4358
- msgid "User opened the profile page of another user"
4359
  msgstr ""
4360
 
4361
- #: defaults.php:313
4362
- msgid ""
4363
- "The profile page of the user %TargetUsername% %LineBreak% Role: %Roles% "
4364
- "%LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% "
4365
- "%LineBreak% %EditUserLink%"
4366
  msgstr ""
4367
 
4368
- #: defaults.php:314
4369
- msgid "User updated a custom field value for a user"
4370
  msgstr ""
4371
 
4372
- #: defaults.php:314
4373
- msgid ""
4374
- "Changed the value of a custom field in the user profile %TargetUsername% "
4375
- "%LineBreak% Custom field: %custom_field_name% %LineBreak% Previous value: "
4376
- "%old_value% %LineBreak% New value: %new_value% %LineBreak% Role: %Roles% "
4377
- "%LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% "
4378
- "%LineBreak% %EditUserLink%"
4379
  msgstr ""
4380
 
4381
- #: defaults.php:315
4382
- msgid "User created a custom field value for a user"
4383
  msgstr ""
4384
 
4385
- #: defaults.php:315
4386
- msgid ""
4387
- "Created a new custom field in the user profile %TargetUsername% %LineBreak% "
4388
- "Custom field: %custom_field_name% %LineBreak% Custom field value: %new_value"
4389
- "% %LineBreak% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% "
4390
- "Last name: %LastName% %LineBreak% %EditUserLink%"
4391
  msgstr ""
4392
 
4393
- #: defaults.php:316
4394
- msgid "User changed first name for a user"
4395
  msgstr ""
4396
 
4397
- #: defaults.php:316
4398
- msgid ""
4399
- "Changed the first name of the user %TargetUsername% %LineBreak% Previous "
4400
- "name: %old_firstname% %LineBreak% New name: %new_firstname% %LineBreak% "
4401
- "Role: %Roles% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
4402
  msgstr ""
4403
 
4404
- #: defaults.php:317
4405
- msgid "User changed last name for a user"
4406
  msgstr ""
4407
 
4408
- #: defaults.php:317
4409
- msgid ""
4410
- "Changed the last name of the user %TargetUsername% %LineBreak% Previous last "
4411
- "name: %old_lastname% %LineBreak% New last name: %new_lastname% %LineBreak% "
4412
- "Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% %EditUserLink%"
4413
  msgstr ""
4414
 
4415
- #: defaults.php:318
4416
- msgid "User changed nickname for a user"
4417
  msgstr ""
4418
 
4419
- #: defaults.php:318
4420
- msgid ""
4421
- "Changed the nickname of the user %TargetUsername% %LineBreak% Previous "
4422
- "nickname: %old_nickname% New nickname: %new_nickname% %LineBreak% Role: "
4423
- "%Roles% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName"
4424
- "% %LineBreak% %EditUserLink%"
4425
  msgstr ""
4426
 
4427
- #: defaults.php:319
4428
- msgid "User changed the display name for a user"
4429
  msgstr ""
4430
 
4431
- #: defaults.php:319
4432
- msgid ""
4433
- "Changed the display name of the user %TargetUsername% %LineBreak% Previous "
4434
- "display name: %old_displayname% %LineBreak% New display name: "
4435
- "%new_displayname% %LineBreak% Role: %Roles% %LineBreak% First name: "
4436
- "%FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
4437
  msgstr ""
4438
 
4439
- #: defaults.php:322
4440
- msgid "Multisite User Profiles"
4441
  msgstr ""
4442
 
4443
- #: defaults.php:323
4444
- msgid "User granted Super Admin privileges"
4445
  msgstr ""
4446
 
4447
- #: defaults.php:323
4448
- msgid ""
4449
- "Granted Super Admin privileges to %TargetUsername% %LineBreak% First name: "
4450
- "%FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
4451
  msgstr ""
4452
 
4453
- #: defaults.php:324
4454
- msgid "User revoked from Super Admin privileges"
4455
  msgstr ""
4456
 
4457
- #: defaults.php:324
4458
- msgid ""
4459
- "Revoked Super Admin privileges from %TargetUsername% %LineBreak% First name: "
4460
- "%FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
4461
  msgstr ""
4462
 
4463
- #: defaults.php:325
4464
- msgid "Existing user added to a site"
4465
  msgstr ""
4466
 
4467
- #: defaults.php:325
4468
- msgid ""
4469
- "Added user %TargetUsername% to site: %SiteName% %LineBreak% Role: "
4470
- "%TargetUserRole% %LineBreak% First name: %FirstName% %LineBreak% Last name: "
4471
- "%LastName% %LineBreak% %EditUserLink%"
4472
  msgstr ""
4473
 
4474
- #: defaults.php:326
4475
- msgid "User removed from site"
4476
  msgstr ""
4477
 
4478
- #: defaults.php:326
4479
- msgid ""
4480
- "Removed user %TargetUsername% from site: %SiteName% %LineBreak% Previous "
4481
- "role: %TargetUserRole% %LineBreak% First name: %FirstName% %LineBreak% Last "
4482
- "name: %LastName% %LineBreak% %EditUserLink%"
4483
  msgstr ""
4484
 
4485
- #: defaults.php:327
4486
- msgid "New network user created"
4487
  msgstr ""
4488
 
4489
- #: defaults.php:327
4490
- msgid ""
4491
- "Created a new network user %NewUserData->Username% %LineBreak% First name: "
4492
- "%NewUserData->FirstName% %LineBreak% Last name: %NewUserData->LastName% "
4493
- "%LineBreak% %EditUserLink%"
4494
  msgstr ""
4495
 
4496
- #: defaults.php:331
4497
- msgid "Plugins & Themes"
4498
  msgstr ""
4499
 
4500
- #: defaults.php:333
4501
- msgid "User installed a plugin"
4502
  msgstr ""
4503
 
4504
- #: defaults.php:333
4505
- msgid ""
4506
- "Name: %Plugin->Name% %LineBreak% Install location: %Plugin->plugin_dir_path%"
4507
  msgstr ""
4508
 
4509
- #: defaults.php:334
4510
- msgid "User activated a WordPress plugin"
4511
  msgstr ""
4512
 
4513
- #: defaults.php:334 defaults.php:335 defaults.php:336 defaults.php:337
4514
- msgid "Name: %PluginData->Name% %LineBreak% Install location: %PluginFile%"
4515
  msgstr ""
4516
 
4517
- #: defaults.php:335
4518
- msgid "User deactivated a WordPress plugin"
4519
  msgstr ""
4520
 
4521
- #: defaults.php:336
4522
- msgid "User uninstalled a plugin"
4523
  msgstr ""
4524
 
4525
- #: defaults.php:337
4526
- msgid "User upgraded a plugin"
4527
  msgstr ""
4528
 
4529
- #: defaults.php:338
4530
- msgid "Plugin created tables"
4531
  msgstr ""
4532
 
4533
- #: defaults.php:338
4534
- msgid ""
4535
- "Plugin created this table in the database %LineBreak% Plugin: %Plugin->Name% "
4536
- "%LineBreak% Tables: %TableNames%"
4537
  msgstr ""
4538
 
4539
- #: defaults.php:339
4540
- msgid "Plugin modified tables structure"
4541
  msgstr ""
4542
 
4543
- #: defaults.php:339
4544
- msgid ""
4545
- "Plugin modified the structure of this table %LineBreak% Plugin: %Plugin->Name"
4546
- "% %LineBreak% Tables: %TableNames%"
4547
  msgstr ""
4548
 
4549
- #: defaults.php:340
4550
- msgid "Plugin deleted tables"
4551
  msgstr ""
4552
 
4553
- #: defaults.php:340
4554
- msgid ""
4555
- "Plugin deleted this table from the database %LineBreak% Plugin: %Plugin->Name"
4556
- "% %LineBreak% Tables: %TableNames%"
4557
  msgstr ""
4558
 
4559
- #: defaults.php:341
4560
- msgid "A plugin created a post"
4561
  msgstr ""
4562
 
4563
- #: defaults.php:341
4564
- msgid ""
4565
- "Plugin %PluginName% created the post %PostTitle% %LineBreak% Post ID: %PostID"
4566
- "% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
4567
- "%EditorLinkPage%"
4568
  msgstr ""
4569
 
4570
- #: defaults.php:342
4571
- msgid "A plugin deleted a post"
4572
  msgstr ""
4573
 
4574
- #: defaults.php:342
4575
- msgid ""
4576
- "Plugin %PluginName% deleted the post %PostTitle% %LineBreak% Post ID: %PostID"
4577
- "% %LineBreak% Type: %PostType%"
4578
  msgstr ""
4579
 
4580
- #: defaults.php:343
4581
- msgid "User changed a file using the plugin editor"
4582
  msgstr ""
4583
 
4584
- #: defaults.php:343
4585
- msgid "Modified a file with the plugin editor %LineBreak% File: %File%"
4586
  msgstr ""
4587
 
4588
- #: defaults.php:346
4589
- msgid "Themes"
4590
  msgstr ""
4591
 
4592
- #: defaults.php:347
4593
- msgid "User installed a theme"
4594
  msgstr ""
4595
 
4596
- #: defaults.php:347
4597
- msgid ""
4598
- "Theme: \"%Theme->Name%\" %LineBreak% Install location: %Theme-"
4599
- ">get_template_directory%"
4600
  msgstr ""
4601
 
4602
- #: defaults.php:348
4603
- msgid "User activated a theme"
4604
  msgstr ""
4605
 
4606
- #: defaults.php:348 defaults.php:349
4607
- msgid ""
4608
- "Theme \"%Theme->Name%\" %LineBreak% Install location: %Theme-"
4609
- ">get_template_directory%"
4610
  msgstr ""
4611
 
4612
- #: defaults.php:349
4613
- msgid "User uninstalled a theme"
4614
  msgstr ""
4615
 
4616
- #: defaults.php:350
4617
- msgid "Theme created tables"
4618
  msgstr ""
4619
 
4620
- #: defaults.php:350
4621
- msgid ""
4622
- "Theme created these tables in the database %LineBreak% Theme: %Theme->Name% "
4623
- "%LineBreak% Tables: %TableNames%"
4624
  msgstr ""
4625
 
4626
- #: defaults.php:351
4627
- msgid "Theme modified tables structure"
4628
  msgstr ""
4629
 
4630
- #: defaults.php:351
4631
- msgid ""
4632
- "Theme modified the structure of these database tables %LineBreak% Theme: "
4633
- "%Theme->Name% %LineBreak% Tables: %TableNames%"
4634
  msgstr ""
4635
 
4636
- #: defaults.php:352
4637
- msgid "Theme deleted tables"
4638
  msgstr ""
4639
 
4640
- #: defaults.php:352
4641
- msgid ""
4642
- "Theme deleted these tables from the database %LineBreak% Theme: %Theme->Name"
4643
- "% %LineBreak% Tables: %TableNames%"
4644
  msgstr ""
4645
 
4646
- #: defaults.php:353
4647
- msgid "User updated a theme"
4648
  msgstr ""
4649
 
4650
- #: defaults.php:353
4651
- msgid ""
4652
- "Name: %Theme->Name% %LineBreak% Install location: %Theme-"
4653
- ">get_template_directory%"
4654
  msgstr ""
4655
 
4656
- #: defaults.php:354
4657
- msgid "User changed a file using the theme editor"
4658
  msgstr ""
4659
 
4660
- #: defaults.php:354
4661
- msgid "Modified a file with the theme editor %LineBreak% File: %Theme%/%File%"
4662
  msgstr ""
4663
 
4664
- #: defaults.php:357
4665
- msgid "Themes on Multisite"
4666
  msgstr ""
4667
 
4668
- #: defaults.php:358
4669
- msgid "Activated theme on network"
4670
  msgstr ""
4671
 
4672
- #: defaults.php:358
4673
- msgid ""
4674
- "Network activated the theme %Theme->Name% %LineBreak% Install location: "
4675
- "%Theme->get_template_directory%"
4676
  msgstr ""
4677
 
4678
- #: defaults.php:359
4679
- msgid "Deactivated theme from network"
4680
  msgstr ""
4681
 
4682
- #: defaults.php:359
4683
- msgid ""
4684
- "Network deactivated the theme %Theme->Name% %LineBreak% Install location: "
4685
- "%Theme->get_template_directory%"
4686
  msgstr ""
4687
 
4688
- #: defaults.php:362
4689
- msgid "Database Events"
4690
  msgstr ""
4691
 
4692
- #: defaults.php:363
4693
- msgid "Unknown component created tables"
4694
  msgstr ""
4695
 
4696
- #: defaults.php:363
4697
- msgid ""
4698
- "An unknown component created these tables in the database %LineBreak% "
4699
- "Tables: %TableNames%"
4700
  msgstr ""
4701
 
4702
- #: defaults.php:364
4703
- msgid "Unknown component modified tables structure"
4704
  msgstr ""
4705
 
4706
- #: defaults.php:364
4707
- msgid ""
4708
- "An unknown component modified the structure of these database tables "
4709
- "%LineBreak% Tables: %TableNames%"
4710
  msgstr ""
4711
 
4712
- #: defaults.php:365
4713
- msgid "Unknown component deleted tables"
4714
  msgstr ""
4715
 
4716
- #: defaults.php:365
4717
- msgid ""
4718
- "An unknown component deleted these tables from the database %LineBreak% "
4719
- "Tables: %TableNames%"
4720
  msgstr ""
4721
 
4722
- #: defaults.php:366
4723
- msgid "WordPress created tables"
4724
  msgstr ""
4725
 
4726
- #: defaults.php:366
4727
- msgid ""
4728
- "WordPress created these tables in the database %LineBreak% Tables: "
4729
- "%TableNames%"
4730
  msgstr ""
4731
 
4732
- #: defaults.php:367
4733
- msgid "WordPress modified tables structure"
4734
  msgstr ""
4735
 
4736
- #: defaults.php:367
4737
- msgid ""
4738
- "WordPress modified the structure of these database tables %LineBreak% "
4739
- "Tables: %TableNames%"
4740
  msgstr ""
4741
 
4742
- #: defaults.php:368
4743
- msgid "WordPress deleted tables"
4744
  msgstr ""
4745
 
4746
- #: defaults.php:368
4747
- msgid ""
4748
- "WordPress deleted these tables from the database %LineBreak% Tables: "
4749
- "%TableNames%"
4750
  msgstr ""
4751
 
4752
- #: defaults.php:372
4753
- msgid "WordPress & System"
4754
  msgstr ""
4755
 
4756
- #: defaults.php:374
4757
- msgid "Unknown Error"
4758
  msgstr ""
4759
 
4760
- #: defaults.php:374
4761
- msgid "An unexpected error has occurred ."
4762
  msgstr ""
4763
 
4764
- #: defaults.php:375
4765
- msgid "PHP error"
4766
  msgstr ""
4767
 
4768
- #: defaults.php:375 defaults.php:376 defaults.php:377 defaults.php:378
4769
- #: defaults.php:379
4770
- msgid "%Message%."
4771
  msgstr ""
4772
 
4773
- #: defaults.php:376
4774
- msgid "PHP warning"
4775
  msgstr ""
4776
 
4777
- #: defaults.php:377
4778
- msgid "PHP notice"
4779
  msgstr ""
4780
 
4781
- #: defaults.php:378
4782
- msgid "PHP exception"
4783
  msgstr ""
4784
 
4785
- #: defaults.php:379
4786
- msgid "PHP shutdown error"
4787
  msgstr ""
4788
 
4789
- #: defaults.php:380
4790
- msgid "WordPress was updated"
4791
  msgstr ""
4792
 
4793
- #: defaults.php:380
4794
- msgid ""
4795
- "Updated WordPress %LineBreak% Previous version: %OldVersion% %LineBreak% New "
4796
- "version: %NewVersion%"
4797
  msgstr ""
4798
 
4799
- #: defaults.php:381
4800
- msgid "Advertising Extensions"
4801
  msgstr ""
4802
 
4803
- #: defaults.php:381
4804
- msgid "%PromoName% %PromoMessage%"
4805
  msgstr ""
4806
 
4807
- #: defaults.php:384
4808
- msgid "Activity log plugin"
4809
  msgstr ""
4810
 
4811
- #: defaults.php:385
4812
- msgid "Events automatically pruned by system"
4813
  msgstr ""
4814
 
4815
- #: defaults.php:385
4816
- msgid "System automatically deleted %EventCount% event(s)"
4817
  msgstr ""
4818
 
4819
- #: defaults.php:386
4820
- msgid "Reset plugin's settings to default"
4821
  msgstr ""
4822
 
4823
- #: defaults.php:386
4824
- msgid "Reset the WP Activity Log plugin settings to default"
4825
  msgstr ""
4826
 
4827
- #: defaults.php:387
4828
- msgid "Purged the activity log"
4829
  msgstr ""
4830
 
4831
- #: defaults.php:390
4832
- msgid "User/Visitor Actions"
4833
  msgstr ""
4834
 
4835
- #: defaults.php:391
4836
- msgid "User requests non-existing pages (404 Error Pages)"
4837
  msgstr ""
4838
 
4839
- #: defaults.php:391
4840
- msgid ""
4841
- "Has requested a non existing page (404 error) %LineBreak% Number of times: "
4842
- "%Attempts%"
4843
  msgstr ""
4844
 
4845
- #: defaults.php:392
4846
- msgid "Website Visitor User requests non-existing pages (404 Error Pages)"
4847
  msgstr ""
4848
 
4849
- #: defaults.php:392
4850
- msgid ""
4851
- "Website visitor has requested a non existing page (404 error) %LineBreak% "
4852
- "Number of times: %Attempts%"
4853
  msgstr ""
4854
 
4855
- #: defaults.php:395
4856
- msgid "WordPress Site Settings"
4857
  msgstr ""
4858
 
4859
- #: defaults.php:396
4860
- msgid "Option Anyone Can Register in WordPress settings changed"
4861
  msgstr ""
4862
 
4863
- #: defaults.php:396
4864
- msgid "The option Anyone can register"
4865
  msgstr ""
4866
 
4867
- #: defaults.php:397
4868
- msgid "New User Default Role changed"
 
4869
  msgstr ""
4870
 
4871
- #: defaults.php:397
4872
- msgid ""
4873
- "Changed the new user default role %LineBreak% Previous role: %OldRole% "
4874
- "%LineBreak% New role: %NewRole%"
4875
  msgstr ""
4876
 
4877
- #: defaults.php:398
4878
- msgid "WordPress Administrator Notification email changed"
4879
  msgstr ""
4880
 
4881
- #: defaults.php:398
4882
- msgid ""
4883
- "Changed the WordPress administrator notification email address %LineBreak% "
4884
- "Previous address %OldEmail% %LineBreak% New address: %NewEmail%"
4885
  msgstr ""
4886
 
4887
- #: defaults.php:399
4888
- msgid "User changes the WordPress Permalinks"
4889
  msgstr ""
4890
 
4891
- #: defaults.php:399
4892
- msgid ""
4893
- "Changed the WordPress permalinks %LineBreak% Previous permalinks: %OldPattern"
4894
- "% %LineBreak% New permalinks: %NewPattern%"
4895
  msgstr ""
4896
 
4897
- #: defaults.php:400
4898
- msgid ""
4899
- "Enabled/Disabled the option Discourage search engines from indexing this site"
4900
  msgstr ""
4901
 
4902
- #: defaults.php:400
4903
- msgid "Discourage search engines from indexing this site."
4904
  msgstr ""
4905
 
4906
- #: defaults.php:401
4907
- msgid "Enabled/Disabled comments on all the website"
4908
  msgstr ""
4909
 
4910
- #: defaults.php:401
4911
- msgid "Comments on the website"
4912
  msgstr ""
4913
 
4914
- #: defaults.php:402
4915
- msgid "Enabled/Disabled the option Comment author must fill out name and email"
4916
  msgstr ""
4917
 
4918
- #: defaults.php:402
4919
- msgid "The option Comment author must fill out name and email"
4920
  msgstr ""
4921
 
4922
- #: defaults.php:403
4923
- msgid ""
4924
- "Enabled/Disabled the option Users must be logged in and registered to comment"
4925
  msgstr ""
4926
 
4927
- #: defaults.php:403
4928
- msgid "The option Users must be logged in and registered to comment"
4929
  msgstr ""
4930
 
4931
- #: defaults.php:404
4932
- msgid "Enabled/Disabled the option to automatically close comments"
4933
  msgstr ""
4934
 
4935
- #: defaults.php:404
4936
- msgid "The option to Automatically close comments after %Value% days"
4937
  msgstr ""
4938
 
4939
- #: defaults.php:405
4940
- msgid "Changed the value of the option Automatically close comments"
4941
  msgstr ""
4942
 
4943
- #: defaults.php:405
4944
- msgid ""
4945
- "Changed the value of the option to Automatically close comments after a "
4946
- "number of days %LineBreak% Previous value: %OldValue% %LineBreak% New value: "
4947
- "%NewValue%"
4948
  msgstr ""
4949
 
4950
- #: defaults.php:406
4951
- msgid "Enabled/Disabled the option for comments to be manually approved"
4952
  msgstr ""
4953
 
4954
- #: defaults.php:406
4955
- msgid "The option for comments to be manually approved"
4956
  msgstr ""
4957
 
4958
- #: defaults.php:407
4959
- msgid ""
4960
- "Enabled/Disabled the option for an author to have previously approved "
4961
- "comments for the comments to appear"
4962
  msgstr ""
4963
 
4964
- #: defaults.php:407
4965
- msgid ""
4966
- "The option for an author to have previously approved comments for the "
4967
- "comments to appear"
4968
  msgstr ""
4969
 
4970
- #: defaults.php:408
4971
- msgid ""
4972
- "Changed the number of links that a comment must have to be held in the queue"
4973
  msgstr ""
4974
 
4975
- #: defaults.php:408
4976
- msgid ""
4977
- "Changed the minimum number of links a comment must have to be held in the "
4978
- "queue %LineBreak% Previous value: %OldValue% %LineBreak% New value: %NewValue"
4979
- "%"
4980
  msgstr ""
4981
 
4982
- #: defaults.php:409
4983
- msgid "Modified the list of keywords for comments moderation"
4984
  msgstr ""
4985
 
4986
- #: defaults.php:409
4987
- msgid "Modified the list of keywords for comments medoration"
4988
  msgstr ""
4989
 
4990
- #: defaults.php:410
4991
- msgid "Modified the list of keywords for comments blacklisting"
4992
  msgstr ""
4993
 
4994
- #: defaults.php:411
4995
- msgid "Option WordPress Address (URL) in WordPress settings changed"
4996
  msgstr ""
4997
 
4998
- #: defaults.php:411
4999
- msgid ""
5000
- "Changed the WordPress address (URL) %LineBreak% Previous URL: %old_url% "
5001
- "%LineBreak% New URL: %new_url%"
5002
  msgstr ""
5003
 
5004
- #: defaults.php:412
5005
- msgid "Option Site Address (URL) in WordPress settings changed"
5006
  msgstr ""
5007
 
5008
- #: defaults.php:412
5009
- msgid ""
5010
- "Changed the site address (URL) %LineBreak% Previous URL: %old_url% %LineBreak"
5011
- "% New URL: %new_url%"
5012
  msgstr ""
5013
 
5014
- #: defaults.php:416
5015
- msgid "Multisite Network Sites"
5016
  msgstr ""
5017
 
5018
- #: defaults.php:418
5019
- msgid "New site added on the network"
5020
  msgstr ""
5021
 
5022
- #: defaults.php:418
5023
- msgid "New site on the network: %SiteName% %LineBreak% URL: %BlogURL%"
5024
  msgstr ""
5025
 
5026
- #: defaults.php:419
5027
- msgid "Existing site archived"
5028
  msgstr ""
5029
 
5030
- #: defaults.php:419
5031
- msgid "Archived the site: %SiteName% %LineBreak% URL: %BlogURL%"
5032
  msgstr ""
5033
 
5034
- #: defaults.php:420
5035
- msgid "Archived site has been unarchived"
5036
  msgstr ""
5037
 
5038
- #: defaults.php:420
5039
- msgid "Unarchived the site: %SiteName% %LineBreak% URL: %BlogURL%"
5040
  msgstr ""
5041
 
5042
- #: defaults.php:421
5043
- msgid "Deactivated site has been activated"
5044
  msgstr ""
5045
 
5046
- #: defaults.php:421
5047
- msgid "Activated the site: %SiteName% %LineBreak% URL: %BlogURL%"
5048
  msgstr ""
5049
 
5050
- #: defaults.php:422
5051
- msgid "Site has been deactivated"
5052
  msgstr ""
5053
 
5054
- #: defaults.php:422
5055
- msgid "Deactivated the site: %SiteName% %LineBreak% URL: %BlogURL%"
5056
  msgstr ""
5057
 
5058
- #: defaults.php:423
5059
- msgid "Existing site deleted from network"
5060
  msgstr ""
5061
 
5062
- #: defaults.php:423
5063
- msgid "The site: %SiteName% %LineBreak% URL: %BlogURL%"
5064
  msgstr ""
5065
 
5066
- #: defaults.php:429
5067
- msgid "User changed title of a SEO post"
5068
  msgstr ""
5069
 
5070
- #: defaults.php:429
5071
- msgid ""
5072
- "Changed the Meta title of the post %PostTitle% %LineBreak% ID: %PostID% "
5073
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
5074
- "Previous title: %OldSEOTitle% %LineBreak% New title: %NewSEOTitle% %LineBreak"
5075
- "% %EditorLinkPost%"
5076
  msgstr ""
5077
 
5078
- #: defaults.php:430
5079
- msgid "User changed the meta description of a SEO post"
5080
  msgstr ""
5081
 
5082
- #: defaults.php:430
5083
- msgid ""
5084
- "Changed the Meta Description of the post %PostTitle% %LineBreak% ID: %PostID"
5085
- "% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
5086
- "Previous description: %old_desc% %LineBreak% New description: %new_desc% "
5087
- "%LineBreak% %EditorLinkPost%"
5088
  msgstr ""
5089
 
5090
- #: defaults.php:431
5091
- msgid ""
5092
- "User changed setting to allow search engines to show post in search results "
5093
- "of a SEO post"
5094
  msgstr ""
5095
 
5096
- #: defaults.php:431
5097
- msgid ""
5098
- "Changed the setting to allow search engines to show post in search results "
5099
- "for the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType"
5100
- "% %LineBreak% Status: %PostStatus% %LineBreak% Previous setting: %OldStatus% "
5101
- "%LineBreak% New setting: %NewStatus% %LineBreak% %EditorLinkPost%"
5102
  msgstr ""
5103
 
5104
- #: defaults.php:432
5105
- msgid ""
5106
- "User Enabled/Disabled the option for search engine to follow links of a SEO "
5107
- "post"
5108
  msgstr ""
5109
 
5110
- #: defaults.php:432
5111
- msgid ""
5112
- "The option for search engine to follow links in post %PostTitle% %LineBreak% "
5113
- "ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% "
5114
- "%LineBreak% %EditorLinkPost%"
5115
  msgstr ""
5116
 
5117
- #: defaults.php:433
5118
- msgid "User set the meta robots advanced setting of a SEO post"
5119
  msgstr ""
5120
 
5121
- #: defaults.php:433
5122
- msgid ""
5123
- "Changed the Meta Robots Advanced setting for the post %PostTitle% %LineBreak"
5124
- "% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% "
5125
- "%LineBreak% Previous setting: %OldStatus% %LineBreak% New setting: %NewStatus"
5126
- "% %LineBreak% %EditorLinkPost%"
5127
  msgstr ""
5128
 
5129
- #: defaults.php:434
5130
- msgid "User changed the canonical URL of a SEO post"
5131
  msgstr ""
5132
 
5133
- #: defaults.php:434
5134
- msgid ""
5135
- "Changed the Canonical URL of the post %PostTitle% %LineBreak% ID: %PostID% "
5136
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
5137
- "Previous URL: %OldCanonicalUrl% %LineBreak% New URL: %NewCanonicalUrl% "
5138
- "%LineBreak% %EditorLinkPost%"
5139
  msgstr ""
5140
 
5141
- #: defaults.php:435
5142
- msgid "User changed the focus keyword of a SEO post"
5143
  msgstr ""
5144
 
5145
- #: defaults.php:435
5146
- msgid ""
5147
- "Changed the focus keyword for the post %PostTitle% %LineBreak% ID: %PostID% "
5148
- "%LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% "
5149
- "Previous keyword: %old_keywords% %LineBreak% New keyword: %new_keywords% "
5150
- "%LineBreak% %EditorLinkPost%"
5151
  msgstr ""
5152
 
5153
- #: defaults.php:436
5154
- msgid "User Enabled/Disabled the option Cornerston Content of a SEO post"
5155
  msgstr ""
5156
 
5157
- #: defaults.php:436
5158
- msgid ""
5159
- "The option Cornerstone Content in the post %PostTitle% %LineBreak% ID: "
5160
- "%PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% "
5161
- "%LineBreak% %EditorLinkPost%"
5162
  msgstr ""
5163
 
5164
- #: defaults.php:439
5165
- msgid "Website Changes"
5166
  msgstr ""
5167
 
5168
- #: defaults.php:440
5169
- msgid "User changed the Title Separator setting"
5170
  msgstr ""
5171
 
5172
- #: defaults.php:440
5173
- msgid ""
5174
- "Changed the default title separator %LineBreak% Previous separator: %old% "
5175
- "%LineBreak% New separator: %new%"
5176
  msgstr ""
5177
 
5178
- #: defaults.php:441
5179
- msgid "User changed the Homepage Title setting"
5180
  msgstr ""
5181
 
5182
- #: defaults.php:441
5183
- msgid ""
5184
- "Changed the homepage Meta title %LineBreak% Previous title: %old% %LineBreak"
5185
- "% New title: %new%"
5186
  msgstr ""
5187
 
5188
- #: defaults.php:442
5189
- msgid "User changed the Homepage Meta description setting"
5190
  msgstr ""
5191
 
5192
- #: defaults.php:442
5193
- msgid ""
5194
- "Changed the homepage Meta description %LineBreak% Previous description: %old"
5195
- "% %LineBreak% New description: %new%"
5196
  msgstr ""
5197
 
5198
- #: defaults.php:443
5199
- msgid "User changed the Company or Person setting"
5200
  msgstr ""
5201
 
5202
- #: defaults.php:443
5203
- msgid ""
5204
- "Changed the Company or Person setting %LineBreak% Previous setting: %old% "
5205
- "%LineBreak% New setting: %new%"
5206
  msgstr ""
5207
 
5208
- #: defaults.php:446
5209
- msgid "Plugin Settings Changes"
5210
  msgstr ""
5211
 
5212
- #: defaults.php:447
5213
- msgid ""
5214
- "User Enabled/Disabled the option Show Posts/Pages in Search Results in the "
5215
- "Yoast SEO plugin settings"
5216
  msgstr ""
5217
 
5218
- #: defaults.php:447
5219
- msgid "The option to show %SEOPostType% in search results"
5220
  msgstr ""
5221
 
5222
- #: defaults.php:448
5223
- msgid ""
5224
- "User changed the Posts/Pages title template in the Yoast SEO plugin settings"
5225
  msgstr ""
5226
 
5227
- #: defaults.php:448
5228
- msgid ""
5229
- "Changed the %SEOPostType% Meta (SEO) title template %LineBreak% Previous "
5230
- "template: %old% %LineBreak% New template: %new%"
5231
  msgstr ""
5232
 
5233
- #: defaults.php:449
5234
- msgid "User Enabled/Disabled SEO analysis in the Yoast SEO plugin settings"
5235
  msgstr ""
5236
 
5237
- #: defaults.php:449
5238
- msgid "The SEO Analysis feature"
5239
  msgstr ""
5240
 
5241
- #: defaults.php:450
5242
- msgid ""
5243
- "User Enabled/Disabled readability analysis in the Yoast SEO plugin settings"
5244
  msgstr ""
5245
 
5246
- #: defaults.php:450
5247
- msgid "The Readability Analysis feature"
5248
  msgstr ""
5249
 
5250
- #: defaults.php:451
5251
- msgid ""
5252
- "User Enabled/Disabled cornerstone content in the Yoast SEO plugin settings"
5253
  msgstr ""
5254
 
5255
- #: defaults.php:451
5256
- msgid "The Cornerstone content feature"
5257
  msgstr ""
5258
 
5259
- #: defaults.php:452
5260
- msgid ""
5261
- "User Enabled/Disabled the text link counter in the Yoast SEO plugin settings"
5262
  msgstr ""
5263
 
5264
- #: defaults.php:452
5265
- msgid "The Text link counter feature"
5266
  msgstr ""
5267
 
5268
- #: defaults.php:453
5269
- msgid "User Enabled/Disabled XML sitemaps in the Yoast SEO plugin settings"
5270
  msgstr ""
5271
 
5272
- #: defaults.php:453
5273
- msgid "The XML sitemap feature"
5274
  msgstr ""
5275
 
5276
- #: defaults.php:454
5277
- msgid "User Enabled/Disabled ryte integration in the Yoast SEO plugin settings"
5278
  msgstr ""
5279
 
5280
- #: defaults.php:454
5281
- msgid "The Ryte integration feature"
5282
  msgstr ""
5283
 
5284
- #: defaults.php:455
5285
- msgid ""
5286
- "User Enabled/Disabled the admin bar menu in the Yoast SEO plugin settings"
5287
  msgstr ""
5288
 
5289
- #: defaults.php:455
5290
- msgid "The Admin bar menu feature"
5291
  msgstr ""
5292
 
5293
- #: defaults.php:456
5294
- msgid ""
5295
- "User changed the Posts/Pages meta description template in the Yoast SEO "
5296
- "plugin settings"
5297
  msgstr ""
5298
 
5299
- #: defaults.php:456
5300
- msgid ""
5301
- "Changed the %SEOPostType% Meta description template %LineBreak% Previous "
5302
- "template: %old% New template: %new%"
5303
  msgstr ""
5304
 
5305
- #: defaults.php:457
5306
- msgid ""
5307
- "User set the option Date in Snippet Preview for Posts/Pages in the Yoast SEO "
5308
- "plugin settings"
5309
  msgstr ""
5310
 
5311
- #: defaults.php:457
5312
- msgid "The option Date in Snippet Preview for %SEOPostType%"
 
5313
  msgstr ""
5314
 
5315
- #: defaults.php:458
5316
- msgid ""
5317
- "User set the option Yoast SEO Meta Box for Posts/Pages in the Yoast SEO "
5318
- "plugin settings"
5319
  msgstr ""
5320
 
5321
- #: defaults.php:458
5322
- msgid "The option Yoast SEO Meta Box for %SEOPostType%"
5323
  msgstr ""
5324
 
5325
- #: defaults.php:459
5326
- msgid ""
5327
- "User Enabled/Disabled the advanced settings for authors in the Yoast SEO "
5328
- "plugin settings"
5329
  msgstr ""
5330
 
5331
- #: defaults.php:459
5332
- msgid "The Security: no advanced settings for authors feature"
5333
  msgstr ""
5334
 
5335
- #: defaults.php:470
5336
- msgid "Dummy"
5337
  msgstr ""
5338
 
5339
- #: extensions/class-wsal-extension-manager.php:216
5340
- #: extensions/external-db/classes/Settings.php:109
5341
- #: extensions/external-db/classes/Settings.php:618
5342
- msgid "External Storage"
5343
  msgstr ""
5344
 
5345
- #: extensions/class-wsal-extension-manager.php:257
5346
- #: extensions/class-wsal-extension-manager.php:297
5347
- #: extensions/class-wsal-extension-manager.php:321
5348
- #: extensions/external-db/classes/Mirroring.php:658
5349
- #: extensions/external-db/classes/Settings.php:121
5350
- msgid "Mirroring"
5351
  msgstr ""
5352
 
5353
- #: extensions/class-wsal-extension-manager.php:374
5354
- #: extensions/external-db/classes/Settings.php:115
5355
- #: extensions/external-db/classes/Settings.php:870
5356
- msgid "Archiving"
5357
  msgstr ""
5358
 
5359
  #: extensions/email-notifications/classes/AddNotification.php:58
@@ -5364,8 +4111,7 @@ msgstr ""
5364
  msgid "Add notification"
5365
  msgstr ""
5366
 
5367
- #: extensions/email-notifications/classes/AddNotification.php:236
5368
- #: extensions/email-notifications/classes/EditNotification.php:240
5369
  msgid "Back"
5370
  msgstr ""
5371
 
@@ -5373,433 +4119,271 @@ msgstr ""
5373
  msgid "You have reached the maximum number of notifications you can add."
5374
  msgstr ""
5375
 
5376
- #: extensions/email-notifications/classes/AddNotification.php:297
5377
- #: extensions/email-notifications/classes/EditNotification.php:348
5378
- #: extensions/email-notifications/classes/Notifications.php:832
5379
- #: extensions/email-notifications/classes/Notifications.php:952
5380
- #: extensions/email-notifications/classes/Notifications.php:1361
5381
- #: extensions/email-notifications/classes/Notifications.php:1525
5382
- #: extensions/email-notifications/classes/Notifications.php:1619
5383
- #: extensions/email-notifications/classes/Notifications.php:1785
5384
- #: extensions/email-notifications/classes/SMSProviderSettings.php:237
5385
- #, php-format
5386
  msgid "Click %s to configure Twilio integration for SMS notifications."
5387
  msgstr ""
5388
 
5389
- #: extensions/email-notifications/classes/AddNotification.php:297
5390
- #: extensions/email-notifications/classes/EditNotification.php:348
5391
- #: extensions/email-notifications/classes/Notifications.php:832
5392
- #: extensions/email-notifications/classes/Notifications.php:952
5393
- #: extensions/email-notifications/classes/Notifications.php:1361
5394
- #: extensions/email-notifications/classes/Notifications.php:1525
5395
- #: extensions/email-notifications/classes/Notifications.php:1619
5396
- #: extensions/email-notifications/classes/Notifications.php:1785
5397
- #: extensions/email-notifications/classes/SMSProviderSettings.php:237
5398
  msgid "here"
5399
  msgstr ""
5400
 
5401
- #: extensions/email-notifications/classes/AddNotification.php:305
5402
- #: extensions/email-notifications/classes/EditNotification.php:356
5403
- #, php-format
5404
- msgid ""
5405
- "Configure the triggers that should match for an email and / or SMS "
5406
- "notification to be sent. You can add up to 20 triggers, use the AND and OR "
5407
- "operands, and also group triggers together. Refer to the %s for more "
5408
- "information."
5409
- msgstr ""
5410
-
5411
- #: extensions/email-notifications/classes/AddNotification.php:305
5412
- #: extensions/email-notifications/classes/EditNotification.php:356
5413
  msgid "Trigger groups documentation"
5414
  msgstr ""
5415
 
5416
- #: extensions/email-notifications/classes/AddNotification.php:310
5417
- #: extensions/email-notifications/classes/EditNotification.php:361
5418
  msgid "Triggers"
5419
  msgstr ""
5420
 
5421
- #: extensions/email-notifications/classes/AddNotification.php:311
5422
- #: extensions/email-notifications/classes/EditNotification.php:362
5423
  msgid "Add Trigger"
5424
  msgstr ""
5425
 
5426
- #: extensions/email-notifications/classes/AddNotification.php:325
5427
- #: extensions/email-notifications/classes/EditNotification.php:405
5428
  msgid "Use default email template"
5429
  msgstr ""
5430
 
5431
- #: extensions/email-notifications/classes/AddNotification.php:330
5432
- #: extensions/email-notifications/classes/EditNotification.php:414
5433
  msgid "Use event specific email template"
5434
  msgstr ""
5435
 
5436
- #: extensions/email-notifications/classes/AddNotification.php:355
5437
- #: extensions/email-notifications/classes/EditNotification.php:447
5438
- #: extensions/external-db/classes/Connections.php:95
5439
- #: extensions/external-db/classes/Mirroring.php:123
5440
  msgid "Name"
5441
  msgstr ""
5442
 
5443
- #: extensions/email-notifications/classes/AddNotification.php:356
5444
- #: extensions/email-notifications/classes/EditNotification.php:448
5445
- #: extensions/email-notifications/classes/Notifications.php:1959
5446
- #: extensions/email-notifications/classes/Notifications.php:1970
5447
  msgid "Title"
5448
  msgstr ""
5449
 
5450
- #: extensions/email-notifications/classes/AddNotification.php:364
5451
- #: extensions/email-notifications/classes/EditNotification.php:456
5452
- #: extensions/email-notifications/classes/Notifications.php:969
5453
- #: extensions/email-notifications/classes/Notifications.php:992
5454
- #: extensions/email-notifications/classes/Notifications.php:1009
5455
- #: extensions/email-notifications/classes/Notifications.php:1026
5456
- #: extensions/email-notifications/classes/Notifications.php:1043
5457
- #: extensions/email-notifications/classes/Notifications.php:1067
5458
- #: extensions/email-notifications/classes/Notifications.php:1091
5459
- #: extensions/email-notifications/classes/Notifications.php:1106
5460
- #: extensions/email-notifications/classes/Notifications.php:1121
5461
- #: extensions/email-notifications/classes/Notifications.php:1143
5462
- #: extensions/email-notifications/classes/Notifications.php:1156
5463
- #: extensions/email-notifications/classes/Notifications.php:1169
5464
- #: extensions/email-notifications/classes/Notifications.php:1182
5465
- #: extensions/email-notifications/classes/Notifications.php:1195
5466
- #: extensions/email-notifications/classes/Notifications.php:1208
5467
- #: extensions/email-notifications/classes/Notifications.php:1232
5468
- #: extensions/email-notifications/classes/Notifications.php:1247
5469
- #: extensions/email-notifications/classes/Notifications.php:1262
5470
- #: extensions/email-notifications/classes/Notifications.php:1277
5471
- #: extensions/email-notifications/classes/Notifications.php:1292
5472
- #: extensions/email-notifications/classes/Notifications.php:1314
5473
- #: extensions/email-notifications/classes/Notifications.php:1379
5474
- #: extensions/email-notifications/classes/Notifications.php:1394
5475
- #: extensions/email-notifications/classes/Notifications.php:1409
5476
- #: extensions/email-notifications/classes/Notifications.php:1433
5477
- #: extensions/email-notifications/classes/Notifications.php:1448
5478
- #: extensions/email-notifications/classes/Notifications.php:1463
5479
- #: extensions/email-notifications/classes/Notifications.php:1478
5480
- #: extensions/email-notifications/classes/Notifications.php:1540
5481
- #: extensions/email-notifications/classes/Notifications.php:1555
5482
- #: extensions/email-notifications/classes/Notifications.php:1570
5483
- #: extensions/email-notifications/classes/Notifications.php:1634
5484
- #: extensions/email-notifications/classes/Notifications.php:1651
5485
- #: extensions/email-notifications/classes/Notifications.php:1668
5486
- #: extensions/email-notifications/classes/Notifications.php:1685
5487
- #: extensions/email-notifications/classes/Notifications.php:1702
5488
- #: extensions/email-notifications/classes/Notifications.php:1719
5489
- #: extensions/email-notifications/classes/Notifications.php:1736
5490
- #: extensions/email-notifications/classes/Notifications.php:1802
5491
- #: extensions/email-notifications/classes/Notifications.php:1819
5492
- #: extensions/email-notifications/classes/Notifications.php:1836
5493
- #: extensions/email-notifications/classes/Notifications.php:1853
5494
- #: extensions/user-sessions/classes/View/Sessions.php:349
5495
  msgid "Email"
5496
  msgstr ""
5497
 
5498
- #: extensions/email-notifications/classes/AddNotification.php:370
5499
- #: extensions/email-notifications/classes/EditNotification.php:462
5500
- #: extensions/email-notifications/classes/Notifications.php:995
5501
- #: extensions/email-notifications/classes/Notifications.php:1012
5502
- #: extensions/email-notifications/classes/Notifications.php:1029
5503
- #: extensions/email-notifications/classes/Notifications.php:1046
5504
- #: extensions/email-notifications/classes/Notifications.php:1070
5505
- #: extensions/email-notifications/classes/Notifications.php:1094
5506
- #: extensions/email-notifications/classes/Notifications.php:1109
5507
- #: extensions/email-notifications/classes/Notifications.php:1124
5508
- #: extensions/email-notifications/classes/Notifications.php:1146
5509
- #: extensions/email-notifications/classes/Notifications.php:1159
5510
- #: extensions/email-notifications/classes/Notifications.php:1172
5511
- #: extensions/email-notifications/classes/Notifications.php:1185
5512
- #: extensions/email-notifications/classes/Notifications.php:1198
5513
- #: extensions/email-notifications/classes/Notifications.php:1211
5514
- #: extensions/email-notifications/classes/Notifications.php:1235
5515
- #: extensions/email-notifications/classes/Notifications.php:1250
5516
- #: extensions/email-notifications/classes/Notifications.php:1265
5517
- #: extensions/email-notifications/classes/Notifications.php:1280
5518
- #: extensions/email-notifications/classes/Notifications.php:1295
5519
- #: extensions/email-notifications/classes/Notifications.php:1317
5520
- #: extensions/email-notifications/classes/Notifications.php:1382
5521
- #: extensions/email-notifications/classes/Notifications.php:1397
5522
- #: extensions/email-notifications/classes/Notifications.php:1412
5523
- #: extensions/email-notifications/classes/Notifications.php:1436
5524
- #: extensions/email-notifications/classes/Notifications.php:1451
5525
- #: extensions/email-notifications/classes/Notifications.php:1466
5526
- #: extensions/email-notifications/classes/Notifications.php:1481
5527
- #: extensions/email-notifications/classes/Notifications.php:1543
5528
- #: extensions/email-notifications/classes/Notifications.php:1558
5529
- #: extensions/email-notifications/classes/Notifications.php:1573
5530
- #: extensions/email-notifications/classes/Notifications.php:1637
5531
- #: extensions/email-notifications/classes/Notifications.php:1654
5532
- #: extensions/email-notifications/classes/Notifications.php:1671
5533
- #: extensions/email-notifications/classes/Notifications.php:1688
5534
- #: extensions/email-notifications/classes/Notifications.php:1705
5535
- #: extensions/email-notifications/classes/Notifications.php:1722
5536
- #: extensions/email-notifications/classes/Notifications.php:1739
5537
- #: extensions/email-notifications/classes/Notifications.php:1805
5538
- #: extensions/email-notifications/classes/Notifications.php:1822
5539
- #: extensions/email-notifications/classes/Notifications.php:1839
5540
- #: extensions/email-notifications/classes/Notifications.php:1856
5541
  msgid "Mobile Number"
5542
  msgstr ""
5543
 
5544
- #: extensions/email-notifications/classes/AddNotification.php:374
5545
- msgid ""
5546
- "Specify the email addresses, WordPress usernames or phone numbers of those "
5547
- "who should receive the notification once the trigger is matched. To specify "
5548
- "multiple recipients separate them with a comma (,)."
5549
- msgstr ""
5550
-
5551
- #: extensions/email-notifications/classes/Common.php:439
5552
- #: extensions/email-notifications/classes/Common.php:504
5553
  msgid "The form is not valid. Please reload the page and try again."
5554
  msgstr ""
5555
 
5556
- #: extensions/email-notifications/classes/Common.php:450
5557
- #: extensions/email-notifications/classes/Common.php:465
5558
- msgid "The EVENT ID is not valid."
5559
  msgstr ""
5560
 
5561
- #: extensions/email-notifications/classes/Common.php:456
5562
- msgid "Internal Error. Please reload the page and try again."
5563
  msgstr ""
5564
 
5565
- #: extensions/email-notifications/classes/Common.php:472
5566
- msgid "The USERNAME is not valid. Maximum of 50 characters allowed."
5567
  msgstr ""
5568
 
5569
- #: extensions/email-notifications/classes/Common.php:478
5570
- msgid "The USERNAME does not exist."
5571
  msgstr ""
5572
 
5573
- #: extensions/email-notifications/classes/Common.php:482
5574
- #: extensions/email-notifications/classes/Common.php:561
5575
- #: extensions/email-notifications/classes/Common.php:581
5576
- #: extensions/email-notifications/classes/Common.php:604
5577
- #: extensions/email-notifications/classes/Common.php:617
5578
- #: extensions/email-notifications/classes/Common.php:631
5579
- #: extensions/email-notifications/classes/Common.php:641
5580
- #, php-format
5581
- msgid "%s is not valid"
5582
  msgstr ""
5583
 
5584
- #: extensions/email-notifications/classes/Common.php:491
5585
- msgid "Selected USER ROLE is not valid."
5586
  msgstr ""
5587
 
5588
- #: extensions/email-notifications/classes/Common.php:498
5589
- msgid "The SOURCE IP is not valid. Maximum of 15 characters allowed."
5590
  msgstr ""
5591
 
5592
- #: extensions/email-notifications/classes/Common.php:513
5593
- msgid "The SOURCE IP is not valid."
5594
  msgstr ""
5595
 
5596
- #: extensions/email-notifications/classes/Common.php:522
5597
- msgid "The SOURCE IP fragment is not valid."
5598
  msgstr ""
5599
 
5600
- #: extensions/email-notifications/classes/Common.php:539
5601
- msgid "DATE is not valid."
5602
  msgstr ""
5603
 
5604
- #: extensions/email-notifications/classes/Common.php:548
5605
- #: extensions/email-notifications/classes/Common.php:554
5606
- msgid "TIME is not valid."
5607
  msgstr ""
5608
 
5609
- #: extensions/email-notifications/classes/Common.php:575
5610
- #: extensions/email-notifications/classes/Common.php:598
5611
- #, php-format
5612
- msgid "%s was not found"
5613
  msgstr ""
5614
 
5615
- #: extensions/email-notifications/classes/Common.php:592
5616
- msgid "The enviroment is not multisite."
5617
  msgstr ""
5618
 
5619
- #: extensions/email-notifications/classes/Common.php:613
5620
- msgid "Selected POST TYPE is not valid."
5621
  msgstr ""
5622
 
5623
- #: extensions/email-notifications/classes/Common.php:626
5624
- msgid "Selected POST STATUS is not valid."
5625
  msgstr ""
5626
 
5627
- #: extensions/email-notifications/classes/Common.php:637
5628
- msgid "Selected OBJECT is not valid."
5629
  msgstr ""
5630
 
5631
- #: extensions/email-notifications/classes/Common.php:647
5632
- msgid "Selected TYPE is not valid."
5633
  msgstr ""
5634
 
5635
- #: extensions/email-notifications/classes/Common.php:872
5636
- #: extensions/email-notifications/classes/Common.php:900
5637
- #: extensions/email-notifications/classes/Common.php:902
5638
  msgid "Title is required."
5639
  msgstr ""
5640
 
5641
- #: extensions/email-notifications/classes/Common.php:909
5642
  msgid "Title is not valid."
5643
  msgstr ""
5644
 
5645
- #: extensions/email-notifications/classes/Common.php:919
5646
  msgid "Please add at least one condition."
5647
  msgstr ""
5648
 
5649
- #: extensions/email-notifications/classes/Common.php:967
5650
- #: extensions/email-notifications/classes/Common.php:973
5651
- #: extensions/email-notifications/classes/Common.php:978
5652
  msgid "The form is not valid. Please refresh the page and try again."
5653
  msgstr ""
5654
 
5655
- #: extensions/email-notifications/classes/Common.php:987
5656
  msgid "A trigger's condition must not be longer than 50 characters."
5657
  msgstr ""
5658
 
5659
- #: extensions/email-notifications/classes/Common.php:1017
5660
- msgid "Email or Username is required."
5661
  msgstr ""
5662
 
5663
- #: extensions/email-notifications/classes/Common.php:1018
5664
- msgid "Mobile number is required."
5665
  msgstr ""
5666
 
5667
- #: extensions/email-notifications/classes/Common.php:1023
5668
- msgid "Email or Username is not valid."
5669
  msgstr ""
5670
 
5671
- #: extensions/email-notifications/classes/Common.php:1030
5672
- msgid "Mobile number is not valid."
5673
  msgstr ""
5674
 
5675
- #: extensions/email-notifications/classes/Common.php:1082
5676
- #: extensions/email-notifications/classes/Notifications.php:592
5677
  msgid "Notification could not be saved."
5678
  msgstr ""
5679
 
5680
- #: extensions/email-notifications/classes/Common.php:1089
5681
- #: extensions/email-notifications/classes/Notifications.php:651
5682
  msgid "Notification successfully saved."
5683
  msgstr ""
5684
 
5685
- #: extensions/email-notifications/classes/Common.php:1167
5686
- #: extensions/email-notifications/classes/Common.php:1229
5687
  msgid "Notification {title} on website {site} triggered"
5688
  msgstr ""
5689
 
5690
- #: extensions/email-notifications/classes/Common.php:1168
5691
- #: extensions/email-notifications/classes/Common.php:1230
5692
- msgid ""
5693
- "Notification <strong>{title}</strong> was triggered. Below are the "
5694
- "notification details:"
5695
  msgstr ""
5696
 
5697
- #: extensions/email-notifications/classes/Common.php:1170
5698
  msgid "Website"
5699
  msgstr ""
5700
 
5701
- #: extensions/email-notifications/classes/Common.php:1172
5702
- #: extensions/email-notifications/classes/Common.php:1233
5703
- #: extensions/search/classes/FilterManager.php:474
5704
- #: extensions/user-sessions/classes/View/Sessions.php:174
5705
- #: extensions/user-sessions/classes/View/Sessions.php:348
5706
  msgid "Username"
5707
  msgstr ""
5708
 
5709
- #: extensions/email-notifications/classes/Common.php:1173
5710
  msgid "User role"
5711
  msgstr ""
5712
 
5713
- #: extensions/email-notifications/classes/Common.php:1174
5714
  msgid "IP address"
5715
  msgstr ""
5716
 
5717
- #: extensions/email-notifications/classes/Common.php:1177
5718
  msgid "Event Message"
5719
  msgstr ""
5720
 
5721
- #: extensions/email-notifications/classes/Common.php:1178
5722
  msgid "Event generated on"
5723
  msgstr ""
5724
 
5725
- #: extensions/email-notifications/classes/Common.php:1180
5726
- msgid ""
5727
- "These email notifications are sent with <a href=\"http://wpactivitylog.com"
5728
- "\">WP Activity Log</a>, the most comprehensive WordPress activity log plugin "
5729
- "solution."
5730
  msgstr ""
5731
 
5732
- #: extensions/email-notifications/classes/Common.php:1203
5733
- #: extensions/email-notifications/classes/Common.php:1262
5734
  msgid "User/Role"
5735
  msgstr ""
5736
 
5737
- #: extensions/email-notifications/classes/Common.php:1234
5738
- #: extensions/search/classes/FilterManager.php:486
5739
- #: extensions/search/classes/Filters/userrolefilter.php:49
5740
- #: extensions/search/classes/Filters/userrolefilter.php:87
5741
- #: extensions/user-sessions/classes/View/Sessions.php:353
5742
  msgid "User Role"
5743
  msgstr ""
5744
 
5745
- #: extensions/email-notifications/classes/Common.php:1236
5746
  msgid "Generated On"
5747
  msgstr ""
5748
 
5749
- #: extensions/email-notifications/classes/Common.php:1238
5750
- msgid ""
5751
- "Monitoring of WordPress and Email Notifications provided by <a href=\"http://"
5752
- "wpactivitylog.com\">WP Activity Log, WordPress most comprehensive audit "
5753
- "trail plugin</a>."
5754
  msgstr ""
5755
 
5756
- #: extensions/email-notifications/classes/Common.php:1263
5757
  msgid "Event"
5758
  msgstr ""
5759
 
5760
- #: extensions/email-notifications/classes/Common.php:1278
5761
  msgid "Subject "
5762
  msgstr ""
5763
 
5764
- #: extensions/email-notifications/classes/Common.php:1287
5765
  msgid "Body "
5766
  msgstr ""
5767
 
5768
- #: extensions/email-notifications/classes/Common.php:1290
5769
  msgid "HTML is accepted. Available template tags:"
5770
  msgstr ""
5771
 
 
5772
  #: extensions/email-notifications/classes/DailyNotification.php:340
5773
- #, php-format
5774
  msgid "was %d login"
5775
  msgid_plural "were %d logins"
5776
  msgstr[0] ""
5777
  msgstr[1] ""
5778
 
 
5779
  #: extensions/email-notifications/classes/DailyNotification.php:346
5780
- #, php-format
5781
  msgid "%d unique user"
5782
  msgid_plural "%d unique users"
5783
  msgstr[0] ""
5784
  msgstr[1] ""
5785
 
 
5786
  #: extensions/email-notifications/classes/DailyNotification.php:353
5787
- #, php-format
5788
- msgid ""
5789
- "There %1$s on your site today from %2$s. Below is a list of the users and "
5790
- "the IP addresses they logged in from:"
5791
  msgstr ""
5792
 
5793
  #: extensions/email-notifications/classes/DailyNotification.php:385
5794
- msgid ""
5795
- "There were failed logins due to a wrong password from the following IP "
5796
- "addresses:"
5797
  msgstr ""
5798
 
5799
  #: extensions/email-notifications/classes/DailyNotification.php:407
5800
- msgid ""
5801
- "There were failed logins due to a wrong username from the following IP "
5802
- "addresses:"
5803
  msgstr ""
5804
 
5805
  #: extensions/email-notifications/classes/EditNotification.php:58
@@ -5810,32 +4394,16 @@ msgstr ""
5810
  msgid "Edit Notification"
5811
  msgstr ""
5812
 
5813
- #: extensions/email-notifications/classes/EditNotification.php:239
5814
- #: extensions/email-notifications/classes/Notifications.php:1908
5815
  msgid "Add New"
5816
  msgstr ""
5817
 
5818
  #: extensions/email-notifications/classes/EditNotification.php:270
5819
- msgid ""
5820
- "You do not have sufficient permissions to access this page. - INVALID "
5821
- "NOTIFICATION ID"
5822
  msgstr ""
5823
 
5824
  #: extensions/email-notifications/classes/EditNotification.php:466
5825
- msgid ""
5826
- "Specify the email address or WordPress usernames who should receive the "
5827
- "notification once the trigger is matched. To specify multiple email "
5828
- "addresses or usernames separate them with a comma (,)."
5829
- msgstr ""
5830
-
5831
- #: extensions/email-notifications/classes/NotificationBuilder.php:76
5832
- #: extensions/email-notifications/classes/Notifications.php:1946
5833
- #: extensions/email-notifications/classes/Notifications.php:2009
5834
- #: extensions/email-notifications/classes/Notifications.php:2024
5835
- #: extensions/external-db/classes/Connections.php:144
5836
- #: extensions/external-db/classes/Mirroring.php:204
5837
- #: extensions/search/search-init.php:330
5838
- msgid "Delete"
5839
  msgstr ""
5840
 
5841
  #: extensions/email-notifications/classes/NotificationBuilder.php:77
@@ -5874,8 +4442,7 @@ msgstr ""
5874
  msgid "Multisite"
5875
  msgstr ""
5876
 
5877
- #: extensions/email-notifications/classes/Notifications.php:185
5878
- #: extensions/email-notifications/classes/Notifications.php:851
5879
  msgid "Custom Notifications"
5880
  msgstr ""
5881
 
@@ -5883,23 +4450,19 @@ msgstr ""
5883
  msgid "Notifications Templates"
5884
  msgstr ""
5885
 
5886
- #: extensions/email-notifications/classes/Notifications.php:197
5887
- #: extensions/email-notifications/classes/Notifications.php:2085
5888
  msgid "Default Email Template"
5889
  msgstr ""
5890
 
5891
- #: extensions/email-notifications/classes/Notifications.php:201
5892
- #: extensions/email-notifications/classes/Notifications.php:2081
5893
  msgid "Default SMS Template"
5894
  msgstr ""
5895
 
5896
- #: extensions/email-notifications/classes/Notifications.php:244
5897
- #: extensions/email-notifications/classes/Notifications.php:258
5898
  msgid "Notifications"
5899
  msgstr ""
5900
 
5901
- #: extensions/email-notifications/classes/Notifications.php:293
5902
- #: extensions/email-notifications/classes/Notifications.php:869
5903
  msgid "Test Notifications"
5904
  msgstr ""
5905
 
@@ -5911,556 +4474,484 @@ msgstr ""
5911
  msgid "Please specify an email address or a phone number to test."
5912
  msgstr ""
5913
 
5914
- #: extensions/email-notifications/classes/Notifications.php:601
5915
- msgid "Email Address and Mobile Number cannot be empty."
5916
- msgstr ""
5917
-
5918
- #: extensions/email-notifications/classes/Notifications.php:609
5919
  msgid "Email Address or Username is not valid."
5920
  msgstr ""
5921
 
5922
- #: extensions/email-notifications/classes/Notifications.php:619
5923
  msgid "Phone number is not valid."
5924
  msgstr ""
5925
 
5926
- #: extensions/email-notifications/classes/Notifications.php:748
5927
- msgid ""
5928
- "To configure email notifications please contact the administrator of this "
5929
- "multisite network on "
5930
  msgstr ""
5931
 
5932
- #: extensions/email-notifications/classes/Notifications.php:757
5933
- msgid "Invalid request."
 
 
 
 
5934
  msgstr ""
5935
 
5936
- #: extensions/email-notifications/classes/Notifications.php:763
5937
  msgid "An error occurred while sending the daily summary email."
5938
  msgstr ""
5939
 
5940
- #: extensions/email-notifications/classes/Notifications.php:767
5941
- msgid "Daily summary email sent."
5942
  msgstr ""
5943
 
5944
- #: extensions/email-notifications/classes/Notifications.php:841
5945
- #, php-format
5946
- msgid ""
5947
- "Tick the check box and specify an email address or username to enable a "
5948
- "notification. You can specify a phone number to send a SMS notification as "
5949
- "well (%s). Multiple recipients or numbers should be separated with a comma "
5950
- "(,). Click the Save Notifications button to save the changes."
5951
  msgstr ""
5952
 
5953
- #: extensions/email-notifications/classes/Notifications.php:842
5954
  msgid "Configure Twilio account integration"
5955
  msgstr ""
5956
 
5957
- #: extensions/email-notifications/classes/Notifications.php:850
5958
- #, php-format
5959
  msgid "You can create your own notification criteria in the %s tab."
5960
  msgstr ""
5961
 
5962
- #: extensions/email-notifications/classes/Notifications.php:870
5963
  msgid "Save Notifications"
5964
  msgstr ""
5965
 
5966
- #: extensions/email-notifications/classes/Notifications.php:879
5967
- msgid ""
5968
- "Specify an email address to where you would like to send a test email "
5969
- "notification:"
5970
  msgstr ""
5971
 
5972
- #: extensions/email-notifications/classes/Notifications.php:884
5973
- msgid ""
5974
- "Specify a mobile phone number to where you would like to send a test SMS "
5975
- "notification:"
5976
  msgstr ""
5977
 
5978
- #: extensions/email-notifications/classes/Notifications.php:890
5979
  msgid "Send"
5980
  msgstr ""
5981
 
5982
- #: extensions/email-notifications/classes/Notifications.php:891
5983
- #: extensions/external-db/classes/Connections.php:216
5984
- #: extensions/external-db/classes/Mirroring.php:287
5985
  msgid "Cancel"
5986
  msgstr ""
5987
 
5988
- #: extensions/email-notifications/classes/Notifications.php:955
5989
  msgid "Daily Summary of Activity Log"
5990
  msgstr ""
5991
 
5992
- #: extensions/email-notifications/classes/Notifications.php:966
5993
  msgid "Send me a summary of what happens every day."
5994
  msgstr ""
5995
 
5996
- #: extensions/email-notifications/classes/Notifications.php:970
5997
  msgid "Send Summary Now"
5998
  msgstr ""
5999
 
6000
- #: extensions/email-notifications/classes/Notifications.php:976
6001
  msgid "Suspicious Activity"
6002
  msgstr ""
6003
 
6004
- #: extensions/email-notifications/classes/Notifications.php:985
6005
- #: extensions/email-notifications/classes/Notifications.php:1002
6006
  msgid "There are more than"
6007
  msgstr ""
6008
 
6009
- #: extensions/email-notifications/classes/Notifications.php:987
6010
  msgid "failed WordPress logins for a WordPress user (Event ID 1002)"
6011
  msgstr ""
6012
 
6013
- #: extensions/email-notifications/classes/Notifications.php:1004
6014
  msgid "failed logins of non existing users (Event ID 1003)"
6015
  msgstr ""
6016
 
6017
- #: extensions/email-notifications/classes/Notifications.php:1019
6018
  msgid "A user generates more than"
6019
  msgstr ""
6020
 
6021
- #: extensions/email-notifications/classes/Notifications.php:1021
6022
  msgid "404 HTTP errors (Event ID 6007)"
6023
  msgstr ""
6024
 
6025
- #: extensions/email-notifications/classes/Notifications.php:1036
6026
  msgid "More than"
6027
  msgstr ""
6028
 
6029
- #: extensions/email-notifications/classes/Notifications.php:1038
6030
  msgid "404 HTTP errors are generated by the same IP address (Event ID 6023)"
6031
  msgstr ""
6032
 
6033
- #: extensions/email-notifications/classes/Notifications.php:1053
6034
  msgid "WordPress Install Changes"
6035
  msgstr ""
6036
 
6037
- #: extensions/email-notifications/classes/Notifications.php:1062
6038
  msgid "WordPress was updated (Event ID 6004)"
6039
  msgstr ""
6040
 
6041
- #: extensions/email-notifications/classes/Notifications.php:1077
6042
- msgid "Website File Changes"
6043
- msgstr ""
6044
-
6045
- #: extensions/email-notifications/classes/Notifications.php:1086
6046
- msgid "File was modified (Event ID 6028)"
6047
- msgstr ""
6048
-
6049
- #: extensions/email-notifications/classes/Notifications.php:1101
6050
- msgid "File was added to the website (Event ID 6029)"
6051
- msgstr ""
6052
-
6053
- #: extensions/email-notifications/classes/Notifications.php:1116
6054
- msgid "File was deleted from website (Event ID 6030)"
6055
- msgstr ""
6056
-
6057
- #: extensions/email-notifications/classes/Notifications.php:1131
6058
  msgid "Plugin Changes Notifications"
6059
  msgstr ""
6060
 
6061
- #: extensions/email-notifications/classes/Notifications.php:1139
6062
  msgid "New plugin is installed (Event ID 5000)"
6063
  msgstr ""
6064
 
6065
- #: extensions/email-notifications/classes/Notifications.php:1152
6066
  msgid "Installed plugin is activated (Event ID 5001)"
6067
  msgstr ""
6068
 
6069
- #: extensions/email-notifications/classes/Notifications.php:1165
6070
  msgid "Plugin file is modified (Event ID 2051)"
6071
  msgstr ""
6072
 
6073
- #: extensions/email-notifications/classes/Notifications.php:1178
6074
  msgid "Installed plugin is deactivated (Event ID 5002)"
6075
  msgstr ""
6076
 
6077
- #: extensions/email-notifications/classes/Notifications.php:1191
6078
  msgid "A plugin is uninstalled (Event ID 5003)"
6079
  msgstr ""
6080
 
6081
- #: extensions/email-notifications/classes/Notifications.php:1204
6082
  msgid "Installed plugin is upgraded (Event ID 5004)"
6083
  msgstr ""
6084
 
6085
- #: extensions/email-notifications/classes/Notifications.php:1218
6086
  msgid "Themes Changes Notifications"
6087
  msgstr ""
6088
 
6089
- #: extensions/email-notifications/classes/Notifications.php:1227
6090
  msgid "New theme is installed (Event ID 5005)"
6091
  msgstr ""
6092
 
6093
- #: extensions/email-notifications/classes/Notifications.php:1242
6094
  msgid "Installed theme is activated (Event ID 5006)"
6095
  msgstr ""
6096
 
6097
- #: extensions/email-notifications/classes/Notifications.php:1257
6098
  msgid "Theme file is modified (Event ID 2046)"
6099
  msgstr ""
6100
 
6101
- #: extensions/email-notifications/classes/Notifications.php:1272
6102
  msgid "A theme is uninstalled (Event ID 5007)"
6103
  msgstr ""
6104
 
6105
- #: extensions/email-notifications/classes/Notifications.php:1287
6106
  msgid "Installed theme is updated (Event ID 5031)"
6107
  msgstr ""
6108
 
6109
- #: extensions/email-notifications/classes/Notifications.php:1302
6110
  msgid "Critical Events"
6111
  msgstr ""
6112
 
6113
- #: extensions/email-notifications/classes/Notifications.php:1310
6114
  msgid "Critical Event is Generated"
6115
  msgstr ""
6116
 
6117
- #: extensions/email-notifications/classes/Notifications.php:1374
 
 
 
 
6118
  msgid "User logs in (Event ID 1000)"
6119
  msgstr ""
6120
 
6121
- #: extensions/email-notifications/classes/Notifications.php:1389
6122
  msgid "First time user logs in"
6123
  msgstr ""
6124
 
6125
- #: extensions/email-notifications/classes/Notifications.php:1404
6126
  msgid "User changed password (Event ID 4003)"
6127
  msgstr ""
6128
 
6129
- #: extensions/email-notifications/classes/Notifications.php:1419
6130
  msgid "User Profile Changes"
6131
  msgstr ""
6132
 
6133
- #: extensions/email-notifications/classes/Notifications.php:1428
6134
  msgid "User changed email address (Event IDs 4005, 4006)"
6135
  msgstr ""
6136
 
6137
- #: extensions/email-notifications/classes/Notifications.php:1443
6138
  msgid "User's role has changed (Event ID 4002)"
6139
  msgstr ""
6140
 
6141
- #: extensions/email-notifications/classes/Notifications.php:1458
6142
  msgid "User changed the password of another user (Event ID 4004)"
6143
  msgstr ""
6144
 
6145
- #: extensions/email-notifications/classes/Notifications.php:1473
6146
  msgid "New user is created (Event IDs 4000, 4001, 4012)"
6147
  msgstr ""
6148
 
6149
- #: extensions/email-notifications/classes/Notifications.php:1535
6150
  msgid "New content is published (Event ID 2001)"
6151
  msgstr ""
6152
 
6153
- #: extensions/email-notifications/classes/Notifications.php:1550
6154
  msgid "Content in a post, page or custom post type is changed (Event ID 2065)"
6155
  msgstr ""
6156
 
6157
- #: extensions/email-notifications/classes/Notifications.php:1565
6158
- msgid ""
6159
- "Anything but content in a post is changed (such as date, category, status, "
6160
- "parent page etc)"
6161
  msgstr ""
6162
 
6163
- #: extensions/email-notifications/classes/Notifications.php:1630
6164
  msgid "User granted super admin (Event ID 4008)"
6165
  msgstr ""
6166
 
6167
- #: extensions/email-notifications/classes/Notifications.php:1646
6168
  msgid "User revoked super admin (Event ID 4009)"
6169
  msgstr ""
6170
 
6171
- #: extensions/email-notifications/classes/Notifications.php:1663
6172
  msgid "User added to site (Event ID 4010)"
6173
  msgstr ""
6174
 
6175
- #: extensions/email-notifications/classes/Notifications.php:1680
6176
  msgid "User removed from site (Event ID 4011)"
6177
  msgstr ""
6178
 
6179
- #: extensions/email-notifications/classes/Notifications.php:1697
6180
  msgid "Site changes"
6181
  msgstr ""
6182
 
6183
- #: extensions/email-notifications/classes/Notifications.php:1714
6184
  msgid "Activated theme on network (Event ID 5008)"
6185
  msgstr ""
6186
 
6187
- #: extensions/email-notifications/classes/Notifications.php:1731
6188
  msgid "Deactivated theme from network (Event ID 5009)"
6189
  msgstr ""
6190
 
6191
- #: extensions/email-notifications/classes/Notifications.php:1797
6192
  msgid "Any product change"
6193
  msgstr ""
6194
 
6195
- #: extensions/email-notifications/classes/Notifications.php:1814
6196
  msgid "Any store settings change"
6197
  msgstr ""
6198
 
6199
- #: extensions/email-notifications/classes/Notifications.php:1831
6200
  msgid "Any coupon code changes"
6201
  msgstr ""
6202
 
6203
- #: extensions/email-notifications/classes/Notifications.php:1848
6204
  msgid "Any orders changes"
6205
  msgstr ""
6206
 
6207
- #: extensions/email-notifications/classes/Notifications.php:1903
6208
- #, php-format
6209
- msgid ""
6210
- "Use the trigger builder to build any type of criteria that triggers email "
6211
- "and / or SMS notifications. Refer to the %s for more detailed information."
6212
  msgstr ""
6213
 
6214
- #: extensions/email-notifications/classes/Notifications.php:1904
6215
  msgid "WordPress notifications documentation"
6216
  msgstr ""
6217
 
6218
- #: extensions/email-notifications/classes/Notifications.php:1921
6219
- #: extensions/reports/classes/HtmlReportGenerator.php:175
6220
- #: extensions/reports/classes/HtmlReportGenerator.php:179
6221
- #: extensions/user-sessions/classes/View/Options/Policies.php:24
6222
- msgid "All"
 
6223
  msgstr ""
6224
 
6225
- #: extensions/email-notifications/classes/Notifications.php:1930
6226
- #: extensions/email-notifications/classes/Notifications.php:1932
6227
- #: extensions/email-notifications/classes/Notifications.php:2053
6228
- #: extensions/email-notifications/classes/Notifications.php:2055
6229
  msgid "Search Notifications"
6230
  msgstr ""
6231
 
6232
- #: extensions/email-notifications/classes/Notifications.php:1943
6233
- #: extensions/email-notifications/classes/Notifications.php:2021
 
 
 
6234
  msgid "Bulk actions"
6235
  msgstr ""
6236
 
6237
- #: extensions/email-notifications/classes/Notifications.php:1944
6238
- #: extensions/email-notifications/classes/Notifications.php:2005
6239
- #: extensions/email-notifications/classes/Notifications.php:2022
6240
- #: extensions/external-db/classes/Connections.php:432
6241
- #: extensions/external-db/classes/Mirroring.php:185
6242
- #: extensions/external-db/classes/Settings.php:1344
6243
  msgid "Enable"
6244
  msgstr ""
6245
 
6246
- #: extensions/email-notifications/classes/Notifications.php:1945
6247
- #: extensions/email-notifications/classes/Notifications.php:2003
6248
- #: extensions/email-notifications/classes/Notifications.php:2023
6249
- #: extensions/external-db/classes/Mirroring.php:188
6250
- #: extensions/external-db/classes/Settings.php:1347
6251
  msgid "Disable"
6252
  msgstr ""
6253
 
6254
- #: extensions/email-notifications/classes/Notifications.php:1948
6255
- #: extensions/email-notifications/classes/Notifications.php:2026
6256
  msgid "Apply"
6257
  msgstr ""
6258
 
6259
- #: extensions/email-notifications/classes/Notifications.php:1993
 
 
 
 
6260
  msgid "Select"
6261
  msgstr ""
6262
 
6263
- #: extensions/email-notifications/classes/Notifications.php:1997
6264
- #: extensions/email-notifications/classes/Notifications.php:1999
6265
  msgid "Edit this notification"
6266
  msgstr ""
6267
 
6268
- #: extensions/email-notifications/classes/Notifications.php:1999
6269
  msgid "Edit"
6270
  msgstr ""
6271
 
6272
- #: extensions/email-notifications/classes/Notifications.php:2003
6273
- msgid "Disable this notification"
6274
  msgstr ""
6275
 
6276
- #: extensions/email-notifications/classes/Notifications.php:2005
6277
- msgid "Enable this notification"
6278
  msgstr ""
6279
 
6280
- #: extensions/email-notifications/classes/Notifications.php:2009
6281
  msgid "Delete this notification"
6282
  msgstr ""
6283
 
6284
- #: extensions/email-notifications/classes/Notifications.php:2012
6285
  msgid "Send Test Email"
6286
  msgstr ""
6287
 
6288
- #: extensions/email-notifications/classes/Notifications.php:2013
6289
  msgid "Send Test SMS"
6290
  msgstr ""
6291
 
6292
- #: extensions/email-notifications/classes/Notifications.php:2046
6293
- msgid "No notifications found to match your search."
6294
  msgstr ""
6295
 
6296
- #: extensions/email-notifications/classes/Notifications.php:2060
6297
- msgid ""
6298
- "No notifications found. Click the <code>Add New</code> button above to "
6299
- "create one."
6300
  msgstr ""
6301
 
6302
- #: extensions/email-notifications/classes/Notifications.php:2080
6303
  msgid "You can modify the default notification SMS template from here."
6304
  msgstr ""
6305
 
6306
- #: extensions/email-notifications/classes/Notifications.php:2082
6307
- msgid ""
6308
- "This is the default template for SMS notifications. The maximum number of "
6309
- "characters for a SMS is 160, so if you configure longer notifications you "
6310
- "will be charged for multiple SMS notifications."
6311
- msgstr ""
6312
-
6313
- #: extensions/email-notifications/classes/Notifications.php:2084
6314
- msgid "You can modify the default notification email template from here."
6315
- msgstr ""
6316
-
6317
- #: extensions/email-notifications/classes/Notifications.php:2086
6318
- msgid ""
6319
- "This is the default template. You can override this default template with "
6320
- "notification specific template which you can modify when using the Trigger "
6321
- "Builder."
6322
  msgstr ""
6323
 
6324
- #: extensions/email-notifications/classes/Notifications.php:2122
6325
  msgid "Subject"
6326
  msgstr ""
6327
 
6328
- #: extensions/email-notifications/classes/Notifications.php:2127
6329
  msgid "Body"
6330
  msgstr ""
6331
 
6332
- #: extensions/email-notifications/classes/Notifications.php:2152
6333
  msgid "HTML is accepted."
6334
  msgstr ""
6335
 
6336
- #: extensions/email-notifications/classes/Notifications.php:2153
6337
  msgid "Available template tags:"
6338
  msgstr ""
6339
 
6340
- #: extensions/email-notifications/classes/Notifications.php:2175
6341
  msgid "Shorten URLs"
6342
  msgstr ""
6343
 
6344
- #: extensions/email-notifications/classes/Notifications.php:2180
6345
  msgid "Shorten URLs with Bit.ly"
6346
  msgstr ""
6347
 
6348
- #: extensions/email-notifications/classes/Notifications.php:2183
6349
  msgid "Bit.ly Access Token"
6350
  msgstr ""
6351
 
6352
- #: extensions/email-notifications/classes/Notifications.php:2188
6353
- #, php-format
6354
- msgid ""
6355
- "The URL shortener works for URLs in the {message} variable and will not "
6356
- "shorten the URL of the website in the variable {site}. Shorten all URLs in "
6357
- "the message using the %s."
6358
  msgstr ""
6359
 
6360
- #: extensions/email-notifications/classes/Notifications.php:2188
6361
  msgid "Bit.ly URL Shortener API"
6362
  msgstr ""
6363
 
6364
- #: extensions/email-notifications/classes/Notifications.php:2228
6365
- msgid "Template could not be saved."
6366
  msgstr ""
6367
 
6368
- #: extensions/email-notifications/classes/Notifications.php:2230
6369
- msgid "Template successfully saved."
6370
  msgstr ""
6371
 
6372
- #: extensions/email-notifications/classes/Notifications.php:2348
6373
- #: extensions/email-notifications/classes/Notifications.php:2452
6374
  msgid "You do not have sufficient permissions to perform this test."
6375
  msgstr ""
6376
 
6377
- #: extensions/email-notifications/classes/Notifications.php:2367
6378
- msgid "Test email notification from the WP Activity Log plugin."
6379
  msgstr ""
6380
 
6381
- #: extensions/email-notifications/classes/Notifications.php:2368
6382
- msgid "This is a test email notification sent with the WP Activity Log plugin."
6383
  msgstr ""
6384
 
6385
- #: extensions/email-notifications/classes/Notifications.php:2371
6386
- msgid "Email address is invalid."
6387
  msgstr ""
6388
 
6389
- #: extensions/email-notifications/classes/Notifications.php:2378
6390
- msgid "This is a test SMS notification sent with the WP Activity Log plugin."
6391
  msgstr ""
6392
 
6393
- #: extensions/email-notifications/classes/Notifications.php:2381
6394
  msgid "Phone number is invalid."
6395
  msgstr ""
6396
 
6397
- #: extensions/email-notifications/classes/Notifications.php:2387
6398
- #: extensions/email-notifications/classes/Notifications.php:2481
6399
- msgid "Email sent successfully."
6400
  msgstr ""
6401
 
6402
- #: extensions/email-notifications/classes/Notifications.php:2390
6403
- #: extensions/email-notifications/classes/Notifications.php:2502
6404
- msgid "SMS sent successfully."
6405
  msgstr ""
6406
 
6407
- #: extensions/email-notifications/classes/Notifications.php:2393
6408
- msgid "Email / SMS sent successfully."
6409
  msgstr ""
6410
 
6411
- #: extensions/email-notifications/classes/Notifications.php:2402
6412
- #: extensions/email-notifications/classes/Notifications.php:2500
6413
- #, php-format
6414
- msgid ""
6415
- "There was a problem sending the SMS. Below is the error we got back from the "
6416
- "SMS provider. Please contact us on %s if you need assistance with this issue."
6417
  msgstr ""
6418
 
6419
- #: extensions/email-notifications/classes/Notifications.php:2405
6420
- #, php-format
6421
- msgid ""
6422
- "There are some problems sending the test email / SMS. Please contact us on "
6423
- "%s to assist you with this problem."
6424
  msgstr ""
6425
 
6426
- #: extensions/email-notifications/classes/Notifications.php:2419
6427
- #: extensions/email-notifications/classes/Notifications.php:2512
6428
- msgid "Nonce verification failed. Please refresh and try again."
6429
  msgstr ""
6430
 
6431
- #: extensions/email-notifications/classes/Notifications.php:2464
6432
- msgid "Unknown notification."
6433
  msgstr ""
6434
 
6435
- #: extensions/email-notifications/classes/Notifications.php:2484
6436
- #, php-format
6437
- msgid ""
6438
- "There are some problems sending the test email. Please contact us on %s to "
6439
- "assist you with this problem."
6440
  msgstr ""
6441
 
6442
- #: extensions/email-notifications/classes/Notifications.php:2497
6443
  msgid "Mobile number is not set for this notification."
6444
  msgstr ""
6445
 
6446
- #: extensions/email-notifications/classes/Notifications.php:2505
6447
- #, php-format
6448
- msgid ""
6449
- "There are some problems sending the test SMS. Please contact us on %s to "
6450
- "assist you with this problem."
6451
  msgstr ""
6452
 
6453
- #: extensions/email-notifications/classes/Notifications.php:2508
6454
- msgid "Unknown notification type."
6455
  msgstr ""
6456
 
6457
- #: extensions/email-notifications/classes/Notifier.php:762
6458
- #: extensions/reports/classes/Common.php:543
6459
  msgid "View the Forum in editor"
6460
  msgstr ""
6461
 
6462
- #: extensions/email-notifications/classes/Notifier.php:765
6463
- #: extensions/reports/classes/Common.php:546
6464
  msgid "View the Topic in editor"
6465
  msgstr ""
6466
 
@@ -6472,23 +4963,17 @@ msgstr ""
6472
  msgid "SMS Provider"
6473
  msgstr ""
6474
 
6475
- #: extensions/email-notifications/classes/SMSProviderSettings.php:146
6476
- #: extensions/email-notifications/classes/SMSProviderSettings.php:148
6477
- #: extensions/external-db/classes/Connections.php:138
6478
  msgid "Test"
6479
  msgstr ""
6480
 
6481
  #: extensions/email-notifications/classes/SMSProviderSettings.php:169
6482
- msgid ""
6483
- "Configure your Twilio account details to be able to configure and send SMS "
6484
- "notifications."
6485
  msgstr ""
6486
 
 
6487
  #: extensions/email-notifications/classes/SMSProviderSettings.php:172
6488
- #, php-format
6489
- msgid ""
6490
- "SMS notifications are available in the Professional and Business Plans. %s "
6491
- "to configure and receive SMS notifications."
6492
  msgstr ""
6493
 
6494
  #: extensions/email-notifications/classes/SMSProviderSettings.php:172
@@ -6503,9 +4988,9 @@ msgstr ""
6503
  msgid "Enter Account SID"
6504
  msgstr ""
6505
 
6506
- #: extensions/email-notifications/classes/SMSProviderSettings.php:185
6507
- #: extensions/email-notifications/classes/SMSProviderSettings.php:200
6508
- #, php-format
6509
  msgid "To view API credentials visit %s"
6510
  msgstr ""
6511
 
@@ -6521,15 +5006,12 @@ msgstr ""
6521
  msgid "Twilio number / Alphanumeric ID"
6522
  msgstr ""
6523
 
6524
- #: extensions/email-notifications/classes/SMSProviderSettings.php:211
6525
- #: extensions/email-notifications/classes/SMSProviderSettings.php:250
6526
  msgid "+16175551212"
6527
  msgstr ""
6528
 
6529
  #: extensions/email-notifications/classes/SMSProviderSettings.php:212
6530
- msgid ""
6531
- "Specify a Twilio phone number including the country code (e.g. +16175551212) "
6532
- "or a valid Alphanumeric ID (e.g. WSAL)"
6533
  msgstr ""
6534
 
6535
  #: extensions/email-notifications/classes/SMSProviderSettings.php:247
@@ -6548,18 +5030,13 @@ msgstr ""
6548
  msgid "The text of the message you want to send, limited to 1600 characters."
6549
  msgstr ""
6550
 
6551
- #: extensions/external-db/classes/Connections.php:18
6552
- #: extensions/external-db/classes/Mirroring.php:18
6553
- #: extensions/external-db/classes/Settings.php:17
6554
  msgid "You are not allowed to view this page."
6555
  msgstr ""
6556
 
 
6557
  #: extensions/external-db/classes/Connections.php:80
6558
- #, php-format
6559
- msgid ""
6560
- "In this section you can %1$s and services connections. These connections can "
6561
- "be used as external activity log storage, activity log archive or to mirror "
6562
- "the activity log to it. In use connections cannot be deleted."
6563
  msgstr ""
6564
 
6565
  #: extensions/external-db/classes/Connections.php:84
@@ -6570,13 +5047,11 @@ msgstr ""
6570
  msgid "Create a Connection"
6571
  msgstr ""
6572
 
6573
- #: extensions/external-db/classes/Connections.php:91
6574
- #: extensions/external-db/classes/Settings.php:104
6575
  msgid "Connections"
6576
  msgstr ""
6577
 
6578
- #: extensions/external-db/classes/Connections.php:96
6579
- #: extensions/external-db/classes/Mirroring.php:124
6580
  msgid "Type"
6581
  msgstr ""
6582
 
@@ -6584,12 +5059,7 @@ msgstr ""
6584
  msgid "Used for"
6585
  msgstr ""
6586
 
6587
- #: extensions/external-db/classes/Connections.php:106
6588
- msgid "No connections so far."
6589
- msgstr ""
6590
-
6591
- #: extensions/external-db/classes/Connections.php:123
6592
- #: extensions/external-db/classes/Mirroring.php:198
6593
  msgid "Configure"
6594
  msgstr ""
6595
 
@@ -6597,24 +5067,19 @@ msgstr ""
6597
  msgid "Send a test message"
6598
  msgstr ""
6599
 
6600
- #. Plugin Name of the plugin/theme
6601
- #: extensions/external-db/classes/Connections.php:173
6602
- #: wp-security-audit-log.php:982
6603
- msgid "WP Activity Log"
6604
  msgstr ""
6605
 
6606
- #: extensions/external-db/classes/Connections.php:175
6607
- #: extensions/external-db/classes/Mirroring.php:252
6608
  msgid "Step 1"
6609
  msgstr ""
6610
 
6611
- #: extensions/external-db/classes/Connections.php:176
6612
- #: extensions/external-db/classes/Mirroring.php:253
6613
  msgid "Step 2"
6614
  msgstr ""
6615
 
6616
- #: extensions/external-db/classes/Connections.php:177
6617
- #: extensions/external-db/classes/Mirroring.php:254
6618
  msgid "Step 3"
6619
  msgstr ""
6620
 
@@ -6638,54 +5103,117 @@ msgstr ""
6638
  msgid "Syslog Server"
6639
  msgstr ""
6640
 
6641
- #: extensions/external-db/classes/Connections.php:195
6642
- #: extensions/external-db/classes/Mirroring.php:102
6643
  msgid "Slack"
6644
  msgstr ""
6645
 
6646
- #: extensions/external-db/classes/Connections.php:196
6647
- #: extensions/external-db/classes/Mirroring.php:107
6648
- msgid "Papertrail"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6649
  msgstr ""
6650
 
6651
- #: extensions/external-db/classes/Connections.php:208
6652
- msgid "Name the connection"
6653
  msgstr ""
6654
 
6655
- #: extensions/external-db/classes/Connections.php:209
6656
- msgid ""
6657
- "Please specify a friendly name for the connection. Connection names can be "
6658
- "25 characters long and can only contain letters, numbers and underscores."
6659
  msgstr ""
6660
 
6661
- #: extensions/external-db/classes/Connections.php:213
6662
- msgid "Save Connection"
6663
  msgstr ""
6664
 
6665
- #: extensions/external-db/classes/Connections.php:233
6666
- #: extensions/external-db/classes/Connections.php:263
6667
- msgid "Configure the connection"
6668
  msgstr ""
6669
 
6670
- #: extensions/external-db/classes/Connections.php:234
6671
- #: extensions/external-db/classes/Connections.php:264
6672
- msgid "Configure the connection details."
6673
  msgstr ""
6674
 
6675
- #: extensions/external-db/classes/Connections.php:249
6676
- msgid "No connection name specified!"
6677
  msgstr ""
6678
 
6679
- #: extensions/external-db/classes/Connections.php:256
6680
- msgid "Configure Connection "
6681
  msgstr ""
6682
 
6683
- #: extensions/external-db/classes/Connections.php:296
6684
- msgid "Connection Name"
6685
  msgstr ""
6686
 
6687
- #: extensions/external-db/classes/Connections.php:300
6688
- msgid "* Invalid Connection Name"
6689
  msgstr ""
6690
 
6691
  #: extensions/external-db/classes/Connections.php:313
@@ -6693,9 +5221,7 @@ msgid "Database Name"
6693
  msgstr ""
6694
 
6695
  #: extensions/external-db/classes/Connections.php:317
6696
- msgid ""
6697
- "Specify the name of the database where you will store the WordPress activity "
6698
- "log."
6699
  msgstr ""
6700
 
6701
  #: extensions/external-db/classes/Connections.php:322
@@ -6711,9 +5237,7 @@ msgid "Database Password"
6711
  msgstr ""
6712
 
6713
  #: extensions/external-db/classes/Connections.php:335
6714
- msgid ""
6715
- "Specify the password each time you want to submit new changes. For security "
6716
- "reasons, the plugin does not store the password in this form."
6717
  msgstr ""
6718
 
6719
  #: extensions/external-db/classes/Connections.php:340
@@ -6729,10 +5253,7 @@ msgid "Database Base Prefix"
6729
  msgstr ""
6730
 
6731
  #: extensions/external-db/classes/Connections.php:359
6732
- msgid ""
6733
- "Specify a prefix for the database tables of the activity log. Ideally this "
6734
- "prefix should be different from the one you use for WordPress so it is not "
6735
- "guessable."
6736
  msgstr ""
6737
 
6738
  #: extensions/external-db/classes/Connections.php:363
@@ -6743,8 +5264,7 @@ msgstr ""
6743
  msgid "SSL"
6744
  msgstr ""
6745
 
6746
- #: extensions/external-db/classes/Connections.php:374
6747
- #: extensions/external-db/classes/Connections.php:385
6748
  msgid "Enable to use SSL to connect with the MySQL server."
6749
  msgstr ""
6750
 
@@ -6764,123 +5284,35 @@ msgstr ""
6764
  msgid "Client Certificate (--ssl-key)"
6765
  msgstr ""
6766
 
6767
- #: extensions/external-db/classes/Connections.php:409
6768
- msgid "Destination"
6769
- msgstr ""
6770
-
6771
- #: extensions/external-db/classes/Connections.php:413
6772
- msgid "* Invalid Papertrail Destination"
6773
- msgstr ""
6774
-
6775
- #: extensions/external-db/classes/Connections.php:418
6776
- #, php-format
6777
- msgid ""
6778
- "Specify your destination. You can find your Papertrail Destination in the %s "
6779
- "section of your Papertrail account page. It should have the following "
6780
- "format: logs4.papertrailapp.com:54321"
6781
- msgstr ""
6782
-
6783
- #: extensions/external-db/classes/Connections.php:419
6784
- msgid "Log Destinations"
6785
- msgstr ""
6786
-
6787
- #: extensions/external-db/classes/Connections.php:427
6788
- msgid "Colorization"
6789
- msgstr ""
6790
-
6791
- #: extensions/external-db/classes/Connections.php:447
6792
- msgid "Syslog Location"
6793
- msgstr ""
6794
-
6795
- #: extensions/external-db/classes/Connections.php:453
6796
- msgid "Write to local syslog file"
6797
- msgstr ""
6798
-
6799
- #: extensions/external-db/classes/Connections.php:458
6800
- msgid "Send messages to remote syslog server"
6801
- msgstr ""
6802
-
6803
- #: extensions/external-db/classes/Connections.php:462
6804
- msgid "IP Address / Hostname"
6805
- msgstr ""
6806
-
6807
- #: extensions/external-db/classes/Connections.php:465
6808
- msgid "* Invalid IP/Hostname"
6809
- msgstr ""
6810
-
6811
- #: extensions/external-db/classes/Connections.php:469
6812
- msgid "Port"
6813
- msgstr ""
6814
-
6815
- #: extensions/external-db/classes/Connections.php:472
6816
- msgid "* Invalid Port"
6817
- msgstr ""
6818
-
6819
- #: extensions/external-db/classes/Connections.php:487
6820
- msgid "Bot Name"
6821
- msgstr ""
6822
-
6823
- #: extensions/external-db/classes/Connections.php:492
6824
- msgid "* Invalid Bot Name"
6825
- msgstr ""
6826
-
6827
- #: extensions/external-db/classes/Connections.php:493
6828
- msgid ""
6829
- "The name to be used in the slack channel for all the WordPress activity log "
6830
- "events sent from the plugin."
6831
- msgstr ""
6832
-
6833
- #: extensions/external-db/classes/Connections.php:498
6834
- msgid "WebHook URL"
6835
- msgstr ""
6836
-
6837
- #: extensions/external-db/classes/Connections.php:503
6838
- msgid "* Invalid WebHook URL"
6839
- msgstr ""
6840
-
6841
- #: extensions/external-db/classes/Connections.php:507
6842
- #, php-format
6843
- msgid ""
6844
- "If you are not familiar with incoming WebHooks for Slack please refer to %s."
6845
  msgstr ""
6846
 
6847
- #: extensions/external-db/classes/Connections.php:507
6848
- msgid "Slack help"
6849
  msgstr ""
6850
 
6851
- #: extensions/external-db/classes/Connections.php:554
6852
- #: extensions/external-db/classes/Mirroring.php:586
6853
  msgid "Connections Wizard"
6854
  msgstr ""
6855
 
6856
- #: extensions/external-db/classes/Connections.php:555
6857
- #: extensions/external-db/classes/Mirroring.php:588
6858
  msgid "Testing..."
6859
  msgstr ""
6860
 
6861
- #: extensions/external-db/classes/Connections.php:556
6862
- #: extensions/external-db/classes/Mirroring.php:589
6863
- #: extensions/search/search-init.php:331
6864
- msgid "Deleting..."
6865
- msgstr ""
6866
-
6867
- #: extensions/external-db/classes/Connections.php:557
6868
- #: extensions/external-db/classes/Mirroring.php:592
6869
  msgid "Connection Failed!"
6870
  msgstr ""
6871
 
6872
- #: extensions/external-db/classes/Connections.php:558
6873
- #: extensions/external-db/classes/Mirroring.php:593
6874
  msgid "Connected"
6875
  msgstr ""
6876
 
6877
- #: extensions/external-db/classes/Connections.php:559
6878
- #: extensions/external-db/classes/Mirroring.php:597
6879
  msgid "Are you sure that you want to delete this connection?"
6880
  msgstr ""
6881
 
6882
- #: extensions/external-db/classes/Connections.php:564
6883
- #: extensions/external-db/classes/Mirroring.php:600
6884
  msgid "Test connection and continue"
6885
  msgstr ""
6886
 
@@ -6888,44 +5320,40 @@ msgstr ""
6888
  msgid "Connection failed. Please check the configuration again."
6889
  msgstr ""
6890
 
6891
- #: extensions/external-db/classes/Connections.php:795
6892
- #: extensions/external-db/classes/Connections.php:1004
6893
- #: extensions/external-db/classes/Settings.php:1099
6894
- #: extensions/external-db/classes/Settings.php:1131
6895
- msgid "Successfully connected to database."
6896
  msgstr ""
6897
 
6898
- #: extensions/external-db/classes/Connections.php:827
6899
- msgid "Successfully connected to Papertrail App."
6900
  msgstr ""
6901
 
6902
- #: extensions/external-db/classes/Connections.php:834
6903
- msgid "socket_sendto was unable to send activity log events."
6904
  msgstr ""
6905
 
6906
- #: extensions/external-db/classes/Connections.php:874
6907
- #: extensions/external-db/classes/Connections.php:896
6908
- msgid "Successfully connected to Syslog."
6909
  msgstr ""
6910
 
6911
- #: extensions/external-db/classes/Connections.php:875
6912
- msgid "Message sent"
6913
  msgstr ""
6914
 
6915
- #: extensions/external-db/classes/Connections.php:903
6916
- msgid "Syslog connection testing failed."
6917
  msgstr ""
6918
 
6919
- #: extensions/external-db/classes/Connections.php:913
6920
- msgid "WP Activity Log connection testing message."
6921
  msgstr ""
6922
 
6923
- #: extensions/external-db/classes/Connections.php:930
6924
- msgid "Successfully connected to Slack."
6925
  msgstr ""
6926
 
6927
- #: extensions/external-db/classes/Connections.php:945
6928
- msgid "Unknown connection type."
6929
  msgstr ""
6930
 
6931
  #: extensions/external-db/classes/Mirroring.php:97
@@ -6937,9 +5365,7 @@ msgid "Syslog"
6937
  msgstr ""
6938
 
6939
  #: extensions/external-db/classes/Mirroring.php:116
6940
- msgid ""
6941
- "In this section you can configure the mirroring of the WordPress to external "
6942
- "databases, services and servers. You can configure multiple mirroring rules."
6943
  msgstr ""
6944
 
6945
  #: extensions/external-db/classes/Mirroring.php:117
@@ -6950,44 +5376,27 @@ msgstr ""
6950
  msgid "The WordPress activity log is currently being mirrored to:"
6951
  msgstr ""
6952
 
6953
- #: extensions/external-db/classes/Mirroring.php:125
6954
- #: extensions/external-db/classes/Mirroring.php:397
6955
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1428
6956
  msgid "Frequency"
6957
  msgstr ""
6958
 
6959
- #: extensions/external-db/classes/Mirroring.php:135
6960
- #: extensions/external-db/classes/Mirroring.php:213
6961
- msgid "No mirrors so far."
6962
- msgstr ""
6963
-
6964
- #: extensions/external-db/classes/Mirroring.php:164
6965
- #: extensions/external-db/classes/Mirroring.php:401
6966
- #: extensions/external-db/classes/Settings.php:927
6967
  msgid "15 minutes"
6968
  msgstr ""
6969
 
6970
- #: extensions/external-db/classes/Mirroring.php:167
6971
- #: extensions/external-db/classes/Mirroring.php:402
6972
- #: extensions/external-db/classes/Settings.php:930
6973
  msgid "1 hour"
6974
  msgstr ""
6975
 
6976
- #: extensions/external-db/classes/Mirroring.php:170
6977
- #: extensions/external-db/classes/Mirroring.php:403
6978
- #: extensions/external-db/classes/Settings.php:933
6979
  msgid "6 hours"
6980
  msgstr ""
6981
 
6982
- #: extensions/external-db/classes/Mirroring.php:173
6983
- #: extensions/external-db/classes/Mirroring.php:404
6984
- #: extensions/external-db/classes/Settings.php:936
6985
  msgid "12 hours"
6986
  msgstr ""
6987
 
6988
- #: extensions/external-db/classes/Mirroring.php:176
6989
- #: extensions/external-db/classes/Mirroring.php:405
6990
- #: extensions/external-db/classes/Settings.php:939
6991
  msgid "24 hours"
6992
  msgstr ""
6993
 
@@ -6995,22 +5404,20 @@ msgstr ""
6995
  msgid "Run Now"
6996
  msgstr ""
6997
 
 
 
 
 
6998
  #: extensions/external-db/classes/Mirroring.php:262
6999
  msgid "Select the connection where to mirror to the activity log"
7000
  msgstr ""
7001
 
7002
- #: extensions/external-db/classes/Mirroring.php:263
7003
- #: extensions/external-db/classes/Mirroring.php:323
7004
- msgid ""
7005
- "Please specify a friendly name for the mirroring connection. Connection "
7006
- "names can be 25 characters long, and can only contain letters, numbers and "
7007
- "underscores."
7008
  msgstr ""
7009
 
7010
  #: extensions/external-db/classes/Mirroring.php:265
7011
- msgid ""
7012
- "Select one of the connections you have configured to where you want to "
7013
- "mirror the activity log."
7014
  msgstr ""
7015
 
7016
  #: extensions/external-db/classes/Mirroring.php:269
@@ -7026,8 +5433,7 @@ msgid "Start once configured?"
7026
  msgstr ""
7027
 
7028
  #: extensions/external-db/classes/Mirroring.php:276
7029
- msgid ""
7030
- "Tick this checkbox to enable the mirror and start sending data once set up."
7031
  msgstr ""
7032
 
7033
  #: extensions/external-db/classes/Mirroring.php:280
@@ -7035,8 +5441,7 @@ msgid "Configure Filtering"
7035
  msgstr ""
7036
 
7037
  #: extensions/external-db/classes/Mirroring.php:281
7038
- msgid ""
7039
- "Configure any filtering you’d like to apply to this mirroring connection:"
7040
  msgstr ""
7041
 
7042
  #: extensions/external-db/classes/Mirroring.php:285
@@ -7059,25 +5464,6 @@ msgstr ""
7059
  msgid "Configure the mirror details."
7060
  msgstr ""
7061
 
7062
- #: extensions/external-db/classes/Mirroring.php:348
7063
- msgid "Mirror Name"
7064
- msgstr ""
7065
-
7066
- #: extensions/external-db/classes/Mirroring.php:352
7067
- msgid "* Invalid Mirror Name"
7068
- msgstr ""
7069
-
7070
- #: extensions/external-db/classes/Mirroring.php:362
7071
- #: extensions/external-db/classes/Settings.php:503
7072
- #: extensions/external-db/classes/Settings.php:684
7073
- msgid "Connection"
7074
- msgstr ""
7075
-
7076
- #: extensions/external-db/classes/Mirroring.php:373
7077
- #: extensions/external-db/classes/Settings.php:1172
7078
- msgid "Select a connection"
7079
- msgstr ""
7080
-
7081
  #: extensions/external-db/classes/Mirroring.php:431
7082
  msgid "Mirror Events"
7083
  msgstr ""
@@ -7094,8 +5480,8 @@ msgstr ""
7094
  msgid "Send all events BUT those with these IDs:"
7095
  msgstr ""
7096
 
 
7097
  #: extensions/external-db/classes/Mirroring.php:518
7098
- #, php-format
7099
  msgid "Refer to the %s for more information."
7100
  msgstr ""
7101
 
@@ -7103,6 +5489,22 @@ msgstr ""
7103
  msgid "list of events and events IDs"
7104
  msgstr ""
7105
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7106
  #: extensions/external-db/classes/Mirroring.php:587
7107
  msgid "Mirroring Wizard"
7108
  msgstr ""
@@ -7131,8 +5533,7 @@ msgstr ""
7131
  msgid "Are you sure that you want to delete this mirror?"
7132
  msgstr ""
7133
 
7134
- #: extensions/external-db/classes/Mirroring.php:599
7135
- #: extensions/reports/inc/wsal-reporting-view.inc.php:991
7136
  msgid "Select Event Code(s)"
7137
  msgstr ""
7138
 
@@ -7144,319 +5545,260 @@ msgstr ""
7144
  msgid "DB/Archive/Mirror"
7145
  msgstr ""
7146
 
7147
- #: extensions/external-db/classes/Settings.php:297
7148
- msgid "Events successfully sent to database."
7149
- msgstr ""
7150
-
7151
  #: extensions/external-db/classes/Settings.php:304
7152
  msgid "An error occurred while sending events to database."
7153
  msgstr ""
7154
 
7155
- #: extensions/external-db/classes/Settings.php:392
 
 
 
 
7156
  msgid "Mirror connection test failed."
7157
  msgstr ""
7158
 
7159
- #: extensions/external-db/classes/Settings.php:443
7160
  msgid "Please do not close this window while migrating events."
7161
  msgstr ""
7162
 
7163
- #: extensions/external-db/classes/Settings.php:487
7164
- #: extensions/external-db/classes/Settings.php:668
7165
- #, php-format
7166
  msgid "Read more on %1$s."
7167
  msgstr ""
7168
 
7169
- #: extensions/external-db/classes/Settings.php:491
7170
  msgid "external storage for activity logs"
7171
  msgstr ""
7172
 
7173
- #: extensions/external-db/classes/Settings.php:495
7174
- msgid ""
7175
- "In this section you can configure the plugin to store the WordPress activity "
7176
- "log in an external storage rather than the WordPress database. This could be "
7177
- "another database on a remote server."
7178
  msgstr ""
7179
 
7180
- #: extensions/external-db/classes/Settings.php:501
7181
  msgid "Store WordPress Activity Log in this External Storage"
7182
  msgstr ""
7183
 
7184
- #: extensions/external-db/classes/Settings.php:510
7185
  msgid "Use buffer"
7186
  msgstr ""
7187
 
7188
- #: extensions/external-db/classes/Settings.php:519
7189
- msgid ""
7190
- "Send the events through the buffer so if the connection to the external "
7191
- "database is slow the performance of the website is not affected."
7192
  msgstr ""
7193
 
7194
- #: extensions/external-db/classes/Settings.php:522
7195
- msgid ""
7196
- "When the buffer is enabled events are sent to the database every 10 minutes, "
7197
- "so the activity log is not updated in real time. Use the button below to "
7198
- "clear the buffer and send the events now."
7199
  msgstr ""
7200
 
7201
- #: extensions/external-db/classes/Settings.php:525
7202
  msgid "Send Events to Database"
7203
  msgstr ""
7204
 
7205
- #: extensions/external-db/classes/Settings.php:530
7206
  msgid "Current Connection Details"
7207
  msgstr ""
7208
 
7209
- #: extensions/external-db/classes/Settings.php:534
7210
  msgid "Currently Connected to database"
7211
  msgstr ""
7212
 
7213
- #: extensions/external-db/classes/Settings.php:542
7214
  msgid "Save & Test Changes"
7215
  msgstr ""
7216
 
7217
- #: extensions/external-db/classes/Settings.php:544
7218
- #: extensions/external-db/classes/Settings.php:794
7219
  msgid "Test Connection"
7220
  msgstr ""
7221
 
7222
- #: extensions/external-db/classes/Settings.php:555
7223
  msgid "Migrate Events to External Storage"
7224
  msgstr ""
7225
 
7226
- #: extensions/external-db/classes/Settings.php:557
7227
- msgid ""
7228
- "Migrate existing WordPress Security Events from the WordPress database to "
7229
- "the new external database."
7230
  msgstr ""
7231
 
7232
- #: extensions/external-db/classes/Settings.php:568
7233
  msgid "Migrate Events to WordPress Database"
7234
  msgstr ""
7235
 
7236
- #: extensions/external-db/classes/Settings.php:570
7237
- msgid ""
7238
- "Remove the external database and start using the WordPress database again. "
7239
- "In the process the events will be automatically migrated to the WordPress "
7240
- "database."
7241
  msgstr ""
7242
 
7243
- #: extensions/external-db/classes/Settings.php:672
7244
  msgid "archiving activity log data"
7245
  msgstr ""
7246
 
7247
- #: extensions/external-db/classes/Settings.php:676
7248
- msgid ""
7249
- "In this section you can configure the archiving of old events to an archive "
7250
- "database. Archives events can still be accessed and are included in search "
7251
- "results and reports."
7252
  msgstr ""
7253
 
7254
- #: extensions/external-db/classes/Settings.php:682
7255
  msgid "Archive the WordPress Activity Log to this Database"
7256
  msgstr ""
7257
 
7258
- #: extensions/external-db/classes/Settings.php:693
7259
  msgid "Archive events that are older than"
7260
  msgstr ""
7261
 
7262
- #: extensions/external-db/classes/Settings.php:695
7263
  msgid "Archiving Options"
7264
  msgstr ""
7265
 
7266
- #: extensions/external-db/classes/Settings.php:709
7267
  msgid "Archive events older than"
7268
  msgstr ""
7269
 
7270
- #: extensions/external-db/classes/Settings.php:713
7271
  msgid "months"
7272
  msgstr ""
7273
 
7274
- #: extensions/external-db/classes/Settings.php:716
7275
  msgid "years"
7276
  msgstr ""
7277
 
7278
- #: extensions/external-db/classes/Settings.php:722
7279
- msgid ""
7280
- "The configured archiving options will override the Security Events Pruning "
7281
- "settings configured in the plugin’s settings."
7282
  msgstr ""
7283
 
7284
- #: extensions/external-db/classes/Settings.php:728
7285
  msgid "WordPress Activity Log Data Retention"
7286
  msgstr ""
7287
 
7288
- #: extensions/external-db/classes/Settings.php:729
7289
- msgid ""
7290
- "Once you configure archiving these data retention settings will be used "
7291
- "instead of the ones configured in the plugin's general settings."
7292
  msgstr ""
7293
 
7294
- #: extensions/external-db/classes/Settings.php:732
7295
  msgid "Activity Log Retention"
7296
  msgstr ""
7297
 
7298
- #: extensions/external-db/classes/Settings.php:738
7299
  msgid "None"
7300
  msgstr ""
7301
 
7302
- #: extensions/external-db/classes/Settings.php:767
7303
  msgid "Next Scheduled Cleanup is in "
7304
  msgstr ""
7305
 
7306
- #: extensions/external-db/classes/Settings.php:772
7307
- #, php-format
7308
  msgid "(or %s)"
7309
  msgstr ""
7310
 
7311
- #: extensions/external-db/classes/Settings.php:773
7312
  msgid "Run Manually"
7313
  msgstr ""
7314
 
7315
- #: extensions/external-db/classes/Settings.php:795
7316
  msgid "Execute Archiving Now"
7317
  msgstr ""
7318
 
7319
- #: extensions/external-db/classes/Settings.php:798
7320
  msgid "Reset Archiving Settings"
7321
  msgstr ""
7322
 
7323
- #: extensions/external-db/classes/Settings.php:799
7324
- msgid ""
7325
- "Click the button below to disable archiving and reset the settings to no "
7326
- "archiving. Note that the archived data will not be deleted."
7327
  msgstr ""
7328
 
7329
- #: extensions/external-db/classes/Settings.php:800
7330
  msgid "Disable Archiving & Reset Settings"
7331
  msgstr ""
7332
 
7333
- #: extensions/external-db/classes/Settings.php:916
7334
  msgid "Run the Archiving Process Every"
7335
  msgstr ""
7336
 
7337
- #: extensions/external-db/classes/Settings.php:945
7338
  msgid "Stop Archiving"
7339
  msgstr ""
7340
 
7341
- #: extensions/external-db/classes/Settings.php:1046
7342
  msgid "Attention!"
7343
  msgstr ""
7344
 
7345
- #: extensions/external-db/classes/Settings.php:1050
7346
- #, php-format
7347
- msgid ""
7348
- "The activity log retention setting is configured to delete events older than "
7349
- "%1$s. This period should be longer than the configured %2$s archiving period "
7350
- "otherwise events will be deleted and not archived."
7351
  msgstr ""
7352
 
7353
- #: extensions/external-db/classes/Settings.php:1292
7354
  msgid "Resetting..."
7355
  msgstr ""
7356
 
7357
- #: extensions/external-db/classes/Settings.php:1293
7358
  msgid "Resetting Failed!"
7359
  msgstr ""
7360
 
7361
- #: extensions/external-db/classes/Settings.php:1295
7362
- #, php-format
7363
  msgid " So far %d events have been migrated."
7364
  msgstr ""
7365
 
7366
- #: extensions/external-db/classes/Settings.php:1296
7367
  msgid "WordPress security events successfully migrated to WordPress database."
7368
  msgstr ""
7369
 
7370
- #: extensions/external-db/classes/Settings.php:1297
7371
- msgid ""
7372
- "WordPress security events successfully migrated to the external database."
7373
  msgstr ""
7374
 
7375
- #: extensions/external-db/classes/Settings.php:1298
7376
  msgid "No events to migrate."
7377
  msgstr ""
7378
 
7379
- #: extensions/external-db/classes/Settings.php:1337
7380
  msgid "Mirror not found."
7381
  msgstr ""
7382
 
7383
- #: extensions/reports/classes/Common.php:732
7384
- #: extensions/reports/classes/Common.php:736
7385
- #: extensions/reports/classes/Common.php:740
7386
- #: extensions/reports/classes/Common.php:744
7387
- #: extensions/reports/classes/Common.php:748
7388
- #: extensions/reports/classes/Common.php:752
7389
- #: extensions/reports/classes/Common.php:756
7390
- #: extensions/reports/classes/Common.php:760
7391
- #: extensions/reports/classes/Common.php:764
7392
- #: extensions/reports/classes/Common.php:768
7393
- #: extensions/reports/classes/Common.php:772
7394
- #, php-format
7395
  msgid "Internal error. <code>%s</code> key was not found."
7396
  msgstr ""
7397
 
7398
- #: extensions/reports/classes/Common.php:796
7399
- #: extensions/reports/classes/Common.php:1613
7400
  msgid "Please specify at least one Alert Group or specify an Alert Code."
7401
  msgstr ""
7402
 
7403
- #: extensions/reports/classes/Common.php:801
7404
  msgid "Internal Error: Could not detect the type of the report to generate."
7405
  msgstr ""
7406
 
7407
- #: extensions/reports/classes/Common.php:911
7408
- #: extensions/reports/classes/Common.php:945
7409
- #: extensions/reports/classes/Common.php:990
7410
- #: extensions/reports/classes/Common.php:1008
7411
- #: extensions/reports/classes/Common.php:1811
7412
- msgid ""
7413
- "There are no alerts that match your filtering criteria. Please try a "
7414
- "different set of rules."
7415
  msgstr ""
7416
 
7417
- #: extensions/reports/classes/Common.php:993
7418
- #: extensions/reports/classes/Common.php:1011
7419
- #: extensions/reports/classes/Common.php:1814
7420
- #, php-format
7421
  msgid "Error: The <strong>%s</strong> path is not accessible."
7422
  msgstr ""
7423
 
7424
- #: extensions/reports/classes/Common.php:1272
7425
- #: extensions/reports/classes/Common.php:1711
7426
- #, php-format
7427
  msgid "%1$s - Website %2$s"
7428
  msgstr ""
7429
 
7430
- #: extensions/reports/classes/Common.php:1275
7431
- #: extensions/reports/classes/Common.php:1714
7432
- #, php-format
7433
  msgid "Week number %1$s - Website %2$s"
7434
  msgstr ""
7435
 
7436
- #: extensions/reports/classes/Common.php:1278
7437
- #: extensions/reports/classes/Common.php:1717
7438
- #, php-format
7439
  msgid "Month %1$s %2$s- Website %3$s"
7440
  msgstr ""
7441
 
7442
- #: extensions/reports/classes/Common.php:1281
7443
- #: extensions/reports/classes/Common.php:1720
7444
- #, php-format
7445
  msgid "Quarter %1$s - Website %2$s"
7446
  msgstr ""
7447
 
7448
- #: extensions/reports/classes/Common.php:1293
7449
- #: extensions/reports/classes/Common.php:1726
7450
- #, php-format
7451
  msgid " - %s Email Report"
7452
  msgstr ""
7453
 
7454
- #: extensions/reports/classes/Common.php:1585
7455
  msgid "Internal Error. Could not retrieve the alerts from the main plugin."
7456
  msgstr ""
7457
 
7458
- #: extensions/reports/classes/HtmlReportGenerator.php:108
7459
- #: extensions/reports/classes/HtmlReportGenerator.php:355
7460
  msgid "WP Activity Log Reporter"
7461
  msgstr ""
7462
 
@@ -7468,18 +5810,15 @@ msgstr ""
7468
  msgid "website"
7469
  msgstr ""
7470
 
7471
- #: extensions/reports/classes/HtmlReportGenerator.php:150
7472
- #: extensions/reports/classes/HtmlReportGenerator.php:364
7473
  msgid "Report Details:"
7474
  msgstr ""
7475
 
7476
- #: extensions/reports/classes/HtmlReportGenerator.php:151
7477
- #: extensions/reports/classes/HtmlReportGenerator.php:365
7478
  msgid "Generated on:"
7479
  msgstr ""
7480
 
7481
- #: extensions/reports/classes/HtmlReportGenerator.php:152
7482
- #: extensions/reports/classes/HtmlReportGenerator.php:366
7483
  msgid "Generated by:"
7484
  msgstr ""
7485
 
@@ -7503,18 +5842,15 @@ msgstr ""
7503
  msgid "Alert Groups"
7504
  msgstr ""
7505
 
7506
- #: extensions/reports/classes/HtmlReportGenerator.php:163
7507
- #: extensions/reports/classes/HtmlReportGenerator.php:370
7508
  msgid "Alert Code(s)"
7509
  msgstr ""
7510
 
7511
- #: extensions/reports/classes/HtmlReportGenerator.php:164
7512
- #: extensions/reports/classes/HtmlReportGenerator.php:371
7513
  msgid "Start date"
7514
  msgstr ""
7515
 
7516
- #: extensions/reports/classes/HtmlReportGenerator.php:165
7517
- #: extensions/reports/classes/HtmlReportGenerator.php:372
7518
  msgid "End date"
7519
  msgstr ""
7520
 
@@ -7522,21 +5858,15 @@ msgstr ""
7522
  msgid "Post Types"
7523
  msgstr ""
7524
 
7525
- #: extensions/reports/classes/HtmlReportGenerator.php:167
7526
- #: extensions/reports/inc/wsal-reporting-view.inc.php:773
7527
- #: extensions/search/classes/FilterManager.php:494
7528
- #: extensions/search/classes/Filters/poststatusfilter.php:47
7529
- #: extensions/search/classes/Filters/poststatusfilter.php:82
7530
  msgid "Post Status"
7531
  msgstr ""
7532
 
7533
- #: extensions/reports/classes/HtmlReportGenerator.php:176
7534
- #: extensions/reports/classes/HtmlReportGenerator.php:341
7535
  msgid "From the beginning"
7536
  msgstr ""
7537
 
7538
- #: extensions/reports/classes/HtmlReportGenerator.php:221
7539
- #: extensions/reports/classes/HtmlReportGenerator.php:367
7540
  msgid "Criteria"
7541
  msgstr ""
7542
 
@@ -7544,50 +5874,6 @@ msgstr ""
7544
  msgid "Results"
7545
  msgstr ""
7546
 
7547
- #: extensions/reports/classes/Views/Main.php:72
7548
- msgid "Reporting"
7549
- msgstr ""
7550
-
7551
- #: extensions/reports/classes/Views/Main.php:86
7552
- msgid "Reports"
7553
- msgstr ""
7554
-
7555
- #: extensions/reports/classes/Views/Main.php:666
7556
- msgid " Generating reports. Please do not close this window"
7557
- msgstr ""
7558
-
7559
- #: extensions/reports/classes/Views/Main.php:679
7560
- msgid ""
7561
- "To generate a report or configure automated scheduled report please contact "
7562
- "the administrator of this multisite network on "
7563
- msgstr ""
7564
-
7565
- #: extensions/reports/classes/Views/Main.php:697
7566
- #, php-format
7567
- msgid ""
7568
- "The %s directory which the Reports plugin uses to create reports in was "
7569
- "either not found or is not accessible."
7570
- msgstr ""
7571
-
7572
- #: extensions/reports/classes/Views/Main.php:701
7573
- #, php-format
7574
- msgid ""
7575
- "In order for the plugin to function, the directory %1$s must be created and "
7576
- "the plugin should have access to write to this directory, so please "
7577
- "configure the following permissions: 0755. If you have any questions or need "
7578
- "further assistance please %2$s"
7579
- msgstr ""
7580
-
7581
- #: extensions/reports/classes/Views/Main.php:741
7582
- #: extensions/user-sessions/classes/Views.php:429
7583
- msgid "You do not have sufficient permissions."
7584
- msgstr ""
7585
-
7586
- #: extensions/reports/inc/wsal-reporting-view.inc.php:194
7587
- msgid ""
7588
- "You do not have sufficient permissions to access this page - rep plugin."
7589
- msgstr ""
7590
-
7591
  #: extensions/reports/inc/wsal-reporting-view.inc.php:198
7592
  msgid "Invalid Request. Please refresh the page and try again."
7593
  msgstr ""
@@ -7620,383 +5906,340 @@ msgstr ""
7620
  msgid "Please select the report format."
7621
  msgstr ""
7622
 
7623
- #: extensions/reports/inc/wsal-reporting-view.inc.php:463
7624
- #: extensions/reports/inc/wsal-reporting-view.inc.php:518
7625
- msgid " Generating report. Please do not close this window"
7626
- msgstr ""
7627
-
7628
  #: extensions/reports/inc/wsal-reporting-view.inc.php:495
7629
  msgid "Periodic Report successfully saved."
7630
  msgstr ""
7631
 
7632
- #: extensions/reports/inc/wsal-reporting-view.inc.php:540
 
 
 
 
7633
  msgid "Periodic Report successfully Deleted."
7634
  msgstr ""
7635
 
7636
- #: extensions/reports/inc/wsal-reporting-view.inc.php:571
7637
  msgid "Generate & Configure Periodic Reports"
7638
  msgstr ""
7639
 
7640
- #: extensions/reports/inc/wsal-reporting-view.inc.php:572
7641
  msgid "Statistics Reports"
7642
  msgstr ""
7643
 
7644
- #: extensions/reports/inc/wsal-reporting-view.inc.php:592
7645
  msgid "Generate a report"
7646
  msgstr ""
7647
 
7648
- #: extensions/reports/inc/wsal-reporting-view.inc.php:595
7649
  msgid "Step 1: Select the type of report"
7650
  msgstr ""
7651
 
7652
- #: extensions/reports/inc/wsal-reporting-view.inc.php:601
7653
  msgid "By Site(s)"
7654
  msgstr ""
7655
 
7656
- #: extensions/reports/inc/wsal-reporting-view.inc.php:609
7657
  msgid "Specify sites"
7658
  msgstr ""
7659
 
7660
- #: extensions/reports/inc/wsal-reporting-view.inc.php:617
7661
  msgid "By User(s)"
7662
  msgstr ""
7663
 
7664
- #: extensions/reports/inc/wsal-reporting-view.inc.php:621
7665
  msgid "All Users"
7666
  msgstr ""
7667
 
7668
- #: extensions/reports/inc/wsal-reporting-view.inc.php:625
7669
  msgid "Specify users"
7670
  msgstr ""
7671
 
7672
- #: extensions/reports/inc/wsal-reporting-view.inc.php:649
7673
- msgid ""
7674
- "Automated verification of usernames is disabled because you have more than "
7675
- "100 users. The process might require a lot of resources to work with a lot "
7676
- "of users. Tick the option below to enable it again."
7677
  msgstr ""
7678
 
7679
- #: extensions/reports/inc/wsal-reporting-view.inc.php:654
7680
  msgid "Enable Autocomplete"
7681
  msgstr ""
7682
 
7683
- #: extensions/reports/inc/wsal-reporting-view.inc.php:663
7684
  msgid "By Role(s)"
7685
  msgstr ""
7686
 
7687
- #: extensions/reports/inc/wsal-reporting-view.inc.php:667
7688
  msgid "All Roles"
7689
  msgstr ""
7690
 
7691
- #: extensions/reports/inc/wsal-reporting-view.inc.php:671
7692
  msgid "Specify roles"
7693
  msgstr ""
7694
 
7695
- #: extensions/reports/inc/wsal-reporting-view.inc.php:679
7696
  msgid "By IP Address(es)"
7697
  msgstr ""
7698
 
7699
- #: extensions/reports/inc/wsal-reporting-view.inc.php:683
7700
  msgid "All IP Addresses"
7701
  msgstr ""
7702
 
7703
- #: extensions/reports/inc/wsal-reporting-view.inc.php:687
7704
  msgid "Specify IP Addresses"
7705
  msgstr ""
7706
 
7707
- #: extensions/reports/inc/wsal-reporting-view.inc.php:695
7708
  msgid "By Object(s)"
7709
  msgstr ""
7710
 
7711
- #: extensions/reports/inc/wsal-reporting-view.inc.php:699
7712
  msgid "All Objects"
7713
  msgstr ""
7714
 
7715
- #: extensions/reports/inc/wsal-reporting-view.inc.php:703
7716
  msgid "Specify Objects"
7717
  msgstr ""
7718
 
7719
- #: extensions/reports/inc/wsal-reporting-view.inc.php:711
7720
  msgid "By Event Type(s)"
7721
  msgstr ""
7722
 
7723
- #: extensions/reports/inc/wsal-reporting-view.inc.php:715
7724
  msgid "All Event Types"
7725
  msgstr ""
7726
 
7727
- #: extensions/reports/inc/wsal-reporting-view.inc.php:719
7728
  msgid "Specify Event Types"
7729
  msgstr ""
7730
 
7731
- #: extensions/reports/inc/wsal-reporting-view.inc.php:727
7732
  msgid "By Event Code(s)"
7733
  msgstr ""
7734
 
7735
- #: extensions/reports/inc/wsal-reporting-view.inc.php:745
7736
- msgid "No alerts were found"
7737
- msgstr ""
7738
-
7739
- #: extensions/reports/inc/wsal-reporting-view.inc.php:759
7740
  msgid "Posts"
7741
  msgstr ""
7742
 
7743
- #: extensions/reports/inc/wsal-reporting-view.inc.php:765
7744
- #: extensions/search/classes/FilterManager.php:498
7745
- #: extensions/search/classes/Filters/posttypefilter.php:46
7746
- #: extensions/search/classes/Filters/posttypefilter.php:85
7747
  msgid "Post Type"
7748
  msgstr ""
7749
 
7750
- #: extensions/reports/inc/wsal-reporting-view.inc.php:787
7751
  msgid "Specify Event Codes"
7752
  msgstr ""
7753
 
7754
- #: extensions/reports/inc/wsal-reporting-view.inc.php:795
7755
  msgid "By the Below Criteria"
7756
  msgstr ""
7757
 
7758
- #: extensions/reports/inc/wsal-reporting-view.inc.php:800
7759
  msgid "Number & List of unique IP addresses per user"
7760
  msgstr ""
7761
 
7762
- #: extensions/reports/inc/wsal-reporting-view.inc.php:805
7763
  msgid "Number of Logins per user"
7764
  msgstr ""
7765
 
7766
- #: extensions/reports/inc/wsal-reporting-view.inc.php:839
7767
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1698
7768
  msgid "Select site(s)"
7769
  msgstr ""
7770
 
7771
- #: extensions/reports/inc/wsal-reporting-view.inc.php:861
7772
  msgid "Select user(s)"
7773
  msgstr ""
7774
 
7775
- #: extensions/reports/inc/wsal-reporting-view.inc.php:903
7776
  msgid "Select role(s)"
7777
  msgstr ""
7778
 
7779
- #: extensions/reports/inc/wsal-reporting-view.inc.php:925
7780
  msgid "Select IP address(es)"
7781
  msgstr ""
7782
 
7783
- #: extensions/reports/inc/wsal-reporting-view.inc.php:947
7784
  msgid "Select Objects(s)"
7785
  msgstr ""
7786
 
7787
- #: extensions/reports/inc/wsal-reporting-view.inc.php:969
7788
  msgid "Select Type(s)"
7789
  msgstr ""
7790
 
7791
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1021
7792
  msgid "Select Post Type(s)"
7793
  msgstr ""
7794
 
7795
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1051
7796
  msgid "Select Post Status(es)"
7797
  msgstr ""
7798
 
7799
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1355
7800
  msgid "Step 2: Select the date range"
7801
  msgstr ""
7802
 
7803
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1357
7804
- msgid ""
7805
- "Note: Do not specify any dates if you are creating a scheduled report or if "
7806
- "you want to generate a report from when you started the audit trail."
7807
  msgstr ""
7808
 
7809
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1362
7810
  msgid "Start Date"
7811
  msgstr ""
7812
 
7813
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1365
7814
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1507
7815
  msgid "Select start date"
7816
  msgstr ""
7817
 
7818
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1371
7819
  msgid "End Date"
7820
  msgstr ""
7821
 
7822
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1374
7823
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1516
7824
  msgid "Select end date"
7825
  msgstr ""
7826
 
7827
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1388
7828
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1600
7829
  msgid "Step 3: Select Report Format"
7830
  msgstr ""
7831
 
7832
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1395
7833
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1606
7834
  msgid "HTML"
7835
  msgstr ""
7836
 
7837
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1400
7838
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1610
7839
  msgid "CSV"
7840
  msgstr ""
7841
 
7842
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1407
7843
  msgid "Step 4: Generate Report Now or Configure Periodic Reports"
7844
  msgstr ""
7845
 
7846
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1410
7847
  msgid "Generate Report Now"
7848
  msgstr ""
7849
 
7850
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1413
7851
- msgid ""
7852
- " Use the buttons below to use the above criteria for a daily, weekly and "
7853
- "monthly summary report which is sent automatically via email."
7854
  msgstr ""
7855
 
7856
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1416
7857
  msgid "Email address(es)"
7858
  msgstr ""
7859
 
7860
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1422
7861
  msgid "Report Name"
7862
  msgstr ""
7863
 
7864
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1430
7865
  msgid "Daily"
7866
  msgstr ""
7867
 
7868
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1431
7869
  msgid "Weekly"
7870
  msgstr ""
7871
 
7872
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1432
7873
  msgid "Monthly"
7874
  msgstr ""
7875
 
7876
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1433
7877
  msgid "Quarterly"
7878
  msgstr ""
7879
 
7880
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1446
7881
  msgid "Configured Periodic Reports"
7882
  msgstr ""
7883
 
7884
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1449
7885
- msgid ""
7886
- "Below is the list of configured periodic reports. Click on Modify to load "
7887
- "the criteria and configure it above. To save the new criteria as a new "
7888
- "report change the report name and save it. Do not change the report name to "
7889
- "overwrite the existing periodic report."
7890
  msgstr ""
7891
 
7892
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1452
7893
- msgid ""
7894
- "Note: Use the Send Now button to generate a report with data from the last "
7895
- "90 days if a quarterly report is configured, 30 days if monthly report is "
7896
- "configured and 7 days if weekly report is configured."
7897
  msgstr ""
7898
 
7899
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1500
7900
  msgid "Step 1: Choose Date Range"
7901
  msgstr ""
7902
 
7903
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1504
7904
- #: extensions/search/classes/Filters/DateFilter.php:55
7905
  msgid "From"
7906
  msgstr ""
7907
 
7908
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1513
7909
  msgid "To"
7910
  msgstr ""
7911
 
7912
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1529
7913
  msgid "Step 2: Choose Criteria"
7914
  msgstr ""
7915
 
7916
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1532
7917
  msgid "Report for"
7918
  msgstr ""
7919
 
7920
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1537
7921
  msgid "Number of logins for user"
7922
  msgstr ""
7923
 
7924
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1542
7925
  msgid "Number of logins for users with the role of"
7926
  msgstr ""
7927
 
7928
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1547
7929
  msgid "Number of views for user"
7930
  msgstr ""
7931
 
7932
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1552
7933
  msgid "Number of views for users with the role of"
7934
  msgstr ""
7935
 
7936
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1557
7937
  msgid "Number of published content for user"
7938
  msgstr ""
7939
 
7940
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1562
7941
  msgid "Number of published content for users with the role of"
7942
  msgstr ""
7943
 
7944
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1567
7945
  msgid "Different IP addresses for Usernames"
7946
  msgstr ""
7947
 
7948
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1572
7949
  msgid "List only IP addresses used during login"
7950
  msgstr ""
7951
 
7952
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1574
7953
- msgid ""
7954
- "If the above option is enabled the report will only include the IP addresses "
7955
- "from where the user logged in. If it is disabled it will list all the IP "
7956
- "addresses from where the plugin recorded activity originating from the user."
7957
  msgstr ""
7958
 
7959
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1633
7960
  msgid "Please specify at least one site"
7961
  msgstr ""
7962
 
7963
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1642
7964
  msgid "Please specify at least one user"
7965
  msgstr ""
7966
 
7967
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1651
7968
  msgid "Please specify at least one role"
7969
  msgstr ""
7970
 
7971
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1660
7972
  msgid "Please specify at least one IP address"
7973
  msgstr ""
7974
 
7975
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1669
7976
  msgid "Please specify at least one object"
7977
  msgstr ""
7978
 
7979
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1678
7980
  msgid "Please specify at least one event type"
7981
  msgstr ""
7982
 
7983
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1687
7984
  msgid "Please specify at least one Alert group or specify an Alert code"
7985
  msgstr ""
7986
 
7987
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1719
7988
- msgid "Select user"
7989
- msgstr ""
7990
-
7991
- #: extensions/reports/inc/wsal-reporting-view.inc.php:1745
7992
- msgid "Select role"
7993
- msgstr ""
7994
-
7995
  #: extensions/search/classes/FilterManager.php:210
7996
- msgid ""
7997
- "Refer to the <a href=\"https://wpactivitylog.com/support/kb/list-wordpress-"
7998
- "activity-log-event-ids/\" target=\"_blank\">list of Event IDs</a> for "
7999
- "reference."
8000
  msgstr ""
8001
 
8002
  #: extensions/search/classes/FilterManager.php:374
@@ -8007,16 +6250,6 @@ msgstr ""
8007
  msgid "Dismiss this notice."
8008
  msgstr ""
8009
 
8010
- #: extensions/search/classes/FilterManager.php:383
8011
- #: extensions/search/search-init.php:333
8012
- msgid "Load Search & Filters"
8013
- msgstr ""
8014
-
8015
- #: extensions/search/classes/FilterManager.php:386
8016
- #: extensions/search/search-init.php:335
8017
- msgid "Remove"
8018
- msgstr ""
8019
-
8020
  #: extensions/search/classes/FilterManager.php:395
8021
  msgid "Save Search & Filters"
8022
  msgstr ""
@@ -8026,57 +6259,34 @@ msgid "* Invalid Name"
8026
  msgstr ""
8027
 
8028
  #: extensions/search/classes/FilterManager.php:402
8029
- msgid ""
8030
- "Name can only be 12 characters long and only letters, numbers and underscore "
8031
- "are allowed."
8032
  msgstr ""
8033
 
8034
- #: extensions/search/classes/FilterManager.php:405
8035
- #: extensions/user-sessions/classes/View/Options/Policies.php:314
8036
- #: extensions/user-sessions/classes/View/Settings.php:96
8037
  msgid "Save"
8038
  msgstr ""
8039
 
8040
- #: extensions/search/classes/FilterManager.php:411
8041
- #: extensions/search/search-init.php:337
8042
- msgid "Filter View"
8043
- msgstr ""
8044
-
8045
- #: extensions/search/classes/FilterManager.php:426
8046
- #: extensions/search/classes/FilterManager.php:537
8047
- msgid ""
8048
- "Refer to the <a href=\"https://wpactivitylog.com/support/kb/list-wordpress-"
8049
- "activity-log-event-ids/\" target=\"_blank\" rel=\"nofollow noopener\">list "
8050
- "of Event IDs</a> for reference."
8051
  msgstr ""
8052
 
8053
  #: extensions/search/classes/FilterManager.php:438
8054
- msgid ""
8055
- "Refer to the <a href=\"https://wpactivitylog.com/support/kb/list-wordpress-"
8056
- "activity-log-event-ids/\" target=\"_blank\" rel=\"nofollow noopener"
8057
- "\">metadata in the activity log</a> for reference."
8058
  msgstr ""
8059
 
8060
  #: extensions/search/classes/FilterManager.php:450
8061
- msgid ""
8062
- "Refer to the <a href=\"https://wpactivitylog.com/support/kb/severity-levels-"
8063
- "wordpress-activity-log/\" target=\"_blank\" rel=\"nofollow noopener"
8064
- "\">severity levels in the activity log</a> for reference."
8065
  msgstr ""
8066
 
8067
  #: extensions/search/classes/FilterManager.php:463
8068
- msgid ""
8069
- "Refer to the <a href=\"https://wpactivitylog.com/support/kb/list-wordpress-"
8070
- "audit-trail-alerts/\" target=\"_blank\" rel=\"nofollow noopener\">list of "
8071
- "Event IDs</a> for reference."
8072
  msgstr ""
8073
 
8074
  #: extensions/search/classes/FilterManager.php:475
8075
  msgid "Filter by username"
8076
  msgstr ""
8077
 
8078
- #: extensions/search/classes/FilterManager.php:478
8079
- #: extensions/user-sessions/classes/View/Sessions.php:350
8080
  msgid "First Name"
8081
  msgstr ""
8082
 
@@ -8084,8 +6294,7 @@ msgstr ""
8084
  msgid "Filter by user first name"
8085
  msgstr ""
8086
 
8087
- #: extensions/search/classes/FilterManager.php:482
8088
- #: extensions/user-sessions/classes/View/Sessions.php:351
8089
  msgid "Last Name"
8090
  msgstr ""
8091
 
@@ -8109,9 +6318,7 @@ msgstr ""
8109
  msgid "Filter by post type"
8110
  msgstr ""
8111
 
8112
- #: extensions/search/classes/FilterManager.php:502
8113
- #: extensions/search/classes/Filters/PostIDFilter.php:29
8114
- #: extensions/search/classes/Filters/PostIDFilter.php:57
8115
  msgid "Post ID"
8116
  msgstr ""
8117
 
@@ -8119,9 +6326,7 @@ msgstr ""
8119
  msgid "Filter by post ID"
8120
  msgstr ""
8121
 
8122
- #: extensions/search/classes/FilterManager.php:506
8123
- #: extensions/search/classes/Filters/PostNameFilter.php:30
8124
- #: extensions/search/classes/Filters/PostNameFilter.php:55
8125
  msgid "Post Name"
8126
  msgstr ""
8127
 
@@ -8145,342 +6350,227 @@ msgstr ""
8145
  msgid "Enter an IP address to filter"
8146
  msgstr ""
8147
 
8148
- #: extensions/search/classes/Filters/AlertWidget.php:38
8149
- msgid "Enter an Event ID to filter - example: 1000"
8150
- msgstr ""
8151
-
8152
- #: extensions/search/classes/Filters/AlertWidget.php:40
8153
- #: extensions/search/classes/Filters/DateWidget.php:38
8154
- #: extensions/search/classes/Filters/IpWidget.php:40
8155
- #: extensions/search/classes/Filters/PostNameWidget.php:38
8156
- #: extensions/search/classes/Filters/postidwidget.php:37
8157
- #: extensions/search/classes/Filters/userfirstnamewidget.php:37
8158
- #: extensions/search/classes/Filters/userlastnamewidget.php:37
8159
- #: extensions/search/classes/Filters/usernamewidget.php:38
8160
- msgid "Add this filter"
8161
- msgstr ""
8162
-
8163
- #: extensions/search/classes/Filters/CodeWidget.php:37
8164
- msgid "Select a Severity to filter"
8165
- msgstr ""
8166
-
8167
- #: extensions/search/classes/Filters/DateFilter.php:56
8168
- msgid "Earlier than"
8169
- msgstr ""
8170
-
8171
- #: extensions/search/classes/Filters/DateFilter.php:57
8172
- msgid "On this day"
8173
- msgstr ""
8174
-
8175
- #: extensions/search/classes/Filters/EventTypeWidget.php:30
8176
- msgid "Select an Event Type to filter"
8177
- msgstr ""
8178
-
8179
- #: extensions/search/classes/Filters/IpWidget.php:38
8180
- msgid "192.168.128.255"
8181
- msgstr ""
8182
-
8183
- #: extensions/search/classes/Filters/ObjectWidget.php:33
8184
- msgid "Select an Object to filter"
8185
- msgstr ""
8186
-
8187
- #: extensions/search/classes/Filters/PostNameWidget.php:36
8188
- msgid "Enter post name to filter"
8189
- msgstr ""
8190
-
8191
- #: extensions/search/classes/Filters/PostStatusWidget.php:36
8192
- msgid "Select a post status to filter"
8193
- msgstr ""
8194
-
8195
- #: extensions/search/classes/Filters/PostTypeWidget.php:36
8196
- msgid "Select a post type to filter"
8197
- msgstr ""
8198
-
8199
- #: extensions/search/classes/Filters/SiteFilter.php:57
8200
- msgid "Sites"
8201
- msgstr ""
8202
-
8203
- #: extensions/search/classes/Filters/SiteWidget.php:33
8204
- msgid "Select a Site to filter"
8205
- msgstr ""
8206
-
8207
- #: extensions/search/classes/Filters/UserRoleWidget.php:36
8208
- msgid "Select a user role to filter"
8209
- msgstr ""
8210
-
8211
- #: extensions/search/classes/Filters/postidwidget.php:35
8212
- msgid "Enter post ID to filter"
8213
- msgstr ""
8214
-
8215
- #: extensions/search/classes/Filters/userfirstnamewidget.php:35
8216
- #: extensions/search/classes/Filters/userlastnamewidget.php:35
8217
- msgid "Enter users first name to filter"
8218
- msgstr ""
8219
-
8220
- #: extensions/search/classes/Filters/usernamewidget.php:36
8221
- msgid "Enter a username to filter"
8222
- msgstr ""
8223
-
8224
- #: extensions/search/search-init.php:207 extensions/search/search-init.php:323
8225
- #: extensions/user-sessions/classes/View/Sessions.php:367
8226
- msgid "Search"
8227
- msgstr ""
8228
-
8229
- #: extensions/search/search-init.php:324
8230
- msgid ""
8231
- "- Use the free-text search to search for text in the event's message.<br>- "
8232
- "To search for a particular Event ID, user, IP address, Post ID or Type or "
8233
- "use date ranges, use the filters."
8234
  msgstr ""
8235
 
8236
- #: extensions/search/search-init.php:325
8237
- msgid "Clear Search Results"
8238
  msgstr ""
8239
 
8240
- #: extensions/search/search-init.php:326
8241
- msgid "Nothing found!"
8242
  msgstr ""
8243
 
8244
- #: extensions/search/search-init.php:327
8245
- msgid "Load"
8246
  msgstr ""
8247
 
8248
- #: extensions/search/search-init.php:328
8249
- msgid "Loading..."
8250
  msgstr ""
8251
 
8252
- #: extensions/search/search-init.php:329
8253
- msgid "Load & Run"
8254
  msgstr ""
8255
 
8256
- #: extensions/search/search-init.php:334
8257
- msgid "* Invalid IP"
 
8258
  msgstr ""
8259
 
8260
- #: extensions/search/search-init.php:336
8261
- msgid "Close Filters"
8262
  msgstr ""
8263
 
8264
- #: extensions/search/search-init.php:340
8265
- #, php-format
8266
- msgid ""
8267
- "Click the %1$sSearch%2$s button to apply the filters. Click the %1$sClear "
8268
- "Search Results%2$s button to reset the search and filters."
8269
  msgstr ""
8270
 
8271
- #: extensions/search/search-init.php:386
8272
- msgid "Widget could not be found."
8273
  msgstr ""
8274
 
8275
- #: extensions/search/search-init.php:453
8276
- msgid "Saved searches found."
8277
  msgstr ""
8278
 
8279
- #: extensions/search/search-init.php:461 extensions/search/search-init.php:531
8280
- msgid "No saved search found."
8281
  msgstr ""
8282
 
8283
- #: extensions/search/search-init.php:495
8284
- msgid "Search name not specified."
8285
  msgstr ""
8286
 
8287
- #: extensions/search/search-init.php:514
8288
- msgid "Saved search deleted."
8289
  msgstr ""
8290
 
8291
- #: extensions/search/search-init.php:522
8292
- msgid "Saved search not found."
8293
  msgstr ""
8294
 
8295
- #: extensions/user-sessions/classes/Helpers.php:129
8296
- msgid ""
8297
- "ERROR: Your session was blocked with the WP Activity Log plugin because "
8298
- "there is already another user logged in with the same username. Please "
8299
- "contact the site administrator for more information."
8300
  msgstr ""
8301
 
8302
- #: extensions/user-sessions/classes/Sensors/UserSessionsTracking.php:283
8303
- #: extensions/user-sessions/classes/View/Options/Policies.php:234
8304
- msgid ""
8305
- "ERROR: Your session was blocked with the <a href=\"https://en-gb.wordpress."
8306
- "org/plugins/wp-security-audit-log\" target=\"_blank\">WP Activity Log "
8307
- "plugin</a> because there is already another user logged in with the same "
8308
- "username. Please contact the site administrator for more information."
8309
  msgstr ""
8310
 
8311
- #: extensions/user-sessions/classes/View/Options.php:30
8312
- msgid "Users Sessions Management"
8313
  msgstr ""
8314
 
8315
- #: extensions/user-sessions/classes/View/Options.php:44
8316
- msgid "User Session Options"
8317
  msgstr ""
8318
 
8319
- #: extensions/user-sessions/classes/View/Options/Policies.php:38
8320
- msgid "Main Policies"
8321
  msgstr ""
8322
 
8323
- #: extensions/user-sessions/classes/View/Options/Policies.php:94
8324
- #: extensions/user-sessions/classes/View/Settings.php:68
8325
- msgid "Settings have been saved"
8326
  msgstr ""
8327
 
8328
- #: extensions/user-sessions/classes/View/Options/Policies.php:110
8329
- msgid "Users sessions policies"
8330
  msgstr ""
8331
 
8332
- #: extensions/user-sessions/classes/View/Options/Policies.php:112
8333
- msgid ""
8334
- "Use the settings below to configure the policies to manage the users' "
8335
- "sessions policies. These policies are automatically inherited by all "
8336
- "profiles. However, you can disable the inheritance or configure different "
8337
- "policies for specific roles in the role's tab."
8338
  msgstr ""
8339
 
8340
- #: extensions/user-sessions/classes/View/Options/Policies.php:117
8341
- msgid "Enable session policies"
8342
  msgstr ""
8343
 
8344
- #: extensions/user-sessions/classes/View/Options/Policies.php:140
8345
- msgid "Do not enforce policies on users with this role"
8346
  msgstr ""
8347
 
8348
- #: extensions/user-sessions/classes/View/Options/Policies.php:158
8349
- msgid "Inherit the sessions policies"
8350
  msgstr ""
8351
 
8352
- #: extensions/user-sessions/classes/View/Options/Policies.php:178
8353
- msgid ""
8354
- "By default WordPress does not limit how many times the same user can connect "
8355
- "simultaneously. So two different users can login at the same time using the "
8356
- "same username. Use the settings below to limit and also block simultaneous "
8357
- "connections for the same username."
8358
  msgstr ""
8359
 
8360
- #: extensions/user-sessions/classes/View/Options/Policies.php:180
8361
- msgid ""
8362
- "Do you want to allow two or more people to login simultaneously with the "
8363
- "same username?"
8364
  msgstr ""
8365
 
8366
- #: extensions/user-sessions/classes/View/Options/Policies.php:182
8367
- msgid ""
8368
- "By allowing multiple sessions two or more people can login to WordPress "
8369
- "using the same username. By blocking them, once a person is logged in with a "
8370
- "username, if another person tries to login with the same username they will "
8371
- "be blocked."
8372
  msgstr ""
8373
 
8374
- #: extensions/user-sessions/classes/View/Options/Policies.php:187
8375
- msgid "Multiple Sessions"
8376
  msgstr ""
8377
 
8378
- #: extensions/user-sessions/classes/View/Options/Policies.php:196
8379
- msgid "Allow one session only"
8380
  msgstr ""
8381
 
8382
- #: extensions/user-sessions/classes/View/Options/Policies.php:202
8383
- msgid "Allow one session only and override current session"
8384
  msgstr ""
8385
 
8386
- #: extensions/user-sessions/classes/View/Options/Policies.php:212
8387
- #, php-format
8388
- msgid "Allow up to %s sessions and block the rest"
8389
  msgstr ""
8390
 
8391
- #: extensions/user-sessions/classes/View/Options/Policies.php:223
8392
- msgid "Configure a Blocked Session Notification for Users"
8393
  msgstr ""
8394
 
8395
- #: extensions/user-sessions/classes/View/Options/Policies.php:225
8396
- msgid ""
8397
- "This error message is shown to users when they try to login with a username "
8398
- "that already has a session and their session is blocked. You can change this "
8399
- "message by editing the text in the below placeholder. Only <a href> HTML "
8400
- "code is allowed."
8401
  msgstr ""
8402
 
8403
- #: extensions/user-sessions/classes/View/Options/Policies.php:230
8404
- msgid "Blocked Sessions Error"
8405
  msgstr ""
8406
 
8407
- #: extensions/user-sessions/classes/View/Options/Policies.php:248
8408
- msgid "Do you want to terminate idle sessions automatically?"
8409
  msgstr ""
8410
 
8411
- #: extensions/user-sessions/classes/View/Options/Policies.php:250
8412
- msgid ""
8413
- "If a session has been idle for more than the configured number of hours, it "
8414
- "will be automatically destroyed by the plugin."
8415
  msgstr ""
8416
 
8417
- #: extensions/user-sessions/classes/View/Options/Policies.php:255
8418
- msgid "Terminate Idle Sessions"
8419
  msgstr ""
8420
 
8421
- #: extensions/user-sessions/classes/View/Options/Policies.php:272
8422
- msgid "1"
8423
  msgstr ""
8424
 
8425
- #: extensions/user-sessions/classes/View/Options/Policies.php:273
8426
- msgid "4"
8427
  msgstr ""
8428
 
8429
- #: extensions/user-sessions/classes/View/Options/Policies.php:274
8430
- msgid "8"
8431
  msgstr ""
8432
 
8433
- #: extensions/user-sessions/classes/View/Options/Policies.php:275
8434
- msgid "12"
8435
  msgstr ""
8436
 
8437
- #: extensions/user-sessions/classes/View/Options/Policies.php:276
8438
- msgid "24"
8439
  msgstr ""
8440
 
8441
- #: extensions/user-sessions/classes/View/Options/Policies.php:277
8442
- msgid "32"
8443
  msgstr ""
8444
 
8445
- #: extensions/user-sessions/classes/View/Options/Policies.php:278
8446
- msgid "48"
8447
  msgstr ""
8448
 
8449
- #: extensions/user-sessions/classes/View/Options/Policies.php:285
8450
- msgid "terminate sessions if they have been idle for more than"
8451
  msgstr ""
8452
 
8453
- #: extensions/user-sessions/classes/View/Options/Policies.php:289
8454
- msgid " seconds (Testing)"
8455
  msgstr ""
8456
 
8457
- #: extensions/user-sessions/classes/View/Options/Policies.php:296
8458
- msgid " hour"
8459
  msgstr ""
8460
 
8461
- #: extensions/user-sessions/classes/View/Options/Policies.php:296
8462
- #: extensions/user-sessions/classes/View/Options/Policies.php:303
8463
- msgid " hours"
8464
  msgstr ""
8465
 
8466
- #: extensions/user-sessions/classes/View/Sessions.php:42
8467
- #: extensions/user-sessions/classes/Views.php:124
8468
- msgid "Logged In Users"
8469
  msgstr ""
8470
 
8471
- #: extensions/user-sessions/classes/View/Sessions.php:114
8472
- #: extensions/user-sessions/classes/Views.php:191
8473
- msgid "Retrieve user data"
8474
  msgstr ""
8475
 
8476
- #: extensions/user-sessions/classes/View/Sessions.php:146
8477
- msgid "No search results were found."
8478
  msgstr ""
8479
 
8480
  #: extensions/user-sessions/classes/View/Sessions.php:154
8481
  msgid "Showing results for "
8482
  msgstr ""
8483
 
 
 
 
 
8484
  #: extensions/user-sessions/classes/View/Sessions.php:180
8485
  msgid "Expires"
8486
  msgstr ""
@@ -8493,13 +6583,12 @@ msgstr ""
8493
  msgid "Last Event"
8494
  msgstr ""
8495
 
8496
- #: extensions/user-sessions/classes/View/Sessions.php:183
8497
- #: extensions/user-sessions/classes/View/Sessions.php:517
8498
  msgid "Actions"
8499
  msgstr ""
8500
 
 
8501
  #: extensions/user-sessions/classes/View/Sessions.php:321
8502
- #, php-format
8503
  msgid "%s users"
8504
  msgstr ""
8505
 
@@ -8535,17 +6624,6 @@ msgstr ""
8535
  msgid "Network-wide Logins"
8536
  msgstr ""
8537
 
8538
- #: extensions/user-sessions/classes/View/Sessions.php:430
8539
- msgid "No logged in sessions meet your search criteria."
8540
- msgstr ""
8541
-
8542
- #: extensions/user-sessions/classes/View/Sessions.php:438
8543
- msgid ""
8544
- "WP Activity Log keeps its own user session data. This means that the "
8545
- "sessions of already logged in users will only show up once they logout and "
8546
- "log back in. The same applies to your session."
8547
- msgstr ""
8548
-
8549
  #: extensions/user-sessions/classes/View/Sessions.php:491
8550
  msgid "Session ID: "
8551
  msgstr ""
@@ -8562,6 +6640,14 @@ msgstr ""
8562
  msgid "Terminate Session"
8563
  msgstr ""
8564
 
 
 
 
 
 
 
 
 
8565
  #: extensions/user-sessions/classes/View/Sessions.php:721
8566
  msgid "User sessions do not exist."
8567
  msgstr ""
@@ -8571,322 +6657,126 @@ msgid "Cleanup expired session data"
8571
  msgstr ""
8572
 
8573
  #: extensions/user-sessions/classes/View/Settings.php:90
8574
- msgid ""
8575
- "The plugin will delete the data about expired users sessions from the "
8576
- "WordPress database."
8577
- msgstr ""
8578
-
8579
- #: extensions/user-sessions/classes/Views.php:110
8580
- msgid "Users Sessions & Management"
8581
- msgstr ""
8582
-
8583
- #: extensions/user-sessions/classes/Views.php:185
8584
- msgid "Logging out..."
8585
- msgstr ""
8586
-
8587
- #: extensions/user-sessions/classes/Views.php:186
8588
- msgid "Refreshing..."
8589
- msgstr ""
8590
-
8591
- #: extensions/user-sessions/classes/Views.php:187
8592
- msgid "This could result in loss of unsaved work. Are you sure?"
8593
- msgstr ""
8594
-
8595
- #: extensions/user-sessions/classes/Views.php:189
8596
- #, php-format
8597
- msgid "out of %s users sessions terminated."
8598
- msgstr ""
8599
-
8600
- #: extensions/user-sessions/classes/Views.php:192
8601
- msgid "Retrieving data"
8602
- msgstr ""
8603
-
8604
- #: extensions/user-sessions/classes/Views.php:193
8605
- msgid "Data retrieved"
8606
- msgstr ""
8607
-
8608
- #: extensions/user-sessions/classes/Views.php:194
8609
- msgid "Event ID: "
8610
- msgstr ""
8611
-
8612
- #: extensions/user-sessions/classes/Views.php:195
8613
- msgid "Object: "
8614
- msgstr ""
8615
-
8616
- #: extensions/user-sessions/classes/Views.php:196
8617
- msgid "Event Type: "
8618
- msgstr ""
8619
-
8620
- #: extensions/user-sessions/classes/Views.php:257
8621
- msgid "Terminate all logged in sessions"
8622
- msgstr ""
8623
-
8624
- #: extensions/user-sessions/classes/Views.php:258
8625
- msgid ""
8626
- "This will terminate all users' sessions including yours, which could result "
8627
- "in unsaved work. Do you like to proceed?"
8628
- msgstr ""
8629
-
8630
- #: extensions/user-sessions/classes/Views.php:269
8631
- msgid "YES"
8632
- msgstr ""
8633
-
8634
- #: extensions/user-sessions/classes/Views.php:270
8635
- msgid "NO"
8636
- msgstr ""
8637
-
8638
- #: extensions/user-sessions/classes/Views.php:282
8639
- msgid "Terminate All Sessions"
8640
- msgstr ""
8641
-
8642
- #: extensions/user-sessions/classes/Views.php:402
8643
- msgid "Users sessions termination is in progress. Please wait..."
8644
- msgstr ""
8645
-
8646
- #: extensions/user-sessions/classes/Views.php:455
8647
- msgid "No sessions."
8648
- msgstr ""
8649
-
8650
- #: extensions/user-sessions/classes/Views.php:487
8651
- msgid "Session destroyed."
8652
  msgstr ""
8653
 
8654
- #: extensions/user-sessions/classes/Views.php:495
8655
- msgid "User session data is not set."
8656
- msgstr ""
8657
-
8658
- #: extensions/user-sessions/classes/Views.php:511
8659
- #: extensions/user-sessions/classes/Views.php:602
8660
- msgid "User do not have sufficient permissions."
8661
- msgstr ""
8662
-
8663
- #: extensions/user-sessions/classes/Views.php:550
8664
- #: extensions/user-sessions/classes/Views.php:567
8665
- msgid "Sessions destroyed!"
8666
- msgstr ""
8667
-
8668
- #: extensions/user-sessions/classes/Views.php:574
8669
- msgid "Users offset is not set."
8670
- msgstr ""
8671
-
8672
- #: extensions/user-sessions/classes/Views.php:612
8673
- msgid "Nonce check failed."
8674
- msgstr ""
8675
-
8676
- #: wp-security-audit-log.php:930 wp-security-audit-log.php:957
8677
- #, php-format
8678
- msgid "Hey %1$s"
8679
- msgstr ""
8680
-
8681
- #: wp-security-audit-log.php:931
8682
- msgid ""
8683
- "Never miss an important update! Opt-in to our security and feature updates "
8684
- "notifications, and non-sensitive diagnostic tracking with freemius.com."
8685
- msgstr ""
8686
-
8687
- #: wp-security-audit-log.php:932 wp-security-audit-log.php:960
8688
- msgid "Note: "
8689
- msgstr ""
8690
-
8691
- #: wp-security-audit-log.php:933 wp-security-audit-log.php:961
8692
- msgid "NO ACTIVITY LOG ACTIVITY & DATA IS SENT BACK TO OUR SERVERS."
8693
- msgstr ""
8694
-
8695
- #: wp-security-audit-log.php:959
8696
- #, php-format
8697
- msgid ""
8698
- "Please help us improve %2$s! If you opt-in, some non-sensitive data about "
8699
- "your usage of %2$s will be sent to %5$s, a diagnostic tracking service we "
8700
- "use. If you skip this, that's okay! %2$s will still work just fine."
8701
- msgstr ""
8702
-
8703
- #: wp-security-audit-log.php:981
8704
- #, php-format
8705
- msgid ""
8706
- "Get a free 7-day trial of the premium edition of %s. No credit card "
8707
- "required, no commitments!"
8708
- msgstr ""
8709
-
8710
- #: wp-security-audit-log.php:986
8711
- msgid "Start free trial"
8712
- msgstr ""
8713
-
8714
- #: wp-security-audit-log.php:1054
8715
- #, php-format
8716
- msgid ""
8717
- "You need to activate the licence key to use WP Activity Log Premium. %2$s"
8718
- msgstr ""
8719
-
8720
- #: wp-security-audit-log.php:1055
8721
- msgid "Activate the licence key now"
8722
- msgstr ""
8723
-
8724
- #: wp-security-audit-log.php:1072
8725
- #, php-format
8726
- msgid ""
8727
- "The license is limited to %s sub-sites. You need to upgrade your license to "
8728
- "cover all the sub-sites on this network."
8729
- msgstr ""
8730
-
8731
- #: wp-security-audit-log.php:1182
8732
- msgid ""
8733
- "Error: You do not have sufficient permissions to disable this custom field."
8734
- msgstr ""
8735
-
8736
- #: wp-security-audit-log.php:1215
8737
- #, php-format
8738
- msgid ""
8739
- "Custom Field %1$s is no longer being monitored.<br />Enable the monitoring "
8740
- "of this custom field again from the"
8741
  msgstr ""
8742
 
8743
- #: wp-security-audit-log.php:1215
8744
- msgid "Excluded Objects"
8745
  msgstr ""
8746
 
8747
- #: wp-security-audit-log.php:1215
8748
- msgid " tab in the plugin settings"
8749
  msgstr ""
8750
 
8751
- #: wp-security-audit-log.php:1227
8752
- msgid "Error: You do not have sufficient permissions to disable this alert."
8753
  msgstr ""
8754
 
8755
- #: wp-security-audit-log.php:1251
8756
- #, php-format
8757
- msgid "Alert %1$s is no longer being monitored.<br /> %2$s"
8758
  msgstr ""
8759
 
8760
- #: wp-security-audit-log.php:1251
8761
- msgid ""
8762
- "You can enable this alert again from the Enable/Disable Alerts node in the "
8763
- "plugin menu."
8764
  msgstr ""
8765
 
8766
- #: wp-security-audit-log.php:1360
8767
- #, php-format
8768
- msgid ""
8769
- "You are using a version of PHP that is older than %s, which is no longer "
8770
- "supported."
8771
  msgstr ""
8772
 
8773
- #: wp-security-audit-log.php:1362
8774
- msgid ""
8775
- "Contact us on <a href=\"mailto:plugins@wpwhitesecurity.com"
8776
- "\">plugins@wpwhitesecurity.com</a> to help you switch the version of PHP you "
8777
- "are using."
8778
  msgstr ""
8779
 
8780
- #: wp-security-audit-log.php:1364
8781
- msgid ""
8782
- "The WP Activity Log plugin is a multisite network tool, so it has to be "
8783
- "activated at network level."
8784
  msgstr ""
8785
 
8786
- #: wp-security-audit-log.php:1366
8787
- msgid "Redirect me to the network dashboard"
8788
  msgstr ""
8789
 
8790
- #: wp-security-audit-log.php:1371
8791
- #, php-format
8792
- msgid "Please install the %s plugin on the MainWP dashboard."
8793
  msgstr ""
8794
 
8795
- #: wp-security-audit-log.php:1371
8796
- msgid "Activity Log for MainWP"
8797
  msgstr ""
8798
 
8799
- #: wp-security-audit-log.php:1373
8800
- #, php-format
8801
- msgid ""
8802
- "The WP Activity Log should be installed on the child sites only. Refer to "
8803
- "the %s for more information."
8804
  msgstr ""
8805
 
8806
- #: wp-security-audit-log.php:1373
8807
- msgid "getting started guide"
8808
  msgstr ""
8809
 
8810
- #: wp-security-audit-log.php:1470
8811
- msgid ""
8812
- "This plugin uses 3 tables in the WordPress database to store the activity "
8813
- "log and settings. It seems that these tables were not created."
8814
  msgstr ""
8815
 
8816
- #: wp-security-audit-log.php:1472
8817
- msgid ""
8818
- "This could happen because the database user does not have the right "
8819
- "privileges to create the tables in the database. We recommend you to update "
8820
- "the privileges and try enabling the plugin again."
8821
  msgstr ""
8822
 
8823
- #: wp-security-audit-log.php:1474
8824
- #, php-format
8825
- msgid ""
8826
- "If after doing so you still have issues, please send us an email on %s for "
8827
- "assistance."
8828
  msgstr ""
8829
 
8830
- #: wp-security-audit-log.php:1474
8831
- msgid "support@wpsecurityauditlog.com"
8832
  msgstr ""
8833
 
8834
- #: wp-security-audit-log.php:2291
8835
- msgid ""
8836
- "For security and auditing purposes, a record of all of your logged-in "
8837
- "actions and changes within the WordPress dashboard will be recorded in an "
8838
- "activity log with the <a href=\"https://wpactivitylog.com/\" target=\"_blank"
8839
- "\">WP Activity Log plugin</a>. The audit log also includes the IP address "
8840
- "where you accessed this site from."
8841
  msgstr ""
8842
 
8843
- #: wp-security-audit-log.php:2310
8844
- msgid "Every 6 hours"
8845
  msgstr ""
8846
 
8847
- #: wp-security-audit-log.php:2314
8848
- msgid "Every 45 minutes"
8849
  msgstr ""
8850
 
8851
- #: wp-security-audit-log.php:2318
8852
- msgid "Every 30 minutes"
8853
  msgstr ""
8854
 
8855
- #: wp-security-audit-log.php:2322
8856
- msgid "Every 15 minutes"
8857
  msgstr ""
8858
 
8859
- #: wp-security-audit-log.php:2326
8860
- msgid "Every 10 minutes"
8861
  msgstr ""
8862
 
8863
- #: wp-security-audit-log.php:2330
8864
- msgid "Every 1 minute"
8865
  msgstr ""
8866
 
8867
- #: wp-security-audit-log.php:2344
8868
- #, php-format
8869
- msgid "Method %1$s is deprecated since version %2$s!"
8870
  msgstr ""
8871
 
8872
- #. Plugin URI of the plugin/theme
8873
- msgid "http://wpactivitylog.com/"
8874
  msgstr ""
8875
 
8876
- #. Description of the plugin/theme
8877
- msgid ""
8878
- "Identify WordPress security issues before they become a problem. Keep track "
8879
- "of everything happening on your WordPress including WordPress users "
8880
- "activity. Similar to Windows Event Log and Linux Syslog, WP Activity Log "
8881
- "generates a security alert for everything that happens on your WordPress "
8882
- "blogs and websites. Use the Activity log viewer included in the plugin to "
8883
- "see all the security alerts."
8884
  msgstr ""
8885
 
8886
- #. Author of the plugin/theme
8887
- msgid "WP White Security"
8888
  msgstr ""
8889
 
8890
- #. Author URI of the plugin/theme
8891
- msgid "http://www.wpwhitesecurity.com/"
8892
  msgstr ""
1
+ # Copyright (C) 2020 wp-security-audit-log
2
+ # This file is distributed under the same license as the wp-security-audit-log package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: wp-security-audit-log\n"
 
 
 
 
 
6
  "MIME-Version: 1.0\n"
7
  "Content-Type: text/plain; charset=UTF-8\n"
8
  "Content-Transfer-Encoding: 8bit\n"
9
+ "Language-Team: WP White Security <info@wpwhitesecurity.com>\n"
10
+ "Last-Translator: WP White Security <info@wpwhitesecurity.com>\n"
11
+ "Report-Msgid-Bugs-To: https://www.wpwhitesecurity.com\n"
12
  "X-Poedit-Basepath: ..\n"
13
+ "X-Poedit-KeywordsList: __;_e;_ex:1,2c;_n:1,2;_n_noop:1,2;_nx:1,2,4c;_nx_noop:1,2,3c;_x:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
 
 
 
 
14
  "X-Poedit-SearchPath-0: .\n"
15
  "X-Poedit-SearchPathExcluded-0: *.js\n"
16
+ "X-Poedit-SourceCharset: UTF-8\n"
17
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
18
 
19
+ #: defaults.php:77
20
+ msgid "Critical severity events."
 
21
  msgstr ""
22
 
23
+ #: defaults.php:78
24
+ msgid "High severity events."
 
25
  msgstr ""
26
 
27
+ #: defaults.php:79
28
+ msgid "Medium severity events."
 
 
29
  msgstr ""
30
 
31
+ #: defaults.php:80
32
+ msgid "Low severity events."
 
33
  msgstr ""
34
 
35
+ #: defaults.php:81
36
+ msgid "Informational events."
37
  msgstr ""
38
 
39
+ #: defaults.php:88
40
+ msgid "User logged in"
41
  msgstr ""
42
 
43
+ #: defaults.php:89
44
+ msgid "User logged out"
 
 
 
 
 
 
45
  msgstr ""
46
 
47
+ #: defaults.php:90
48
+ msgid "Login failed"
 
 
 
 
 
49
  msgstr ""
50
 
51
+ #: defaults.php:91
52
+ msgid "Login failed / non existing user"
 
53
  msgstr ""
54
 
55
+ #: defaults.php:91
56
+ msgid "%Attempts% failed login(s) %LineBreak% %LogFileText%"
57
  msgstr ""
58
 
59
+ #: defaults.php:92
60
+ msgid "Login blocked"
61
  msgstr ""
62
 
63
+ #: defaults.php:92
64
+ msgid "Login blocked because other session(s) already exist for this user. %LineBreak% IP address: %ClientIP%"
65
  msgstr ""
66
 
67
+ #: defaults.php:93
68
+ msgid "User logged in with existing session(s)"
69
  msgstr ""
70
 
71
+ #: defaults.php:93
72
+ msgid "User logged in. There are other session(s) using the same username logged in from these IP address(es): %IPAddress%"
73
  msgstr ""
74
 
75
+ #: defaults.php:94
76
+ msgid "User logged out all other sessions with the same username"
77
  msgstr ""
78
 
79
+ #: defaults.php:94
80
+ msgid "Logged out all other sessions with the same user."
81
  msgstr ""
82
 
83
+ #: defaults.php:95
84
+ msgid "User session destroyed and logged out"
85
  msgstr ""
86
 
87
+ #: defaults.php:95
88
+ msgid "Terminated the session of another user. %LineBreak% User: %TargetUserName% %LineBreak% Session ID: %TargetSessionID%"
89
  msgstr ""
90
 
91
+ #: defaults.php:96
92
+ msgid "Switched to another user"
 
93
  msgstr ""
94
 
95
+ #: defaults.php:96
96
+ msgid "Switched to another user. %LineBreak% User: %TargetUserName% %LineBreak% Role: %TargetUserRole%"
97
  msgstr ""
98
 
99
+ #: defaults.php:97
100
+ msgid "User uploaded file from Uploads directory"
101
  msgstr ""
102
 
103
+ #: defaults.php:97, defaults.php:98
104
+ msgid "Filename: %FileName% %LineBreak% Directory: %FilePath%"
105
  msgstr ""
106
 
107
+ #: defaults.php:98
108
+ msgid "User deleted file from Uploads directory"
109
  msgstr ""
110
 
111
+ #: defaults.php:104
112
+ msgid "User created a new post and saved it as draft"
113
  msgstr ""
114
 
115
+ #: defaults.php:104
116
+ msgid "Created the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
117
  msgstr ""
118
 
119
+ #: defaults.php:105
120
+ msgid "User published a post"
121
  msgstr ""
122
 
123
+ #: defaults.php:105
124
+ msgid "Published the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
125
  msgstr ""
126
 
127
+ #: defaults.php:106
128
+ msgid "User modified a post"
 
 
 
129
  msgstr ""
130
 
131
+ #: defaults.php:106
132
+ msgid "Modified the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
133
  msgstr ""
134
 
135
+ #: defaults.php:107
136
+ msgid "User permanently deleted a post from the trash"
137
  msgstr ""
138
 
139
+ #: defaults.php:107
140
+ msgid "Permanently deleted the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType%"
141
  msgstr ""
142
 
143
+ #: defaults.php:108
144
+ msgid "User moved a post to the trash"
145
  msgstr ""
146
 
147
+ #: defaults.php:108
148
+ msgid "Moved the post %PostTitle% to trash %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished%"
149
  msgstr ""
150
 
151
+ #: defaults.php:109
152
+ msgid "User restored a post from trash"
153
  msgstr ""
154
 
155
+ #: defaults.php:109
156
+ msgid "Restored the post %PostTitle% from trash %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
157
  msgstr ""
158
 
159
+ #: defaults.php:110
160
+ msgid "User changed post URL"
161
  msgstr ""
162
 
163
+ #: defaults.php:110
164
+ msgid "Changed the URL of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous URL: %OldUrl% %LineBreak% New URL: %NewUrl% %LineBreak% %EditorLinkPost%"
 
165
  msgstr ""
166
 
167
+ #: defaults.php:111
168
+ msgid "User changed post author"
169
  msgstr ""
170
 
171
+ #: defaults.php:111
172
+ msgid "Changed the author of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous author: %OldAuthor% %LineBreak% New author: %NewAuthor% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%."
173
  msgstr ""
174
 
175
+ #: defaults.php:112
176
+ msgid "User changed post status"
177
  msgstr ""
178
 
179
+ #: defaults.php:112
180
+ msgid "Changed the status of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status was: %OldStatus% %LineBreak% New status: %NewStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
181
  msgstr ""
182
 
183
+ #: defaults.php:113
184
+ msgid "User changed the visibility of a post"
185
  msgstr ""
186
 
187
+ #: defaults.php:113
188
+ msgid "Changed the visibility of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Visibility was: %OldVisibility% %LineBreak% Visibility is: %NewVisibility% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
189
  msgstr ""
190
 
191
+ #: defaults.php:114
192
+ msgid "User changed the date of a post"
 
193
  msgstr ""
194
 
195
+ #: defaults.php:114
196
+ msgid "Changed the date of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous date: %OldDate% %LineBreak% New date: %NewDate% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
197
  msgstr ""
198
 
199
+ #: defaults.php:115
200
+ msgid "User changed the parent of a page"
201
  msgstr ""
202
 
203
+ #: defaults.php:115
204
+ msgid "Changed the parent of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous parent: %OldParentName% %LineBreak% New parent: %NewParentName% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
205
  msgstr ""
206
 
207
+ #: defaults.php:116
208
+ msgid "User changed the template of a page"
209
  msgstr ""
210
 
211
+ #: defaults.php:116
212
+ msgid "Changed the template of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous template: %OldTemplate% %LineBreak% New template: %NewTemplate% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
213
  msgstr ""
214
 
215
+ #: defaults.php:117
216
+ msgid "User set a post as sticky"
217
  msgstr ""
218
 
219
+ #: defaults.php:117
220
+ msgid "Set the post %PostTitle% as sticky %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
221
  msgstr ""
222
 
223
+ #: defaults.php:118
224
+ msgid "User removed post from sticky"
225
  msgstr ""
226
 
227
+ #: defaults.php:118
228
+ msgid "Removed the post %PostTitle% from sticky %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
229
  msgstr ""
230
 
231
+ #: defaults.php:119
232
+ msgid "User modified the content of a post"
233
  msgstr ""
234
 
235
+ #: defaults.php:119
236
+ msgid "Modified the content of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% %RevisionLink% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
237
  msgstr ""
238
 
239
+ #: defaults.php:120
240
+ msgid "User submitted a post for review"
241
  msgstr ""
242
 
243
+ #: defaults.php:120
244
+ msgid "Submitted the post %PostTitle% for review %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
245
  msgstr ""
246
 
247
+ #: defaults.php:121
248
+ msgid "User scheduled a post"
249
  msgstr ""
250
 
251
+ #: defaults.php:121
252
+ msgid "Scheduled the post %PostTitle% to be published on %PublishingDate% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
 
 
 
 
253
  msgstr ""
254
 
255
+ #: defaults.php:122
256
+ msgid "User changed title of a post"
 
 
 
 
257
  msgstr ""
258
 
259
+ #: defaults.php:122
260
+ msgid "Changed the title of the post %OldTitle% %LineBreak% New title: %NewTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
261
  msgstr ""
262
 
263
+ #: defaults.php:123
264
+ msgid "User opened a post in the editor"
 
 
265
  msgstr ""
266
 
267
+ #: defaults.php:123
268
+ msgid "Opened the post %PostTitle% in the editor %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
 
 
269
  msgstr ""
270
 
271
+ #: defaults.php:124
272
+ msgid "User viewed a post"
273
  msgstr ""
274
 
275
+ #: defaults.php:124
276
+ msgid "Viewed the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% URL: %PostUrl% %LineBreak% %EditorLinkPost%"
277
  msgstr ""
278
 
279
+ #: defaults.php:125
280
+ msgid "User enabled/disabled comments in a post"
281
  msgstr ""
282
 
283
+ #: defaults.php:125
284
+ msgid "The comments in the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
285
  msgstr ""
286
 
287
+ #: defaults.php:126
288
+ msgid "User enabled/disabled trackbacks and pingbacks in a post"
289
  msgstr ""
290
 
291
+ #: defaults.php:126
292
+ msgid "Pingbacks and Trackbacks in the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
293
  msgstr ""
294
 
295
+ #: defaults.php:130
296
+ msgid "User added post tag"
 
 
297
  msgstr ""
298
 
299
+ #: defaults.php:130
300
+ msgid "Added tag(s) to the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Added tag(s): %tag% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
301
  msgstr ""
302
 
303
+ #: defaults.php:131
304
+ msgid "User removed post tag"
305
  msgstr ""
306
 
307
+ #: defaults.php:131
308
+ msgid "Removed tag(s) from the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Removed tag(s): %tag% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
 
309
  msgstr ""
310
 
311
+ #: defaults.php:132
312
+ msgid "User created new tag"
 
 
 
 
313
  msgstr ""
314
 
315
+ #: defaults.php:132
316
+ msgid "Created the tag %TagName% %LineBreak% Slug: %Slug% %LineBreak% %TagLink%"
 
317
  msgstr ""
318
 
319
+ #: defaults.php:133
320
+ msgid "User deleted tag"
 
 
 
 
321
  msgstr ""
322
 
323
+ #: defaults.php:133
324
+ msgid "Deleted the tag %TagName% %LineBreak% Slug: %Slug%"
 
 
325
  msgstr ""
326
 
327
+ #: defaults.php:134
328
+ msgid "User renamed tag"
329
  msgstr ""
330
 
331
+ #: defaults.php:134
332
+ msgid "Old name: %old_name% %LineBreak% New name: %new_name% %LineBreak% Slug: %Slug% %LineBreak% %TagLink%"
333
  msgstr ""
334
 
335
+ #: defaults.php:135
336
+ msgid "User changed tag slug"
337
  msgstr ""
338
 
339
+ #: defaults.php:135
340
+ msgid "Changed the slug of the tag %tag% %LineBreak% Previous slug: %old_slug% %LineBreak% New slug: %new_slug% %LineBreak% %TagLink%"
 
 
341
  msgstr ""
342
 
343
+ #: defaults.php:136
344
+ msgid "User changed tag description"
345
  msgstr ""
346
 
347
+ #: defaults.php:136
348
+ msgid "Changed the description of the tag %tag% %LineBreak% Slug: %Slug% %LineBreak% Previous description: %old_desc% %LineBreak% New description: %new_desc% %LineBreak% %TagLink%"
 
349
  msgstr ""
350
 
351
+ #: defaults.php:140
352
+ msgid "User changed post category"
353
  msgstr ""
354
 
355
+ #: defaults.php:140
356
+ msgid "Changed the category of the post %PostTitle% %LineBreak% ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% Previous category(ies): %OldCategories% %LineBreak% New category(ies): %NewCategories% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
 
357
  msgstr ""
358
 
359
+ #: defaults.php:141
360
+ msgid "User created new category"
361
  msgstr ""
362
 
363
+ #: defaults.php:141
364
+ msgid "Created the category %CategoryName% %LineBreak% Slug: %Slug% %LineBreak% %CategoryLink%"
365
  msgstr ""
366
 
367
+ #: defaults.php:142
368
+ msgid "User deleted category"
369
  msgstr ""
370
 
371
+ #: defaults.php:142
372
+ msgid "Deleted the category %CategoryName% %LineBreak% Slug: %Slug%"
373
  msgstr ""
374
 
375
+ #: defaults.php:143
376
+ msgid "Changed the parent of a category"
377
  msgstr ""
378
 
379
+ #: defaults.php:143
380
+ msgid "Changed the parent of the category %CategoryName% %LineBreak% Slug: %Slug% %LineBreak% Previous parent: %OldParent% %LineBreak% New parent: %NewParent% %LineBreak% %CategoryLink%"
381
  msgstr ""
382
 
383
+ #: defaults.php:144
384
+ msgid "User changed category name"
385
  msgstr ""
386
 
387
+ #: defaults.php:144
388
+ msgid "Previous name: %old_name% %LineBreak% New name: %new_name% %LineBreak% Slug: %slug% %LineBreak% %cat_link%"
 
389
  msgstr ""
390
 
391
+ #: defaults.php:145
392
+ msgid "User changed category slug"
 
393
  msgstr ""
394
 
395
+ #: defaults.php:145
396
+ msgid "Changed the slug of the category: %CategoryName% %LineBreak% Previous slug: %old_slug% %LineBreak% New slug: %new_slug% %LineBreak% %cat_link%"
 
397
  msgstr ""
398
 
399
+ #: defaults.php:149
400
+ msgid "User created a custom field for a post"
 
 
401
  msgstr ""
402
 
403
+ #: defaults.php:149
404
+ msgid "Created a new custom field called %MetaKey% in the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Custom field value: %MetaValue% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost% %LineBreak% %MetaLink%"
 
 
 
 
405
  msgstr ""
406
 
407
+ #: defaults.php:150
408
+ msgid "User updated a custom field value for a post"
 
 
 
409
  msgstr ""
410
 
411
+ #: defaults.php:150
412
+ msgid "Modified the value of the custom field %MetaKey% in the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Previous custom field value: %MetaValueOld% %LineBreak% New custom field value: %MetaValueNew% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost% %LineBreak% %MetaLink%."
 
413
  msgstr ""
414
 
415
+ #: defaults.php:151
416
+ msgid "User deleted a custom field from a post"
 
417
  msgstr ""
418
 
419
+ #: defaults.php:151
420
+ msgid "Deleted the custom field %MetaKey% from the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
 
 
 
421
  msgstr ""
422
 
423
+ #: defaults.php:152
424
+ msgid "User updated a custom field name for a post"
 
 
 
425
  msgstr ""
426
 
427
+ #: defaults.php:152
428
+ msgid "Old custom field name: %MetaKeyOld% %LineBreak% New custom field name: %MetaKeyNew% %LineBreak% Post: %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% %EditorLinkPost%"
429
  msgstr ""
430
 
431
+ #: defaults.php:176
432
+ msgid "User approved a comment"
 
433
  msgstr ""
434
 
435
+ #: defaults.php:176
436
+ msgid "Approved the comment posted by %Author% on the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% %CommentLink%"
 
437
  msgstr ""
438
 
439
+ #: defaults.php:177
440
+ msgid "User unapproved a comment"
 
 
441
  msgstr ""
442
 
443
+ #: defaults.php:177
444
+ msgid "Unapproved the comment posted by %Author% on the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% %CommentLink%"
 
445
  msgstr ""
446
 
447
+ #: defaults.php:178
448
+ msgid "User replied to a comment"
449
  msgstr ""
450
 
451
+ #: defaults.php:178
452
+ msgid "Replied to the comment posted by %Author% on the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% %CommentLink%"
 
 
 
 
453
  msgstr ""
454
 
455
+ #: defaults.php:179
456
+ msgid "User edited a comment"
457
  msgstr ""
458
 
459
+ #: defaults.php:179
460
+ msgid "Edited the comment posted by %Author% on the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% %CommentLink%"
461
  msgstr ""
462
 
463
+ #: defaults.php:180
464
+ msgid "User marked a comment as Spam"
465
  msgstr ""
466
 
467
+ #: defaults.php:180
468
+ msgid "Marked the comment posted by %Author% on the post %PostTitle% as spam %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% %CommentLink%"
 
 
 
 
469
  msgstr ""
470
 
471
+ #: defaults.php:181
472
+ msgid "User marked a comment as Not Spam"
473
  msgstr ""
474
 
475
+ #: defaults.php:181
476
+ msgid "Marked the comment posted by %Author% on the post %PostTitle% as not spam %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% %CommentLink%"
477
  msgstr ""
478
 
479
+ #: defaults.php:182
480
+ msgid "User moved a comment to trash"
 
 
 
481
  msgstr ""
482
 
483
+ #: defaults.php:182
484
+ msgid "Moved the comment posted by %Author% on the post %PostTitle% to trash %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% %CommentLink%"
485
  msgstr ""
486
 
487
+ #: defaults.php:183
488
+ msgid "User restored a comment from the trash"
 
489
  msgstr ""
490
 
491
+ #: defaults.php:183
492
+ msgid "Restored the comment posted by %Author% on the post %PostTitle% from trash %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% %CommentLink%"
 
 
 
493
  msgstr ""
494
 
495
+ #: defaults.php:184
496
+ msgid "User permanently deleted a comment"
 
 
 
 
497
  msgstr ""
498
 
499
+ #: defaults.php:184
500
+ msgid "Permanently deleted the comment posted by %Author% on the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %PostUrlIfPlublished% %LineBreak% Comment ID: %CommentID%"
501
  msgstr ""
502
 
503
+ #: defaults.php:185
504
+ msgid "User posted a comment"
 
 
505
  msgstr ""
506
 
507
+ #: defaults.php:185, defaults.php:190
508
+ msgid "Posted a comment on the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Post Type: %PostType% %LineBreak% Post Status: %PostStatus% %LineBreak% Comment ID: %CommentID% %PostUrlIfPlublished% %LineBreak% %CommentLink%"
509
  msgstr ""
510
 
511
+ #: defaults.php:190
512
+ msgid "Visitor posted a comment"
 
513
  msgstr ""
514
 
515
+ #: defaults.php:197
516
+ msgid "User added a new widget"
 
517
  msgstr ""
518
 
519
+ #: defaults.php:197
520
+ msgid "Added a new %WidgetName% widget in %Sidebar%."
 
521
  msgstr ""
522
 
523
+ #: defaults.php:198
524
+ msgid "User modified a widget"
 
525
  msgstr ""
526
 
527
+ #: defaults.php:198
528
+ msgid "Modified the %WidgetName% widget in %Sidebar%."
529
  msgstr ""
530
 
531
+ #: defaults.php:199
532
+ msgid "User deleted widget"
 
533
  msgstr ""
534
 
535
+ #: defaults.php:199
536
+ msgid "Deleted the %WidgetName% widget from %Sidebar%."
537
  msgstr ""
538
 
539
+ #: defaults.php:200
540
+ msgid "User moved widget"
541
  msgstr ""
542
 
543
+ #: defaults.php:200
544
+ msgid "Moved the %WidgetName% widget %LineBreak% From: %OldSidebar% %LineBreak% To: %NewSidebar%"
545
  msgstr ""
546
 
547
+ #: defaults.php:201
548
+ msgid "User changed widget position"
 
549
  msgstr ""
550
 
551
+ #: defaults.php:201
552
+ msgid "Changed the position of the %WidgetName% widget in %Sidebar%."
553
  msgstr ""
554
 
555
+ #: defaults.php:208
556
+ msgid "User created new menu"
 
 
 
557
  msgstr ""
558
 
559
+ #: defaults.php:208
560
+ msgid "New menu called %MenuName%."
561
  msgstr ""
562
 
563
+ #: defaults.php:209
564
+ msgid "User added content to a menu"
565
  msgstr ""
566
 
567
+ #: defaults.php:209
568
+ msgid "Added new item to the menu %MenuName% %LineBreak% Item type: %ContentType% %LineBreak% Item name: %ContentName% "
569
  msgstr ""
570
 
571
+ #: defaults.php:210
572
+ msgid "User removed content from a menu"
573
  msgstr ""
574
 
575
+ #: defaults.php:210
576
+ msgid "Removed item from the menu %MenuName% %LineBreak% Item type: %ContentType% %LineBreak% Item name: %ContentName%"
577
  msgstr ""
578
 
579
+ #: defaults.php:211
580
+ msgid "User deleted menu"
581
  msgstr ""
582
 
583
+ #: defaults.php:211
584
+ msgid "Deleted the menu %MenuName%"
 
 
 
585
  msgstr ""
586
 
587
+ #: defaults.php:212
588
+ msgid "User changed menu setting"
589
  msgstr ""
590
 
591
+ #: defaults.php:212
592
+ msgid "The setting in the %MenuName% %LineBreak% Setting: %MenuSetting%"
 
 
593
  msgstr ""
594
 
595
+ #: defaults.php:213
596
+ msgid "User modified content in a menu"
 
 
 
 
597
  msgstr ""
598
 
599
+ #: defaults.php:213
600
+ msgid "Modified an item in the menu %MenuName% %LineBreak% Item type: %ContentType% %LineBreak% Item name: %ContentName%"
 
 
601
  msgstr ""
602
 
603
+ #: defaults.php:214
604
+ msgid "User changed name of a menu"
 
 
605
  msgstr ""
606
 
607
+ #: defaults.php:214
608
+ msgid "Old name: %OldMenuName% %LineBreak% New name: %NewMenuName%"
 
 
609
  msgstr ""
610
 
611
+ #: defaults.php:215
612
+ msgid "User changed order of the objects in a menu"
 
 
613
  msgstr ""
614
 
615
+ #: defaults.php:215
616
+ msgid "Changed the order of the items in the menu %MenuName%"
617
  msgstr ""
618
 
619
+ #: defaults.php:216
620
+ msgid "User moved objects as a sub-item"
621
  msgstr ""
622
 
623
+ #: defaults.php:216
624
+ msgid "Menu name: %MenuName% %LineBreak% Moved item %ItemName% as a sub-item of %ParentName%"
 
 
625
  msgstr ""
626
 
627
+ #: defaults.php:228
628
+ msgid "User modified a draft blog post"
 
 
629
  msgstr ""
630
 
631
+ #: defaults.php:228
632
+ msgid "Modified the draft post with the %PostTitle%. %EditorLinkPost%."
633
  msgstr ""
634
 
635
+ #: defaults.php:229
636
+ msgid "User created a new post with custom post type and saved it as draft"
637
  msgstr ""
638
 
639
+ #: defaults.php:229
640
+ msgid "Created a new custom post called %PostTitle% of type %PostType%. %EditorLinkPost%."
641
  msgstr ""
642
 
643
+ #: defaults.php:230
644
+ msgid "User published a post with custom post type"
 
645
  msgstr ""
646
 
647
+ #: defaults.php:230
648
+ msgid "Published a custom post %PostTitle% of type %PostType%. Post URL is %PostUrl%. %EditorLinkPost%."
649
  msgstr ""
650
 
651
+ #: defaults.php:231
652
+ msgid "User modified a post with custom post type"
653
  msgstr ""
654
 
655
+ #: defaults.php:231
656
+ msgid "Modified the custom post %PostTitle% of type %PostType%. Post URL is %PostUrl%. %EditorLinkPost%."
657
  msgstr ""
658
 
659
+ #: defaults.php:232
660
+ msgid "User modified a draft post with custom post type"
 
661
  msgstr ""
662
 
663
+ #: defaults.php:232
664
+ msgid "Modified the draft custom post %PostTitle% of type is %PostType%. %EditorLinkPost%."
 
665
  msgstr ""
666
 
667
+ #: defaults.php:233
668
+ msgid "User permanently deleted post with custom post type"
669
  msgstr ""
670
 
671
+ #: defaults.php:233
672
+ msgid "Permanently Deleted the custom post %PostTitle% of type %PostType%."
 
 
 
673
  msgstr ""
674
 
675
+ #: defaults.php:234
676
+ msgid "User moved post with custom post type to trash"
 
 
 
677
  msgstr ""
678
 
679
+ #: defaults.php:234
680
+ msgid "Moved the custom post %PostTitle% of type %PostType% to trash. Post URL was %PostUrl%."
 
681
  msgstr ""
682
 
683
+ #: defaults.php:235
684
+ msgid "User restored post with custom post type from trash"
 
685
  msgstr ""
686
 
687
+ #: defaults.php:235
688
+ msgid "The custom post %PostTitle% of type %PostType% has been restored from trash. %EditorLinkPost%."
 
 
689
  msgstr ""
690
 
691
+ #: defaults.php:236
692
+ msgid "User changed the category of a post with custom post type"
 
693
  msgstr ""
694
 
695
+ #: defaults.php:236
696
+ msgid "Changed the category(ies) of the custom post %PostTitle% of type %PostType% from %OldCategories% to %NewCategories%. %EditorLinkPost%."
697
  msgstr ""
698
 
699
+ #: defaults.php:237
700
+ msgid "User changed the URL of a post with custom post type"
 
 
701
  msgstr ""
702
 
703
+ #: defaults.php:237
704
+ msgid "Changed the URL of the custom post %PostTitle% of type %PostType% from %OldUrl% to %NewUrl%. %EditorLinkPost%."
705
  msgstr ""
706
 
707
+ #: defaults.php:238
708
+ msgid "User changed the author or post with custom post type"
 
 
 
 
 
 
 
 
 
 
 
 
709
  msgstr ""
710
 
711
+ #: defaults.php:238
712
+ msgid "Changed the author of custom post %PostTitle% of type %PostType% from %OldAuthor% to %NewAuthor%. %EditorLinkPost%."
713
  msgstr ""
714
 
715
+ #: defaults.php:239
716
+ msgid "User changed the status of post with custom post type"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
717
  msgstr ""
718
 
719
+ #: defaults.php:239
720
+ msgid "Changed the status of custom post %PostTitle% of type %PostType% from %OldStatus% to %NewStatus%. %EditorLinkPost%."
 
 
721
  msgstr ""
722
 
723
+ #: defaults.php:240
724
+ msgid "User changed the visibility of a post with custom post type"
 
725
  msgstr ""
726
 
727
+ #: defaults.php:240
728
+ msgid "Changed the visibility of the custom post %PostTitle% of type %PostType% from %OldVisibility% to %NewVisibility%. %EditorLinkPost%."
 
 
729
  msgstr ""
730
 
731
+ #: defaults.php:241
732
+ msgid "User changed the date of post with custom post type"
733
  msgstr ""
734
 
735
+ #: defaults.php:241
736
+ msgid "Changed the date of the custom post %PostTitle% of type %PostType% from %OldDate% to %NewDate%. %EditorLinkPost%."
 
 
737
  msgstr ""
738
 
739
+ #: defaults.php:242
740
+ msgid "User created a custom field for a custom post type"
741
  msgstr ""
742
 
743
+ #: defaults.php:243
744
+ msgid "User updated a custom field for a custom post type"
745
  msgstr ""
746
 
747
+ #: defaults.php:244
748
+ msgid "User deleted a custom field from a custom post type"
749
  msgstr ""
750
 
751
+ #: defaults.php:245
752
+ msgid "User updated a custom field name for a custom post type"
753
  msgstr ""
754
 
755
+ #: defaults.php:246
756
+ msgid "User modified content for a published custom post type"
757
  msgstr ""
758
 
759
+ #: defaults.php:247
760
+ msgid "User modified content for a draft post"
761
  msgstr ""
762
 
763
+ #: defaults.php:248
764
+ msgid "User modified content for a draft custom post type"
 
 
 
765
  msgstr ""
766
 
767
+ #: defaults.php:249
768
+ msgid "User modified content of a post"
769
  msgstr ""
770
 
771
+ #: defaults.php:250
772
+ msgid "User scheduled a custom post type"
 
 
 
 
773
  msgstr ""
774
 
775
+ #: defaults.php:250
776
+ msgid "Scheduled the custom post type %PostTitle% to be published %PublishingDate%. %EditorLinkPost%."
777
  msgstr ""
778
 
779
+ #: defaults.php:251
780
+ msgid "User changed title of a custom post type"
781
  msgstr ""
782
 
783
+ #: defaults.php:251
784
+ msgid "Changed the title of the custom post %OldTitle% to %NewTitle%. %EditorLinkPost%."
785
  msgstr ""
786
 
787
+ #: defaults.php:252
788
+ msgid "User opened a custom post type in the editor"
789
  msgstr ""
790
 
791
+ #: defaults.php:252
792
+ msgid "Opened the custom post %PostTitle% of type %PostType% in the editor. View the post: %EditorLinkPost%."
793
  msgstr ""
794
 
795
+ #: defaults.php:253
796
+ msgid "User viewed a custom post type"
797
  msgstr ""
798
 
799
+ #: defaults.php:253
800
+ msgid "Viewed the custom post %PostTitle% of type %PostType%. View the post: %PostUrl%."
801
  msgstr ""
802
 
803
+ #: defaults.php:254
804
+ msgid "A plugin created a custom post"
805
  msgstr ""
806
 
807
+ #: defaults.php:254
808
+ msgid "A plugin automatically created the following custom post: %PostTitle%."
 
 
 
 
 
 
 
 
 
809
  msgstr ""
810
 
811
+ #: defaults.php:255
812
+ msgid "A plugin deleted a custom post"
 
 
813
  msgstr ""
814
 
815
+ #: defaults.php:255
816
+ msgid "A plugin automatically deleted the following custom post: %PostTitle%."
 
 
 
 
 
 
817
  msgstr ""
818
 
819
+ #: defaults.php:256
820
+ msgid "A plugin modified a custom post"
 
 
 
 
 
 
821
  msgstr ""
822
 
823
+ #: defaults.php:256
824
+ msgid "Plugin modified the custom post %PostTitle%. View the post: %EditorLinkPost%."
825
  msgstr ""
826
 
827
+ #: defaults.php:268
828
+ msgid "User created a new WordPress page and saved it as draft"
829
  msgstr ""
830
 
831
+ #: defaults.php:268
832
+ msgid "Created a new page called %PostTitle% and saved it as draft. %EditorLinkPage%."
833
  msgstr ""
834
 
835
+ #: defaults.php:269
836
+ msgid "User published a WordPress page"
837
  msgstr ""
838
 
839
+ #: defaults.php:269
840
+ msgid "Published a page called %PostTitle%. Page URL is %PostUrl%. %EditorLinkPage%."
841
  msgstr ""
842
 
843
+ #: defaults.php:270
844
+ msgid "User modified a published WordPress page"
845
  msgstr ""
846
 
847
+ #: defaults.php:270
848
+ msgid "Modified the published page %PostTitle%. Page URL is %PostUrl%. %EditorLinkPage%."
849
  msgstr ""
850
 
851
+ #: defaults.php:271
852
+ msgid "User modified a draft WordPress page"
 
 
 
853
  msgstr ""
854
 
855
+ #: defaults.php:271
856
+ msgid "Modified the draft page %PostTitle%. Page ID is %PostID%. %EditorLinkPage%."
857
  msgstr ""
858
 
859
+ #: defaults.php:272
860
+ msgid "User permanently deleted a page from the trash"
 
 
861
  msgstr ""
862
 
863
+ #: defaults.php:272
864
+ msgid "Permanently deleted the page %PostTitle%."
865
  msgstr ""
866
 
867
+ #: defaults.php:273
868
+ msgid "User moved WordPress page to the trash"
869
  msgstr ""
870
 
871
+ #: defaults.php:273
872
+ msgid "Moved the page %PostTitle% to trash. Page URL was %PostUrl%."
873
  msgstr ""
874
 
875
+ #: defaults.php:274
876
+ msgid "User restored a WordPress page from trash"
877
  msgstr ""
878
 
879
+ #: defaults.php:274
880
+ msgid "Page %PostTitle% has been restored from trash. %EditorLinkPage%."
881
  msgstr ""
882
 
883
+ #: defaults.php:275
884
+ msgid "User changed page URL"
885
  msgstr ""
886
 
887
+ #: defaults.php:275
888
+ msgid "Changed the URL of the page %PostTitle% from %OldUrl% to %NewUrl%. %EditorLinkPage%."
889
  msgstr ""
890
 
891
+ #: defaults.php:276
892
+ msgid "User changed page author"
 
 
893
  msgstr ""
894
 
895
+ #: defaults.php:276
896
+ msgid "Changed the author of the page %PostTitle% from %OldAuthor% to %NewAuthor%. %EditorLinkPage%."
897
  msgstr ""
898
 
899
+ #: defaults.php:277
900
+ msgid "User changed page status"
 
 
901
  msgstr ""
902
 
903
+ #: defaults.php:277
904
+ msgid "Changed the status of the page %PostTitle% from %OldStatus% to %NewStatus%. %EditorLinkPage%."
905
  msgstr ""
906
 
907
+ #: defaults.php:278
908
+ msgid "User changed the visibility of a page post"
 
909
  msgstr ""
910
 
911
+ #: defaults.php:278
912
+ msgid "Changed the visibility of the page %PostTitle% from %OldVisibility% to %NewVisibility%. %EditorLinkPage%."
913
  msgstr ""
914
 
915
+ #: defaults.php:279
916
+ msgid "User changed the date of a page post"
917
  msgstr ""
918
 
919
+ #: defaults.php:279
920
+ msgid "Changed the date of the page %PostTitle% from %OldDate% to %NewDate%. %EditorLinkPage%."
 
 
921
  msgstr ""
922
 
923
+ #: defaults.php:280
924
+ msgid "User created a custom field for a page"
 
 
925
  msgstr ""
926
 
927
+ #: defaults.php:281
928
+ msgid "User updated a custom field value for a page"
 
929
  msgstr ""
930
 
931
+ #: defaults.php:282
932
+ msgid "User deleted a custom field from a page"
 
 
 
933
  msgstr ""
934
 
935
+ #: defaults.php:283
936
+ msgid "User updated a custom field name for a page"
 
 
937
  msgstr ""
938
 
939
+ #: defaults.php:284
940
+ msgid "User modified content for a published page"
941
  msgstr ""
942
 
943
+ #: defaults.php:284
944
+ msgid "Modified the content of the published page %PostTitle%. Page URL is %PostUrl%. %RevisionLink% %EditorLinkPage%."
945
  msgstr ""
946
 
947
+ #: defaults.php:285
948
+ msgid "User modified content for a draft page"
949
  msgstr ""
950
 
951
+ #: defaults.php:286
952
+ msgid "User scheduled a page"
 
 
 
953
  msgstr ""
954
 
955
+ #: defaults.php:287
956
+ msgid "User changed title of a page"
957
  msgstr ""
958
 
959
+ #: defaults.php:288
960
+ msgid "User opened a page in the editor"
961
  msgstr ""
962
 
963
+ #: defaults.php:288
964
+ msgid "Opened the page %PostTitle% in the editor. View the page: %EditorLinkPage%."
 
 
965
  msgstr ""
966
 
967
+ #: defaults.php:289
968
+ msgid "User viewed a page"
 
 
969
  msgstr ""
970
 
971
+ #: defaults.php:289
972
+ msgid "Viewed the page %PostTitle%. View the page: %PostUrl%."
 
 
973
  msgstr ""
974
 
975
+ #: defaults.php:290
976
+ msgid "User disabled Comments/Trackbacks and Pingbacks on a draft post"
977
  msgstr ""
978
 
979
+ #: defaults.php:290
980
+ msgid "Disabled %Type% on the draft post %PostTitle%. View the post: %PostUrl%."
 
 
981
  msgstr ""
982
 
983
+ #: defaults.php:291
984
+ msgid "User enabled Comments/Trackbacks and Pingbacks on a draft post"
 
985
  msgstr ""
986
 
987
+ #: defaults.php:291
988
+ msgid "Enabled %Type% on the draft post %PostTitle%. View the post: %PostUrl%."
989
  msgstr ""
990
 
991
+ #: defaults.php:292
992
+ msgid "User disabled Comments/Trackbacks and Pingbacks on a published page"
993
  msgstr ""
994
 
995
+ #: defaults.php:292
996
+ msgid "Disabled %Type% on the published page %PostTitle%. View the page: %PostUrl%."
 
 
 
 
997
  msgstr ""
998
 
999
+ #: defaults.php:293
1000
+ msgid "User enabled Comments/Trackbacks and Pingbacks on a published page"
1001
  msgstr ""
1002
 
1003
+ #: defaults.php:293
1004
+ msgid "Enabled %Type% on the published page %PostTitle%. View the page: %PostUrl%."
 
 
1005
  msgstr ""
1006
 
1007
+ #: defaults.php:294
1008
+ msgid "User disabled Comments/Trackbacks and Pingbacks on a draft page"
 
 
1009
  msgstr ""
1010
 
1011
+ #: defaults.php:294
1012
+ msgid "Disabled %Type% on the draft page %PostTitle%. View the page: %PostUrl%."
1013
  msgstr ""
1014
 
1015
+ #: defaults.php:295
1016
+ msgid "User enabled Comments/Trackbacks and Pingbacks on a draft page"
1017
  msgstr ""
1018
 
1019
+ #: defaults.php:295
1020
+ msgid "Enabled %Type% on the draft page %PostTitle%. View the page: %PostUrl%."
1021
  msgstr ""
1022
 
1023
+ #: defaults.php:296
1024
+ msgid "A plugin created a page"
 
 
1025
  msgstr ""
1026
 
1027
+ #: defaults.php:296
1028
+ msgid "A plugin automatically created the following page: %PostTitle%."
 
 
 
1029
  msgstr ""
1030
 
1031
+ #: defaults.php:297
1032
+ msgid "A plugin deleted a page"
1033
  msgstr ""
1034
 
1035
+ #: defaults.php:297
1036
+ msgid "A plugin automatically deleted the following page: %PostTitle%."
1037
  msgstr ""
1038
 
1039
+ #: defaults.php:298
1040
+ msgid "A plugin modified a page"
1041
  msgstr ""
1042
 
1043
+ #: defaults.php:298
1044
+ msgid "Plugin modified the page %PostTitle%. View the page: %EditorLinkPage%."
1045
  msgstr ""
1046
 
1047
+ #: defaults.php:304
1048
+ msgid "New user was created on WordPress"
 
 
1049
  msgstr ""
1050
 
1051
+ #: defaults.php:304, defaults.php:305
1052
+ msgid "New user: %NewUserData->Username% %LineBreak% Role: %NewUserData->Roles% %LineBreak% First name: %NewUserData->FirstName% %LineBreak% Last name: %NewUserData->LastName% %LineBreak% %EditUserLink%"
 
 
1053
  msgstr ""
1054
 
1055
+ #: defaults.php:305
1056
+ msgid "User created another WordPress user"
 
 
1057
  msgstr ""
1058
 
1059
+ #: defaults.php:306
1060
+ msgid "The role of a user was changed by another WordPress user"
1061
  msgstr ""
1062
 
1063
+ #: defaults.php:306
1064
+ msgid "Changed the role of the user %TargetUsername% %LineBreak% New role: %NewRole% %LineBreak% Previous role: %OldRole% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1065
  msgstr ""
1066
 
1067
+ #: defaults.php:307
1068
+ msgid "User has changed his or her password"
1069
  msgstr ""
1070
 
1071
+ #: defaults.php:307
1072
+ msgid "Changed the password %LineBreak% First name: %TargetUserData->FirstName% %LineBreak% Last name: %TargetUserData->LastName% %LineBreak% %EditUserLink%"
1073
  msgstr ""
1074
 
1075
+ #: defaults.php:308
1076
+ msgid "User changed another user's password"
 
 
1077
  msgstr ""
1078
 
1079
+ #: defaults.php:308
1080
+ msgid "Changed the password of the user %TargetUserData->Username% %LineBreak% Role: %TargetUserData->Roles% %LineBreak% First name: %TargetUserData->FirstName% %LineBreak% Last name: %TargetUserData->LastName% %LineBreak% %EditUserLink%"
1081
  msgstr ""
1082
 
1083
+ #: defaults.php:309
1084
+ msgid "User changed his or her email address"
1085
  msgstr ""
1086
 
1087
+ #: defaults.php:309
1088
+ msgid "Changed the email address to %NewEmail% %LineBreak% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1089
  msgstr ""
1090
 
1091
+ #: defaults.php:310
1092
+ msgid "User changed another user's email address"
1093
  msgstr ""
1094
 
1095
+ #: defaults.php:310
1096
+ msgid "Changed the email address of the user %TargetUsername% %LineBreak% New email address: %NewEmail% %LineBreak% Previous email address: %OldEmail% %LineBreak% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1097
  msgstr ""
1098
 
1099
+ #: defaults.php:311
1100
+ msgid "User was deleted by another user"
1101
  msgstr ""
1102
 
1103
+ #: defaults.php:311
1104
+ msgid "User: %TargetUserData->Username% %LineBreak% Role: %TargetUserData->Roles% %LineBreak% First name: %NewUserData->FirstName% %LineBreak% Last name: %NewUserData->LastName%"
1105
  msgstr ""
1106
 
1107
+ #: defaults.php:312
1108
+ msgid "User opened the profile page of another user"
1109
  msgstr ""
1110
 
1111
+ #: defaults.php:312
1112
+ msgid "The profile page of the user %TargetUsername% %LineBreak% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1113
  msgstr ""
1114
 
1115
+ #: defaults.php:313
1116
+ msgid "User updated a custom field value for a user"
1117
  msgstr ""
1118
 
1119
+ #: defaults.php:313
1120
+ msgid "Changed the value of a custom field in the user profile %TargetUsername% %LineBreak% Custom field: %custom_field_name% %LineBreak% Previous value: %old_value% %LineBreak% New value: %new_value% %LineBreak% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1121
  msgstr ""
1122
 
1123
+ #: defaults.php:314
1124
+ msgid "User created a custom field value for a user"
1125
  msgstr ""
1126
 
1127
+ #: defaults.php:314
1128
+ msgid "Created a new custom field in the user profile %TargetUsername% %LineBreak% Custom field: %custom_field_name% %LineBreak% Custom field value: %new_value% %LineBreak% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1129
  msgstr ""
1130
 
1131
+ #: defaults.php:315
1132
+ msgid "User changed first name for a user"
 
 
1133
  msgstr ""
1134
 
1135
+ #: defaults.php:315
1136
+ msgid "Changed the first name of the user %TargetUsername% %LineBreak% Previous name: %old_firstname% %LineBreak% New name: %new_firstname% %LineBreak% Role: %Roles% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1137
  msgstr ""
1138
 
1139
+ #: defaults.php:316
1140
+ msgid "User changed last name for a user"
1141
  msgstr ""
1142
 
1143
+ #: defaults.php:316
1144
+ msgid "Changed the last name of the user %TargetUsername% %LineBreak% Previous last name: %old_lastname% %LineBreak% New last name: %new_lastname% %LineBreak% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% %EditUserLink%"
1145
  msgstr ""
1146
 
1147
+ #: defaults.php:317
1148
+ msgid "User changed nickname for a user"
1149
  msgstr ""
1150
 
1151
+ #: defaults.php:317
1152
+ msgid "Changed the nickname of the user %TargetUsername% %LineBreak% Previous nickname: %old_nickname% New nickname: %new_nickname% %LineBreak% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
 
 
 
1153
  msgstr ""
1154
 
1155
+ #: defaults.php:318
1156
+ msgid "User changed the display name for a user"
1157
  msgstr ""
1158
 
1159
+ #: defaults.php:318
1160
+ msgid "Changed the display name of the user %TargetUsername% %LineBreak% Previous display name: %old_displayname% %LineBreak% New display name: %new_displayname% %LineBreak% Role: %Roles% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1161
  msgstr ""
1162
 
1163
+ #: defaults.php:322
1164
+ msgid "User granted Super Admin privileges"
1165
  msgstr ""
1166
 
1167
+ #: defaults.php:322
1168
+ msgid "Granted Super Admin privileges to %TargetUsername% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
 
 
1169
  msgstr ""
1170
 
1171
+ #: defaults.php:323
1172
+ msgid "User revoked from Super Admin privileges"
 
 
1173
  msgstr ""
1174
 
1175
+ #: defaults.php:323
1176
+ msgid "Revoked Super Admin privileges from %TargetUsername% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1177
  msgstr ""
1178
 
1179
+ #: defaults.php:324
1180
+ msgid "Existing user added to a site"
1181
  msgstr ""
1182
 
1183
+ #: defaults.php:324
1184
+ msgid "Added user %TargetUsername% to site: %SiteName% %LineBreak% Role: %TargetUserRole% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1185
  msgstr ""
1186
 
1187
+ #: defaults.php:325
1188
+ msgid "User removed from site"
1189
  msgstr ""
1190
 
1191
+ #: defaults.php:325
1192
+ msgid "Removed user %TargetUsername% from site: %SiteName% %LineBreak% Previous role: %TargetUserRole% %LineBreak% First name: %FirstName% %LineBreak% Last name: %LastName% %LineBreak% %EditUserLink%"
1193
  msgstr ""
1194
 
1195
+ #: defaults.php:326
1196
+ msgid "New network user created"
1197
  msgstr ""
1198
 
1199
+ #: defaults.php:326
1200
+ msgid "Created a new network user %NewUserData->Username% %LineBreak% First name: %NewUserData->FirstName% %LineBreak% Last name: %NewUserData->LastName% %LineBreak% %EditUserLink%"
 
 
 
1201
  msgstr ""
1202
 
1203
+ #: defaults.php:332
1204
+ msgid "User installed a plugin"
1205
  msgstr ""
1206
 
1207
+ #: defaults.php:332
1208
+ msgid "Name: %Plugin->Name% %LineBreak% Install location: %Plugin->plugin_dir_path%"
1209
  msgstr ""
1210
 
1211
+ #: defaults.php:333
1212
+ msgid "User activated a WordPress plugin"
1213
  msgstr ""
1214
 
1215
+ #: defaults.php:333, defaults.php:334, defaults.php:335, defaults.php:336
1216
+ msgid "Name: %PluginData->Name% %LineBreak% Install location: %PluginFile%"
1217
  msgstr ""
1218
 
1219
+ #: defaults.php:334
1220
+ msgid "User deactivated a WordPress plugin"
1221
  msgstr ""
1222
 
1223
+ #: defaults.php:335
1224
+ msgid "User uninstalled a plugin"
1225
  msgstr ""
1226
 
1227
+ #: defaults.php:336
1228
+ msgid "User upgraded a plugin"
 
 
1229
  msgstr ""
1230
 
1231
+ #: defaults.php:337
1232
+ msgid "Plugin created table"
 
 
1233
  msgstr ""
1234
 
1235
+ #: defaults.php:337
1236
+ msgid "Plugin created this table in the database %LineBreak% Plugin: %Plugin->Name% %LineBreak% Table: %TableNames%"
1237
  msgstr ""
1238
 
1239
+ #: defaults.php:338
1240
+ msgid "Plugin modified table structure"
 
1241
  msgstr ""
1242
 
1243
+ #: defaults.php:338
1244
+ msgid "Plugin modified the structure of this table %LineBreak% Plugin: %Plugin->Name% %LineBreak% Table: %TableNames%"
1245
  msgstr ""
1246
 
1247
+ #: defaults.php:339
1248
+ msgid "Plugin deleted table"
1249
  msgstr ""
1250
 
1251
+ #: defaults.php:339
1252
+ msgid "Plugin deleted this table from the database %LineBreak% Plugin: %Plugin->Name% %LineBreak% Table: %TableNames%"
 
 
1253
  msgstr ""
1254
 
1255
+ #: defaults.php:340
1256
+ msgid "A plugin created a post"
1257
  msgstr ""
1258
 
1259
+ #: defaults.php:340
1260
+ msgid "Plugin %PluginName% created the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Type: %PostType% %LineBreak% Status: %PostStatus% %LineBreak% %EditorLinkPage%"
1261
  msgstr ""
1262
 
1263
+ #: defaults.php:341
1264
+ msgid "A plugin deleted a post"
1265
  msgstr ""
1266
 
1267
+ #: defaults.php:341
1268
+ msgid "Plugin %PluginName% deleted the post %PostTitle% %LineBreak% Post ID: %PostID% %LineBreak% Type: %PostType%"
1269
  msgstr ""
1270
 
1271
+ #: defaults.php:342
1272
+ msgid "User changed a file using the plugin editor"
 
1273
  msgstr ""
1274
 
1275
+ #: defaults.php:342
1276
+ msgid "Modified a file with the plugin editor %LineBreak% File: %File%"
 
 
1277
  msgstr ""
1278
 
1279
+ #: defaults.php:346
1280
+ msgid "User installed a theme"
1281
  msgstr ""
1282
 
1283
+ #: defaults.php:346
1284
+ msgid "Theme: \"%Theme->Name%\" %LineBreak% Install location: %Theme->get_template_directory%"
1285
  msgstr ""
1286
 
1287
+ #: defaults.php:347
1288
+ msgid "User activated a theme"
1289
  msgstr ""
1290
 
1291
+ #: defaults.php:347, defaults.php:348
1292
+ msgid "Theme \"%Theme->Name%\" %LineBreak% Install location: %Theme->get_template_directory%"
 
 
 
 
 
1293
  msgstr ""
1294
 
1295
+ #: defaults.php:348
1296
+ msgid "User uninstalled a theme"
1297
  msgstr ""
1298
 
1299
+ #: defaults.php:349
1300
+ msgid "Theme created tables"
 
 
 
1301
  msgstr ""
1302
 
1303
+ #: defaults.php:349
1304
+ msgid "Theme created these tables in the database %LineBreak% Theme: %Theme->Name% %LineBreak% Tables: %TableNames%"
1305
  msgstr ""
1306
 
1307
+ #: defaults.php:350
1308
+ msgid "Theme modified tables structure"
1309
  msgstr ""
1310
 
1311
+ #: defaults.php:350
1312
+ msgid "Theme modified the structure of these database tables %LineBreak% Theme: %Theme->Name% %LineBreak% Tables: %TableNames%"
1313
  msgstr ""
1314
 
1315
+ #: defaults.php:351
1316
+ msgid "Theme deleted tables"
1317
  msgstr ""
1318
 
1319
+ #: defaults.php:351
1320
+ msgid "Theme deleted these tables from the database %LineBreak% Theme: %Theme->Name% %LineBreak% Tables: %TableNames%"
1321
  msgstr ""
1322
 
1323
+ #: defaults.php:352
1324
+ msgid "User updated a theme"
 
 
1325
  msgstr ""
1326
 
1327
+ #: defaults.php:352
1328
+ msgid "Name: %Theme->Name% %LineBreak% Install location: %Theme->get_template_directory%"
1329
  msgstr ""
1330
 
1331
+ #: defaults.php:353
1332
+ msgid "User changed a file using the theme editor"
1333
  msgstr ""
1334
 
1335
+ #: defaults.php:353
1336
+ msgid "Modified a file with the theme editor %LineBreak% File: %Theme%/%File%"
1337
  msgstr ""
1338
 
1339
+ #: defaults.php:357
1340
+ msgid "Activated theme on network"
1341
  msgstr ""
1342
 
1343
+ #: defaults.php:357
1344
+ msgid "Network activated the theme %Theme->Name% %LineBreak% Install location: %Theme->get_template_directory%"
 
 
 
1345
  msgstr ""
1346
 
1347
+ #: defaults.php:358
1348
+ msgid "Deactivated theme from network"
1349
  msgstr ""
1350
 
1351
+ #: defaults.php:358
1352
+ msgid "Network deactivated the theme %Theme->Name% %LineBreak% Install location: %Theme->get_template_directory%"
1353
  msgstr ""
1354
 
1355
+ #: defaults.php:362
1356
+ msgid "Unknown component created tables"
1357
  msgstr ""
1358
 
1359
+ #: defaults.php:362
1360
+ msgid "An unknown component created these tables in the database %LineBreak% Tables: %TableNames%"
1361
  msgstr ""
1362
 
1363
+ #: defaults.php:363
1364
+ msgid "Unknown component modified tables structure"
1365
  msgstr ""
1366
 
1367
+ #: defaults.php:363
1368
+ msgid "An unknown component modified the structure of these database tables %LineBreak% Tables: %TableNames%"
1369
  msgstr ""
1370
 
1371
+ #: defaults.php:364
1372
+ msgid "Unknown component deleted tables"
1373
  msgstr ""
1374
 
1375
+ #: defaults.php:364
1376
+ msgid "An unknown component deleted these tables from the database %LineBreak% Tables: %TableNames%"
1377
  msgstr ""
1378
 
1379
+ #: defaults.php:365
1380
+ msgid "WordPress created tables"
 
 
 
1381
  msgstr ""
1382
 
1383
+ #: defaults.php:365
1384
+ msgid "WordPress created these tables in the database %LineBreak% Tables: %TableNames%"
1385
  msgstr ""
1386
 
1387
+ #: defaults.php:366
1388
+ msgid "WordPress modified tables structure"
 
 
 
 
 
 
1389
  msgstr ""
1390
 
1391
+ #: defaults.php:366
1392
+ msgid "WordPress modified the structure of these database tables %LineBreak% Tables: %TableNames%"
1393
  msgstr ""
1394
 
1395
+ #: defaults.php:367
1396
+ msgid "WordPress deleted tables"
 
 
1397
  msgstr ""
1398
 
1399
+ #: defaults.php:367
1400
+ msgid "WordPress deleted these tables from the database %LineBreak% Tables: %TableNames%"
1401
  msgstr ""
1402
 
1403
+ #: defaults.php:373
1404
+ msgid "Unknown Error"
 
 
 
1405
  msgstr ""
1406
 
1407
+ #: defaults.php:373
1408
+ msgid "An unexpected error has occurred ."
 
1409
  msgstr ""
1410
 
1411
+ #: defaults.php:374
1412
+ msgid "PHP error"
1413
  msgstr ""
1414
 
1415
+ #: defaults.php:374, defaults.php:375, defaults.php:376, defaults.php:377, defaults.php:378
1416
+ msgid "%Message%."
 
 
 
1417
  msgstr ""
1418
 
1419
+ #: defaults.php:375
1420
+ msgid "PHP warning"
1421
  msgstr ""
1422
 
1423
+ #: defaults.php:376
1424
+ msgid "PHP notice"
 
 
 
 
1425
  msgstr ""
1426
 
1427
+ #: defaults.php:377
1428
+ msgid "PHP exception"
 
 
 
 
1429
  msgstr ""
1430
 
1431
+ #: defaults.php:378
1432
+ msgid "PHP shutdown error"
1433
  msgstr ""
1434
 
1435
+ #: defaults.php:379
1436
+ msgid "WordPress was updated"
1437
  msgstr ""
1438
 
1439
+ #: defaults.php:379
1440
+ msgid "Updated WordPress %LineBreak% Previous version: %OldVersion% %LineBreak% New version: %NewVersion%"
1441
  msgstr ""
1442
 
1443
+ #: defaults.php:380
1444
+ msgid "Advertising Extensions"
 
 
 
1445
  msgstr ""
1446
 
1447
+ #: defaults.php:380
1448
+ msgid "%PromoName% %PromoMessage%"
 
 
 
1449
  msgstr ""
1450
 
1451
+ #: defaults.php:384
1452
+ msgid "Events automatically pruned by system"
1453
  msgstr ""
1454
 
1455
+ #: defaults.php:384
1456
+ msgid "System automatically deleted %EventCount% event(s)"
1457
  msgstr ""
1458
 
1459
+ #: defaults.php:385
1460
+ msgid "Reset the plugin's settings to default"
1461
  msgstr ""
1462
 
1463
+ #: defaults.php:385
1464
+ msgid "Reset the WP Activity Log plugin settings to default"
 
 
1465
  msgstr ""
1466
 
1467
+ #: defaults.php:386, defaults.php:386
1468
+ msgid "Purged the activity log"
1469
  msgstr ""
1470
 
1471
+ #: defaults.php:390
1472
+ msgid "User requests non-existing pages (404 Error Pages)"
 
 
1473
  msgstr ""
1474
 
1475
+ #: defaults.php:390
1476
+ msgid "Has requested a non existing page (404 error) %LineBreak% Number of times: %Attempts%"
1477
  msgstr ""
1478
 
1479
+ #: defaults.php:391
1480
+ msgid "Website Visitor User requests non-existing pages (404 Error Pages)"
 
 
 
1481
  msgstr ""
1482
 
1483
+ #: defaults.php:391
1484
+ msgid "Website visitor has requested a non existing page (404 error) %LineBreak% Number of times: %Attempts%"
1485
  msgstr ""
1486
 
1487
+ #: defaults.php:395
1488
+ msgid "Option Anyone Can Register in WordPress settings changed"
1489
  msgstr ""
1490
 
1491
+ #: defaults.php:395
1492
+ msgid "The option Anyone can register"
1493
  msgstr ""
1494
 
1495
+ #: defaults.php:396
1496
+ msgid "New User Default Role changed"
1497
  msgstr ""
1498
 
1499
+ #: defaults.php:396
1500
+ msgid "Changed the new user default role %LineBreak% Previous role: %OldRole% %LineBreak% New role: %NewRole%"
1501
  msgstr ""
1502
 
1503
+ #: defaults.php:397
1504
+ msgid "WordPress Administrator Notification email changed"
1505
  msgstr ""
1506
 
1507
+ #: defaults.php:397
1508
+ msgid "Changed the WordPress administrator notification email address %LineBreak% Previous address %OldEmail% %LineBreak% New address: %NewEmail%"
 
 
 
 
1509
  msgstr ""
1510
 
1511
+ #: defaults.php:398
1512
+ msgid "User changes the WordPress Permalinks"
1513
  msgstr ""
1514
 
1515
+ #: defaults.php:398
1516
+ msgid "Changed the WordPress permalinks %LineBreak% Previous permalinks: %OldPattern% %LineBreak% New permalinks: %NewPattern%"
1517
  msgstr ""
1518
 
1519
+ #: defaults.php:399
1520
+ msgid "Enabled/Disabled the option Discourage search engines from indexing this site"
1521
  msgstr ""
1522
 
1523
+ #: defaults.php:399
1524
+ msgid "Discourage search engines from indexing this site."
 
 
1525
  msgstr ""
1526
 
1527
+ #: defaults.php:400
1528
+ msgid "Enabled/Disabled comments on all the website"
 
 
 
1529
  msgstr ""
1530
 
1531
+ #: defaults.php:400
1532
+ msgid "Comments on the website"
 
 
 
 
1533
  msgstr ""
1534
 
1535
+ #: defaults.php:401
1536
+ msgid "Enabled/Disabled the option Comment author must fill out name and email"
 
 
 
1537
  msgstr ""
1538
 
1539
+ #: defaults.php:401
1540
+ msgid "The option Comment author must fill out name and email"
1541
  msgstr ""
1542
 
1543
+ #: defaults.php:402
1544
+ msgid "Enabled/Disabled the option Users must be logged in and registered to comment"
1545
  msgstr ""
1546
 
1547
+ #: defaults.php:402
1548
+ msgid "The option Users must be logged in and registered to comment"
 
1549
  msgstr ""
1550
 
1551
+ #: defaults.php:403
1552
+ msgid "Enabled/Disabled the option to automatically close comments"
 
1553
  msgstr ""
1554
 
1555
+ #: defaults.php:403
1556
+ msgid "The option to Automatically close comments after %Value% days"
 
1557
  msgstr ""
1558
 
1559
+ #: defaults.php:404
1560
+ msgid "Changed the value of the option Automatically close comments"
1561
  msgstr ""
1562
 
1563
+ #: defaults.php:404
1564
+ msgid "Changed the value of the option to Automatically close comments after a number of days %LineBreak% Previous value: %OldValue% %LineBreak% New value: %NewValue%"
1565
  msgstr ""
1566
 
1567
+ #: defaults.php:405
1568
+ msgid "Enabled/Disabled the option for comments to be manually approved"
1569
  msgstr ""
1570
 
1571
+ #: defaults.php:405
1572
+ msgid "The option for comments to be manually approved"
1573
  msgstr ""
1574
 
1575
+ #: defaults.php:406
1576
+ msgid "Enabled/Disabled the option for an author to have previously approved comments for the comments to appear"
 
 
 
1577
  msgstr ""
1578
 
1579
+ #: defaults.php:406
1580
+ msgid "The option for an author to have previously approved comments for the comments to appear"
1581
  msgstr ""
1582
 
1583
+ #: defaults.php:407
1584
+ msgid "Changed the number of links that a comment must have to be held in the queue"
1585
  msgstr ""
1586
 
1587
+ #: defaults.php:407
1588
+ msgid "Changed the minimum number of links a comment must have to be held in the queue %LineBreak% Previous value: %OldValue% %LineBreak% New value: %NewValue%"
1589
  msgstr ""
1590
 
1591
+ #: defaults.php:408
1592
+ msgid "Modified the list of keywords for comments moderation"
1593
  msgstr ""
1594
 
1595
+ #: defaults.php:408
1596
+ msgid "Modified the list of keywords for comments medoration"
1597
  msgstr ""
1598
 
1599
+ #: defaults.php:409, defaults.php:409
1600
+ msgid "Modified the list of keywords for comments blacklisting"
 
1601
  msgstr ""
1602
 
1603
+ #: defaults.php:410
1604
+ msgid "Option WordPress Address (URL) in WordPress settings changed"
 
 
 
 
1605
  msgstr ""
1606
 
1607
+ #: defaults.php:410
1608
+ msgid "Changed the WordPress address (URL) %LineBreak% Previous URL: %old_url% %LineBreak% New URL: %new_url%"
1609
  msgstr ""
1610
 
1611
+ #: defaults.php:411
1612
+ msgid "Option Site Address (URL) in WordPress settings changed"
1613
  msgstr ""
1614
 
1615
+ #: defaults.php:411
1616
+ msgid "Changed the site address (URL) %LineBreak% Previous URL: %old_url% %LineBreak% New URL: %new_url%"
1617
  msgstr ""
1618
 
1619
+ #: defaults.php:417
1620
+ msgid "New site added on the network"
1621
  msgstr ""
1622
 
1623
+ #: defaults.php:417
1624
+ msgid "New site on the network: %SiteName% %LineBreak% URL: %BlogURL%"
1625
  msgstr ""
1626
 
1627
+ #: defaults.php:418
1628
+ msgid "Existing site archived"
 
 
1629
  msgstr ""
1630
 
1631
+ #: defaults.php:418
1632
+ msgid "Archived the site: %SiteName% %LineBreak% URL: %BlogURL%"
1633
  msgstr ""
1634
 
1635
+ #: defaults.php:419
1636
+ msgid "Archived site has been unarchived"
 
 
 
 
 
1637
  msgstr ""
1638
 
1639
+ #: defaults.php:419
1640
+ msgid "Unarchived the site: %SiteName% %LineBreak% URL: %BlogURL%"
1641
  msgstr ""
1642
 
1643
+ #: defaults.php:420
1644
+ msgid "Deactivated site has been activated"
1645
  msgstr ""
1646
 
1647
+ #: defaults.php:420
1648
+ msgid "Activated the site: %SiteName% %LineBreak% URL: %BlogURL%"
1649
  msgstr ""
1650
 
1651
+ #: defaults.php:421
1652
+ msgid "Site has been deactivated"
1653
  msgstr ""
1654
 
1655
+ #: defaults.php:421
1656
+ msgid "Deactivated the site: %SiteName% %LineBreak% URL: %BlogURL%"
 
 
 
 
1657
  msgstr ""
1658
 
1659
+ #: defaults.php:422
1660
+ msgid "Existing site deleted from network"
1661
  msgstr ""
1662
 
1663
+ #: defaults.php:422
1664
+ msgid "The site: %SiteName% %LineBreak% URL: %BlogURL%"
1665
  msgstr ""
1666
 
1667
+ #: defaults.php:433
1668
+ msgid "Dummy"
 
 
1669
  msgstr ""
1670
 
1671
+ #. translators: Username
1672
+ #. translators: Username
1673
+ #: wp-security-audit-log.php:910, wp-security-audit-log.php:937
1674
+ msgid "Hey %1$s"
1675
  msgstr ""
1676
 
1677
+ #: wp-security-audit-log.php:911
1678
+ msgid "Never miss an important update! Opt-in to our security and feature updates notifications, and non-sensitive diagnostic tracking with freemius.com."
1679
  msgstr ""
1680
 
1681
+ #: wp-security-audit-log.php:912, wp-security-audit-log.php:940
1682
+ msgid "Note: "
1683
  msgstr ""
1684
 
1685
+ #: wp-security-audit-log.php:913, wp-security-audit-log.php:941
1686
+ msgid "NO ACTIVITY LOG ACTIVITY & DATA IS SENT BACK TO OUR SERVERS."
1687
  msgstr ""
1688
 
1689
+ #. translators: 1: Plugin name. 2: Freemius link.
1690
+ #: wp-security-audit-log.php:939
1691
+ msgid "Please help us improve %2$s! If you opt-in, some non-sensitive data about your usage of %2$s will be sent to %5$s, a diagnostic tracking service we use. If you skip this, that's okay! %2$s will still work just fine."
 
 
 
1692
  msgstr ""
1693
 
1694
+ #. translators: Plugin name
1695
+ #: wp-security-audit-log.php:961
1696
+ msgid "Get a free 7-day trial of the premium edition of %s. No credit card required, no commitments!"
1697
  msgstr ""
1698
 
1699
+ #: wp-security-audit-log.php:962, classes/AlertManager.php:1140, extensions/external-db/classes/Connections.php:173
1700
+ msgid "WP Activity Log"
1701
  msgstr ""
1702
 
1703
+ #: wp-security-audit-log.php:966
1704
+ msgid "Start free trial"
1705
  msgstr ""
1706
 
1707
+ #: wp-security-audit-log.php:1034
1708
+ msgid "You need to activate the licence key to use WP Activity Log Premium. %2$s"
 
 
 
1709
  msgstr ""
1710
 
1711
+ #: wp-security-audit-log.php:1035
1712
+ msgid "Activate the licence key now"
1713
  msgstr ""
1714
 
1715
+ #. translators: Number of sites
1716
+ #: wp-security-audit-log.php:1052
1717
+ msgid "The license is limited to %s sub-sites. You need to upgrade your license to cover all the sub-sites on this network."
 
 
1718
  msgstr ""
1719
 
1720
+ #: wp-security-audit-log.php:1162
1721
+ msgid "Error: You do not have sufficient permissions to disable this custom field."
1722
  msgstr ""
1723
 
1724
+ #: wp-security-audit-log.php:1195
1725
+ msgid "Custom Field %1$s is no longer being monitored.<br />Enable the monitoring of this custom field again from the"
 
 
1726
  msgstr ""
1727
 
1728
+ #: wp-security-audit-log.php:1195
1729
+ msgid "Excluded Objects"
1730
  msgstr ""
1731
 
1732
+ #: wp-security-audit-log.php:1195
1733
+ msgid " tab in the plugin settings"
 
 
 
1734
  msgstr ""
1735
 
1736
+ #: wp-security-audit-log.php:1207
1737
+ msgid "Error: You do not have sufficient permissions to disable this alert."
1738
  msgstr ""
1739
 
1740
+ #: wp-security-audit-log.php:1230
1741
+ msgid "Alert %1$s is no longer being monitored.<br /> %2$s"
1742
  msgstr ""
1743
 
1744
+ #: wp-security-audit-log.php:1230
1745
+ msgid "You can enable this alert again from the Enable/Disable Alerts node in the plugin menu."
1746
  msgstr ""
1747
 
1748
+ #: wp-security-audit-log.php:1255, classes/Views/SetupWizard.php:275
1749
+ msgid "Installing, please wait"
 
 
 
1750
  msgstr ""
1751
 
1752
+ #: wp-security-audit-log.php:1256, classes/Views/SetupWizard.php:276
1753
+ msgid "Already installed"
 
 
1754
  msgstr ""
1755
 
1756
+ #: wp-security-audit-log.php:1257, classes/Utilities/PluginInstallAndActivate.php:107, classes/Views/SetupWizard.php:277, classes/Views/SetupWizard.php:894
1757
+ msgid "Extension installed"
 
 
 
 
 
 
1758
  msgstr ""
1759
 
1760
+ #: wp-security-audit-log.php:1258, classes/Views/SetupWizard.php:278
1761
+ msgid "Extension activated"
1762
  msgstr ""
1763
 
1764
+ #: wp-security-audit-log.php:1259, classes/Views/SetupWizard.php:279
1765
+ msgid "Install failed"
 
 
1766
  msgstr ""
1767
 
1768
+ #. translators: %s: PHP Version
1769
+ #: wp-security-audit-log.php:1322
1770
+ msgid "You are using a version of PHP that is older than %s, which is no longer supported."
 
1771
  msgstr ""
1772
 
1773
+ #: wp-security-audit-log.php:1324
1774
+ msgid "Contact us on <a href=\"mailto:plugins@wpwhitesecurity.com\">plugins@wpwhitesecurity.com</a> to help you switch the version of PHP you are using."
 
 
 
1775
  msgstr ""
1776
 
1777
+ #. translators: %s: Activity Log for MainWP plugin hyperlink
1778
+ #: wp-security-audit-log.php:1329
1779
+ msgid "Please install the %s plugin on the MainWP dashboard."
1780
  msgstr ""
1781
 
1782
+ #: wp-security-audit-log.php:1329
1783
+ msgid "Activity Log for MainWP"
 
 
1784
  msgstr ""
1785
 
1786
+ #. translators: %s: Getting started guide hyperlink
1787
+ #: wp-security-audit-log.php:1331
1788
+ msgid "The WP Activity Log should be installed on the child sites only. Refer to the %s for more information."
1789
  msgstr ""
1790
 
1791
+ #: wp-security-audit-log.php:1331
1792
+ msgid "getting started guide"
 
 
 
1793
  msgstr ""
1794
 
1795
+ #: wp-security-audit-log.php:1402
1796
+ msgid "This plugin uses 3 tables in the WordPress database to store the activity log and settings. It seems that these tables were not created."
1797
  msgstr ""
1798
 
1799
+ #: wp-security-audit-log.php:1404
1800
+ msgid "This could happen because the database user does not have the right privileges to create the tables in the database. We recommend you to update the privileges and try enabling the plugin again."
1801
  msgstr ""
1802
 
1803
+ #. translators: %s: Support Hyperlink
1804
+ #: wp-security-audit-log.php:1406
1805
+ msgid "If after doing so you still have issues, please send us an email on %s for assistance."
1806
  msgstr ""
1807
 
1808
+ #: wp-security-audit-log.php:1406
1809
+ msgid "support@wpsecurityauditlog.com"
 
 
1810
  msgstr ""
1811
 
1812
+ #: wp-security-audit-log.php:1888
1813
+ msgid "For security and auditing purposes, a record of all of your logged-in actions and changes within the WordPress dashboard will be recorded in an activity log with the <a href=\"https://wpactivitylog.com/\" target=\"_blank\">WP Activity Log plugin</a>. The audit log also includes the IP address where you accessed this site from."
1814
  msgstr ""
1815
 
1816
+ #: wp-security-audit-log.php:1907
1817
+ msgid "Every 6 hours"
1818
  msgstr ""
1819
 
1820
+ #: wp-security-audit-log.php:1911
1821
+ msgid "Every 45 minutes"
1822
  msgstr ""
1823
 
1824
+ #: wp-security-audit-log.php:1915
1825
+ msgid "Every 30 minutes"
 
 
 
 
 
1826
  msgstr ""
1827
 
1828
+ #: wp-security-audit-log.php:1919
1829
+ msgid "Every 15 minutes"
1830
  msgstr ""
1831
 
1832
+ #: wp-security-audit-log.php:1923
1833
+ msgid "Every 10 minutes"
1834
  msgstr ""
1835
 
1836
+ #: wp-security-audit-log.php:1927
1837
+ msgid "Every 1 minute"
1838
  msgstr ""
1839
 
1840
+ #. translators: 1. Deprecated method name 2. Version since deprecated
1841
+ #: wp-security-audit-log.php:1941
1842
+ msgid "Method %1$s is deprecated since version %2$s!"
1843
  msgstr ""
1844
 
1845
+ #. translators: Event ID
1846
+ #: classes/AlertManager.php:372
1847
+ msgid "Event with code %d has not be registered."
 
 
 
 
1848
  msgstr ""
1849
 
1850
+ #. translators: Event ID
1851
+ #: classes/AlertManager.php:434
1852
+ msgid "Event %s already registered with WP Activity Log."
1853
  msgstr ""
1854
 
1855
+ #: classes/AlertManager.php:507
1856
+ msgid "You have custom events that are using the same ID or IDs which are already registered in the plugin, so they have been disabled."
1857
  msgstr ""
1858
 
1859
+ #. translators: 1.CSS classes, 2. Notice, 3. Contact us link
1860
+ #: classes/AlertManager.php:510
1861
+ msgid "%4$s to help you solve this issue."
1862
  msgstr ""
1863
 
1864
+ #: classes/AlertManager.php:512
1865
+ msgid "ERROR:"
1866
  msgstr ""
1867
 
1868
+ #: classes/AlertManager.php:514
1869
+ msgid "Contact us"
 
 
1870
  msgstr ""
1871
 
1872
+ #: classes/AlertManager.php:1121, classes/AuditLogListView.php:333, classes/AuditLogListView.php:367, classes/WidgetManager.php:76, classes/Views/Settings.php:1160, extensions/search/classes/Filters/UserNameFilter.php:44, extensions/user-sessions/classes/View/Sessions.php:172
1873
+ msgid "User"
1874
  msgstr ""
1875
 
1876
+ #: classes/AlertManager.php:1122, classes/AlertManager.php:1907, classes/AuditLogGridView.php:517, classes/AuditLogListView.php:543, extensions/email-notifications/classes/DailyNotification.php:241, extensions/email-notifications/classes/Notifier.php:633, extensions/reports/classes/Common.php:665
1877
+ msgid "System"
1878
  msgstr ""
1879
 
1880
+ #: classes/AlertManager.php:1123, classes/AuditLogGridView.php:508, classes/AuditLogListView.php:531
1881
+ msgid "Plugin"
1882
  msgstr ""
1883
 
1884
+ #: classes/AlertManager.php:1124
1885
+ msgid "Database"
1886
  msgstr ""
1887
 
1888
+ #: classes/AlertManager.php:1125
1889
+ msgid "Post"
1890
  msgstr ""
1891
 
1892
+ #: classes/AlertManager.php:1126, classes/AlertManager.php:1130
1893
+ msgid "File"
1894
  msgstr ""
1895
 
1896
+ #: classes/AlertManager.php:1127
1897
+ msgid "Tag"
1898
  msgstr ""
1899
 
1900
+ #: classes/AlertManager.php:1128
1901
+ msgid "Comment"
1902
  msgstr ""
1903
 
1904
+ #: classes/AlertManager.php:1129
1905
+ msgid "Setting"
1906
  msgstr ""
1907
 
1908
+ #: classes/AlertManager.php:1131
1909
+ msgid "System Setting"
1910
  msgstr ""
1911
 
1912
+ #: classes/AlertManager.php:1132
1913
+ msgid "MainWP Network"
1914
  msgstr ""
1915
 
1916
+ #: classes/AlertManager.php:1133
1917
+ msgid "MainWP"
1918
  msgstr ""
1919
 
1920
+ #: classes/AlertManager.php:1134
1921
+ msgid "Category"
1922
  msgstr ""
1923
 
1924
+ #: classes/AlertManager.php:1135
1925
+ msgid "Custom Field"
1926
  msgstr ""
1927
 
1928
+ #: classes/AlertManager.php:1136
1929
+ msgid "Widget"
1930
  msgstr ""
1931
 
1932
+ #: classes/AlertManager.php:1137
1933
+ msgid "Menu"
1934
  msgstr ""
1935
 
1936
+ #: classes/AlertManager.php:1138
1937
+ msgid "Theme"
 
1938
  msgstr ""
1939
 
1940
+ #: classes/AlertManager.php:1139
1941
+ msgid "Activity log"
1942
  msgstr ""
1943
 
1944
+ #: classes/AlertManager.php:1141
1945
+ msgid "Multisite Network"
1946
  msgstr ""
1947
 
1948
+ #: classes/AlertManager.php:1142, extensions/email-notifications/classes/Common.php:1148, extensions/search/classes/Filters/IpFilter.php:87, extensions/user-sessions/classes/View/Sessions.php:352
1949
+ msgid "IP Address"
1950
  msgstr ""
1951
 
1952
+ #: classes/AlertManager.php:1158
1953
+ msgid "unknown object"
1954
  msgstr ""
1955
 
1956
+ #: classes/AlertManager.php:1195
1957
+ msgid "Login"
1958
  msgstr ""
1959
 
1960
+ #: classes/AlertManager.php:1196
1961
+ msgid "Logout"
1962
  msgstr ""
1963
 
1964
+ #: classes/AlertManager.php:1197
1965
+ msgid "Installed"
1966
  msgstr ""
1967
 
1968
+ #: classes/AlertManager.php:1198
1969
+ msgid "Activated"
1970
  msgstr ""
1971
 
1972
+ #: classes/AlertManager.php:1199
1973
+ msgid "Deactivated"
1974
  msgstr ""
1975
 
1976
+ #: classes/AlertManager.php:1200
1977
+ msgid "Uninstalled"
 
 
1978
  msgstr ""
1979
 
1980
+ #: classes/AlertManager.php:1201
1981
+ msgid "Updated"
 
 
1982
  msgstr ""
1983
 
1984
+ #: classes/AlertManager.php:1202, extensions/user-sessions/classes/View/Sessions.php:179
1985
+ msgid "Created"
1986
  msgstr ""
1987
 
1988
+ #: classes/AlertManager.php:1203
1989
+ msgid "Modified"
1990
  msgstr ""
1991
 
1992
+ #: classes/AlertManager.php:1204, extensions/search/search-init.php:341
1993
+ msgid "Deleted"
1994
  msgstr ""
1995
 
1996
+ #: classes/AlertManager.php:1205
1997
+ msgid "Published"
 
1998
  msgstr ""
1999
 
2000
+ #: classes/AlertManager.php:1206
2001
+ msgid "Approved"
2002
  msgstr ""
2003
 
2004
+ #: classes/AlertManager.php:1207
2005
+ msgid "Unapproved"
 
 
 
 
 
 
 
 
 
 
 
 
 
2006
  msgstr ""
2007
 
2008
+ #: classes/AlertManager.php:1208
2009
+ msgid "Enabled"
 
 
2010
  msgstr ""
2011
 
2012
+ #: classes/AlertManager.php:1209, extensions/email-notifications/classes/Notifications.php:1862
2013
+ msgid "Disabled"
2014
  msgstr ""
2015
 
2016
+ #: classes/AlertManager.php:1210
2017
+ msgid "Added"
2018
  msgstr ""
2019
 
2020
+ #: classes/AlertManager.php:1211
2021
+ msgid "Failed Login"
 
 
 
2022
  msgstr ""
2023
 
2024
+ #: classes/AlertManager.php:1212
2025
+ msgid "Blocked"
 
 
 
2026
  msgstr ""
2027
 
2028
+ #: classes/AlertManager.php:1213
2029
+ msgid "Uploaded"
 
 
2030
  msgstr ""
2031
 
2032
+ #: classes/AlertManager.php:1214
2033
+ msgid "Restored"
2034
  msgstr ""
2035
 
2036
+ #: classes/AlertManager.php:1215
2037
+ msgid "Opened"
 
 
 
2038
  msgstr ""
2039
 
2040
+ #: classes/AlertManager.php:1216
2041
+ msgid "Viewed"
2042
  msgstr ""
2043
 
2044
+ #: classes/AlertManager.php:1217
2045
+ msgid "Started"
2046
  msgstr ""
2047
 
2048
+ #: classes/AlertManager.php:1218
2049
+ msgid "Stopped"
2050
  msgstr ""
2051
 
2052
+ #: classes/AlertManager.php:1219
2053
+ msgid "Removed"
2054
  msgstr ""
2055
 
2056
+ #: classes/AlertManager.php:1220
2057
+ msgid "Unblocked"
 
 
 
 
 
 
 
2058
  msgstr ""
2059
 
2060
+ #: classes/AlertManager.php:1221
2061
+ msgid "Renamed"
 
 
 
 
2062
  msgstr ""
2063
 
2064
+ #: classes/AlertManager.php:1222
2065
+ msgid "Duplicated"
 
 
2066
  msgstr ""
2067
 
2068
+ #: classes/AlertManager.php:1239
2069
+ msgid "unknown type"
2070
  msgstr ""
2071
 
2072
+ #: classes/AlertManager.php:1866, classes/ConstantManager.php:146, extensions/external-db/classes/Common.php:661, extensions/external-db/classes/Common.php:902
2073
+ msgid "Unknown error code."
2074
  msgstr ""
2075
 
2076
+ #: classes/AlertManager.php:1885, classes/AlertManager.php:1873, extensions/reports/classes/Common.php:645, extensions/reports/classes/Common.php:635
2077
+ msgid "Unknown Site"
2078
  msgstr ""
2079
 
2080
+ #: classes/AuditLogGridView.php:129, classes/AuditLogListView.php:129
2081
+ msgid "No events so far."
2082
  msgstr ""
2083
 
2084
+ #: classes/AuditLogGridView.php:167, classes/AuditLogListView.php:173
2085
+ msgid "List View"
 
 
 
 
 
2086
  msgstr ""
2087
 
2088
+ #: classes/AuditLogGridView.php:168, classes/AuditLogListView.php:174
2089
+ msgid "Grid View"
2090
  msgstr ""
2091
 
2092
+ #: classes/AuditLogGridView.php:193, classes/AuditLogListView.php:199
2093
+ msgid "Show "
2094
  msgstr ""
2095
 
2096
+ #: classes/AuditLogGridView.php:201, classes/AuditLogListView.php:207
2097
+ msgid " Items"
 
 
 
2098
  msgstr ""
2099
 
2100
+ #: classes/AuditLogGridView.php:208, classes/AuditLogListView.php:214
2101
+ msgid " End of Activity Log —"
2102
  msgstr ""
2103
 
2104
+ #: classes/AuditLogGridView.php:229, classes/AuditLogListView.php:235, classes/Views/AuditLog.php:627, extensions/reports/inc/wsal-reporting-view.inc.php:601
2105
+ msgid "All Sites"
2106
  msgstr ""
2107
 
2108
+ #: classes/AuditLogGridView.php:257, classes/AuditLogListView.php:264
2109
+ msgid "Live Database"
2110
  msgstr ""
2111
 
2112
+ #: classes/AuditLogGridView.php:260, classes/AuditLogListView.php:267
2113
+ msgid "Archive Database"
2114
  msgstr ""
2115
 
2116
+ #: classes/AuditLogGridView.php:314, classes/AuditLogGridView.php:338, classes/AuditLogListView.php:330, classes/AuditLogListView.php:358
2117
+ msgid "ID"
2118
  msgstr ""
2119
 
2120
+ #: classes/AuditLogGridView.php:315, classes/AuditLogGridView.php:341, classes/AuditLogListView.php:331, classes/AuditLogListView.php:361, classes/Views/Settings.php:1156, classes/Views/ToggleAlerts.php:319, extensions/search/classes/Filters/CodeFilter.php:38, extensions/search/classes/Filters/CodeFilter.php:64
2121
+ msgid "Severity"
 
 
 
 
 
 
2122
  msgstr ""
2123
 
2124
+ #: classes/AuditLogGridView.php:316, extensions/search/classes/Filters/CodeFilter.php:71
2125
+ msgid "Info"
2126
  msgstr ""
2127
 
2128
+ #: classes/AuditLogGridView.php:321, classes/AuditLogListView.php:341, classes/AuditLogListView.php:373, extensions/email-notifications/classes/Common.php:1146, extensions/email-notifications/classes/Common.php:1205, extensions/search/classes/Filters/SiteFilter.php:29
2129
+ msgid "Site"
2130
  msgstr ""
2131
 
2132
+ #: classes/AuditLogGridView.php:324, classes/AuditLogGridView.php:347, classes/AuditLogListView.php:344, classes/AuditLogListView.php:382, extensions/email-notifications/classes/Common.php:1179
2133
+ msgid "Message"
2134
  msgstr ""
2135
 
2136
+ #: classes/AuditLogGridView.php:344
2137
+ msgid "Grid"
2138
  msgstr ""
2139
 
2140
+ #: classes/AuditLogGridView.php:416, classes/AuditLogListView.php:466
2141
+ msgid "Disable this type of events."
2142
  msgstr ""
2143
 
2144
+ #: classes/AuditLogGridView.php:459, classes/AuditLogGridView.php:466, classes/AuditLogGridView.php:505, classes/AuditLogListView.php:486, classes/AuditLogListView.php:527
2145
+ msgid "Unknown"
 
 
2146
  msgstr ""
2147
 
2148
+ #: classes/AuditLogGridView.php:514, classes/AuditLogListView.php:539
2149
+ msgid "Unregistered user"
2150
  msgstr ""
2151
 
2152
+ #: classes/AuditLogGridView.php:511, classes/AuditLogListView.php:535
2153
+ msgid "Plugins"
 
 
2154
  msgstr ""
2155
 
2156
+ #: classes/AuditLogGridView.php:490, classes/AuditLogListView.php:512
2157
+ msgid "Show me all activity by this User"
2158
  msgstr ""
2159
 
2160
+ #: classes/AuditLogGridView.php:551, classes/AuditLogGridView.php:564, classes/AuditLogListView.php:575, classes/AuditLogListView.php:588
2161
+ msgid "Show me all activity originating from this IP Address"
 
 
2162
  msgstr ""
2163
 
2164
+ #: classes/AuditLogGridView.php:621, classes/AuditLogListView.php:617
2165
+ msgid "View all details of this change"
2166
  msgstr ""
2167
 
2168
+ #: classes/AuditLogGridView.php:622, classes/AuditLogGridView.php:772, classes/AuditLogListView.php:618, classes/AuditLogListView.php:772
2169
+ msgid "Alert Data Inspector"
2170
  msgstr ""
2171
 
2172
+ #: classes/AuditLogGridView.php:724, classes/AuditLogGridView.php:724, classes/AuditLogListView.php:724, classes/AuditLogListView.php:724, classes/Settings.php:1792, classes/Settings.php:1792
2173
+ msgid "Download the log file"
 
2174
  msgstr ""
2175
 
2176
+ #: classes/AuditLogGridView.php:744, classes/AuditLogGridView.php:744, classes/AuditLogListView.php:744, classes/AuditLogListView.php:744, classes/Settings.php:1834, classes/Settings.php:1834
2177
+ msgid "Download the log file."
2178
  msgstr ""
2179
 
2180
+ #: classes/AuditLogGridView.php:752, classes/AuditLogListView.php:752, classes/Settings.php:1847, classes/Settings.php:2087, extensions/email-notifications/classes/Notifier.php:794
2181
+ msgid "published"
2182
  msgstr ""
2183
 
2184
+ #. translators: Mailto link for support.
2185
+ #. translators: Mailto link for support.
2186
+ #. translators: Mailto link for support.
2187
+ #. translators: Mailto link for support.
2188
+ #. translators: Mailto link for support.
2189
+ #. translators: Mailto link for support.
2190
+ #: classes/AuditLogGridView.php:780, classes/AuditLogListView.php:780, classes/Settings.php:1873, classes/Settings.php:2113, extensions/email-notifications/classes/Notifier.php:820, extensions/reports/classes/Common.php:541
2191
+ msgid "Contact us on %s for assistance"
2192
  msgstr ""
2193
 
2194
+ #: classes/AuditLogListView.php:332, classes/AuditLogListView.php:364, extensions/search/classes/Filters/DateFilter.php:27
2195
+ msgid "Date"
2196
  msgstr ""
2197
 
2198
+ #: classes/AuditLogListView.php:334, classes/AuditLogListView.php:370, extensions/search/classes/Filters/IpFilter.php:45
2199
+ msgid "IP"
2200
  msgstr ""
2201
 
2202
+ #: classes/AuditLogListView.php:335, classes/AuditLogListView.php:376, extensions/email-notifications/classes/Common.php:1119, extensions/search/classes/Filters/ObjectFilter.php:29, extensions/search/classes/Filters/ObjectFilter.php:53
2203
+ msgid "Object"
2204
  msgstr ""
2205
 
2206
+ #: classes/AuditLogListView.php:336, classes/AuditLogListView.php:379, extensions/email-notifications/classes/Common.php:1120, extensions/search/classes/Filters/EventTypeFilter.php:29, extensions/search/classes/Filters/EventTypeFilter.php:53
2207
+ msgid "Event Type"
2208
  msgstr ""
2209
 
2210
+ #: classes/AuditLogListView.php:441
2211
+ msgid "Click to toggle."
2212
  msgstr ""
2213
 
2214
+ #: classes/AuditLogListView.php:446, classes/Models/Occurrence.php:83
2215
+ msgid "Alert message not found."
2216
  msgstr ""
2217
 
2218
+ #: classes/AuditLogListView.php:447, classes/Models/Occurrence.php:84
2219
+ msgid "Alert description not found."
2220
  msgstr ""
2221
 
2222
+ #: classes/ConstantManager.php:166, classes/Views/ToggleAlerts.php:457
2223
+ msgid "Informational"
 
 
2224
  msgstr ""
2225
 
2226
+ #: classes/ConstantManager.php:164, classes/Views/ToggleAlerts.php:455, extensions/search/classes/Filters/CodeFilter.php:70
2227
+ msgid "Low"
2228
  msgstr ""
2229
 
2230
+ #: classes/ConstantManager.php:162, classes/Views/ToggleAlerts.php:453, extensions/search/classes/Filters/CodeFilter.php:69
2231
+ msgid "Medium"
 
 
 
2232
  msgstr ""
2233
 
2234
+ #: classes/ConstantManager.php:160, classes/Views/ToggleAlerts.php:451, extensions/search/classes/Filters/CodeFilter.php:68
2235
+ msgid "High"
2236
  msgstr ""
2237
 
2238
+ #: classes/ConstantManager.php:158, classes/ConstantManager.php:152, classes/Views/ToggleAlerts.php:449, classes/Views/ToggleAlerts.php:443, extensions/search/classes/Filters/CodeFilter.php:67
2239
+ msgid "Critical"
 
 
 
2240
  msgstr ""
2241
 
2242
+ #: classes/ConstantManager.php:156, classes/Views/ToggleAlerts.php:459, classes/Views/ToggleAlerts.php:447
2243
+ msgid "Notification"
 
 
 
 
2244
  msgstr ""
2245
 
2246
+ #: classes/ConstantManager.php:154, classes/Views/ToggleAlerts.php:445
2247
+ msgid "Warning"
 
 
 
 
2248
  msgstr ""
2249
 
2250
+ #: classes/Settings.php:591
2251
+ msgid "This function is deprecated"
2252
  msgstr ""
2253
 
2254
+ #: classes/Settings.php:1751, extensions/email-notifications/classes/Notifier.php:742, extensions/reports/classes/Common.php:482
2255
+ msgid "View the content changes"
 
 
 
2256
  msgstr ""
2257
 
2258
+ #: classes/Settings.php:1756, extensions/email-notifications/classes/Notifier.php:747, extensions/email-notifications/classes/Notifier.php:753, extensions/reports/classes/Common.php:487, extensions/reports/classes/Common.php:493
2259
+ msgid "View post in the editor"
2260
  msgstr ""
2261
 
2262
+ #: classes/Settings.php:1759, extensions/email-notifications/classes/Notifier.php:750, extensions/reports/classes/Common.php:490
2263
+ msgid "View Order"
 
 
2264
  msgstr ""
2265
 
2266
+ #: classes/Settings.php:1764, extensions/email-notifications/classes/Notifier.php:756, extensions/reports/classes/Common.php:496
2267
+ msgid "View category"
2268
  msgstr ""
2269
 
2270
+ #: classes/Settings.php:1767, extensions/email-notifications/classes/Notifier.php:759, extensions/reports/classes/Common.php:499
2271
+ msgid "View tag"
 
 
2272
  msgstr ""
2273
 
2274
+ #: classes/Settings.php:1771, extensions/email-notifications/classes/Notifier.php:769, extensions/reports/classes/Common.php:509
2275
+ msgid "User profile page"
 
 
 
 
 
2276
  msgstr ""
2277
 
2278
+ #: classes/Settings.php:1885, extensions/reports/classes/Common.php:553
2279
+ msgid "Increase maximum file size limit"
2280
  msgstr ""
2281
 
2282
+ #: classes/Settings.php:1888, extensions/reports/classes/Common.php:556
2283
+ msgid "Contact Support"
2284
  msgstr ""
2285
 
2286
+ #: classes/Settings.php:2125, extensions/email-notifications/classes/Notifier.php:831, extensions/email-notifications/classes/Notifier.php:959
2287
+ msgid "plugin settings"
 
2288
  msgstr ""
2289
 
2290
+ #: classes/Settings.php:2128, extensions/email-notifications/classes/Notifier.php:834, extensions/email-notifications/classes/Notifier.php:964
2291
+ msgid "contact our support"
 
 
 
2292
  msgstr ""
2293
 
2294
+ #: classes/Settings.php:2299
2295
+ msgid "Root directory of WordPress (excluding sub directories)"
2296
  msgstr ""
2297
 
2298
+ #: classes/Settings.php:2300
2299
+ msgid "WP Admin directory (/wp-admin/)"
 
 
2300
  msgstr ""
2301
 
2302
+ #: classes/Settings.php:2301
2303
+ msgid "WP Includes directory (/wp-includes/)"
2304
  msgstr ""
2305
 
2306
+ #: classes/Settings.php:2302
2307
+ msgid "/wp-content/ directory (excluding plugins, themes & uploads directories)"
2308
  msgstr ""
2309
 
2310
+ #: classes/Settings.php:2303
2311
+ msgid "Themes directory (/wp-content/themes/)"
2312
  msgstr ""
2313
 
2314
+ #: classes/Settings.php:2304
2315
+ msgid "Plugins directory (/wp-content/plugins/)"
2316
  msgstr ""
2317
 
2318
+ #: classes/Settings.php:2305
2319
+ msgid "Uploads directory (/wp-content/uploads/)"
2320
  msgstr ""
2321
 
2322
+ #: classes/Settings.php:2310
2323
+ msgid "Uploads directory of all sub sites on this network (/wp-content/sites/*)"
2324
  msgstr ""
2325
 
2326
+ #: classes/ViewManager.php:141
2327
+ msgid "WP Activity Log requires Website File Changes Monitor 1.6.0. Please upgrade that plugin."
2328
  msgstr ""
2329
 
2330
+ #: classes/ViewManager.php:283
2331
+ msgid "Free Premium Trial"
2332
  msgstr ""
2333
 
2334
+ #: classes/WidgetManager.php:55
2335
+ msgid "Latest Events"
2336
  msgstr ""
2337
 
2338
+ #: classes/WidgetManager.php:77, classes/Views/ToggleAlerts.php:320
2339
+ msgid "Description"
2340
  msgstr ""
2341
 
2342
+ #: classes/WidgetManager.php:71
2343
+ msgid "No events found."
2344
  msgstr ""
2345
 
2346
+ #: extensions/class-wsal-extension-manager.php:216, extensions/external-db/classes/Settings.php:109, extensions/external-db/classes/Settings.php:619
2347
+ msgid "External Storage"
2348
  msgstr ""
2349
 
2350
+ #: extensions/class-wsal-extension-manager.php:321, extensions/class-wsal-extension-manager.php:297, extensions/class-wsal-extension-manager.php:257, extensions/external-db/classes/Mirroring.php:658, extensions/external-db/classes/Settings.php:121
2351
+ msgid "Mirroring"
 
2352
  msgstr ""
2353
 
2354
+ #: extensions/class-wsal-extension-manager.php:374, extensions/external-db/classes/Settings.php:115, extensions/external-db/classes/Settings.php:871
2355
+ msgid "Archiving"
2356
  msgstr ""
2357
 
2358
+ #. translators: 1 - mysqli error code, 2 - mysqli error message
2359
+ #: classes/Connector/MySQLDB.php:68
2360
+ msgid "Code %1$d: %2$s"
2361
  msgstr ""
2362
 
2363
+ #: classes/Loggers/Database.php:235, classes/Views/addons/html-view.php:92, classes/Views/addons/html-view.php:117
2364
+ msgid "Upgrade to Premium"
2365
  msgstr ""
2366
 
2367
+ #: classes/Loggers/Database.php:236, classes/Views/addons/html-view.php:93
2368
+ msgid "More Information"
2369
  msgstr ""
2370
 
2371
+ #: classes/Models/Occurrence.php:200
2372
+ msgid "WFCM"
2373
  msgstr ""
2374
 
2375
+ #. translators: 1: html that opens a link, 2: html that closes a link.
2376
+ #: classes/Models/Occurrence.php:226
2377
+ msgid "Alert message was not available, this may have been a custom alert that no longer exists. Read more about custom events %1$shere%2$s."
2378
  msgstr ""
2379
 
2380
+ #: classes/Sensors/Content.php:1037, classes/Sensors/Content.php:1045
2381
+ msgid "Public"
 
 
2382
  msgstr ""
2383
 
2384
+ #: classes/Sensors/Content.php:1035, classes/Sensors/Content.php:1043
2385
+ msgid "Private"
2386
  msgstr ""
2387
 
2388
+ #: classes/Sensors/Content.php:1033, classes/Sensors/Content.php:1041
2389
+ msgid "Password Protected"
 
 
2390
  msgstr ""
2391
 
2392
+ #: classes/Sensors/FrontendWooCommerce.php:232, classes/Sensors/Public.php:417
2393
+ msgid "On backorder"
2394
  msgstr ""
2395
 
2396
+ #: classes/Sensors/FrontendWooCommerce.php:230, classes/Sensors/Public.php:415
2397
+ msgid "Out of stock"
2398
  msgstr ""
2399
 
2400
+ #: classes/Sensors/FrontendWooCommerce.php:228, classes/Sensors/Public.php:413
2401
+ msgid "In stock"
2402
  msgstr ""
2403
 
2404
+ #: classes/ThirdPartyExtensions/BBPressExtension.php:29
2405
+ msgid "BBPress"
 
 
2406
  msgstr ""
2407
 
2408
+ #: classes/ThirdPartyExtensions/GravityFormsExtension.php:11, classes/ThirdPartyExtensions/GravityFormsExtension.php:28
2409
+ msgid "Gravity Forms"
2410
  msgstr ""
2411
 
2412
+ #: classes/ThirdPartyExtensions/GravityFormsExtension.php:16
2413
+ msgid "Keep a record of when someone adds, modifies or deletes forms, entries and more in the Gravity Forms plugin."
 
 
2414
  msgstr ""
2415
 
2416
+ #: classes/ThirdPartyExtensions/WooCommerceExtension.php:34, extensions/email-notifications/classes/Notifications.php:179
2417
+ msgid "WooCommerce"
2418
  msgstr ""
2419
 
2420
+ #: classes/ThirdPartyExtensions/WPFormsExtension.php:29
2421
+ msgid "WPForms"
2422
  msgstr ""
2423
 
2424
+ #: classes/ThirdPartyExtensions/YoastSeoExtension.php:29
2425
+ msgid "Yoast SEO"
2426
  msgstr ""
2427
 
2428
+ #. translators: %s: Home URL
2429
+ #: classes/Utilities/Emailer.php:53
2430
+ msgid "WP Activity Log plugin disabled on %s"
2431
  msgstr ""
2432
 
2433
+ #: classes/Utilities/Emailer.php:56
2434
+ msgid "Hello admin,"
2435
  msgstr ""
2436
 
2437
+ #. translators: 1. User display name, 2. Home URL, 3. Date and time
2438
+ #: classes/Utilities/Emailer.php:61
2439
+ msgid "This is a notification to let you know that the user %1$s has deactivated the plugin WP Activity Log on the website %2$s on %3$s."
 
 
2440
  msgstr ""
2441
 
2442
+ #: classes/Utilities/PluginInstallAndActivate.php:82
2443
+ msgid "WP Activity Log can keep a log of changes done on other plugins. Install the relevant extension from the below list to keep a log of changes done on that plugin."
2444
  msgstr ""
2445
 
2446
+ #: classes/Utilities/PluginInstallAndActivate.php:100, classes/Views/SetupWizard.php:887
2447
+ msgid "Extension for "
 
 
 
2448
  msgstr ""
2449
 
2450
+ #: classes/Utilities/PluginInstallAndActivate.php:109, classes/Views/SetupWizard.php:896
2451
+ msgid "Install Extension"
2452
  msgstr ""
2453
 
2454
+ #: classes/Utilities/PluginInstallAndActivate.php:105, classes/Views/SetupWizard.php:892
2455
+ msgid "Extension installed, activate now?"
 
 
2456
  msgstr ""
2457
 
2458
+ #: classes/Utilities/PluginInstallerAction.php:76
2459
+ msgid "Tried to install a zip or slug that was not in the allowed list"
2460
  msgstr ""
2461
 
2462
+ #: classes/Views/AuditLog.php:100
2463
+ msgid "Get instantly alerted of critical changes via SMS & email, search the activity log, generate user reports, see who is logged in and more!"
 
 
2464
  msgstr ""
2465
 
2466
+ #: classes/Views/AuditLog.php:101
2467
+ msgid "Upgrade to premium to unlock these powerful activity log features & more!"
2468
  msgstr ""
2469
 
2470
+ #: classes/Views/AuditLog.php:104
2471
+ msgid "Instant SMS & email alerts, search & filters, reports, users sessions management and much more!"
 
 
2472
  msgstr ""
2473
 
2474
+ #: classes/Views/AuditLog.php:105
2475
+ msgid "Upgrade to premium to get more out of your activity logs!"
2476
  msgstr ""
2477
 
2478
+ #: classes/Views/AuditLog.php:108
2479
+ msgid "See who logged in on your site in real-time, generate reports, get SMS & email alerts of critical changes and more!"
 
 
 
2480
  msgstr ""
2481
 
2482
+ #: classes/Views/AuditLog.php:109
2483
+ msgid "Unlock these and other powerful features with WP Activity Log Premium."
2484
  msgstr ""
2485
 
2486
+ #: classes/Views/AuditLog.php:187
2487
+ msgid "UPGRADE NOW"
 
 
 
2488
  msgstr ""
2489
 
2490
+ #: classes/Views/AuditLog.php:188
2491
+ msgid "Start Free Trial"
2492
  msgstr ""
2493
 
2494
+ #: classes/Views/AuditLog.php:189
2495
+ msgid "Tell me more"
 
 
 
 
2496
  msgstr ""
2497
 
2498
+ #: classes/Views/AuditLog.php:191
2499
+ msgid "Dismiss the banner"
2500
  msgstr ""
2501
 
2502
+ #: classes/Views/AuditLog.php:191
2503
+ msgid "Close"
 
 
 
2504
  msgstr ""
2505
 
2506
+ #: classes/Views/AuditLog.php:216
2507
+ msgid "There are connectivity issues with the database where the WordPress activity log is stored. The logs will be temporary buffered in the WordPress database until the connection is fully restored."
2508
  msgstr ""
2509
 
2510
+ #: classes/Views/AuditLog.php:234
2511
+ msgid "Help WP Activity Log improve."
 
 
 
 
2512
  msgstr ""
2513
 
2514
+ #: classes/Views/AuditLog.php:235
2515
+ msgid "Gathering non-sensitive diagnostic data about the plugin install helps us improve the plugin. When you opt-in, you also subscribe to our announcements (you can opt-out at any time). If you would rather opt-out, we will not collect any data."
2516
  msgstr ""
2517
 
2518
+ #: classes/Views/AuditLog.php:235
2519
+ msgid "Read more about what we collect."
 
 
 
 
2520
  msgstr ""
2521
 
2522
+ #: classes/Views/AuditLog.php:237
2523
+ msgid "Sure, opt-in"
2524
  msgstr ""
2525
 
2526
+ #: classes/Views/AuditLog.php:238
2527
+ msgid "No, thank you"
 
 
 
 
2528
  msgstr ""
2529
 
2530
+ #: classes/Views/AuditLog.php:294
2531
+ msgid "We noticed you have"
2532
  msgstr ""
2533
 
2534
+ #: classes/Views/AuditLog.php:296
2535
+ msgid "installed."
 
 
 
 
2536
  msgstr ""
2537
 
2538
+ #: classes/Views/AuditLog.php:298
2539
+ msgid "Install extension"
2540
  msgstr ""
2541
 
2542
+ #: classes/Views/AuditLog.php:361, classes/Views/Settings.php:92
2543
+ msgid "Activity Log Viewer"
 
 
 
2544
  msgstr ""
2545
 
2546
+ #: classes/Views/AuditLog.php:388
2547
+ msgid "Log Viewer"
2548
  msgstr ""
2549
 
2550
+ #: classes/Views/AuditLog.php:543, classes/Views/Settings.php:326, classes/Views/ToggleAlerts.php:131, extensions/email-notifications/classes/AddNotification.php:246, extensions/email-notifications/classes/AddNotification.php:279, extensions/email-notifications/classes/EditNotification.php:250, extensions/email-notifications/classes/EditNotification.php:258, extensions/email-notifications/classes/EditNotification.php:254, extensions/email-notifications/classes/EditNotification.php:263, extensions/email-notifications/classes/EditNotification.php:291, extensions/external-db/classes/Settings.php:421
2551
+ msgid "You do not have sufficient permissions to access this page."
 
 
 
2552
  msgstr ""
2553
 
2554
+ #: classes/Views/AuditLog.php:592
2555
+ msgid "Thank you for installing WP Activity Log. Do you want to run the wizard to configure the basic plugin settings?"
2556
  msgstr ""
2557
 
2558
+ #: classes/Views/AuditLog.php:594, classes/Views/Settings.php:527, classes/Views/Settings.php:554, classes/Views/Settings.php:620, classes/Views/Settings.php:678, classes/Views/Settings.php:1192, classes/Views/Settings.php:1483, classes/Views/Settings.php:1542, classes/Views/Settings.php:1583, classes/Views/Settings.php:1614, classes/Views/SetupWizard.php:567, classes/Views/SetupWizard.php:615
2559
+ msgid "Yes"
 
 
 
2560
  msgstr ""
2561
 
2562
+ #: classes/Views/AuditLog.php:595, classes/Views/Settings.php:532, classes/Views/Settings.php:559, classes/Views/Settings.php:650, classes/Views/Settings.php:688, classes/Views/Settings.php:1197, classes/Views/Settings.php:1488, classes/Views/Settings.php:1549, classes/Views/Settings.php:1590, classes/Views/Settings.php:1615, classes/Views/SetupWizard.php:572, classes/Views/SetupWizard.php:620
2563
+ msgid "No"
2564
  msgstr ""
2565
 
2566
+ #: classes/Views/AuditLog.php:626
2567
+ msgid "Please enter the number of alerts you would like to see on one page:"
 
 
 
2568
  msgstr ""
2569
 
2570
+ #: classes/Views/AuditLog.php:628
2571
+ msgid "No Results"
2572
  msgstr ""
2573
 
2574
+ #: classes/Views/AuditLog.php:798, classes/Views/AuditLog.php:848, classes/Views/AuditLog.php:905, classes/Views/AuditLog.php:1219, classes/Views/AuditLog.php:1281, classes/Views/AuditLog.php:1334, classes/Views/Settings.php:235, classes/Views/Settings.php:1792, classes/Views/Settings.php:1820, classes/Views/Settings.php:1850, classes/Views/SetupWizard.php:96, extensions/search/search-init.php:450, extensions/search/search-init.php:498, extensions/email-notifications/classes/Notifications.php:492, extensions/external-db/classes/Connections.php:753, extensions/external-db/classes/Connections.php:787, extensions/external-db/classes/Connections.php:980, extensions/external-db/classes/Settings.php:312, extensions/external-db/classes/Settings.php:386, extensions/external-db/classes/Settings.php:1092, extensions/external-db/classes/Settings.php:1367, extensions/external-db/classes/Settings.php:1419, extensions/external-db/classes/Settings.php:1452, extensions/user-sessions/classes/Views.php:521, extensions/reports/classes/Views/Main.php:756
2575
+ msgid "Nonce verification failed."
 
 
 
2576
  msgstr ""
2577
 
2578
+ #: classes/Views/AuditLog.php:816
2579
+ msgid "No users found."
2580
  msgstr ""
2581
 
2582
+ #: classes/Views/AuditLog.php:836
2583
+ msgid "Log file does not exist."
 
 
 
2584
  msgstr ""
2585
 
2586
+ #: classes/Views/AuditLog.php:878
2587
+ msgid "Request to get log file failed."
2588
  msgstr ""
2589
 
2590
+ #: classes/Views/AuditLog.php:952
2591
+ msgid "Freemius opt choice not found."
 
 
 
2592
  msgstr ""
2593
 
2594
+ #: classes/Views/AuditLog.php:945
2595
+ msgid "Freemius opt choice selected."
2596
  msgstr ""
2597
 
2598
+ #. translators: 1 - an opening link tag, 2 - the closing tag.
2599
+ #: classes/Views/AuditLog.php:1040
2600
+ msgid "<br>An error occurred when trying to install and activate the plugin. Please try install it again from the %1$sevent settings%2$s page."
 
 
2601
  msgstr ""
2602
 
2603
+ #: classes/Views/AuditLog.php:1139
2604
+ msgid "WordPress Activity Log"
2605
  msgstr ""
2606
 
2607
+ #: classes/Views/AuditLog.php:1140
2608
+ msgid "When a user makes a change on your website the plugin will keep a record of that event here. Right now there is nothing because this is a new install."
 
 
 
2609
  msgstr ""
2610
 
2611
+ #: classes/Views/AuditLog.php:1141
2612
+ msgid "Thank you for using WP Activity Log"
2613
  msgstr ""
2614
 
2615
+ #: classes/Views/AuditLog.php:1162
2616
+ msgid "Error: You do not have sufficient permissions to exclude this URL."
 
 
 
2617
  msgstr ""
2618
 
2619
+ #: classes/Views/AuditLog.php:1208, classes/Views/AuditLog.php:1318
2620
+ msgid "You do not have sufficient permissions to dismiss this notice."
2621
  msgstr ""
2622
 
2623
+ #: classes/Views/AuditLog.php:1276
2624
+ msgid "Access Denied"
 
 
 
2625
  msgstr ""
2626
 
2627
+ #: classes/Views/EmailNotifications.php:28
2628
+ msgid "Notifications Extension"
2629
  msgstr ""
2630
 
2631
+ #: classes/Views/EmailNotifications.php:42
2632
+ msgid "Notifications &#8682;"
2633
  msgstr ""
2634
 
2635
+ #: classes/Views/EmailNotifications.php:114
2636
+ msgid "SMS & Email Notifications"
 
 
 
2637
  msgstr ""
2638
 
2639
+ #: classes/Views/EmailNotifications.php:115
2640
+ msgid "Get instantly alerted of important changes on your site via SMS and email notifications. Upgrade to premium and:"
2641
  msgstr ""
2642
 
2643
+ #: classes/Views/EmailNotifications.php:118
2644
+ msgid "Configure any type of SMS & email notifications"
 
 
 
2645
  msgstr ""
2646
 
2647
+ #: classes/Views/EmailNotifications.php:119
2648
+ msgid "Receive notifications for when users login, change their password or change content"
2649
  msgstr ""
2650
 
2651
+ #: classes/Views/EmailNotifications.php:120
2652
+ msgid "Get alerted of site changes like plugin installs, theme changes etc"
 
2653
  msgstr ""
2654
 
2655
+ #: classes/Views/EmailNotifications.php:121
2656
+ msgid "Enable built-in security email notifications of suspicious user activity"
2657
  msgstr ""
2658
 
2659
+ #: classes/Views/EmailNotifications.php:122
2660
+ msgid "Personalize all email and SMS templates"
2661
  msgstr ""
2662
 
2663
+ #: classes/Views/EmailNotifications.php:123
2664
+ msgid "Use the trigger builder to configure any type of notification criteria!"
2665
  msgstr ""
2666
 
2667
+ #: classes/Views/EmailNotifications.php:125
2668
+ msgid "Getting started is really easy. You can use one of the plugin’s built-in notifications or create your own using the easy to use trigger builder."
 
 
2669
  msgstr ""
2670
 
2671
+ #: classes/Views/EmailNotifications.php:128
2672
+ msgid "Email and SMS notifications instantly alert you of important changes on your WordPress site."
2673
  msgstr ""
2674
 
2675
+ #: classes/Views/EmailNotifications.php:132
2676
+ msgid "Easily enable any of the built-in security and user management notifications."
 
 
2677
  msgstr ""
2678
 
2679
+ #: classes/Views/EmailNotifications.php:136
2680
+ msgid "Use the trigger builder to configure any type of email and SMS notification to get instantly alerted of site changes that are important to you and your business."
2681
  msgstr ""
2682
 
2683
+ #: classes/Views/EmailNotifications.php:140
2684
+ msgid "All email and SMS templates are configurable, allowing you to personalize them."
 
 
 
2685
  msgstr ""
2686
 
2687
+ #: classes/Views/ExternalDB.php:28
2688
+ msgid "External DB Extension"
2689
  msgstr ""
2690
 
2691
+ #: classes/Views/ExternalDB.php:42
2692
+ msgid "DB & Integrations &#8682;"
2693
  msgstr ""
2694
 
2695
+ #: classes/Views/ExternalDB.php:114
2696
+ msgid "Activity log database & integration tools"
 
 
 
 
2697
  msgstr ""
2698
 
2699
+ #: classes/Views/ExternalDB.php:115
2700
+ msgid "There are several benefits to segregating the logs from the main site database, and to be able to mirror the logs to third party and centralized business solutions. Upgrade to premium and:"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2701
  msgstr ""
2702
 
2703
+ #: classes/Views/ExternalDB.php:118
2704
+ msgid "Store the audit logs of your sites on an external database"
2705
  msgstr ""
2706
 
2707
+ #: classes/Views/ExternalDB.php:119
2708
+ msgid "Configuring archiving and store older log data in a segregated database"
2709
  msgstr ""
2710
 
2711
+ #: classes/Views/ExternalDB.php:120
2712
+ msgid "Mirror the logs to syslog, Slack, Papertrail and central business communication services"
2713
  msgstr ""
2714
 
2715
+ #: classes/Views/ExternalDB.php:121
2716
+ msgid "Configure filters to filter what is mirrored and archived in the databases and services"
2717
  msgstr ""
2718
 
2719
+ #: classes/Views/ExternalDB.php:126
2720
+ msgid "Easily configure integration and database connections thanks to a user friendly wizard."
 
 
2721
  msgstr ""
2722
 
2723
+ #: classes/Views/ExternalDB.php:130
2724
+ msgid "Configure activity log filters for third party services connections."
2725
  msgstr ""
2726
 
2727
+ #: classes/Views/ExternalDB.php:134
2728
+ msgid "Configure an unlimited number of connections to different databases and third party services."
2729
  msgstr ""
2730
 
2731
+ #: classes/Views/Help.php:62, classes/Views/Help.php:104, classes/Views/Help.php:118
2732
+ msgid "Help"
2733
  msgstr ""
2734
 
2735
+ #: classes/Views/Help.php:68, classes/Views/Help.php:232
2736
+ msgid "System Info"
 
 
2737
  msgstr ""
2738
 
2739
+ #: classes/Views/Help.php:177
2740
+ msgid "Getting Started"
2741
  msgstr ""
2742
 
2743
+ #: classes/Views/Help.php:178
2744
+ msgid "Getting started with WP Activity Log is really easy; once the plugin is installed it will automatically keep a log of everything that is happening on your website and you do not need to do anything. Watch the video below for a quick overview of the plugin."
 
 
2745
  msgstr ""
2746
 
2747
+ #: classes/Views/Help.php:182
2748
+ msgid "Plugin Support"
2749
  msgstr ""
2750
 
2751
+ #: classes/Views/Help.php:184
2752
+ msgid "Have you encountered or noticed any issues while using WP Activity Log plugin?"
 
 
2753
  msgstr ""
2754
 
2755
+ #: classes/Views/Help.php:185
2756
+ msgid "Or you want to report something to us? Click any of the options below to post on the plugin's forum or contact our support directly."
2757
  msgstr ""
2758
 
2759
+ #: classes/Views/Help.php:187
2760
+ msgid "Free Support Forum"
 
 
2761
  msgstr ""
2762
 
2763
+ #: classes/Views/Help.php:189
2764
+ msgid "Free Support Email"
2765
  msgstr ""
2766
 
2767
+ #: classes/Views/Help.php:193
2768
+ msgid "Plugin Documentation"
2769
  msgstr ""
2770
 
2771
+ #: classes/Views/Help.php:195
2772
+ msgid "For more technical information about the WP Activity Log plugin please visit the plugin’s knowledge base."
2773
  msgstr ""
2774
 
2775
+ #: classes/Views/Help.php:196
2776
+ msgid "Refer to the list of WordPress security events for a complete list of Events and IDs that the plugin uses to keep a log of all the changes in the WordPress activity log."
 
 
2777
  msgstr ""
2778
 
2779
+ #: classes/Views/Help.php:198
2780
+ msgid "Plugin Website"
2781
  msgstr ""
2782
 
2783
+ #: classes/Views/Help.php:200
2784
+ msgid "Knowledge Base"
 
 
2785
  msgstr ""
2786
 
2787
+ #: classes/Views/Help.php:202
2788
+ msgid "List of activity logs event IDs"
2789
  msgstr ""
2790
 
2791
+ #: classes/Views/Help.php:206
2792
+ msgid "Rate WP Activity Log"
 
 
2793
  msgstr ""
2794
 
2795
+ #: classes/Views/Help.php:208
2796
+ msgid "We work really hard to deliver a plugin that enables you to keep a record of all the changes that are happening on your WordPress."
2797
  msgstr ""
2798
 
2799
+ #: classes/Views/Help.php:209
2800
+ msgid "It takes thousands of man-hours every year and endless amount of dedication to research, develop and maintain the free edition of WP Activity Log."
 
 
2801
  msgstr ""
2802
 
2803
+ #: classes/Views/Help.php:210
2804
+ msgid "Therefore if you like what you see, and find WP Activity Log useful we ask you nothing more than to please rate our plugin."
2805
  msgstr ""
2806
 
2807
+ #: classes/Views/Help.php:211
2808
+ msgid "We appreciate every star!"
 
 
2809
  msgstr ""
2810
 
2811
+ #: classes/Views/Help.php:221
2812
+ msgid "Rate Plugin"
2813
  msgstr ""
2814
 
2815
+ #: classes/Views/Help.php:250
2816
+ msgid "Enforce strong password policies on WordPress"
 
 
2817
  msgstr ""
2818
 
2819
+ #: classes/Views/Help.php:256
2820
+ msgid "Automatically identify unauthorized file changes on WordPress"
2821
  msgstr ""
2822
 
2823
+ #: classes/Views/Help.php:262
2824
+ msgid "Add an extra layer of security to your login pages with 2FA & require your users to use it."
 
 
2825
  msgstr ""
2826
 
2827
+ #: classes/Views/Help.php:268
2828
+ msgid "See the child sites activity logs from the central MainWP dashboard"
2829
  msgstr ""
2830
 
2831
+ #: classes/Views/Help.php:274
2832
+ msgid "Our other WordPress plugins"
 
 
2833
  msgstr ""
2834
 
2835
+ #: classes/Views/Help.php:285
2836
+ msgid "LEARN MORE"
2837
  msgstr ""
2838
 
2839
+ #: classes/Views/LogInUsers.php:28
2840
+ msgid "User Sessions Management Extension"
 
 
2841
  msgstr ""
2842
 
2843
+ #: classes/Views/LogInUsers.php:42
2844
+ msgid "Logged In Users &#8682;"
2845
  msgstr ""
2846
 
2847
+ #: classes/Views/LogInUsers.php:114
2848
+ msgid "Real-Time Users Sessions Management"
 
 
 
2849
  msgstr ""
2850
 
2851
+ #: classes/Views/LogInUsers.php:115
2852
+ msgid "Better manage your users’ logins and sessions. Upgrade to premium and:"
2853
  msgstr ""
2854
 
2855
+ #: classes/Views/LogInUsers.php:119
2856
+ msgid "See who is logged in to your site"
 
 
2857
  msgstr ""
2858
 
2859
+ #: classes/Views/LogInUsers.php:120
2860
+ msgid "When they logged in and from where"
2861
  msgstr ""
2862
 
2863
+ #: classes/Views/LogInUsers.php:121
2864
+ msgid "The last change they have done in real-time"
 
 
2865
  msgstr ""
2866
 
2867
+ #: classes/Views/LogInUsers.php:122
2868
+ msgid "Terminate any users’ session with a click of a button"
2869
  msgstr ""
2870
 
2871
+ #: classes/Views/LogInUsers.php:123
2872
+ msgid "Limit or block multiple sessions for the same user"
 
 
2873
  msgstr ""
2874
 
2875
+ #: classes/Views/LogInUsers.php:124
2876
+ msgid "Get alerted of multiple same user sessions"
2877
  msgstr ""
2878
 
2879
+ #: classes/Views/LogInUsers.php:128
2880
+ msgid "See who is logged in to your WordPress site and multisite network in real-time."
 
 
2881
  msgstr ""
2882
 
2883
+ #: classes/Views/LogInUsers.php:132
2884
+ msgid "Limit, manage and block multiple same user sessions easily."
2885
  msgstr ""
2886
 
2887
+ #: classes/Views/Reports.php:28
2888
+ msgid "Reports Extension"
 
 
2889
  msgstr ""
2890
 
2891
+ #: classes/Views/Reports.php:42
2892
+ msgid "Reports &#8682;"
2893
  msgstr ""
2894
 
2895
+ #: classes/Views/Reports.php:114
2896
+ msgid "Individual, Scheduled & Automated Reports"
 
 
2897
  msgstr ""
2898
 
2899
+ #: classes/Views/Reports.php:115
2900
+ msgid "Many are not fans of reports, however reports are vital in business. With them you can make informed decisions that allow you to improve user productivity and the business. Upgrade to Premium so you can:"
2901
  msgstr ""
2902
 
2903
+ #: classes/Views/Reports.php:118
2904
+ msgid "Generate any type of user and site (in multisite) activity report"
 
 
2905
  msgstr ""
2906
 
2907
+ #: classes/Views/Reports.php:119
2908
+ msgid "Automate and schedule daily, weekly, monthly and quarterly reports"
2909
  msgstr ""
2910
 
2911
+ #: classes/Views/Reports.php:120
2912
+ msgid "Received reports automatically via email"
 
 
2913
  msgstr ""
2914
 
2915
+ #: classes/Views/Reports.php:121
2916
+ msgid "Create statistics reports about users’ views, logins, activity from IP addresses & more"
2917
  msgstr ""
2918
 
2919
+ #: classes/Views/Reports.php:123
2920
+ msgid "Reports are vital to the success of your business and management of your site."
 
 
2921
  msgstr ""
2922
 
2923
+ #: classes/Views/Reports.php:126
2924
+ msgid "Generate a HTML or CSV report."
2925
  msgstr ""
2926
 
2927
+ #: classes/Views/Reports.php:130
2928
+ msgid "Easily configure a criteria for your reports."
 
 
2929
  msgstr ""
2930
 
2931
+ #: classes/Views/Reports.php:134
2932
+ msgid "Schedule reports that are sent to you by email automatically."
2933
  msgstr ""
2934
 
2935
+ #: classes/Views/Search.php:28
2936
+ msgid "Search Extension"
2937
  msgstr ""
2938
 
2939
+ #: classes/Views/Search.php:42
2940
+ msgid "Search &#8682;"
2941
  msgstr ""
2942
 
2943
+ #: classes/Views/Search.php:114
2944
+ msgid "Search & Filters for the Activity Log"
2945
  msgstr ""
2946
 
2947
+ #: classes/Views/Search.php:115
2948
+ msgid "You can find all the information you want in the activity log, if you know what you are looking for and have the right tools. Upgrade to premium so you can:"
2949
  msgstr ""
2950
 
2951
+ #: classes/Views/Search.php:118
2952
+ msgid "Do text searches and use filters to fine tune the search results"
 
2953
  msgstr ""
2954
 
2955
+ #: classes/Views/Search.php:119
2956
+ msgid "Easily find when and who did a specific change on your site"
2957
  msgstr ""
2958
 
2959
+ #: classes/Views/Search.php:120
2960
+ msgid "Easily identify and track back suspicious user behaviour"
 
 
2961
  msgstr ""
2962
 
2963
+ #: classes/Views/Search.php:121
2964
+ msgid "Search for the cause of a problem and ease troubleshooting"
2965
  msgstr ""
2966
 
2967
+ #: classes/Views/Search.php:122
2968
+ msgid "Save search terms and filters for future use and improved productivity"
 
2969
  msgstr ""
2970
 
2971
+ #: classes/Views/Search.php:127
2972
+ msgid "Use the text search to find a specific change."
2973
  msgstr ""
2974
 
2975
+ #: classes/Views/Search.php:131
2976
+ msgid "Configure any filter you need to fine tune the search results and find what you are looking for with much less effort."
 
 
2977
  msgstr ""
2978
 
2979
+ #: classes/Views/Search.php:135
2980
+ msgid "Save search terms and filters to run the searches again in the future with just a single click."
2981
  msgstr ""
2982
 
2983
+ #: classes/Views/Settings.php:85
2984
+ msgid "General"
 
2985
  msgstr ""
2986
 
2987
+ #: classes/Views/Settings.php:99
2988
+ msgid "File Changes"
2989
  msgstr ""
2990
 
2991
+ #: classes/Views/Settings.php:105
2992
+ msgid "Exclude Objects"
2993
  msgstr ""
2994
 
2995
+ #: classes/Views/Settings.php:112
2996
+ msgid "Advanced Settings"
2997
  msgstr ""
2998
 
2999
+ #: classes/Views/Settings.php:161, classes/Views/Settings.php:175, extensions/email-notifications/classes/SMSProviderSettings.php:143
3000
+ msgid "Settings"
3001
  msgstr ""
3002
 
3003
+ #: classes/Views/Settings.php:202
3004
+ msgid "Current user is not allowed to save settings."
3005
  msgstr ""
3006
 
3007
+ #: classes/Views/Settings.php:208
3008
+ msgid "Unknown settings tab."
3009
  msgstr ""
3010
 
3011
+ #: classes/Views/Settings.php:220, classes/Views/Settings.php:1880, classes/Views/Settings.php:1903, classes/Views/SetupWizard.php:83, extensions/email-notifications/classes/Notifications.php:117, extensions/external-db/classes/Connections.php:738, extensions/external-db/classes/Connections.php:772, extensions/external-db/classes/Connections.php:970, extensions/external-db/classes/Settings.php:282, extensions/external-db/classes/Settings.php:373, extensions/external-db/classes/Settings.php:1079, extensions/external-db/classes/Settings.php:1320, extensions/external-db/classes/Settings.php:1384, extensions/external-db/classes/Settings.php:1436
3012
+ msgid "Access Denied."
3013
  msgstr ""
3014
 
3015
+ #: classes/Views/Settings.php:245, classes/Views/SetupWizard.php:106
3016
+ msgid "Invalid input."
 
 
3017
  msgstr ""
3018
 
3019
+ #: classes/Views/Settings.php:342, classes/Views/ToggleAlerts.php:148, extensions/external-db/classes/Settings.php:432
3020
+ msgid "Settings have been saved."
3021
  msgstr ""
3022
 
3023
+ #: classes/Views/Settings.php:338
3024
+ msgid "Message sent successfully."
 
 
3025
  msgstr ""
3026
 
3027
+ #: classes/Views/Settings.php:348, classes/Views/ToggleAlerts.php:154, extensions/external-db/classes/Settings.php:437, extensions/user-sessions/classes/View/Sessions.php:164
3028
+ msgid "Error: "
3029
  msgstr ""
3030
 
3031
+ #: classes/Views/Settings.php:366
3032
+ msgid "No data is old enough to be purged."
 
 
3033
  msgstr ""
3034
 
3035
+ #: classes/Views/Settings.php:360
3036
+ msgid "Old data successfully purged."
3037
  msgstr ""
3038
 
3039
+ #: classes/Views/Settings.php:397
3040
+ msgid "Send Message"
 
 
3041
  msgstr ""
3042
 
3043
+ #: classes/Views/Settings.php:448
3044
+ msgid "Use infinite scroll or pagination for the event viewer?"
3045
  msgstr ""
3046
 
3047
+ #. translators: Learn more link.
3048
+ #: classes/Views/Settings.php:453
3049
+ msgid "When using infinite scroll the event viewer and search results %s load up much faster and require less resources."
 
3050
  msgstr ""
3051
 
3052
+ #: classes/Views/Settings.php:454
3053
+ msgid "(Premium feature)"
3054
  msgstr ""
3055
 
3056
+ #: classes/Views/Settings.php:461
3057
+ msgid "Select event viewer view type:"
 
 
3058
  msgstr ""
3059
 
3060
+ #: classes/Views/Settings.php:466
3061
+ msgid "Infinite Scroll (Recommended)"
3062
  msgstr ""
3063
 
3064
+ #: classes/Views/Settings.php:471
3065
+ msgid "Pagination"
 
 
3066
  msgstr ""
3067
 
3068
+ #: classes/Views/Settings.php:482
3069
+ msgid "Do you want the activity log viewer to auto refresh?"
3070
  msgstr ""
3071
 
3072
+ #: classes/Views/Settings.php:483
3073
+ msgid "The activity log viewer auto refreshes every 30 seconds when opened so you can see the latest events as they happen almost in real time."
 
 
3074
  msgstr ""
3075
 
3076
+ #: classes/Views/Settings.php:487
3077
+ msgid "Refresh activity log viewer"
3078
  msgstr ""
3079
 
3080
+ #: classes/Views/Settings.php:493
3081
+ msgid "Auto refresh"
 
 
3082
  msgstr ""
3083
 
3084
+ #: classes/Views/Settings.php:498
3085
+ msgid "Do not auto refresh"
3086
  msgstr ""
3087
 
3088
+ #: classes/Views/Settings.php:508
3089
+ msgid "Display latest events widget in Dashboard & Admin bar"
 
 
3090
  msgstr ""
3091
 
3092
+ #. translators: Max number of dashboard widget alerts.
3093
+ #: classes/Views/Settings.php:513
3094
+ msgid "The events widget displays the latest %d security events in the dashboard and the admin bar notification displays the latest event."
3095
  msgstr ""
3096
 
3097
+ #: classes/Views/Settings.php:521
3098
+ msgid "Dashboard Widget"
 
 
3099
  msgstr ""
3100
 
3101
+ #: classes/Views/Settings.php:542
3102
+ msgid "Admin Bar Notification"
3103
  msgstr ""
3104
 
3105
+ #: classes/Views/Settings.php:545
3106
+ msgid "Admin Bar Notification (Premium)"
 
 
3107
  msgstr ""
3108
 
3109
+ #: classes/Views/Settings.php:569
3110
+ msgid "Admin Bar Notification Updates"
3111
  msgstr ""
3112
 
3113
+ #: classes/Views/Settings.php:572
3114
+ msgid "Admin Bar Notification Updates (Premium)"
 
3115
  msgstr ""
3116
 
3117
+ #: classes/Views/Settings.php:581
3118
+ msgid "Update in near real time"
3119
  msgstr ""
3120
 
3121
+ #: classes/Views/Settings.php:586
3122
+ msgid "Update only on page refreshes"
 
3123
  msgstr ""
3124
 
3125
+ #: classes/Views/Settings.php:596
3126
+ msgid "Add user notification on the WordPress login page"
3127
  msgstr ""
3128
 
3129
+ #: classes/Views/Settings.php:597
3130
+ msgid "Many compliance regulations (such as the GDPR) require website administrators to tell the users of their website that all the changes they do when logged in are being logged."
3131
  msgstr ""
3132
 
3133
+ #: classes/Views/Settings.php:601
3134
+ msgid "Login Page Notification"
3135
  msgstr ""
3136
 
3137
+ #: classes/Views/Settings.php:626
3138
+ msgid "For security and auditing purposes, a record of all of your logged-in actions and changes within the WordPress dashboard will be recorded in an activity log with the <a href=\"https://wpactivitylog.com/?utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=settings+pages\" target=\"_blank\">WP Activity Log plugin</a>. The audit log also includes the IP address where you accessed this site from."
 
3139
  msgstr ""
3140
 
3141
+ #: classes/Views/Settings.php:644
3142
+ msgid "<strong>Note: </strong>"
3143
  msgstr ""
3144
 
3145
+ #: classes/Views/Settings.php:644
3146
+ msgid "The only HTML code allowed in the login page notification is for links ( < a href >< /a > )."
3147
  msgstr ""
3148
 
3149
+ #: classes/Views/Settings.php:660
3150
+ msgid "Is your website running behind a firewall or reverse proxy?"
3151
  msgstr ""
3152
 
3153
+ #. translators: Learn more link.
3154
+ #: classes/Views/Settings.php:665
3155
+ msgid "If your website is running behind a firewall set this option to yes so the plugin retrieves the end user’s IP address from the proxy header - %s."
3156
  msgstr ""
3157
 
3158
+ #: classes/Views/Settings.php:666, classes/Views/Settings.php:712, classes/Views/Settings.php:767
3159
+ msgid "learn more"
3160
  msgstr ""
3161
 
3162
+ #: classes/Views/Settings.php:673
3163
+ msgid "Reverse Proxy / Firewall Options"
 
3164
  msgstr ""
3165
 
3166
+ #: classes/Views/Settings.php:683
3167
+ msgid "Filter internal IP addresses from the proxy headers. Enable this option only if you are are still seeing the internal IP addresses of the firewall or proxy."
3168
  msgstr ""
3169
 
3170
+ #: classes/Views/Settings.php:699
3171
+ msgid "Who can change the plugin settings?"
 
3172
  msgstr ""
3173
 
3174
+ #. translators: Learn more link.
3175
+ #: classes/Views/Settings.php:711
3176
+ msgid "By default only users with administrator role (single site) and super administrator role (multisite) can change the settings of the plugin. Though you can restrict the privileges to just your user - %s."
3177
  msgstr ""
3178
 
3179
+ #: classes/Views/Settings.php:722
3180
+ msgid "Restrict plugin access"
3181
  msgstr ""
3182
 
3183
+ #: classes/Views/Settings.php:727, classes/Views/Settings.php:782
3184
+ msgid "Only me"
3185
+ msgstr ""
3186
+
3187
+ #: classes/Views/Settings.php:736
3188
+ msgid "All administrators"
3189
  msgstr ""
3190
 
3191
+ #: classes/Views/Settings.php:734
3192
+ msgid "All superadmins"
3193
  msgstr ""
3194
 
3195
+ #: classes/Views/Settings.php:749
3196
+ msgid "Allow other users to view the activity log"
3197
  msgstr ""
3198
 
3199
+ #: classes/Views/Settings.php:763
3200
+ msgid "By default only users with administrator role can view the WordPress activity log. To allow someone who does not have an admin role to view the activity log, specify them in the below setting."
3201
  msgstr ""
3202
 
3203
+ #: classes/Views/Settings.php:761
3204
+ msgid "By default only super administrators and the child sites' administrators can view the WordPress activity log. Though you can change this by using the setting below."
3205
  msgstr ""
3206
 
3207
+ #: classes/Views/Settings.php:776, classes/Views/Settings.php:806
3208
+ msgid "Can view events"
3209
  msgstr ""
3210
 
3211
+ #: classes/Views/Settings.php:783
3212
+ msgid "Super administators only"
3213
  msgstr ""
3214
 
3215
+ #: classes/Views/Settings.php:784
3216
+ msgid "Super administators and site administrators"
3217
  msgstr ""
3218
 
3219
+ #: classes/Views/Settings.php:800
3220
+ msgid "To allow someone who does not have an admin role to view the activity log, specify them in the below setting."
3221
  msgstr ""
3222
 
3223
+ #: classes/Views/Settings.php:806
3224
+ msgid "Can also view events"
 
 
 
3225
  msgstr ""
3226
 
3227
+ #: classes/Views/Settings.php:815
3228
+ msgid "Specify the username or the users which do not have an admin role but can also see the WordPress activity role. You can also specify roles."
3229
  msgstr ""
3230
 
3231
+ #: classes/Views/Settings.php:841
3232
+ msgid "Which email address should the plugin use as a from address?"
3233
  msgstr ""
3234
 
3235
+ #: classes/Views/Settings.php:842
3236
+ msgid "By default when the plugin sends an email notification it uses the email address specified in this website’s general settings. Though you can change the email address and display name from this section."
 
 
 
3237
  msgstr ""
3238
 
3239
+ #: classes/Views/Settings.php:846
3240
+ msgid "From Email & Name"
3241
  msgstr ""
3242
 
3243
+ #: classes/Views/Settings.php:852
3244
+ msgid "Use the email address from the WordPress general settings"
 
 
3245
  msgstr ""
3246
 
3247
+ #: classes/Views/Settings.php:857
3248
+ msgid "Use another email address"
3249
  msgstr ""
3250
 
3251
+ #: classes/Views/Settings.php:861
3252
+ msgid "Email Address"
 
 
 
 
3253
  msgstr ""
3254
 
3255
+ #: classes/Views/Settings.php:866
3256
+ msgid "Display Name"
3257
  msgstr ""
3258
 
3259
+ #: classes/Views/Settings.php:877
3260
+ msgid "Do you want to hide the plugin from the list of installed plugins?"
 
 
 
3261
  msgstr ""
3262
 
3263
+ #: classes/Views/Settings.php:878
3264
+ msgid "By default all installed plugins are listed in the plugins page. If you do not want other administrators to see that you installed this plugin set this option to Yes so the WP Activity Log is not listed as an installed plugin on this website."
3265
  msgstr ""
3266
 
3267
+ #: classes/Views/Settings.php:882
3268
+ msgid "Hide Plugin in Plugins Page"
 
 
 
 
3269
  msgstr ""
3270
 
3271
+ #: classes/Views/Settings.php:887
3272
+ msgid "Yes, hide the plugin from the list of installed plugins"
3273
  msgstr ""
3274
 
3275
+ #: classes/Views/Settings.php:892
3276
+ msgid "No, do not hide the plugin"
 
 
 
3277
  msgstr ""
3278
 
3279
+ #: classes/Views/Settings.php:958
3280
+ msgid "For how long do you want to keep the activity log events (Retention settings) ?"
3281
  msgstr ""
3282
 
3283
+ #: classes/Views/Settings.php:961
3284
+ msgid "The plugin uses an efficient way to store the activity log data in the WordPress database, though the more data you keep the more disk space will be required. "
 
 
 
3285
  msgstr ""
3286
 
3287
+ #: classes/Views/Settings.php:962
3288
+ msgid "<a href=\"https://wpactivitylog.com/pricing/?utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=settings+pages\" target=\"_blank\">Upgrade to Premium</a> to store the activity log data in an external database."
3289
  msgstr ""
3290
 
3291
+ #: classes/Views/Settings.php:983
3292
+ msgid "Activity log retention"
 
 
 
 
 
3293
  msgstr ""
3294
 
3295
+ #: classes/Views/Settings.php:989
3296
+ msgid "Keep all data"
3297
  msgstr ""
3298
 
3299
+ #: classes/Views/Settings.php:1016, extensions/external-db/classes/Settings.php:754
3300
+ msgid "Delete events older than"
 
 
 
 
3301
  msgstr ""
3302
 
3303
+ #: classes/Views/Settings.php:1023, extensions/external-db/classes/Settings.php:760
3304
+ msgid "Months"
3305
  msgstr ""
3306
 
3307
+ #: classes/Views/Settings.php:1024, extensions/external-db/classes/Settings.php:761
3308
+ msgid "Years"
 
 
 
3309
  msgstr ""
3310
 
3311
+ #: classes/Views/Settings.php:1032
3312
+ msgid "The next scheduled purging of activity log data that is older than "
3313
  msgstr ""
3314
 
3315
+ #: classes/Views/Settings.php:1039
3316
+ msgid "You can run the purging process now by clicking the button below."
 
 
 
3317
  msgstr ""
3318
 
3319
+ #: classes/Views/Settings.php:1043
3320
+ msgid "Purge Old Data"
3321
  msgstr ""
3322
 
3323
+ #: classes/Views/Settings.php:976
3324
+ msgid "Retention settings moved to %1$s archiving settings %2$s because archiving is enabled"
 
 
 
 
3325
  msgstr ""
3326
 
3327
+ #: classes/Views/Settings.php:1054
3328
+ msgid "What timestamp you would like to see in the WordPress activity log?"
3329
  msgstr ""
3330
 
3331
+ #: classes/Views/Settings.php:1055
3332
+ msgid "Note that the WordPress' timezone might be different from that configured on the server so when you switch from UTC to WordPress timezone or vice versa you might notice a big difference."
 
 
 
 
3333
  msgstr ""
3334
 
3335
+ #: classes/Views/Settings.php:1059
3336
+ msgid "Events Timestamp"
3337
  msgstr ""
3338
 
3339
+ #: classes/Views/Settings.php:1079
3340
+ msgid "UTC"
3341
  msgstr ""
3342
 
3343
+ #: classes/Views/Settings.php:1085
3344
+ msgid "Timezone configured on this WordPress website"
 
 
3345
  msgstr ""
3346
 
3347
+ #: classes/Views/Settings.php:1092
3348
+ msgid "Show Milliseconds"
3349
  msgstr ""
3350
 
3351
+ #: classes/Views/Settings.php:1099
3352
+ msgid "Show Milliseconds in list view"
 
 
3353
  msgstr ""
3354
 
3355
+ #: classes/Views/Settings.php:1109
3356
+ msgid "What user information should be displayed in the WordPress activity log?"
3357
  msgstr ""
3358
 
3359
+ #: classes/Views/Settings.php:1110
3360
+ msgid "Usernames might not be the same as a user's first and last name so it can be difficult to recognize whose user was that did a change. When there is no first & last name or public display name configured the plugin will revert back to the WordPress username."
 
 
 
3361
  msgstr ""
3362
 
3363
+ #: classes/Views/Settings.php:1114
3364
+ msgid "User information in Activity log"
3365
  msgstr ""
3366
 
3367
+ #: classes/Views/Settings.php:1120
3368
+ msgid "WordPress username"
 
 
 
3369
  msgstr ""
3370
 
3371
+ #: classes/Views/Settings.php:1125
3372
+ msgid "First name & last name"
3373
  msgstr ""
3374
 
3375
+ #: classes/Views/Settings.php:1130
3376
+ msgid "Configured public display name"
 
 
 
3377
  msgstr ""
3378
 
3379
+ #: classes/Views/Settings.php:1140
3380
+ msgid "Select the columns to be displayed in the WordPress activity log"
3381
  msgstr ""
3382
 
3383
+ #: classes/Views/Settings.php:1141
3384
+ msgid "When you deselect a column it won’t be shown in the activity log viewer in both views. The data will still be recorded by the plugin."
3385
  msgstr ""
3386
 
3387
+ #: classes/Views/Settings.php:1145
3388
+ msgid "Activity log columns selection"
 
3389
  msgstr ""
3390
 
3391
+ #: classes/Views/Settings.php:1164
3392
+ msgid "Info (used in Grid view mode only)"
3393
  msgstr ""
3394
 
3395
+ #: classes/Views/Settings.php:1162
3396
+ msgid "Source IP Address"
3397
  msgstr ""
3398
 
3399
+ #: classes/Views/Settings.php:1158
3400
+ msgid "Date & Time"
3401
  msgstr ""
3402
 
3403
+ #: classes/Views/Settings.php:1154, extensions/email-notifications/classes/Common.php:1115, extensions/email-notifications/classes/Common.php:1149, extensions/email-notifications/classes/Common.php:1176, extensions/search/classes/Filters/AlertFilter.php:26, extensions/search/classes/Filters/AlertFilter.php:51
3404
+ msgid "Event ID"
3405
  msgstr ""
3406
 
3407
+ #: classes/Views/Settings.php:1180
3408
+ msgid "Do you want to keep a log of WordPress background activity?"
3409
  msgstr ""
3410
 
3411
+ #: classes/Views/Settings.php:1182
3412
+ msgid "WordPress does a lot of things in the background that you do not necessarily need to know about, such as; deletion of post revisions, deletion of auto saved drafts etc. By default the plugin does not report them since there might be a lot and are irrelevant to the user."
3413
  msgstr ""
3414
 
3415
+ #: classes/Views/Settings.php:1187
3416
+ msgid "Enable Events for WordPress Background Activity"
 
 
3417
  msgstr ""
3418
 
3419
+ #: classes/Views/Settings.php:1262
3420
+ msgid "Configure how often file changes scan run and other settings from the"
3421
  msgstr ""
3422
 
3423
+ #: classes/Views/Settings.php:1262
3424
+ msgid "Website File Changes plugin settings"
 
 
3425
  msgstr ""
3426
 
3427
+ #: classes/Views/Settings.php:1246, classes/Views/ToggleAlerts.php:556
3428
+ msgid "Website File Changes Monitor"
3429
  msgstr ""
3430
 
3431
+ #: classes/Views/Settings.php:1247, classes/Views/ToggleAlerts.php:557
3432
+ msgid "To keep a log of file changes please install Website File Changes Monitor, a plugin which is also developed by us."
 
 
3433
  msgstr ""
3434
 
3435
+ #: classes/Views/Settings.php:1248, classes/Views/ToggleAlerts.php:558
3436
+ msgid "Install plugin now"
3437
  msgstr ""
3438
 
3439
+ #: classes/Views/Settings.php:1248, classes/Views/ToggleAlerts.php:558
3440
+ msgid "Learn More"
 
 
 
3441
  msgstr ""
3442
 
3443
+ #: classes/Views/Settings.php:1277
3444
+ msgid "By default the plugin keeps a log of all user changes done on your WordPress website. Use the setting below to exclude any objects from the activity log. When an object is excluded from the activity log, any event in which that object is referred will not be logged in the activity log."
3445
  msgstr ""
3446
 
3447
+ #: classes/Views/Settings.php:1281
3448
+ msgid "Exclude Users:"
 
 
3449
  msgstr ""
3450
 
3451
+ #: classes/Views/Settings.php:1302
3452
+ msgid "Exclude Roles:"
3453
  msgstr ""
3454
 
3455
+ #: classes/Views/Settings.php:1323
3456
+ msgid "Exclude IP Address(es):"
3457
  msgstr ""
3458
 
3459
+ #: classes/Views/Settings.php:1339
3460
+ msgid "You can exclude an individual IP address or a range of IP addresses. To exclude a range use the following format: [first IP]-[last octet of the last IP]. Example: 172.16.180.6-127."
3461
  msgstr ""
3462
 
3463
+ #: classes/Views/Settings.php:1345
3464
+ msgid "Exclude Post Type:"
3465
  msgstr ""
3466
 
3467
+ #: classes/Views/Settings.php:1361
3468
+ msgid "WordPress has the post and page post types by default though your website might use more post types (custom post types). You can exclude all post types, including the default WordPress ones."
 
 
3469
  msgstr ""
3470
 
3471
+ #: classes/Views/Settings.php:1367
3472
+ msgid "Exclude Custom Fields:"
3473
  msgstr ""
3474
 
3475
+ #: classes/Views/Settings.php:1383
3476
+ msgid "You can use the * wildcard to exclude multiple matching custom fields. For example to exclude all custom fields starting with wp123 enter wp123*"
 
 
3477
  msgstr ""
3478
 
3479
+ #: classes/Views/Settings.php:1389
3480
+ msgid "Exclude Non-Existing URLs:"
3481
  msgstr ""
3482
 
3483
+ #: classes/Views/Settings.php:1405
3484
+ msgid "Add the non existing URLs for which you do not want to be alerted of HTTP 404 errors in the activity log by specifying the complete URL. Examples below:"
3485
  msgstr ""
3486
 
3487
+ #: classes/Views/Settings.php:1405
3488
+ msgid "File: "
 
 
3489
  msgstr ""
3490
 
3491
+ #: classes/Views/Settings.php:1405
3492
+ msgid "Directory: "
3493
  msgstr ""
3494
 
3495
+ #: classes/Views/Settings.php:1437
3496
+ msgid "These settings are for advanced users."
 
 
3497
  msgstr ""
3498
 
3499
+ #: classes/Views/Settings.php:1438
3500
+ msgid "If you have any questions <a href=\"https://wpactivitylog.com/contact/?utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=settings+pages\" target=\"_blank\">contact us</a>."
3501
  msgstr ""
3502
 
3503
+ #: classes/Views/Settings.php:1441
3504
+ msgid "Where do you want the plugin's working directory for log files, reports and other files?"
 
 
3505
  msgstr ""
3506
 
3507
+ #: classes/Views/Settings.php:1442
3508
+ msgid "The plugin stores the reports it generates, a number of log files ( for example to keep a log of 404 errors), and the request log in this working directory. By default the directory is in the default WordPress uploads directory. Use the below setting to create the working directory in a different location. Note that the plugin requires write permissions to this directory. Please specify the relative path of the directory."
3509
  msgstr ""
3510
 
3511
+ #: classes/Views/Settings.php:1447
3512
+ msgid "Working directory location"
 
 
3513
  msgstr ""
3514
 
3515
+ #: classes/Views/Settings.php:1470
3516
+ msgid "Troubleshooting setting: Keep a debug log of all the requests this website receives"
3517
  msgstr ""
3518
 
3519
+ #: classes/Views/Settings.php:1471
3520
+ msgid "Only enable the request log on testing, staging and development website. Never enable logging on a live website unless instructed to do so. Enabling request logging on a live website may degrade the performance of the website."
3521
  msgstr ""
3522
 
3523
+ #: classes/Views/Settings.php:1475
3524
+ msgid "Request Log"
3525
  msgstr ""
3526
 
3527
+ #: classes/Views/Settings.php:1505
3528
+ msgid "Reset plugin settings to default"
3529
  msgstr ""
3530
 
3531
+ #: classes/Views/Settings.php:1506
3532
+ msgid "Use this button to <em>factory reset</em> the plugin. This means that all the configured settings will be reset to default and all email notifications, scheduled reports, external database / third party services connections, archiving and mirroring rule will be deleted. NOTE: the activity log data will not be purged. Use the setting below to purge the activity log."
 
 
3533
  msgstr ""
3534
 
3535
+ #: classes/Views/Settings.php:1510
3536
+ msgid "Reset Settings"
3537
  msgstr ""
3538
 
3539
+ #: classes/Views/Settings.php:1512
3540
+ msgid "RESET"
 
 
3541
  msgstr ""
3542
 
3543
+ #: classes/Views/Settings.php:1518
3544
+ msgid "Purge the WordPress activity log"
3545
  msgstr ""
3546
 
3547
+ #: classes/Views/Settings.php:1519
3548
+ msgid "Click the Purge button below to delete all the data from the WordPress activity log and start afresh."
3549
  msgstr ""
3550
 
3551
+ #: classes/Views/Settings.php:1523
3552
+ msgid "Purge Activity Log"
 
 
3553
  msgstr ""
3554
 
3555
+ #: classes/Views/Settings.php:1525
3556
+ msgid "PURGE"
3557
  msgstr ""
3558
 
3559
+ #: classes/Views/Settings.php:1532
3560
+ msgid "MainWP Child Site Stealth Mode"
 
 
3561
  msgstr ""
3562
 
3563
+ #: classes/Views/Settings.php:1533
3564
+ msgid "This option is enabled automatically when the plugin detects the MainWP Child plugin on the site. When this setting is enabled plugin access is restricted to the administrator who installs the plugin, the plugin is not shown in the list of installed plugins and no admin notifications are shown. Disable this option to change the plugin to the default setup."
3565
  msgstr ""
3566
 
3567
+ #: classes/Views/Settings.php:1537
3568
+ msgid "Enable MainWP Child Site Stealth Mode"
 
 
3569
  msgstr ""
3570
 
3571
+ #: classes/Views/Settings.php:1557
3572
+ msgid "Admin blocking plugins support"
3573
  msgstr ""
3574
 
3575
+ #: classes/Views/Settings.php:1562
3576
+ msgid "Enable early plugin loading on sites that use admin blocking plugins"
 
 
3577
  msgstr ""
3578
 
3579
+ #: classes/Views/Settings.php:1571
3580
+ msgid "Do you want to delete the plugin data from the database upon uninstall?"
3581
  msgstr ""
3582
 
3583
+ #: classes/Views/Settings.php:1572
3584
+ msgid "The plugin saves the activity log data and settings in the WordPress database. By default upon uninstalling the plugin the data is kept in the database so if it is installed again, you can still access the data. If the data is deleted it is not possible to recover it so you won't be able to access it again even when you reinstall the plugin."
 
 
3585
  msgstr ""
3586
 
3587
+ #: classes/Views/Settings.php:1576
3588
+ msgid "Remove Data on Uninstall"
3589
  msgstr ""
3590
 
3591
+ #: classes/Views/Settings.php:1601
3592
+ msgid "Are you sure you want to reset all the plugin settings to default? This action cannot be undone."
 
 
3593
  msgstr ""
3594
 
3595
+ #: classes/Views/Settings.php:1611
3596
+ msgid "Are you sure you want to purge all the activity log data?"
3597
  msgstr ""
3598
 
3599
+ #: classes/Views/Settings.php:1642
3600
+ msgid "MainWP Child plugin is not active on this website."
3601
  msgstr ""
3602
 
3603
+ #: classes/Views/Settings.php:1675
3604
+ msgid "The plugin cannot create the directory for the log files. Please check permissions and configure it again."
3605
  msgstr ""
3606
 
3607
+ #: classes/Views/Settings.php:1751
3608
+ msgid "The specified value is not a valid URL!"
3609
  msgstr ""
3610
 
3611
+ #: classes/Views/Settings.php:1752
3612
+ msgid "The specified value is not a valid post type!"
 
3613
  msgstr ""
3614
 
3615
+ #: classes/Views/Settings.php:1753
3616
+ msgid "The specified value is not a valid IP address!"
3617
  msgstr ""
3618
 
3619
+ #: classes/Views/Settings.php:1754
3620
+ msgid "The specified value is not a user nor a role!"
3621
  msgstr ""
3622
 
3623
+ #: classes/Views/Settings.php:1755
3624
+ msgid "Filename cannot be added because it contains invalid characters."
3625
  msgstr ""
3626
 
3627
+ #: classes/Views/Settings.php:1756
3628
+ msgid "File extension cannot be added because it contains invalid characters."
3629
  msgstr ""
3630
 
3631
+ #: classes/Views/Settings.php:1757
3632
+ msgid "Directory cannot be added because it contains invalid characters."
3633
  msgstr ""
3634
 
3635
+ #: classes/Views/Settings.php:1758
3636
+ msgid "Please save any changes before switching tabs."
 
 
3637
  msgstr ""
3638
 
3639
+ #: classes/Views/Settings.php:1886, classes/Views/Settings.php:1909
3640
+ msgid "Nonce Verification Failed."
3641
  msgstr ""
3642
 
3643
+ #: classes/Views/Settings.php:1894
3644
+ msgid "Plugin settings have been reset."
3645
  msgstr ""
3646
 
3647
+ #: classes/Views/Settings.php:1920
3648
+ msgid "Reset query failed."
3649
  msgstr ""
3650
 
3651
+ #: classes/Views/Settings.php:1918
3652
+ msgid "Tables has been reset."
3653
  msgstr ""
3654
 
3655
+ #: classes/Views/SetupWizard.php:178
3656
+ msgid "Welcome"
3657
  msgstr ""
3658
 
3659
+ #: classes/Views/SetupWizard.php:182
3660
+ msgid "Log Details"
3661
  msgstr ""
3662
 
3663
+ #: classes/Views/SetupWizard.php:187
3664
+ msgid "Log In"
3665
  msgstr ""
3666
 
3667
+ #: classes/Views/SetupWizard.php:192
3668
+ msgid "404s"
3669
  msgstr ""
3670
 
3671
+ #: classes/Views/SetupWizard.php:197
3672
+ msgid "User Registrations"
3673
  msgstr ""
3674
 
3675
+ #: classes/Views/SetupWizard.php:202
3676
+ msgid "Log Retention"
3677
  msgstr ""
3678
 
3679
+ #: classes/Views/SetupWizard.php:207, classes/Views/SetupWizard.php:794, classes/Views/SetupWizard.php:795
3680
+ msgid "Finish"
 
 
3681
  msgstr ""
3682
 
3683
+ #: classes/Views/SetupWizard.php:267
3684
+ msgid "Specified value in not a user."
3685
  msgstr ""
3686
 
3687
+ #: classes/Views/SetupWizard.php:268
3688
+ msgid "Specified value in not a role."
 
 
3689
  msgstr ""
3690
 
3691
+ #: classes/Views/SetupWizard.php:269
3692
+ msgid "Specified value in not an IP address."
3693
  msgstr ""
3694
 
3695
+ #: classes/Views/SetupWizard.php:309
3696
+ msgid "WP Activity Log &rsaquo; Setup Wizard"
3697
  msgstr ""
3698
 
3699
+ #: classes/Views/SetupWizard.php:327
3700
+ msgid "Close Wizard"
3701
  msgstr ""
3702
 
3703
+ #. translators: 1 - an opening link tag, 2 - a closing link tag.
3704
+ #: classes/Views/SetupWizard.php:420
3705
+ msgid "You have reached an invaild step - %1$sreturn to the start of the wizard%2$s."
3706
  msgstr ""
3707
 
3708
+ #: classes/Views/SetupWizard.php:437
3709
+ msgid "This wizard helps you configure the basic plugin settings. All these settings can be changed at a later stage from the plugin settings."
 
 
3710
  msgstr ""
3711
 
3712
+ #: classes/Views/SetupWizard.php:442
3713
+ msgid "Start Configuring the Plugin"
3714
  msgstr ""
3715
 
3716
+ #: classes/Views/SetupWizard.php:446
3717
+ msgid "Exit Wizard"
 
 
3718
  msgstr ""
3719
 
3720
+ #: classes/Views/SetupWizard.php:459
3721
+ msgid "Please select the level of detail for your WordPress activity logs:"
3722
  msgstr ""
3723
 
3724
+ #: classes/Views/SetupWizard.php:463
3725
+ msgid "Basic (I want a high level overview and I am not interested in the detail)"
 
 
3726
  msgstr ""
3727
 
3728
+ #: classes/Views/SetupWizard.php:468
3729
+ msgid "Geek (I want to know everything that is happening on my WordPress)"
 
3730
  msgstr ""
3731
 
3732
+ #: classes/Views/SetupWizard.php:470
3733
+ msgid "Note: You can change the WordPress logging level from the plugin’s settings anytime."
3734
  msgstr ""
3735
 
3736
+ #: classes/Views/SetupWizard.php:473, classes/Views/SetupWizard.php:473, classes/Views/SetupWizard.php:530, classes/Views/SetupWizard.php:530, classes/Views/SetupWizard.php:578, classes/Views/SetupWizard.php:578, classes/Views/SetupWizard.php:627, classes/Views/SetupWizard.php:627, classes/Views/SetupWizard.php:687, classes/Views/SetupWizard.php:688, classes/Views/SetupWizard.php:909, classes/Views/SetupWizard.php:910, extensions/external-db/classes/Connections.php:214, extensions/external-db/classes/Connections.php:565, extensions/external-db/classes/Mirroring.php:286, extensions/external-db/classes/Mirroring.php:601
3737
+ msgid "Next"
3738
  msgstr ""
3739
 
3740
+ #: classes/Views/SetupWizard.php:514
3741
+ msgid "Do you or your users use other pages to log in to WordPress other than the default login page ( /wp-admin/ )?"
3742
  msgstr ""
3743
 
3744
+ #: classes/Views/SetupWizard.php:518
3745
+ msgid "Yes, we use other pages to login to WordPress."
3746
  msgstr ""
3747
 
3748
+ #: classes/Views/SetupWizard.php:523
3749
+ msgid "No, we only use the default WordPress login page."
3750
  msgstr ""
3751
 
3752
+ #: classes/Views/SetupWizard.php:525
3753
+ msgid "If your website is a membership or ecommerce website most probably you have more than one area from where the users can login. If you are not sure, select Yes."
 
3754
  msgstr ""
3755
 
3756
+ #: classes/Views/SetupWizard.php:528, classes/Views/SetupWizard.php:576, classes/Views/SetupWizard.php:625, classes/Views/SetupWizard.php:679
3757
+ msgid "Note: You can change the WordPress activity log retention settings at any time from the plugin settings later on."
3758
  msgstr ""
3759
 
3760
+ #: classes/Views/SetupWizard.php:563
3761
+ msgid "Do you want to keep a log of (non-logged in) visitors’ requests to non-existing URLs which generate a HTTP 404 error response?"
3762
  msgstr ""
3763
 
3764
+ #: classes/Views/SetupWizard.php:611
3765
+ msgid "Can visitors register for a user on your website?"
3766
  msgstr ""
3767
 
3768
+ #: classes/Views/SetupWizard.php:622
3769
+ msgid "If you are not sure about this setting, check if the Membership setting in the WordPress General settings is checked or not. If it is not checked (default) select No."
3770
  msgstr ""
3771
 
3772
+ #: classes/Views/SetupWizard.php:661
3773
+ msgid "How long do you want to keep the data in the WordPress activity Log?"
 
 
 
3774
  msgstr ""
3775
 
3776
+ #: classes/Views/SetupWizard.php:666
3777
+ msgid "6 months (data older than 6 months will be deleted)"
3778
  msgstr ""
3779
 
3780
+ #: classes/Views/SetupWizard.php:671
3781
+ msgid "12 months (data older than 12 months will be deleted)"
3782
  msgstr ""
3783
 
3784
+ #: classes/Views/SetupWizard.php:676
3785
+ msgid "Keep all data."
 
 
3786
  msgstr ""
3787
 
3788
+ #: classes/Views/SetupWizard.php:697
3789
+ msgid "The plugin stores the data in the WordPress database in a very efficient way, though the more data you keep the more hard disk space it will consume. If you need need to retain a lot of data we would recommend you to <a href=\"https://wpactivitylog.com/features/?utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=wizard+configuration\" target=\"_blank\">upgrade to Premium</a> and use the Database tools to store the WordPress activity log in an external database."
 
 
3790
  msgstr ""
3791
 
3792
+ #: classes/Views/SetupWizard.php:765
3793
+ msgid "Your plugin is all set and it is ready to start keeping a record of everything that is happening on your WordPress in a WordPress activity log."
 
3794
  msgstr ""
3795
 
3796
+ #: classes/Views/SetupWizard.php:766
3797
+ msgid "Below are a few useful links you might need to refer to:"
 
 
 
3798
  msgstr ""
3799
 
3800
+ #: classes/Views/SetupWizard.php:771
3801
+ msgid "Getting started with the WP Activity Log plugin"
3802
  msgstr ""
3803
 
3804
+ #: classes/Views/SetupWizard.php:776
3805
+ msgid "Knowledge Base & Support Documents"
3806
  msgstr ""
3807
 
3808
+ #: classes/Views/SetupWizard.php:781
3809
+ msgid "Benefits of keeping a WordPress activity log"
3810
  msgstr ""
3811
 
3812
+ #: classes/Views/SetupWizard.php:786
3813
+ msgid "We trust this plugin meets all your activity log requirements. Should you encounter any problems, have feature requests or would like to share some feedback, <a href=\"https://wpactivitylog.com/contact/?utm_source=plugin&utm_medium=referral&utm_campaign=WSAL&utm_content=wizard+configuration\" target=\"_blank\">please get in touch!</a>"
3814
  msgstr ""
3815
 
3816
+ #: classes/Views/SetupWizard.php:822
3817
+ msgid "Third Party Extensions"
 
 
3818
  msgstr ""
3819
 
3820
+ #: classes/Views/SetupWizard.php:863
3821
+ msgid "Monitoring changes done in third party plugins"
3822
  msgstr ""
3823
 
3824
+ #: classes/Views/SetupWizard.php:864
3825
+ msgid "We noticed that the below plugins are installed on this website. You can install our extensions to also keep a log of changes users do on these plugins."
 
 
3826
  msgstr ""
3827
 
3828
+ #: classes/Views/ToggleAlerts.php:27, classes/Views/ToggleAlerts.php:41
3829
+ msgid "Enable/Disable Events"
3830
  msgstr ""
3831
 
3832
+ #: classes/Views/ToggleAlerts.php:192
3833
+ msgid "Log Level: "
3834
  msgstr ""
3835
 
3836
+ #: classes/Views/ToggleAlerts.php:197
3837
+ msgid "Basic"
3838
  msgstr ""
3839
 
3840
+ #: classes/Views/ToggleAlerts.php:202
3841
+ msgid "Geek"
3842
  msgstr ""
3843
 
3844
+ #: classes/Views/ToggleAlerts.php:205
3845
+ msgid "Custom"
3846
  msgstr ""
3847
 
3848
+ #: classes/Views/ToggleAlerts.php:209
3849
+ msgid "Use the Log level drop down menu above to use one of our preset log levels. Alternatively you can enable or disable any of the individual events from the below tabs. Refer to <a href=\"https://wpactivitylog.com/support/kb/list-wordpress-activity-log-event-ids/\" target=\"_blank\">the complete list of WordPress activity log event IDs</a> for reference on all the events the plugin can keep a log of."
3850
  msgstr ""
3851
 
3852
+ #: classes/Views/ToggleAlerts.php:219
3853
+ msgid "Front-end Events"
3854
  msgstr ""
3855
 
3856
+ #: classes/Views/ToggleAlerts.php:222
3857
+ msgid "Third party plugins"
3858
  msgstr ""
3859
 
3860
+ #: classes/Views/ToggleAlerts.php:318
3861
+ msgid "Code"
3862
  msgstr ""
3863
 
3864
+ #: classes/Views/ToggleAlerts.php:361
3865
+ msgid "Logins & Logouts"
3866
  msgstr ""
3867
 
3868
+ #: classes/Views/ToggleAlerts.php:354
3869
+ msgid "Your website is a single site so the multisite events have been disabled."
3870
  msgstr ""
3871
 
3872
+ #: classes/Views/ToggleAlerts.php:334
3873
+ msgid "The plugin WooCommerce is not installed on your website so these events have been disabled."
3874
  msgstr ""
3875
 
3876
+ #: classes/Views/ToggleAlerts.php:341
3877
+ msgid "Products"
3878
  msgstr ""
3879
 
3880
+ #: classes/Views/ToggleAlerts.php:347
3881
+ msgid "Post Changes"
3882
  msgstr ""
3883
 
3884
+ #: classes/Views/ToggleAlerts.php:327
3885
+ msgid "<strong>Note:</strong> Post refers to any type of content, i.e. blog post, page or a post with a custom post type."
 
 
 
 
3886
  msgstr ""
3887
 
3888
+ #: classes/Views/ToggleAlerts.php:384
3889
+ msgid "Not Implemented"
3890
  msgstr ""
3891
 
3892
+ #: classes/Views/ToggleAlerts.php:387
3893
+ msgid "Not Available"
 
 
 
 
3894
  msgstr ""
3895
 
3896
+ #: classes/Views/ToggleAlerts.php:407
3897
+ msgid "Product Attributes"
 
 
3898
  msgstr ""
3899
 
3900
+ #: classes/Views/ToggleAlerts.php:405
3901
+ msgid "Product Stock Changes"
 
 
 
 
3902
  msgstr ""
3903
 
3904
+ #: classes/Views/ToggleAlerts.php:403
3905
+ msgid "Product Admin"
 
 
3906
  msgstr ""
3907
 
3908
+ #: classes/Views/ToggleAlerts.php:401
3909
+ msgid "Post Settings"
 
 
 
3910
  msgstr ""
3911
 
3912
+ #: classes/Views/ToggleAlerts.php:399
3913
+ msgid "Files"
3914
  msgstr ""
3915
 
3916
+ #: classes/Views/ToggleAlerts.php:397
3917
+ msgid "User Sessions"
 
 
 
 
3918
  msgstr ""
3919
 
3920
+ #: classes/Views/ToggleAlerts.php:477, classes/Views/ToggleAlerts.php:627
3921
+ msgid "Capture 404 requests to file (the log file are created in the /wp-content/uploads/wp-activity-log/404s/ directory)"
3922
  msgstr ""
3923
 
3924
+ #: classes/Views/ToggleAlerts.php:485, classes/Views/ToggleAlerts.php:631
3925
+ msgid "Purge log files older than one month"
 
 
 
 
3926
  msgstr ""
3927
 
3928
+ #: classes/Views/ToggleAlerts.php:490
3929
+ msgid "Number of 404 Requests to Log. By default the plugin keeps up to 99 requests to non-existing pages from the same IP address. Increase the value in this setting to the desired amount to keep a log of more or less requests."
3930
  msgstr ""
3931
 
3932
+ #: classes/Views/ToggleAlerts.php:495, classes/Views/ToggleAlerts.php:639
3933
+ msgid "Record the referrer that generated the 404 error."
 
 
 
 
3934
  msgstr ""
3935
 
3936
+ #: classes/Views/ToggleAlerts.php:507, classes/Views/ToggleAlerts.php:520
3937
+ msgid "Number of login attempts to log. Enter 0 to log all failed login attempts. (By default the plugin only logs up to 10 failed login because the process can be very resource intensive in case of a brute force attack)"
3938
  msgstr ""
3939
 
3940
+ #: classes/Views/ToggleAlerts.php:533
3941
+ msgid "Log all stock changes. Disable this setting to only keep a log of stock changes done manually via the WooCommerce dashboard. Therefore automated stock changes typically done via customers placing orders or via other plugins will not be logged."
 
 
 
3942
  msgstr ""
3943
 
3944
+ #: classes/Views/ToggleAlerts.php:584
3945
+ msgid "This plugin keeps a log of what your website users are doing when they are logged in. On top of that it can also keep a log of some important events of (non logged in) website visitors. Use the below settings to enable / disable any of the front-end sensors:"
3946
  msgstr ""
3947
 
3948
+ #: classes/Views/ToggleAlerts.php:589
3949
+ msgid "Front-end users registrations"
3950
  msgstr ""
3951
 
3952
+ #: classes/Views/ToggleAlerts.php:595
3953
+ msgid "Keep a log when a visitor registers a user on the website. Only enable this if you allow visitors to register as users on your website. User registration is disabled by default in WordPress."
 
 
3954
  msgstr ""
3955
 
3956
+ #: classes/Views/ToggleAlerts.php:600
3957
+ msgid "Front-end users logins"
3958
  msgstr ""
3959
 
3960
+ #: classes/Views/ToggleAlerts.php:606
3961
+ msgid "Keep a log when users login to the website from other login pages / forms other than the default WordPress login page."
 
 
3962
  msgstr ""
3963
 
3964
+ #: classes/Views/ToggleAlerts.php:611
3965
+ msgid "Website visitors 404 errors"
3966
  msgstr ""
3967
 
3968
+ #: classes/Views/ToggleAlerts.php:617
3969
+ msgid "Event ID 6023: Keep a log when a website visitor requests a non-existing URL (HTTP 404 response error)."
 
 
3970
  msgstr ""
3971
 
3972
+ #: classes/Views/ToggleAlerts.php:635
3973
+ msgid "Number of 404 Requests to Log. By default the plugin keeps up to 99 requests to non-existing pages from the same IP address. Increase the value in this setting to the desired amount to keep a log of more or less requests. Note that by increasing this value to a high number, should your website be scanned the plugin will consume more resources to log all the requests."
3974
  msgstr ""
3975
 
3976
+ #: classes/Views/ToggleAlerts.php:648
3977
+ msgid "Save Changes"
 
 
3978
  msgstr ""
3979
 
3980
+ #: classes/Views/ToggleAlerts.php:655
3981
+ msgid "Log Level Updated"
3982
  msgstr ""
3983
 
3984
+ #. translators: Alerts log level.
3985
+ #: classes/Views/ToggleAlerts.php:659
3986
+ msgid "The %s log level has been successfully loaded and applied."
 
3987
  msgstr ""
3988
 
3989
+ #: classes/Views/ToggleAlerts.php:663, extensions/email-notifications/classes/Notifications.php:292, extensions/email-notifications/classes/Notifications.php:892, extensions/email-notifications/classes/Notifications.php:1976
3990
+ msgid "OK"
3991
  msgstr ""
3992
 
3993
+ #: classes/Views/ToggleAlerts.php:678
3994
+ msgid "Enable File Integrity Scanner"
 
3995
  msgstr ""
3996
 
3997
+ #: classes/Views/ToggleAlerts.php:680
3998
+ msgid "The file integrity scanner is switched off. To enable this event it has to be switched on."
 
 
3999
  msgstr ""
4000
 
4001
+ #: classes/Views/ToggleAlerts.php:684
4002
+ msgid "SWITCH ON"
4003
  msgstr ""
4004
 
4005
+ #: classes/Views/ToggleAlerts.php:685
4006
+ msgid "DISABLE EVENT"
4007
  msgstr ""
4008
 
4009
+ #: extensions/search/search-init.php:197
4010
+ msgid "An identical search filter already exists."
 
4011
  msgstr ""
4012
 
4013
+ #: extensions/search/search-init.php:216, extensions/search/search-init.php:332, extensions/user-sessions/classes/View/Sessions.php:367
4014
+ msgid "Search"
4015
  msgstr ""
4016
 
4017
+ #: extensions/search/search-init.php:333
4018
+ msgid "- Use the free-text search to search for text in the event's message.<br>- To search for a particular Event ID, user, IP address, Post ID or Type or use date ranges, use the filters."
 
4019
  msgstr ""
4020
 
4021
+ #: extensions/search/search-init.php:334
4022
+ msgid "Clear Search Results"
4023
  msgstr ""
4024
 
4025
+ #: extensions/search/search-init.php:335
4026
+ msgid "Nothing found!"
 
4027
  msgstr ""
4028
 
4029
+ #: extensions/search/search-init.php:336
4030
+ msgid "Load"
4031
  msgstr ""
4032
 
4033
+ #: extensions/search/search-init.php:337
4034
+ msgid "Loading..."
4035
  msgstr ""
4036
 
4037
+ #: extensions/search/search-init.php:338
4038
+ msgid "Load & Run"
4039
  msgstr ""
4040
 
4041
+ #: extensions/search/search-init.php:339, extensions/email-notifications/classes/NotificationBuilder.php:76, extensions/email-notifications/classes/Notifications.php:1886, extensions/email-notifications/classes/Notifications.php:1949, extensions/email-notifications/classes/Notifications.php:1964, extensions/external-db/classes/Connections.php:144, extensions/external-db/classes/Mirroring.php:204
4042
+ msgid "Delete"
4043
  msgstr ""
4044
 
4045
+ #: extensions/search/search-init.php:340, extensions/external-db/classes/Connections.php:556, extensions/external-db/classes/Mirroring.php:589
4046
+ msgid "Deleting..."
4047
  msgstr ""
4048
 
4049
+ #: extensions/search/search-init.php:342, extensions/search/classes/FilterManager.php:383
4050
+ msgid "Load Search & Filters"
 
4051
  msgstr ""
4052
 
4053
+ #: extensions/search/search-init.php:343
4054
+ msgid "* Invalid IP"
4055
  msgstr ""
4056
 
4057
+ #: extensions/search/search-init.php:344, extensions/search/classes/FilterManager.php:386
4058
+ msgid "Remove"
 
 
4059
  msgstr ""
4060
 
4061
+ #: extensions/search/search-init.php:345
4062
+ msgid "Close Filters"
 
 
4063
  msgstr ""
4064
 
4065
+ #: extensions/search/search-init.php:346, extensions/search/classes/FilterManager.php:411
4066
+ msgid "Filter View"
 
 
4067
  msgstr ""
4068
 
4069
+ #. translators: both placeholders are html formatting strings for itallics
4070
+ #: extensions/search/search-init.php:349
4071
+ msgid "Click the %1$sSearch%2$s button to apply the filters. Click the %1$sClear Search Results%2$s button to reset the search and filters."
4072
  msgstr ""
4073
 
4074
+ #: extensions/search/search-init.php:395
4075
+ msgid "Widget could not be found."
 
 
4076
  msgstr ""
4077
 
4078
+ #: extensions/search/search-init.php:477, extensions/search/search-init.php:547
4079
+ msgid "No saved search found."
4080
  msgstr ""
4081
 
4082
+ #: extensions/search/search-init.php:469
4083
+ msgid "Saved searches found."
 
 
4084
  msgstr ""
4085
 
4086
+ #: extensions/search/search-init.php:511
4087
+ msgid "Search name not specified."
4088
  msgstr ""
4089
 
4090
+ #: extensions/search/search-init.php:538
4091
+ msgid "Saved search not found."
4092
  msgstr ""
4093
 
4094
+ #: extensions/search/search-init.php:530
4095
+ msgid "Saved search deleted."
 
 
4096
  msgstr ""
4097
 
4098
+ #: classes/Views/addons/html-view.php:101
4099
+ msgid "Screenshots"
 
 
 
 
4100
  msgstr ""
4101
 
4102
+ #: classes/Views/addons/html-view.php:118
4103
+ msgid "Start Free 14-Day Premium Trial"
 
 
4104
  msgstr ""
4105
 
4106
  #: extensions/email-notifications/classes/AddNotification.php:58
4111
  msgid "Add notification"
4112
  msgstr ""
4113
 
4114
+ #: extensions/email-notifications/classes/AddNotification.php:236, extensions/email-notifications/classes/EditNotification.php:240
 
4115
  msgid "Back"
4116
  msgstr ""
4117
 
4119
  msgid "You have reached the maximum number of notifications you can add."
4120
  msgstr ""
4121
 
4122
+ #. translators: Twilio settings hyperlink.
4123
+ #. translators: Twilio settings hyperlink.
4124
+ #. translators: Twilio settings hyperlink.
4125
+ #. translators: Twilio settings hyperlink.
4126
+ #. translators: Twilio settings hyperlink.
4127
+ #. translators: Twilio settings hyperlink.
4128
+ #. translators: Twilio settings hyperlink.
4129
+ #. translators: Twilio settings hyperlink.
4130
+ #. translators: Twilio settings hyperlink.
4131
+ #: extensions/email-notifications/classes/AddNotification.php:297, extensions/email-notifications/classes/EditNotification.php:348, extensions/email-notifications/classes/Notifications.php:826, extensions/email-notifications/classes/Notifications.php:946, extensions/email-notifications/classes/Notifications.php:1301, extensions/email-notifications/classes/Notifications.php:1465, extensions/email-notifications/classes/Notifications.php:1559, extensions/email-notifications/classes/Notifications.php:1725, extensions/email-notifications/classes/SMSProviderSettings.php:237
4132
  msgid "Click %s to configure Twilio integration for SMS notifications."
4133
  msgstr ""
4134
 
4135
+ #: extensions/email-notifications/classes/AddNotification.php:297, extensions/email-notifications/classes/EditNotification.php:348, extensions/email-notifications/classes/Notifications.php:826, extensions/email-notifications/classes/Notifications.php:946, extensions/email-notifications/classes/Notifications.php:1301, extensions/email-notifications/classes/Notifications.php:1465, extensions/email-notifications/classes/Notifications.php:1559, extensions/email-notifications/classes/Notifications.php:1725, extensions/email-notifications/classes/SMSProviderSettings.php:237
 
 
 
 
 
 
 
 
4136
  msgid "here"
4137
  msgstr ""
4138
 
4139
+ #. translators: Trigger groups documentation hyperlink
4140
+ #. translators: Trigger groups documentation hyperlink
4141
+ #: extensions/email-notifications/classes/AddNotification.php:305, extensions/email-notifications/classes/EditNotification.php:356
 
 
 
 
 
 
 
 
 
4142
  msgid "Trigger groups documentation"
4143
  msgstr ""
4144
 
4145
+ #: extensions/email-notifications/classes/AddNotification.php:310, extensions/email-notifications/classes/EditNotification.php:361
 
4146
  msgid "Triggers"
4147
  msgstr ""
4148
 
4149
+ #: extensions/email-notifications/classes/AddNotification.php:311, extensions/email-notifications/classes/EditNotification.php:362
 
4150
  msgid "Add Trigger"
4151
  msgstr ""
4152
 
4153
+ #: extensions/email-notifications/classes/AddNotification.php:325, extensions/email-notifications/classes/EditNotification.php:405
 
4154
  msgid "Use default email template"
4155
  msgstr ""
4156
 
4157
+ #: extensions/email-notifications/classes/AddNotification.php:330, extensions/email-notifications/classes/EditNotification.php:414
 
4158
  msgid "Use event specific email template"
4159
  msgstr ""
4160
 
4161
+ #: extensions/email-notifications/classes/AddNotification.php:355, extensions/email-notifications/classes/EditNotification.php:447, extensions/external-db/classes/Connections.php:95, extensions/external-db/classes/Mirroring.php:123
 
 
 
4162
  msgid "Name"
4163
  msgstr ""
4164
 
4165
+ #: extensions/email-notifications/classes/AddNotification.php:356, extensions/email-notifications/classes/EditNotification.php:448, extensions/email-notifications/classes/Notifications.php:1899, extensions/email-notifications/classes/Notifications.php:1910
 
 
 
4166
  msgid "Title"
4167
  msgstr ""
4168
 
4169
+ #: extensions/email-notifications/classes/AddNotification.php:364, extensions/email-notifications/classes/EditNotification.php:456, extensions/email-notifications/classes/Notifications.php:963, extensions/email-notifications/classes/Notifications.php:986, extensions/email-notifications/classes/Notifications.php:1003, extensions/email-notifications/classes/Notifications.php:1020, extensions/email-notifications/classes/Notifications.php:1037, extensions/email-notifications/classes/Notifications.php:1061, extensions/email-notifications/classes/Notifications.php:1083, extensions/email-notifications/classes/Notifications.php:1096, extensions/email-notifications/classes/Notifications.php:1109, extensions/email-notifications/classes/Notifications.php:1122, extensions/email-notifications/classes/Notifications.php:1135, extensions/email-notifications/classes/Notifications.php:1148, extensions/email-notifications/classes/Notifications.php:1172, extensions/email-notifications/classes/Notifications.php:1187, extensions/email-notifications/classes/Notifications.php:1202, extensions/email-notifications/classes/Notifications.php:1217, extensions/email-notifications/classes/Notifications.php:1232, extensions/email-notifications/classes/Notifications.php:1254, extensions/email-notifications/classes/Notifications.php:1319, extensions/email-notifications/classes/Notifications.php:1334, extensions/email-notifications/classes/Notifications.php:1349, extensions/email-notifications/classes/Notifications.php:1373, extensions/email-notifications/classes/Notifications.php:1388, extensions/email-notifications/classes/Notifications.php:1403, extensions/email-notifications/classes/Notifications.php:1418, extensions/email-notifications/classes/Notifications.php:1480, extensions/email-notifications/classes/Notifications.php:1495, extensions/email-notifications/classes/Notifications.php:1510, extensions/email-notifications/classes/Notifications.php:1574, extensions/email-notifications/classes/Notifications.php:1591, extensions/email-notifications/classes/Notifications.php:1608, extensions/email-notifications/classes/Notifications.php:1625, extensions/email-notifications/classes/Notifications.php:1642, extensions/email-notifications/classes/Notifications.php:1659, extensions/email-notifications/classes/Notifications.php:1676, extensions/email-notifications/classes/Notifications.php:1742, extensions/email-notifications/classes/Notifications.php:1759, extensions/email-notifications/classes/Notifications.php:1776, extensions/email-notifications/classes/Notifications.php:1793, extensions/user-sessions/classes/View/Sessions.php:349
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4170
  msgid "Email"
4171
  msgstr ""
4172
 
4173
+ #: extensions/email-notifications/classes/AddNotification.php:370, extensions/email-notifications/classes/EditNotification.php:462, extensions/email-notifications/classes/Notifications.php:989, extensions/email-notifications/classes/Notifications.php:1006, extensions/email-notifications/classes/Notifications.php:1023, extensions/email-notifications/classes/Notifications.php:1040, extensions/email-notifications/classes/Notifications.php:1064, extensions/email-notifications/classes/Notifications.php:1086, extensions/email-notifications/classes/Notifications.php:1099, extensions/email-notifications/classes/Notifications.php:1112, extensions/email-notifications/classes/Notifications.php:1125, extensions/email-notifications/classes/Notifications.php:1138, extensions/email-notifications/classes/Notifications.php:1151, extensions/email-notifications/classes/Notifications.php:1175, extensions/email-notifications/classes/Notifications.php:1190, extensions/email-notifications/classes/Notifications.php:1205, extensions/email-notifications/classes/Notifications.php:1220, extensions/email-notifications/classes/Notifications.php:1235, extensions/email-notifications/classes/Notifications.php:1257, extensions/email-notifications/classes/Notifications.php:1322, extensions/email-notifications/classes/Notifications.php:1337, extensions/email-notifications/classes/Notifications.php:1352, extensions/email-notifications/classes/Notifications.php:1376, extensions/email-notifications/classes/Notifications.php:1391, extensions/email-notifications/classes/Notifications.php:1406, extensions/email-notifications/classes/Notifications.php:1421, extensions/email-notifications/classes/Notifications.php:1483, extensions/email-notifications/classes/Notifications.php:1498, extensions/email-notifications/classes/Notifications.php:1513, extensions/email-notifications/classes/Notifications.php:1577, extensions/email-notifications/classes/Notifications.php:1594, extensions/email-notifications/classes/Notifications.php:1611, extensions/email-notifications/classes/Notifications.php:1628, extensions/email-notifications/classes/Notifications.php:1645, extensions/email-notifications/classes/Notifications.php:1662, extensions/email-notifications/classes/Notifications.php:1679, extensions/email-notifications/classes/Notifications.php:1745, extensions/email-notifications/classes/Notifications.php:1762, extensions/email-notifications/classes/Notifications.php:1779, extensions/email-notifications/classes/Notifications.php:1796
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4174
  msgid "Mobile Number"
4175
  msgstr ""
4176
 
4177
+ #: extensions/email-notifications/classes/Common.php:383, extensions/email-notifications/classes/Common.php:448
 
 
 
 
 
 
 
 
4178
  msgid "The form is not valid. Please reload the page and try again."
4179
  msgstr ""
4180
 
4181
+ #. translators: Event type
4182
+ #: extensions/email-notifications/classes/Common.php:585, extensions/email-notifications/classes/Common.php:575, extensions/email-notifications/classes/Common.php:561, extensions/email-notifications/classes/Common.php:548, extensions/email-notifications/classes/Common.php:525, extensions/email-notifications/classes/Common.php:505, extensions/email-notifications/classes/Common.php:426
4183
+ msgid "%s is not valid"
4184
  msgstr ""
4185
 
4186
+ #: extensions/email-notifications/classes/Common.php:591
4187
+ msgid "Selected TYPE is not valid."
4188
  msgstr ""
4189
 
4190
+ #: extensions/email-notifications/classes/Common.php:581
4191
+ msgid "Selected OBJECT is not valid."
4192
  msgstr ""
4193
 
4194
+ #: extensions/email-notifications/classes/Common.php:570
4195
+ msgid "Selected POST STATUS is not valid."
4196
  msgstr ""
4197
 
4198
+ #: extensions/email-notifications/classes/Common.php:557
4199
+ msgid "Selected POST TYPE is not valid."
 
 
 
 
 
 
 
4200
  msgstr ""
4201
 
4202
+ #: extensions/email-notifications/classes/Common.php:536
4203
+ msgid "The enviroment is not multisite."
4204
  msgstr ""
4205
 
4206
+ #: extensions/email-notifications/classes/Common.php:542, extensions/email-notifications/classes/Common.php:519
4207
+ msgid "%s was not found"
4208
  msgstr ""
4209
 
4210
+ #: extensions/email-notifications/classes/Common.php:492, extensions/email-notifications/classes/Common.php:498
4211
+ msgid "TIME is not valid."
4212
  msgstr ""
4213
 
4214
+ #: extensions/email-notifications/classes/Common.php:483
4215
+ msgid "DATE is not valid."
4216
  msgstr ""
4217
 
4218
+ #: extensions/email-notifications/classes/Common.php:442
4219
+ msgid "The SOURCE IP is not valid. Maximum of 15 characters allowed."
4220
  msgstr ""
4221
 
4222
+ #: extensions/email-notifications/classes/Common.php:457
4223
+ msgid "The SOURCE IP is not valid."
 
4224
  msgstr ""
4225
 
4226
+ #: extensions/email-notifications/classes/Common.php:466
4227
+ msgid "The SOURCE IP fragment is not valid."
 
 
4228
  msgstr ""
4229
 
4230
+ #: extensions/email-notifications/classes/Common.php:435
4231
+ msgid "Selected USER ROLE is not valid."
4232
  msgstr ""
4233
 
4234
+ #: extensions/email-notifications/classes/Common.php:416
4235
+ msgid "The USERNAME is not valid. Maximum of 50 characters allowed."
4236
  msgstr ""
4237
 
4238
+ #: extensions/email-notifications/classes/Common.php:422
4239
+ msgid "The USERNAME does not exist."
4240
  msgstr ""
4241
 
4242
+ #: extensions/email-notifications/classes/Common.php:394, extensions/email-notifications/classes/Common.php:409
4243
+ msgid "The EVENT ID is not valid."
4244
  msgstr ""
4245
 
4246
+ #: extensions/email-notifications/classes/Common.php:400
4247
+ msgid "Internal Error. Please reload the page and try again."
4248
  msgstr ""
4249
 
4250
+ #: extensions/email-notifications/classes/Common.php:816, extensions/email-notifications/classes/Common.php:844, extensions/email-notifications/classes/Common.php:846
 
 
4251
  msgid "Title is required."
4252
  msgstr ""
4253
 
4254
+ #: extensions/email-notifications/classes/Common.php:853
4255
  msgid "Title is not valid."
4256
  msgstr ""
4257
 
4258
+ #: extensions/email-notifications/classes/Common.php:863
4259
  msgid "Please add at least one condition."
4260
  msgstr ""
4261
 
4262
+ #: extensions/email-notifications/classes/Common.php:911, extensions/email-notifications/classes/Common.php:917, extensions/email-notifications/classes/Common.php:922
 
 
4263
  msgid "The form is not valid. Please refresh the page and try again."
4264
  msgstr ""
4265
 
4266
+ #: extensions/email-notifications/classes/Common.php:931
4267
  msgid "A trigger's condition must not be longer than 50 characters."
4268
  msgstr ""
4269
 
4270
+ #: extensions/email-notifications/classes/Common.php:967
4271
+ msgid "Email or Username is not valid."
4272
  msgstr ""
4273
 
4274
+ #: extensions/email-notifications/classes/Common.php:974
4275
+ msgid "Mobile number is not valid."
4276
  msgstr ""
4277
 
4278
+ #: extensions/email-notifications/classes/Common.php:961
4279
+ msgid "Email or Username is required."
4280
  msgstr ""
4281
 
4282
+ #: extensions/email-notifications/classes/Common.php:962
4283
+ msgid "Mobile number is required."
4284
  msgstr ""
4285
 
4286
+ #: extensions/email-notifications/classes/Common.php:1026, extensions/email-notifications/classes/Notifications.php:586
 
4287
  msgid "Notification could not be saved."
4288
  msgstr ""
4289
 
4290
+ #: extensions/email-notifications/classes/Common.php:1033, extensions/email-notifications/classes/Notifications.php:645
 
4291
  msgid "Notification successfully saved."
4292
  msgstr ""
4293
 
4294
+ #: extensions/email-notifications/classes/Common.php:1111, extensions/email-notifications/classes/Common.php:1173
 
4295
  msgid "Notification {title} on website {site} triggered"
4296
  msgstr ""
4297
 
4298
+ #: extensions/email-notifications/classes/Common.php:1112, extensions/email-notifications/classes/Common.php:1174
4299
+ msgid "Notification <strong>{title}</strong> was triggered. Below are the notification details:"
 
 
 
4300
  msgstr ""
4301
 
4302
+ #: extensions/email-notifications/classes/Common.php:1114
4303
  msgid "Website"
4304
  msgstr ""
4305
 
4306
+ #: extensions/email-notifications/classes/Common.php:1116, extensions/email-notifications/classes/Common.php:1177, extensions/search/classes/FilterManager.php:474, extensions/user-sessions/classes/View/Sessions.php:174, extensions/user-sessions/classes/View/Sessions.php:348
 
 
 
 
4307
  msgid "Username"
4308
  msgstr ""
4309
 
4310
+ #: extensions/email-notifications/classes/Common.php:1117
4311
  msgid "User role"
4312
  msgstr ""
4313
 
4314
+ #: extensions/email-notifications/classes/Common.php:1118
4315
  msgid "IP address"
4316
  msgstr ""
4317
 
4318
+ #: extensions/email-notifications/classes/Common.php:1121
4319
  msgid "Event Message"
4320
  msgstr ""
4321
 
4322
+ #: extensions/email-notifications/classes/Common.php:1122
4323
  msgid "Event generated on"
4324
  msgstr ""
4325
 
4326
+ #: extensions/email-notifications/classes/Common.php:1124
4327
+ msgid "These email notifications are sent with <a href=\"http://wpactivitylog.com\">WP Activity Log</a>, the most comprehensive WordPress activity log plugin solution."
 
 
 
4328
  msgstr ""
4329
 
4330
+ #: extensions/email-notifications/classes/Common.php:1147, extensions/email-notifications/classes/Common.php:1206
 
4331
  msgid "User/Role"
4332
  msgstr ""
4333
 
4334
+ #: extensions/email-notifications/classes/Common.php:1178, extensions/search/classes/FilterManager.php:486, extensions/search/classes/Filters/userrolefilter.php:49, extensions/search/classes/Filters/userrolefilter.php:87, extensions/user-sessions/classes/View/Sessions.php:353
 
 
 
 
4335
  msgid "User Role"
4336
  msgstr ""
4337
 
4338
+ #: extensions/email-notifications/classes/Common.php:1180
4339
  msgid "Generated On"
4340
  msgstr ""
4341
 
4342
+ #: extensions/email-notifications/classes/Common.php:1182
4343
+ msgid "Monitoring of WordPress and Email Notifications provided by <a href=\"http://wpactivitylog.com\">WP Activity Log, WordPress most comprehensive audit trail plugin</a>."
 
 
 
4344
  msgstr ""
4345
 
4346
+ #: extensions/email-notifications/classes/Common.php:1207
4347
  msgid "Event"
4348
  msgstr ""
4349
 
4350
+ #: extensions/email-notifications/classes/Common.php:1222
4351
  msgid "Subject "
4352
  msgstr ""
4353
 
4354
+ #: extensions/email-notifications/classes/Common.php:1231
4355
  msgid "Body "
4356
  msgstr ""
4357
 
4358
+ #: extensions/email-notifications/classes/Common.php:1234
4359
  msgid "HTML is accepted. Available template tags:"
4360
  msgstr ""
4361
 
4362
+ #. translators: singular or plural form of a login total count.
4363
  #: extensions/email-notifications/classes/DailyNotification.php:340
 
4364
  msgid "was %d login"
4365
  msgid_plural "were %d logins"
4366
  msgstr[0] ""
4367
  msgstr[1] ""
4368
 
4369
+ #. translators: a number that is total count of unique users in a login group.
4370
  #: extensions/email-notifications/classes/DailyNotification.php:346
 
4371
  msgid "%d unique user"
4372
  msgid_plural "%d unique users"
4373
  msgstr[0] ""
4374
  msgstr[1] ""
4375
 
4376
+ #. translators: 1 - number of logins. 2 - total unique users
4377
  #: extensions/email-notifications/classes/DailyNotification.php:353
4378
+ msgid "There %1$s on your site today from %2$s. Below is a list of the users and the IP addresses they logged in from:"
 
 
 
4379
  msgstr ""
4380
 
4381
  #: extensions/email-notifications/classes/DailyNotification.php:385
4382
+ msgid "There were failed logins due to a wrong password from the following IP addresses:"
 
 
4383
  msgstr ""
4384
 
4385
  #: extensions/email-notifications/classes/DailyNotification.php:407
4386
+ msgid "There were failed logins due to a wrong username from the following IP addresses:"
 
 
4387
  msgstr ""
4388
 
4389
  #: extensions/email-notifications/classes/EditNotification.php:58
4394
  msgid "Edit Notification"
4395
  msgstr ""
4396
 
4397
+ #: extensions/email-notifications/classes/EditNotification.php:239, extensions/email-notifications/classes/Notifications.php:1848
 
4398
  msgid "Add New"
4399
  msgstr ""
4400
 
4401
  #: extensions/email-notifications/classes/EditNotification.php:270
4402
+ msgid "You do not have sufficient permissions to access this page. - INVALID NOTIFICATION ID"
 
 
4403
  msgstr ""
4404
 
4405
  #: extensions/email-notifications/classes/EditNotification.php:466
4406
+ msgid "Specify the email address or WordPress usernames who should receive the notification once the trigger is matched. To specify multiple email addresses or usernames separate them with a comma (,)."
 
 
 
 
 
 
 
 
 
 
 
 
 
4407
  msgstr ""
4408
 
4409
  #: extensions/email-notifications/classes/NotificationBuilder.php:77
4442
  msgid "Multisite"
4443
  msgstr ""
4444
 
4445
+ #: extensions/email-notifications/classes/Notifications.php:185, extensions/email-notifications/classes/Notifications.php:845
 
4446
  msgid "Custom Notifications"
4447
  msgstr ""
4448
 
4450
  msgid "Notifications Templates"
4451
  msgstr ""
4452
 
4453
+ #: extensions/email-notifications/classes/Notifications.php:197, extensions/email-notifications/classes/Notifications.php:2025
 
4454
  msgid "Default Email Template"
4455
  msgstr ""
4456
 
4457
+ #: extensions/email-notifications/classes/Notifications.php:201, extensions/email-notifications/classes/Notifications.php:2021
 
4458
  msgid "Default SMS Template"
4459
  msgstr ""
4460
 
4461
+ #: extensions/email-notifications/classes/Notifications.php:244, extensions/email-notifications/classes/Notifications.php:258
 
4462
  msgid "Notifications"
4463
  msgstr ""
4464
 
4465
+ #: extensions/email-notifications/classes/Notifications.php:293, extensions/email-notifications/classes/Notifications.php:863
 
4466
  msgid "Test Notifications"
4467
  msgstr ""
4468
 
4474
  msgid "Please specify an email address or a phone number to test."
4475
  msgstr ""
4476
 
4477
+ #: extensions/email-notifications/classes/Notifications.php:603
 
 
 
 
4478
  msgid "Email Address or Username is not valid."
4479
  msgstr ""
4480
 
4481
+ #: extensions/email-notifications/classes/Notifications.php:613
4482
  msgid "Phone number is not valid."
4483
  msgstr ""
4484
 
4485
+ #: extensions/email-notifications/classes/Notifications.php:595
4486
+ msgid "Email Address and Mobile Number cannot be empty."
 
 
4487
  msgstr ""
4488
 
4489
+ #: extensions/email-notifications/classes/Notifications.php:742
4490
+ msgid "To configure email notifications please contact the administrator of this multisite network on "
4491
+ msgstr ""
4492
+
4493
+ #: extensions/email-notifications/classes/Notifications.php:761
4494
+ msgid "Daily summary email sent."
4495
  msgstr ""
4496
 
4497
+ #: extensions/email-notifications/classes/Notifications.php:757
4498
  msgid "An error occurred while sending the daily summary email."
4499
  msgstr ""
4500
 
4501
+ #: extensions/email-notifications/classes/Notifications.php:751
4502
+ msgid "Invalid request."
4503
  msgstr ""
4504
 
4505
+ #. translators: %s: Twilio settings link
4506
+ #: extensions/email-notifications/classes/Notifications.php:835
4507
+ msgid "Tick the check box and specify an email address or username to enable a notification. You can specify a phone number to send a SMS notification as well (%s). Multiple recipients or numbers should be separated with a comma (,). Click the Save Notifications button to save the changes."
 
 
 
 
4508
  msgstr ""
4509
 
4510
+ #: extensions/email-notifications/classes/Notifications.php:836
4511
  msgid "Configure Twilio account integration"
4512
  msgstr ""
4513
 
4514
+ #. translators: %s: Twilio settings link
4515
+ #: extensions/email-notifications/classes/Notifications.php:844
4516
  msgid "You can create your own notification criteria in the %s tab."
4517
  msgstr ""
4518
 
4519
+ #: extensions/email-notifications/classes/Notifications.php:864
4520
  msgid "Save Notifications"
4521
  msgstr ""
4522
 
4523
+ #: extensions/email-notifications/classes/Notifications.php:873
4524
+ msgid "Specify an email address to where you would like to send a test email notification:"
 
 
4525
  msgstr ""
4526
 
4527
+ #: extensions/email-notifications/classes/Notifications.php:878
4528
+ msgid "Specify a mobile phone number to where you would like to send a test SMS notification:"
 
 
4529
  msgstr ""
4530
 
4531
+ #: extensions/email-notifications/classes/Notifications.php:884
4532
  msgid "Send"
4533
  msgstr ""
4534
 
4535
+ #: extensions/email-notifications/classes/Notifications.php:885, extensions/external-db/classes/Connections.php:216, extensions/external-db/classes/Mirroring.php:287
 
 
4536
  msgid "Cancel"
4537
  msgstr ""
4538
 
4539
+ #: extensions/email-notifications/classes/Notifications.php:949
4540
  msgid "Daily Summary of Activity Log"
4541
  msgstr ""
4542
 
4543
+ #: extensions/email-notifications/classes/Notifications.php:960
4544
  msgid "Send me a summary of what happens every day."
4545
  msgstr ""
4546
 
4547
+ #: extensions/email-notifications/classes/Notifications.php:964
4548
  msgid "Send Summary Now"
4549
  msgstr ""
4550
 
4551
+ #: extensions/email-notifications/classes/Notifications.php:970
4552
  msgid "Suspicious Activity"
4553
  msgstr ""
4554
 
4555
+ #: extensions/email-notifications/classes/Notifications.php:979, extensions/email-notifications/classes/Notifications.php:996
 
4556
  msgid "There are more than"
4557
  msgstr ""
4558
 
4559
+ #: extensions/email-notifications/classes/Notifications.php:981
4560
  msgid "failed WordPress logins for a WordPress user (Event ID 1002)"
4561
  msgstr ""
4562
 
4563
+ #: extensions/email-notifications/classes/Notifications.php:998
4564
  msgid "failed logins of non existing users (Event ID 1003)"
4565
  msgstr ""
4566
 
4567
+ #: extensions/email-notifications/classes/Notifications.php:1013
4568
  msgid "A user generates more than"
4569
  msgstr ""
4570
 
4571
+ #: extensions/email-notifications/classes/Notifications.php:1015
4572
  msgid "404 HTTP errors (Event ID 6007)"
4573
  msgstr ""
4574
 
4575
+ #: extensions/email-notifications/classes/Notifications.php:1030
4576
  msgid "More than"
4577
  msgstr ""
4578
 
4579
+ #: extensions/email-notifications/classes/Notifications.php:1032
4580
  msgid "404 HTTP errors are generated by the same IP address (Event ID 6023)"
4581
  msgstr ""
4582
 
4583
+ #: extensions/email-notifications/classes/Notifications.php:1047
4584
  msgid "WordPress Install Changes"
4585
  msgstr ""
4586
 
4587
+ #: extensions/email-notifications/classes/Notifications.php:1056
4588
  msgid "WordPress was updated (Event ID 6004)"
4589
  msgstr ""
4590
 
4591
+ #: extensions/email-notifications/classes/Notifications.php:1071
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4592
  msgid "Plugin Changes Notifications"
4593
  msgstr ""
4594
 
4595
+ #: extensions/email-notifications/classes/Notifications.php:1079
4596
  msgid "New plugin is installed (Event ID 5000)"
4597
  msgstr ""
4598
 
4599
+ #: extensions/email-notifications/classes/Notifications.php:1092
4600
  msgid "Installed plugin is activated (Event ID 5001)"
4601
  msgstr ""
4602
 
4603
+ #: extensions/email-notifications/classes/Notifications.php:1105
4604
  msgid "Plugin file is modified (Event ID 2051)"
4605
  msgstr ""
4606
 
4607
+ #: extensions/email-notifications/classes/Notifications.php:1118
4608
  msgid "Installed plugin is deactivated (Event ID 5002)"
4609
  msgstr ""
4610
 
4611
+ #: extensions/email-notifications/classes/Notifications.php:1131
4612
  msgid "A plugin is uninstalled (Event ID 5003)"
4613
  msgstr ""
4614
 
4615
+ #: extensions/email-notifications/classes/Notifications.php:1144
4616
  msgid "Installed plugin is upgraded (Event ID 5004)"
4617
  msgstr ""
4618
 
4619
+ #: extensions/email-notifications/classes/Notifications.php:1158
4620
  msgid "Themes Changes Notifications"
4621
  msgstr ""
4622
 
4623
+ #: extensions/email-notifications/classes/Notifications.php:1167
4624
  msgid "New theme is installed (Event ID 5005)"
4625
  msgstr ""
4626
 
4627
+ #: extensions/email-notifications/classes/Notifications.php:1182
4628
  msgid "Installed theme is activated (Event ID 5006)"
4629
  msgstr ""
4630
 
4631
+ #: extensions/email-notifications/classes/Notifications.php:1197
4632
  msgid "Theme file is modified (Event ID 2046)"
4633
  msgstr ""
4634
 
4635
+ #: extensions/email-notifications/classes/Notifications.php:1212
4636
  msgid "A theme is uninstalled (Event ID 5007)"
4637
  msgstr ""
4638
 
4639
+ #: extensions/email-notifications/classes/Notifications.php:1227
4640
  msgid "Installed theme is updated (Event ID 5031)"
4641
  msgstr ""
4642
 
4643
+ #: extensions/email-notifications/classes/Notifications.php:1242
4644
  msgid "Critical Events"
4645
  msgstr ""
4646
 
4647
+ #: extensions/email-notifications/classes/Notifications.php:1250
4648
  msgid "Critical Event is Generated"
4649
  msgstr ""
4650
 
4651
+ #: extensions/email-notifications/classes/Notifications.php:1305
4652
+ msgid "User Activity"
4653
+ msgstr ""
4654
+
4655
+ #: extensions/email-notifications/classes/Notifications.php:1314
4656
  msgid "User logs in (Event ID 1000)"
4657
  msgstr ""
4658
 
4659
+ #: extensions/email-notifications/classes/Notifications.php:1329
4660
  msgid "First time user logs in"
4661
  msgstr ""
4662
 
4663
+ #: extensions/email-notifications/classes/Notifications.php:1344
4664
  msgid "User changed password (Event ID 4003)"
4665
  msgstr ""
4666
 
4667
+ #: extensions/email-notifications/classes/Notifications.php:1359
4668
  msgid "User Profile Changes"
4669
  msgstr ""
4670
 
4671
+ #: extensions/email-notifications/classes/Notifications.php:1368
4672
  msgid "User changed email address (Event IDs 4005, 4006)"
4673
  msgstr ""
4674
 
4675
+ #: extensions/email-notifications/classes/Notifications.php:1383
4676
  msgid "User's role has changed (Event ID 4002)"
4677
  msgstr ""
4678
 
4679
+ #: extensions/email-notifications/classes/Notifications.php:1398
4680
  msgid "User changed the password of another user (Event ID 4004)"
4681
  msgstr ""
4682
 
4683
+ #: extensions/email-notifications/classes/Notifications.php:1413
4684
  msgid "New user is created (Event IDs 4000, 4001, 4012)"
4685
  msgstr ""
4686
 
4687
+ #: extensions/email-notifications/classes/Notifications.php:1475
4688
  msgid "New content is published (Event ID 2001)"
4689
  msgstr ""
4690
 
4691
+ #: extensions/email-notifications/classes/Notifications.php:1490
4692
  msgid "Content in a post, page or custom post type is changed (Event ID 2065)"
4693
  msgstr ""
4694
 
4695
+ #: extensions/email-notifications/classes/Notifications.php:1505
4696
+ msgid "Anything but content in a post is changed (such as date, category, status, parent page etc)"
 
 
4697
  msgstr ""
4698
 
4699
+ #: extensions/email-notifications/classes/Notifications.php:1570
4700
  msgid "User granted super admin (Event ID 4008)"
4701
  msgstr ""
4702
 
4703
+ #: extensions/email-notifications/classes/Notifications.php:1586
4704
  msgid "User revoked super admin (Event ID 4009)"
4705
  msgstr ""
4706
 
4707
+ #: extensions/email-notifications/classes/Notifications.php:1603
4708
  msgid "User added to site (Event ID 4010)"
4709
  msgstr ""
4710
 
4711
+ #: extensions/email-notifications/classes/Notifications.php:1620
4712
  msgid "User removed from site (Event ID 4011)"
4713
  msgstr ""
4714
 
4715
+ #: extensions/email-notifications/classes/Notifications.php:1637
4716
  msgid "Site changes"
4717
  msgstr ""
4718
 
4719
+ #: extensions/email-notifications/classes/Notifications.php:1654
4720
  msgid "Activated theme on network (Event ID 5008)"
4721
  msgstr ""
4722
 
4723
+ #: extensions/email-notifications/classes/Notifications.php:1671
4724
  msgid "Deactivated theme from network (Event ID 5009)"
4725
  msgstr ""
4726
 
4727
+ #: extensions/email-notifications/classes/Notifications.php:1737
4728
  msgid "Any product change"
4729
  msgstr ""
4730
 
4731
+ #: extensions/email-notifications/classes/Notifications.php:1754
4732
  msgid "Any store settings change"
4733
  msgstr ""
4734
 
4735
+ #: extensions/email-notifications/classes/Notifications.php:1771
4736
  msgid "Any coupon code changes"
4737
  msgstr ""
4738
 
4739
+ #: extensions/email-notifications/classes/Notifications.php:1788
4740
  msgid "Any orders changes"
4741
  msgstr ""
4742
 
4743
+ #. translators: WSAL Notifications Documentation hyperlink
4744
+ #: extensions/email-notifications/classes/Notifications.php:1843
4745
+ msgid "Use the trigger builder to build any type of criteria that triggers email and / or SMS notifications. Refer to the %s for more detailed information."
 
 
4746
  msgstr ""
4747
 
4748
+ #: extensions/email-notifications/classes/Notifications.php:1844
4749
  msgid "WordPress notifications documentation"
4750
  msgstr ""
4751
 
4752
+ #: extensions/email-notifications/classes/Notifications.php:2000
4753
+ msgid "No notifications found. Click the <code>Add New</code> button above to create one."
4754
+ msgstr ""
4755
+
4756
+ #: extensions/email-notifications/classes/Notifications.php:1986
4757
+ msgid "No notifications found to match your search."
4758
  msgstr ""
4759
 
4760
+ #: extensions/email-notifications/classes/Notifications.php:1993, extensions/email-notifications/classes/Notifications.php:1995, extensions/email-notifications/classes/Notifications.php:1870, extensions/email-notifications/classes/Notifications.php:1872
 
 
 
4761
  msgid "Search Notifications"
4762
  msgstr ""
4763
 
4764
+ #: extensions/email-notifications/classes/Notifications.php:1861, extensions/reports/classes/HtmlReportGenerator.php:175, extensions/reports/classes/HtmlReportGenerator.php:179, extensions/user-sessions/classes/View/Options/Policies.php:24
4765
+ msgid "All"
4766
+ msgstr ""
4767
+
4768
+ #: extensions/email-notifications/classes/Notifications.php:1883, extensions/email-notifications/classes/Notifications.php:1961
4769
  msgid "Bulk actions"
4770
  msgstr ""
4771
 
4772
+ #: extensions/email-notifications/classes/Notifications.php:1884, extensions/email-notifications/classes/Notifications.php:1945, extensions/email-notifications/classes/Notifications.php:1962, extensions/external-db/classes/Connections.php:432, extensions/external-db/classes/Mirroring.php:185, extensions/external-db/classes/Settings.php:1347
 
 
 
 
 
4773
  msgid "Enable"
4774
  msgstr ""
4775
 
4776
+ #: extensions/email-notifications/classes/Notifications.php:1885, extensions/email-notifications/classes/Notifications.php:1943, extensions/email-notifications/classes/Notifications.php:1963, extensions/external-db/classes/Mirroring.php:188, extensions/external-db/classes/Settings.php:1350
 
 
 
 
4777
  msgid "Disable"
4778
  msgstr ""
4779
 
4780
+ #: extensions/email-notifications/classes/Notifications.php:1888, extensions/email-notifications/classes/Notifications.php:1966
 
4781
  msgid "Apply"
4782
  msgstr ""
4783
 
4784
+ #: extensions/email-notifications/classes/Notifications.php:1896, extensions/email-notifications/classes/Notifications.php:1907, extensions/reports/inc/wsal-reporting-view.inc.php:735
4785
+ msgid "Select All"
4786
+ msgstr ""
4787
+
4788
+ #: extensions/email-notifications/classes/Notifications.php:1933
4789
  msgid "Select"
4790
  msgstr ""
4791
 
4792
+ #: extensions/email-notifications/classes/Notifications.php:1937, extensions/email-notifications/classes/Notifications.php:1939
 
4793
  msgid "Edit this notification"
4794
  msgstr ""
4795
 
4796
+ #: extensions/email-notifications/classes/Notifications.php:1939
4797
  msgid "Edit"
4798
  msgstr ""
4799
 
4800
+ #: extensions/email-notifications/classes/Notifications.php:1945
4801
+ msgid "Enable this notification"
4802
  msgstr ""
4803
 
4804
+ #: extensions/email-notifications/classes/Notifications.php:1943
4805
+ msgid "Disable this notification"
4806
  msgstr ""
4807
 
4808
+ #: extensions/email-notifications/classes/Notifications.php:1949
4809
  msgid "Delete this notification"
4810
  msgstr ""
4811
 
4812
+ #: extensions/email-notifications/classes/Notifications.php:1952
4813
  msgid "Send Test Email"
4814
  msgstr ""
4815
 
4816
+ #: extensions/email-notifications/classes/Notifications.php:1953
4817
  msgid "Send Test SMS"
4818
  msgstr ""
4819
 
4820
+ #: extensions/email-notifications/classes/Notifications.php:2024
4821
+ msgid "You can modify the default notification email template from here."
4822
  msgstr ""
4823
 
4824
+ #: extensions/email-notifications/classes/Notifications.php:2026
4825
+ msgid "This is the default template. You can override this default template with notification specific template which you can modify when using the Trigger Builder."
 
 
4826
  msgstr ""
4827
 
4828
+ #: extensions/email-notifications/classes/Notifications.php:2020
4829
  msgid "You can modify the default notification SMS template from here."
4830
  msgstr ""
4831
 
4832
+ #: extensions/email-notifications/classes/Notifications.php:2022
4833
+ msgid "This is the default template for SMS notifications. The maximum number of characters for a SMS is 160, so if you configure longer notifications you will be charged for multiple SMS notifications."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4834
  msgstr ""
4835
 
4836
+ #: extensions/email-notifications/classes/Notifications.php:2062
4837
  msgid "Subject"
4838
  msgstr ""
4839
 
4840
+ #: extensions/email-notifications/classes/Notifications.php:2067
4841
  msgid "Body"
4842
  msgstr ""
4843
 
4844
+ #: extensions/email-notifications/classes/Notifications.php:2092
4845
  msgid "HTML is accepted."
4846
  msgstr ""
4847
 
4848
+ #: extensions/email-notifications/classes/Notifications.php:2093
4849
  msgid "Available template tags:"
4850
  msgstr ""
4851
 
4852
+ #: extensions/email-notifications/classes/Notifications.php:2115
4853
  msgid "Shorten URLs"
4854
  msgstr ""
4855
 
4856
+ #: extensions/email-notifications/classes/Notifications.php:2120
4857
  msgid "Shorten URLs with Bit.ly"
4858
  msgstr ""
4859
 
4860
+ #: extensions/email-notifications/classes/Notifications.php:2123
4861
  msgid "Bit.ly Access Token"
4862
  msgstr ""
4863
 
4864
+ #. translators: Bit.ly documentation hyperlink
4865
+ #: extensions/email-notifications/classes/Notifications.php:2128
4866
+ msgid "The URL shortener works for URLs in the {message} variable and will not shorten the URL of the website in the variable {site}. Shorten all URLs in the message using the %s."
 
 
 
4867
  msgstr ""
4868
 
4869
+ #: extensions/email-notifications/classes/Notifications.php:2128
4870
  msgid "Bit.ly URL Shortener API"
4871
  msgstr ""
4872
 
4873
+ #: extensions/email-notifications/classes/Notifications.php:2170
4874
+ msgid "Template successfully saved."
4875
  msgstr ""
4876
 
4877
+ #: extensions/email-notifications/classes/Notifications.php:2168
4878
+ msgid "Template could not be saved."
4879
  msgstr ""
4880
 
4881
+ #: extensions/email-notifications/classes/Notifications.php:2288, extensions/email-notifications/classes/Notifications.php:2394
 
4882
  msgid "You do not have sufficient permissions to perform this test."
4883
  msgstr ""
4884
 
4885
+ #: extensions/email-notifications/classes/Notifications.php:2299, extensions/email-notifications/classes/Notifications.php:2400
4886
+ msgid "Nonce verification failed. Please refresh and try again."
4887
  msgstr ""
4888
 
4889
+ #: extensions/email-notifications/classes/Notifications.php:2320
4890
+ msgid "Email address is invalid."
4891
  msgstr ""
4892
 
4893
+ #: extensions/email-notifications/classes/Notifications.php:2316
4894
+ msgid "Test email notification from the WP Activity Log plugin."
4895
  msgstr ""
4896
 
4897
+ #: extensions/email-notifications/classes/Notifications.php:2317
4898
+ msgid "This is a test email notification sent with the WP Activity Log plugin."
4899
  msgstr ""
4900
 
4901
+ #: extensions/email-notifications/classes/Notifications.php:2330
4902
  msgid "Phone number is invalid."
4903
  msgstr ""
4904
 
4905
+ #: extensions/email-notifications/classes/Notifications.php:2327
4906
+ msgid "This is a test SMS notification sent with the WP Activity Log plugin."
 
4907
  msgstr ""
4908
 
4909
+ #. translators: Support email hyperlink
4910
+ #: extensions/email-notifications/classes/Notifications.php:2354
4911
+ msgid "There are some problems sending the test email / SMS. Please contact us on %s to assist you with this problem."
4912
  msgstr ""
4913
 
4914
+ #: extensions/email-notifications/classes/Notifications.php:2351, extensions/email-notifications/classes/Notifications.php:2446
4915
+ msgid "There was a problem sending the SMS. Below is the error we got back from the SMS provider. Please contact us on %s if you need assistance with this issue."
4916
  msgstr ""
4917
 
4918
+ #: extensions/email-notifications/classes/Notifications.php:2342
4919
+ msgid "Email / SMS sent successfully."
 
 
 
 
4920
  msgstr ""
4921
 
4922
+ #: extensions/email-notifications/classes/Notifications.php:2339, extensions/email-notifications/classes/Notifications.php:2448
4923
+ msgid "SMS sent successfully."
 
 
 
4924
  msgstr ""
4925
 
4926
+ #: extensions/email-notifications/classes/Notifications.php:2336, extensions/email-notifications/classes/Notifications.php:2427
4927
+ msgid "Email sent successfully."
 
4928
  msgstr ""
4929
 
4930
+ #: extensions/email-notifications/classes/Notifications.php:2454
4931
+ msgid "Unknown notification type."
4932
  msgstr ""
4933
 
4934
+ #: extensions/email-notifications/classes/Notifications.php:2451
4935
+ msgid "There are some problems sending the test SMS. Please contact us on %s to assist you with this problem."
 
 
 
4936
  msgstr ""
4937
 
4938
+ #: extensions/email-notifications/classes/Notifications.php:2443
4939
  msgid "Mobile number is not set for this notification."
4940
  msgstr ""
4941
 
4942
+ #: extensions/email-notifications/classes/Notifications.php:2430
4943
+ msgid "There are some problems sending the test email. Please contact us on %s to assist you with this problem."
 
 
 
4944
  msgstr ""
4945
 
4946
+ #: extensions/email-notifications/classes/Notifications.php:2410
4947
+ msgid "Unknown notification."
4948
  msgstr ""
4949
 
4950
+ #: extensions/email-notifications/classes/Notifier.php:762, extensions/reports/classes/Common.php:502
 
4951
  msgid "View the Forum in editor"
4952
  msgstr ""
4953
 
4954
+ #: extensions/email-notifications/classes/Notifier.php:765, extensions/reports/classes/Common.php:505
 
4955
  msgid "View the Topic in editor"
4956
  msgstr ""
4957
 
4963
  msgid "SMS Provider"
4964
  msgstr ""
4965
 
4966
+ #: extensions/email-notifications/classes/SMSProviderSettings.php:148, extensions/email-notifications/classes/SMSProviderSettings.php:146, extensions/external-db/classes/Connections.php:138
 
 
4967
  msgid "Test"
4968
  msgstr ""
4969
 
4970
  #: extensions/email-notifications/classes/SMSProviderSettings.php:169
4971
+ msgid "Configure your Twilio account details to be able to configure and send SMS notifications."
 
 
4972
  msgstr ""
4973
 
4974
+ #. translators: Upgrade now hyperlink.
4975
  #: extensions/email-notifications/classes/SMSProviderSettings.php:172
4976
+ msgid "SMS notifications are available in the Professional and Business Plans. %s to configure and receive SMS notifications."
 
 
 
4977
  msgstr ""
4978
 
4979
  #: extensions/email-notifications/classes/SMSProviderSettings.php:172
4988
  msgid "Enter Account SID"
4989
  msgstr ""
4990
 
4991
+ #. translators: Twilio console link
4992
+ #. translators: Twilio console link
4993
+ #: extensions/email-notifications/classes/SMSProviderSettings.php:185, extensions/email-notifications/classes/SMSProviderSettings.php:200
4994
  msgid "To view API credentials visit %s"
4995
  msgstr ""
4996
 
5006
  msgid "Twilio number / Alphanumeric ID"
5007
  msgstr ""
5008
 
5009
+ #: extensions/email-notifications/classes/SMSProviderSettings.php:211, extensions/email-notifications/classes/SMSProviderSettings.php:250
 
5010
  msgid "+16175551212"
5011
  msgstr ""
5012
 
5013
  #: extensions/email-notifications/classes/SMSProviderSettings.php:212
5014
+ msgid "Specify a Twilio phone number including the country code (e.g. +16175551212) or a valid Alphanumeric ID (e.g. WSAL)"
 
 
5015
  msgstr ""
5016
 
5017
  #: extensions/email-notifications/classes/SMSProviderSettings.php:247
5030
  msgid "The text of the message you want to send, limited to 1600 characters."
5031
  msgstr ""
5032
 
5033
+ #: extensions/external-db/classes/Connections.php:18, extensions/external-db/classes/Mirroring.php:18, extensions/external-db/classes/Settings.php:17
 
 
5034
  msgid "You are not allowed to view this page."
5035
  msgstr ""
5036
 
5037
+ #. translators: 1- a string wrapped in a link saying to create or configure databases.
5038
  #: extensions/external-db/classes/Connections.php:80
5039
+ msgid "In this section you can %1$s and services connections. These connections can be used as external activity log storage, activity log archive or to mirror the activity log to it. In use connections cannot be deleted."
 
 
 
 
5040
  msgstr ""
5041
 
5042
  #: extensions/external-db/classes/Connections.php:84
5047
  msgid "Create a Connection"
5048
  msgstr ""
5049
 
5050
+ #: extensions/external-db/classes/Connections.php:91, extensions/external-db/classes/Settings.php:104
 
5051
  msgid "Connections"
5052
  msgstr ""
5053
 
5054
+ #: extensions/external-db/classes/Connections.php:96, extensions/external-db/classes/Mirroring.php:124
 
5055
  msgid "Type"
5056
  msgstr ""
5057
 
5059
  msgid "Used for"
5060
  msgstr ""
5061
 
5062
+ #: extensions/external-db/classes/Connections.php:123, extensions/external-db/classes/Mirroring.php:198
 
 
 
 
 
5063
  msgid "Configure"
5064
  msgstr ""
5065
 
5067
  msgid "Send a test message"
5068
  msgstr ""
5069
 
5070
+ #: extensions/external-db/classes/Connections.php:106
5071
+ msgid "No connections so far."
 
 
5072
  msgstr ""
5073
 
5074
+ #: extensions/external-db/classes/Connections.php:175, extensions/external-db/classes/Mirroring.php:252
 
5075
  msgid "Step 1"
5076
  msgstr ""
5077
 
5078
+ #: extensions/external-db/classes/Connections.php:176, extensions/external-db/classes/Mirroring.php:253
 
5079
  msgid "Step 2"
5080
  msgstr ""
5081
 
5082
+ #: extensions/external-db/classes/Connections.php:177, extensions/external-db/classes/Mirroring.php:254
 
5083
  msgid "Step 3"
5084
  msgstr ""
5085
 
5103
  msgid "Syslog Server"
5104
  msgstr ""
5105
 
5106
+ #: extensions/external-db/classes/Connections.php:195, extensions/external-db/classes/Mirroring.php:102
 
5107
  msgid "Slack"
5108
  msgstr ""
5109
 
5110
+ #: extensions/external-db/classes/Connections.php:196, extensions/external-db/classes/Mirroring.php:107
5111
+ msgid "Papertrail"
5112
+ msgstr ""
5113
+
5114
+ #: extensions/external-db/classes/Connections.php:208
5115
+ msgid "Name the connection"
5116
+ msgstr ""
5117
+
5118
+ #: extensions/external-db/classes/Connections.php:209
5119
+ msgid "Please specify a friendly name for the connection. Connection names can be 25 characters long and can only contain letters, numbers and underscores."
5120
+ msgstr ""
5121
+
5122
+ #: extensions/external-db/classes/Connections.php:213
5123
+ msgid "Save Connection"
5124
+ msgstr ""
5125
+
5126
+ #: extensions/external-db/classes/Connections.php:233, extensions/external-db/classes/Connections.php:263
5127
+ msgid "Configure the connection"
5128
+ msgstr ""
5129
+
5130
+ #: extensions/external-db/classes/Connections.php:234, extensions/external-db/classes/Connections.php:264
5131
+ msgid "Configure the connection details."
5132
+ msgstr ""
5133
+
5134
+ #: extensions/external-db/classes/Connections.php:249
5135
+ msgid "No connection name specified!"
5136
+ msgstr ""
5137
+
5138
+ #: extensions/external-db/classes/Connections.php:256
5139
+ msgid "Configure Connection → "
5140
+ msgstr ""
5141
+
5142
+ #: extensions/external-db/classes/Connections.php:487
5143
+ msgid "Bot Name"
5144
+ msgstr ""
5145
+
5146
+ #: extensions/external-db/classes/Connections.php:492
5147
+ msgid "* Invalid Bot Name"
5148
+ msgstr ""
5149
+
5150
+ #: extensions/external-db/classes/Connections.php:493
5151
+ msgid "The name to be used in the slack channel for all the WordPress activity log events sent from the plugin."
5152
+ msgstr ""
5153
+
5154
+ #: extensions/external-db/classes/Connections.php:498
5155
+ msgid "WebHook URL"
5156
+ msgstr ""
5157
+
5158
+ #: extensions/external-db/classes/Connections.php:503
5159
+ msgid "* Invalid WebHook URL"
5160
+ msgstr ""
5161
+
5162
+ #. translators: Slack help HTML link.
5163
+ #: extensions/external-db/classes/Connections.php:507
5164
+ msgid "If you are not familiar with incoming WebHooks for Slack please refer to %s."
5165
+ msgstr ""
5166
+
5167
+ #: extensions/external-db/classes/Connections.php:507
5168
+ msgid "Slack help"
5169
+ msgstr ""
5170
+
5171
+ #: extensions/external-db/classes/Connections.php:447
5172
+ msgid "Syslog Location"
5173
+ msgstr ""
5174
+
5175
+ #: extensions/external-db/classes/Connections.php:453
5176
+ msgid "Write to local syslog file"
5177
+ msgstr ""
5178
+
5179
+ #: extensions/external-db/classes/Connections.php:458
5180
+ msgid "Send messages to remote syslog server"
5181
  msgstr ""
5182
 
5183
+ #: extensions/external-db/classes/Connections.php:462
5184
+ msgid "IP Address / Hostname"
5185
  msgstr ""
5186
 
5187
+ #: extensions/external-db/classes/Connections.php:465
5188
+ msgid "* Invalid IP/Hostname"
 
 
5189
  msgstr ""
5190
 
5191
+ #: extensions/external-db/classes/Connections.php:469
5192
+ msgid "Port"
5193
  msgstr ""
5194
 
5195
+ #: extensions/external-db/classes/Connections.php:472
5196
+ msgid "* Invalid Port"
 
5197
  msgstr ""
5198
 
5199
+ #: extensions/external-db/classes/Connections.php:409
5200
+ msgid "Destination"
 
5201
  msgstr ""
5202
 
5203
+ #: extensions/external-db/classes/Connections.php:413
5204
+ msgid "* Invalid Papertrail Destination"
5205
  msgstr ""
5206
 
5207
+ #: extensions/external-db/classes/Connections.php:418
5208
+ msgid "Specify your destination. You can find your Papertrail Destination in the %s section of your Papertrail account page. It should have the following format: logs4.papertrailapp.com:54321"
5209
  msgstr ""
5210
 
5211
+ #: extensions/external-db/classes/Connections.php:419
5212
+ msgid "Log Destinations"
5213
  msgstr ""
5214
 
5215
+ #: extensions/external-db/classes/Connections.php:427
5216
+ msgid "Colorization"
5217
  msgstr ""
5218
 
5219
  #: extensions/external-db/classes/Connections.php:313
5221
  msgstr ""
5222
 
5223
  #: extensions/external-db/classes/Connections.php:317
5224
+ msgid "Specify the name of the database where you will store the WordPress activity log."
 
 
5225
  msgstr ""
5226
 
5227
  #: extensions/external-db/classes/Connections.php:322
5237
  msgstr ""
5238
 
5239
  #: extensions/external-db/classes/Connections.php:335
5240
+ msgid "Specify the password each time you want to submit new changes. For security reasons, the plugin does not store the password in this form."
 
 
5241
  msgstr ""
5242
 
5243
  #: extensions/external-db/classes/Connections.php:340
5253
  msgstr ""
5254
 
5255
  #: extensions/external-db/classes/Connections.php:359
5256
+ msgid "Specify a prefix for the database tables of the activity log. Ideally this prefix should be different from the one you use for WordPress so it is not guessable."
 
 
 
5257
  msgstr ""
5258
 
5259
  #: extensions/external-db/classes/Connections.php:363
5264
  msgid "SSL"
5265
  msgstr ""
5266
 
5267
+ #: extensions/external-db/classes/Connections.php:374, extensions/external-db/classes/Connections.php:385
 
5268
  msgid "Enable to use SSL to connect with the MySQL server."
5269
  msgstr ""
5270
 
5284
  msgid "Client Certificate (--ssl-key)"
5285
  msgstr ""
5286
 
5287
+ #: extensions/external-db/classes/Connections.php:296
5288
+ msgid "Connection Name"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5289
  msgstr ""
5290
 
5291
+ #: extensions/external-db/classes/Connections.php:300
5292
+ msgid "* Invalid Connection Name"
5293
  msgstr ""
5294
 
5295
+ #: extensions/external-db/classes/Connections.php:554, extensions/external-db/classes/Mirroring.php:586
 
5296
  msgid "Connections Wizard"
5297
  msgstr ""
5298
 
5299
+ #: extensions/external-db/classes/Connections.php:555, extensions/external-db/classes/Mirroring.php:588
 
5300
  msgid "Testing..."
5301
  msgstr ""
5302
 
5303
+ #: extensions/external-db/classes/Connections.php:557, extensions/external-db/classes/Mirroring.php:592
 
 
 
 
 
 
 
5304
  msgid "Connection Failed!"
5305
  msgstr ""
5306
 
5307
+ #: extensions/external-db/classes/Connections.php:558, extensions/external-db/classes/Mirroring.php:593
 
5308
  msgid "Connected"
5309
  msgstr ""
5310
 
5311
+ #: extensions/external-db/classes/Connections.php:559, extensions/external-db/classes/Mirroring.php:597
 
5312
  msgid "Are you sure that you want to delete this connection?"
5313
  msgstr ""
5314
 
5315
+ #: extensions/external-db/classes/Connections.php:564, extensions/external-db/classes/Mirroring.php:600
 
5316
  msgid "Test connection and continue"
5317
  msgstr ""
5318
 
5320
  msgid "Connection failed. Please check the configuration again."
5321
  msgstr ""
5322
 
5323
+ #: extensions/external-db/classes/Connections.php:954
5324
+ msgid "Unknown connection type."
 
 
 
5325
  msgstr ""
5326
 
5327
+ #: extensions/external-db/classes/Connections.php:922
5328
+ msgid "WP Activity Log connection testing message."
5329
  msgstr ""
5330
 
5331
+ #: extensions/external-db/classes/Connections.php:939
5332
+ msgid "Successfully connected to Slack."
5333
  msgstr ""
5334
 
5335
+ #: extensions/external-db/classes/Connections.php:912
5336
+ msgid "Syslog connection testing failed."
 
5337
  msgstr ""
5338
 
5339
+ #: extensions/external-db/classes/Connections.php:905, extensions/external-db/classes/Connections.php:883
5340
+ msgid "Successfully connected to Syslog."
5341
  msgstr ""
5342
 
5343
+ #: extensions/external-db/classes/Connections.php:884
5344
+ msgid "Message sent"
5345
  msgstr ""
5346
 
5347
+ #: extensions/external-db/classes/Connections.php:843
5348
+ msgid "socket_sendto was unable to send activity log events."
5349
  msgstr ""
5350
 
5351
+ #: extensions/external-db/classes/Connections.php:836
5352
+ msgid "Successfully connected to Papertrail App."
5353
  msgstr ""
5354
 
5355
+ #: extensions/external-db/classes/Connections.php:804, extensions/external-db/classes/Connections.php:1014, extensions/external-db/classes/Settings.php:1141, extensions/external-db/classes/Settings.php:1109
5356
+ msgid "Successfully connected to database."
5357
  msgstr ""
5358
 
5359
  #: extensions/external-db/classes/Mirroring.php:97
5365
  msgstr ""
5366
 
5367
  #: extensions/external-db/classes/Mirroring.php:116
5368
+ msgid "In this section you can configure the mirroring of the WordPress to external databases, services and servers. You can configure multiple mirroring rules."
 
 
5369
  msgstr ""
5370
 
5371
  #: extensions/external-db/classes/Mirroring.php:117
5376
  msgid "The WordPress activity log is currently being mirrored to:"
5377
  msgstr ""
5378
 
5379
+ #: extensions/external-db/classes/Mirroring.php:125, extensions/external-db/classes/Mirroring.php:397, extensions/reports/inc/wsal-reporting-view.inc.php:1424
 
 
5380
  msgid "Frequency"
5381
  msgstr ""
5382
 
5383
+ #: extensions/external-db/classes/Mirroring.php:164, extensions/external-db/classes/Mirroring.php:401, extensions/external-db/classes/Settings.php:928
 
 
 
 
 
 
 
5384
  msgid "15 minutes"
5385
  msgstr ""
5386
 
5387
+ #: extensions/external-db/classes/Mirroring.php:167, extensions/external-db/classes/Mirroring.php:402, extensions/external-db/classes/Settings.php:931
 
 
5388
  msgid "1 hour"
5389
  msgstr ""
5390
 
5391
+ #: extensions/external-db/classes/Mirroring.php:170, extensions/external-db/classes/Mirroring.php:403, extensions/external-db/classes/Settings.php:934
 
 
5392
  msgid "6 hours"
5393
  msgstr ""
5394
 
5395
+ #: extensions/external-db/classes/Mirroring.php:173, extensions/external-db/classes/Mirroring.php:404, extensions/external-db/classes/Settings.php:937
 
 
5396
  msgid "12 hours"
5397
  msgstr ""
5398
 
5399
+ #: extensions/external-db/classes/Mirroring.php:176, extensions/external-db/classes/Mirroring.php:405, extensions/external-db/classes/Settings.php:940
 
 
5400
  msgid "24 hours"
5401
  msgstr ""
5402
 
5404
  msgid "Run Now"
5405
  msgstr ""
5406
 
5407
+ #: extensions/external-db/classes/Mirroring.php:213, extensions/external-db/classes/Mirroring.php:135
5408
+ msgid "No mirrors so far."
5409
+ msgstr ""
5410
+
5411
  #: extensions/external-db/classes/Mirroring.php:262
5412
  msgid "Select the connection where to mirror to the activity log"
5413
  msgstr ""
5414
 
5415
+ #: extensions/external-db/classes/Mirroring.php:263, extensions/external-db/classes/Mirroring.php:323
5416
+ msgid "Please specify a friendly name for the mirroring connection. Connection names can be 25 characters long, and can only contain letters, numbers and underscores."
 
 
 
 
5417
  msgstr ""
5418
 
5419
  #: extensions/external-db/classes/Mirroring.php:265
5420
+ msgid "Select one of the connections you have configured to where you want to mirror the activity log."
 
 
5421
  msgstr ""
5422
 
5423
  #: extensions/external-db/classes/Mirroring.php:269
5433
  msgstr ""
5434
 
5435
  #: extensions/external-db/classes/Mirroring.php:276
5436
+ msgid "Tick this checkbox to enable the mirror and start sending data once set up."
 
5437
  msgstr ""
5438
 
5439
  #: extensions/external-db/classes/Mirroring.php:280
5441
  msgstr ""
5442
 
5443
  #: extensions/external-db/classes/Mirroring.php:281
5444
+ msgid "Configure any filtering you’d like to apply to this mirroring connection:"
 
5445
  msgstr ""
5446
 
5447
  #: extensions/external-db/classes/Mirroring.php:285
5464
  msgid "Configure the mirror details."
5465
  msgstr ""
5466
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5467
  #: extensions/external-db/classes/Mirroring.php:431
5468
  msgid "Mirror Events"
5469
  msgstr ""
5480
  msgid "Send all events BUT those with these IDs:"
5481
  msgstr ""
5482
 
5483
+ #. translators: Events and Event IDs hyperlink.
5484
  #: extensions/external-db/classes/Mirroring.php:518
 
5485
  msgid "Refer to the %s for more information."
5486
  msgstr ""
5487
 
5489
  msgid "list of events and events IDs"
5490
  msgstr ""
5491
 
5492
+ #: extensions/external-db/classes/Mirroring.php:362, extensions/external-db/classes/Settings.php:504, extensions/external-db/classes/Settings.php:685
5493
+ msgid "Connection"
5494
+ msgstr ""
5495
+
5496
+ #: extensions/external-db/classes/Mirroring.php:373, extensions/external-db/classes/Settings.php:1175
5497
+ msgid "Select a connection"
5498
+ msgstr ""
5499
+
5500
+ #: extensions/external-db/classes/Mirroring.php:348
5501
+ msgid "Mirror Name"
5502
+ msgstr ""
5503
+
5504
+ #: extensions/external-db/classes/Mirroring.php:352
5505
+ msgid "* Invalid Mirror Name"
5506
+ msgstr ""
5507
+
5508
  #: extensions/external-db/classes/Mirroring.php:587
5509
  msgid "Mirroring Wizard"
5510
  msgstr ""
5533
  msgid "Are you sure that you want to delete this mirror?"
5534
  msgstr ""
5535
 
5536
+ #: extensions/external-db/classes/Mirroring.php:599, extensions/reports/inc/wsal-reporting-view.inc.php:987
 
5537
  msgid "Select Event Code(s)"
5538
  msgstr ""
5539
 
5545
  msgid "DB/Archive/Mirror"
5546
  msgstr ""
5547
 
 
 
 
 
5548
  #: extensions/external-db/classes/Settings.php:304
5549
  msgid "An error occurred while sending events to database."
5550
  msgstr ""
5551
 
5552
+ #: extensions/external-db/classes/Settings.php:297
5553
+ msgid "Events successfully sent to database."
5554
+ msgstr ""
5555
+
5556
+ #: extensions/external-db/classes/Settings.php:400
5557
  msgid "Mirror connection test failed."
5558
  msgstr ""
5559
 
5560
+ #: extensions/external-db/classes/Settings.php:444
5561
  msgid "Please do not close this window while migrating events."
5562
  msgstr ""
5563
 
5564
+ #. translators: 1 is the help type being linked
5565
+ #. translators: 1 is the help type being linked
5566
+ #: extensions/external-db/classes/Settings.php:488, extensions/external-db/classes/Settings.php:669
5567
  msgid "Read more on %1$s."
5568
  msgstr ""
5569
 
5570
+ #: extensions/external-db/classes/Settings.php:492
5571
  msgid "external storage for activity logs"
5572
  msgstr ""
5573
 
5574
+ #: extensions/external-db/classes/Settings.php:496
5575
+ msgid "In this section you can configure the plugin to store the WordPress activity log in an external storage rather than the WordPress database. This could be another database on a remote server."
 
 
 
5576
  msgstr ""
5577
 
5578
+ #: extensions/external-db/classes/Settings.php:502
5579
  msgid "Store WordPress Activity Log in this External Storage"
5580
  msgstr ""
5581
 
5582
+ #: extensions/external-db/classes/Settings.php:511
5583
  msgid "Use buffer"
5584
  msgstr ""
5585
 
5586
+ #: extensions/external-db/classes/Settings.php:520
5587
+ msgid "Send the events through the buffer so if the connection to the external database is slow the performance of the website is not affected."
 
 
5588
  msgstr ""
5589
 
5590
+ #: extensions/external-db/classes/Settings.php:523
5591
+ msgid "When the buffer is enabled events are sent to the database every 10 minutes, so the activity log is not updated in real time. Use the button below to clear the buffer and send the events now."
 
 
 
5592
  msgstr ""
5593
 
5594
+ #: extensions/external-db/classes/Settings.php:526
5595
  msgid "Send Events to Database"
5596
  msgstr ""
5597
 
5598
+ #: extensions/external-db/classes/Settings.php:531
5599
  msgid "Current Connection Details"
5600
  msgstr ""
5601
 
5602
+ #: extensions/external-db/classes/Settings.php:535
5603
  msgid "Currently Connected to database"
5604
  msgstr ""
5605
 
5606
+ #: extensions/external-db/classes/Settings.php:543
5607
  msgid "Save & Test Changes"
5608
  msgstr ""
5609
 
5610
+ #: extensions/external-db/classes/Settings.php:545, extensions/external-db/classes/Settings.php:795
 
5611
  msgid "Test Connection"
5612
  msgstr ""
5613
 
5614
+ #: extensions/external-db/classes/Settings.php:556
5615
  msgid "Migrate Events to External Storage"
5616
  msgstr ""
5617
 
5618
+ #: extensions/external-db/classes/Settings.php:558
5619
+ msgid "Migrate existing WordPress Security Events from the WordPress database to the new external database."
 
 
5620
  msgstr ""
5621
 
5622
+ #: extensions/external-db/classes/Settings.php:569
5623
  msgid "Migrate Events to WordPress Database"
5624
  msgstr ""
5625
 
5626
+ #: extensions/external-db/classes/Settings.php:571
5627
+ msgid "Remove the external database and start using the WordPress database again. In the process the events will be automatically migrated to the WordPress database."
 
 
 
5628
  msgstr ""
5629
 
5630
+ #: extensions/external-db/classes/Settings.php:673
5631
  msgid "archiving activity log data"
5632
  msgstr ""
5633
 
5634
+ #: extensions/external-db/classes/Settings.php:677
5635
+ msgid "In this section you can configure the archiving of old events to an archive database. Archives events can still be accessed and are included in search results and reports."
 
 
 
5636
  msgstr ""
5637
 
5638
+ #: extensions/external-db/classes/Settings.php:683
5639
  msgid "Archive the WordPress Activity Log to this Database"
5640
  msgstr ""
5641
 
5642
+ #: extensions/external-db/classes/Settings.php:694
5643
  msgid "Archive events that are older than"
5644
  msgstr ""
5645
 
5646
+ #: extensions/external-db/classes/Settings.php:696
5647
  msgid "Archiving Options"
5648
  msgstr ""
5649
 
5650
+ #: extensions/external-db/classes/Settings.php:710
5651
  msgid "Archive events older than"
5652
  msgstr ""
5653
 
5654
+ #: extensions/external-db/classes/Settings.php:714
5655
  msgid "months"
5656
  msgstr ""
5657
 
5658
+ #: extensions/external-db/classes/Settings.php:717
5659
  msgid "years"
5660
  msgstr ""
5661
 
5662
+ #: extensions/external-db/classes/Settings.php:723
5663
+ msgid "The configured archiving options will override the Security Events Pruning settings configured in the plugin’s settings."
 
 
5664
  msgstr ""
5665
 
5666
+ #: extensions/external-db/classes/Settings.php:729
5667
  msgid "WordPress Activity Log Data Retention"
5668
  msgstr ""
5669
 
5670
+ #: extensions/external-db/classes/Settings.php:730
5671
+ msgid "Once you configure archiving these data retention settings will be used instead of the ones configured in the plugin's general settings."
 
 
5672
  msgstr ""
5673
 
5674
+ #: extensions/external-db/classes/Settings.php:733
5675
  msgid "Activity Log Retention"
5676
  msgstr ""
5677
 
5678
+ #: extensions/external-db/classes/Settings.php:739
5679
  msgid "None"
5680
  msgstr ""
5681
 
5682
+ #: extensions/external-db/classes/Settings.php:768
5683
  msgid "Next Scheduled Cleanup is in "
5684
  msgstr ""
5685
 
5686
+ #. translators: Events Purning Link
5687
+ #: extensions/external-db/classes/Settings.php:773
5688
  msgid "(or %s)"
5689
  msgstr ""
5690
 
5691
+ #: extensions/external-db/classes/Settings.php:774
5692
  msgid "Run Manually"
5693
  msgstr ""
5694
 
5695
+ #: extensions/external-db/classes/Settings.php:796
5696
  msgid "Execute Archiving Now"
5697
  msgstr ""
5698
 
5699
+ #: extensions/external-db/classes/Settings.php:799
5700
  msgid "Reset Archiving Settings"
5701
  msgstr ""
5702
 
5703
+ #: extensions/external-db/classes/Settings.php:800
5704
+ msgid "Click the button below to disable archiving and reset the settings to no archiving. Note that the archived data will not be deleted."
 
 
5705
  msgstr ""
5706
 
5707
+ #: extensions/external-db/classes/Settings.php:801
5708
  msgid "Disable Archiving & Reset Settings"
5709
  msgstr ""
5710
 
5711
+ #: extensions/external-db/classes/Settings.php:917
5712
  msgid "Run the Archiving Process Every"
5713
  msgstr ""
5714
 
5715
+ #: extensions/external-db/classes/Settings.php:946
5716
  msgid "Stop Archiving"
5717
  msgstr ""
5718
 
5719
+ #: extensions/external-db/classes/Settings.php:1047
5720
  msgid "Attention!"
5721
  msgstr ""
5722
 
5723
+ #. translators: %1$s: Alerts Pruning Period, %2$s: Alerts Archiving Period
5724
+ #: extensions/external-db/classes/Settings.php:1051
5725
+ msgid "The activity log retention setting is configured to delete events older than %1$s. This period should be longer than the configured %2$s archiving period otherwise events will be deleted and not archived."
 
 
 
5726
  msgstr ""
5727
 
5728
+ #: extensions/external-db/classes/Settings.php:1295
5729
  msgid "Resetting..."
5730
  msgstr ""
5731
 
5732
+ #: extensions/external-db/classes/Settings.php:1296
5733
  msgid "Resetting Failed!"
5734
  msgstr ""
5735
 
5736
+ #. translators: %d: Number of events.
5737
+ #: extensions/external-db/classes/Settings.php:1298
5738
  msgid " So far %d events have been migrated."
5739
  msgstr ""
5740
 
5741
+ #: extensions/external-db/classes/Settings.php:1299
5742
  msgid "WordPress security events successfully migrated to WordPress database."
5743
  msgstr ""
5744
 
5745
+ #: extensions/external-db/classes/Settings.php:1300
5746
+ msgid "WordPress security events successfully migrated to the external database."
 
5747
  msgstr ""
5748
 
5749
+ #: extensions/external-db/classes/Settings.php:1301
5750
  msgid "No events to migrate."
5751
  msgstr ""
5752
 
5753
+ #: extensions/external-db/classes/Settings.php:1340
5754
  msgid "Mirror not found."
5755
  msgstr ""
5756
 
5757
+ #: extensions/reports/classes/Common.php:709, extensions/reports/classes/Common.php:713, extensions/reports/classes/Common.php:717, extensions/reports/classes/Common.php:721, extensions/reports/classes/Common.php:725, extensions/reports/classes/Common.php:729, extensions/reports/classes/Common.php:733, extensions/reports/classes/Common.php:737, extensions/reports/classes/Common.php:741, extensions/reports/classes/Common.php:745, extensions/reports/classes/Common.php:749
 
 
 
 
 
 
 
 
 
 
 
5758
  msgid "Internal error. <code>%s</code> key was not found."
5759
  msgstr ""
5760
 
5761
+ #: extensions/reports/classes/Common.php:773, extensions/reports/classes/Common.php:1586
 
5762
  msgid "Please specify at least one Alert Group or specify an Alert Code."
5763
  msgstr ""
5764
 
5765
+ #: extensions/reports/classes/Common.php:778
5766
  msgid "Internal Error: Could not detect the type of the report to generate."
5767
  msgstr ""
5768
 
5769
+ #: extensions/reports/classes/Common.php:888, extensions/reports/classes/Common.php:922, extensions/reports/classes/Common.php:967, extensions/reports/classes/Common.php:985, extensions/reports/classes/Common.php:1778
5770
+ msgid "There are no alerts that match your filtering criteria. Please try a different set of rules."
 
 
 
 
 
 
5771
  msgstr ""
5772
 
5773
+ #: extensions/reports/classes/Common.php:970, extensions/reports/classes/Common.php:988, extensions/reports/classes/Common.php:1781
 
 
 
5774
  msgid "Error: The <strong>%s</strong> path is not accessible."
5775
  msgstr ""
5776
 
5777
+ #: extensions/reports/classes/Common.php:1249, extensions/reports/classes/Common.php:1685
 
 
5778
  msgid "%1$s - Website %2$s"
5779
  msgstr ""
5780
 
5781
+ #: extensions/reports/classes/Common.php:1252, extensions/reports/classes/Common.php:1688
 
 
5782
  msgid "Week number %1$s - Website %2$s"
5783
  msgstr ""
5784
 
5785
+ #: extensions/reports/classes/Common.php:1255, extensions/reports/classes/Common.php:1691
 
 
5786
  msgid "Month %1$s %2$s- Website %3$s"
5787
  msgstr ""
5788
 
5789
+ #: extensions/reports/classes/Common.php:1258, extensions/reports/classes/Common.php:1694
 
 
5790
  msgid "Quarter %1$s - Website %2$s"
5791
  msgstr ""
5792
 
5793
+ #: extensions/reports/classes/Common.php:1270, extensions/reports/classes/Common.php:1700
 
 
5794
  msgid " - %s Email Report"
5795
  msgstr ""
5796
 
5797
+ #: extensions/reports/classes/Common.php:1558
5798
  msgid "Internal Error. Could not retrieve the alerts from the main plugin."
5799
  msgstr ""
5800
 
5801
+ #: extensions/reports/classes/HtmlReportGenerator.php:108, extensions/reports/classes/HtmlReportGenerator.php:355
 
5802
  msgid "WP Activity Log Reporter"
5803
  msgstr ""
5804
 
5810
  msgid "website"
5811
  msgstr ""
5812
 
5813
+ #: extensions/reports/classes/HtmlReportGenerator.php:150, extensions/reports/classes/HtmlReportGenerator.php:364
 
5814
  msgid "Report Details:"
5815
  msgstr ""
5816
 
5817
+ #: extensions/reports/classes/HtmlReportGenerator.php:151, extensions/reports/classes/HtmlReportGenerator.php:365
 
5818
  msgid "Generated on:"
5819
  msgstr ""
5820
 
5821
+ #: extensions/reports/classes/HtmlReportGenerator.php:152, extensions/reports/classes/HtmlReportGenerator.php:366
 
5822
  msgid "Generated by:"
5823
  msgstr ""
5824
 
5842
  msgid "Alert Groups"
5843
  msgstr ""
5844
 
5845
+ #: extensions/reports/classes/HtmlReportGenerator.php:163, extensions/reports/classes/HtmlReportGenerator.php:370
 
5846
  msgid "Alert Code(s)"
5847
  msgstr ""
5848
 
5849
+ #: extensions/reports/classes/HtmlReportGenerator.php:164, extensions/reports/classes/HtmlReportGenerator.php:371
 
5850
  msgid "Start date"
5851
  msgstr ""
5852
 
5853
+ #: extensions/reports/classes/HtmlReportGenerator.php:165, extensions/reports/classes/HtmlReportGenerator.php:372
 
5854
  msgid "End date"
5855
  msgstr ""
5856
 
5858
  msgid "Post Types"
5859
  msgstr ""
5860
 
5861
+ #: extensions/reports/classes/HtmlReportGenerator.php:167, extensions/reports/inc/wsal-reporting-view.inc.php:769, extensions/search/classes/FilterManager.php:494, extensions/search/classes/Filters/poststatusfilter.php:47, extensions/search/classes/Filters/poststatusfilter.php:82
 
 
 
 
5862
  msgid "Post Status"
5863
  msgstr ""
5864
 
5865
+ #: extensions/reports/classes/HtmlReportGenerator.php:176, extensions/reports/classes/HtmlReportGenerator.php:341
 
5866
  msgid "From the beginning"
5867
  msgstr ""
5868
 
5869
+ #: extensions/reports/classes/HtmlReportGenerator.php:221, extensions/reports/classes/HtmlReportGenerator.php:367
 
5870
  msgid "Criteria"
5871
  msgstr ""
5872
 
5874
  msgid "Results"
5875
  msgstr ""
5876
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5877
  #: extensions/reports/inc/wsal-reporting-view.inc.php:198
5878
  msgid "Invalid Request. Please refresh the page and try again."
5879
  msgstr ""
5906
  msgid "Please select the report format."
5907
  msgstr ""
5908
 
 
 
 
 
 
5909
  #: extensions/reports/inc/wsal-reporting-view.inc.php:495
5910
  msgid "Periodic Report successfully saved."
5911
  msgstr ""
5912
 
5913
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:463, extensions/reports/inc/wsal-reporting-view.inc.php:514
5914
+ msgid " Generating report. Please do not close this window"
5915
+ msgstr ""
5916
+
5917
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:536
5918
  msgid "Periodic Report successfully Deleted."
5919
  msgstr ""
5920
 
5921
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:567
5922
  msgid "Generate & Configure Periodic Reports"
5923
  msgstr ""
5924
 
5925
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:568
5926
  msgid "Statistics Reports"
5927
  msgstr ""
5928
 
5929
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:588
5930
  msgid "Generate a report"
5931
  msgstr ""
5932
 
5933
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:591
5934
  msgid "Step 1: Select the type of report"
5935
  msgstr ""
5936
 
5937
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:597
5938
  msgid "By Site(s)"
5939
  msgstr ""
5940
 
5941
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:605
5942
  msgid "Specify sites"
5943
  msgstr ""
5944
 
5945
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:613
5946
  msgid "By User(s)"
5947
  msgstr ""
5948
 
5949
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:617
5950
  msgid "All Users"
5951
  msgstr ""
5952
 
5953
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:621
5954
  msgid "Specify users"
5955
  msgstr ""
5956
 
5957
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:645
5958
+ msgid "Automated verification of usernames is disabled because you have more than 100 users. The process might require a lot of resources to work with a lot of users. Tick the option below to enable it again."
 
 
 
5959
  msgstr ""
5960
 
5961
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:650
5962
  msgid "Enable Autocomplete"
5963
  msgstr ""
5964
 
5965
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:659
5966
  msgid "By Role(s)"
5967
  msgstr ""
5968
 
5969
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:663
5970
  msgid "All Roles"
5971
  msgstr ""
5972
 
5973
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:667
5974
  msgid "Specify roles"
5975
  msgstr ""
5976
 
5977
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:675
5978
  msgid "By IP Address(es)"
5979
  msgstr ""
5980
 
5981
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:679
5982
  msgid "All IP Addresses"
5983
  msgstr ""
5984
 
5985
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:683
5986
  msgid "Specify IP Addresses"
5987
  msgstr ""
5988
 
5989
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:691
5990
  msgid "By Object(s)"
5991
  msgstr ""
5992
 
5993
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:695
5994
  msgid "All Objects"
5995
  msgstr ""
5996
 
5997
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:699
5998
  msgid "Specify Objects"
5999
  msgstr ""
6000
 
6001
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:707
6002
  msgid "By Event Type(s)"
6003
  msgstr ""
6004
 
6005
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:711
6006
  msgid "All Event Types"
6007
  msgstr ""
6008
 
6009
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:715
6010
  msgid "Specify Event Types"
6011
  msgstr ""
6012
 
6013
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:723
6014
  msgid "By Event Code(s)"
6015
  msgstr ""
6016
 
6017
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:755
 
 
 
 
6018
  msgid "Posts"
6019
  msgstr ""
6020
 
6021
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:761, extensions/search/classes/FilterManager.php:498, extensions/search/classes/Filters/posttypefilter.php:85
 
 
 
6022
  msgid "Post Type"
6023
  msgstr ""
6024
 
6025
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:783
6026
  msgid "Specify Event Codes"
6027
  msgstr ""
6028
 
6029
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:791
6030
  msgid "By the Below Criteria"
6031
  msgstr ""
6032
 
6033
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:796
6034
  msgid "Number & List of unique IP addresses per user"
6035
  msgstr ""
6036
 
6037
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:801
6038
  msgid "Number of Logins per user"
6039
  msgstr ""
6040
 
6041
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:835
 
6042
  msgid "Select site(s)"
6043
  msgstr ""
6044
 
6045
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:857
6046
  msgid "Select user(s)"
6047
  msgstr ""
6048
 
6049
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:899
6050
  msgid "Select role(s)"
6051
  msgstr ""
6052
 
6053
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:921
6054
  msgid "Select IP address(es)"
6055
  msgstr ""
6056
 
6057
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:943
6058
  msgid "Select Objects(s)"
6059
  msgstr ""
6060
 
6061
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:965
6062
  msgid "Select Type(s)"
6063
  msgstr ""
6064
 
6065
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1017
6066
  msgid "Select Post Type(s)"
6067
  msgstr ""
6068
 
6069
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1047
6070
  msgid "Select Post Status(es)"
6071
  msgstr ""
6072
 
6073
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1351
6074
  msgid "Step 2: Select the date range"
6075
  msgstr ""
6076
 
6077
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1353
6078
+ msgid "Note: Do not specify any dates if you are creating a scheduled report or if you want to generate a report from when you started the audit trail."
 
 
6079
  msgstr ""
6080
 
6081
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1358
6082
  msgid "Start Date"
6083
  msgstr ""
6084
 
6085
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1361, extensions/reports/inc/wsal-reporting-view.inc.php:1503
 
6086
  msgid "Select start date"
6087
  msgstr ""
6088
 
6089
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1367
6090
  msgid "End Date"
6091
  msgstr ""
6092
 
6093
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1370, extensions/reports/inc/wsal-reporting-view.inc.php:1512
 
6094
  msgid "Select end date"
6095
  msgstr ""
6096
 
6097
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1384, extensions/reports/inc/wsal-reporting-view.inc.php:1596
 
6098
  msgid "Step 3: Select Report Format"
6099
  msgstr ""
6100
 
6101
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1391, extensions/reports/inc/wsal-reporting-view.inc.php:1602
 
6102
  msgid "HTML"
6103
  msgstr ""
6104
 
6105
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1396, extensions/reports/inc/wsal-reporting-view.inc.php:1606
 
6106
  msgid "CSV"
6107
  msgstr ""
6108
 
6109
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1403
6110
  msgid "Step 4: Generate Report Now or Configure Periodic Reports"
6111
  msgstr ""
6112
 
6113
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1406
6114
  msgid "Generate Report Now"
6115
  msgstr ""
6116
 
6117
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1409
6118
+ msgid " Use the buttons below to use the above criteria for a daily, weekly and monthly summary report which is sent automatically via email."
 
 
6119
  msgstr ""
6120
 
6121
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1412
6122
  msgid "Email address(es)"
6123
  msgstr ""
6124
 
6125
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1418
6126
  msgid "Report Name"
6127
  msgstr ""
6128
 
6129
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1426
6130
  msgid "Daily"
6131
  msgstr ""
6132
 
6133
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1427
6134
  msgid "Weekly"
6135
  msgstr ""
6136
 
6137
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1428
6138
  msgid "Monthly"
6139
  msgstr ""
6140
 
6141
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1429
6142
  msgid "Quarterly"
6143
  msgstr ""
6144
 
6145
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1442
6146
  msgid "Configured Periodic Reports"
6147
  msgstr ""
6148
 
6149
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1445
6150
+ msgid "Below is the list of configured periodic reports. Click on Modify to load the criteria and configure it above. To save the new criteria as a new report change the report name and save it. Do not change the report name to overwrite the existing periodic report."
 
 
 
 
6151
  msgstr ""
6152
 
6153
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1448
6154
+ msgid "Note: Use the Send Now button to generate a report with data from the last 90 days if a quarterly report is configured, 30 days if monthly report is configured and 7 days if weekly report is configured."
 
 
 
6155
  msgstr ""
6156
 
6157
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1496
6158
  msgid "Step 1: Choose Date Range"
6159
  msgstr ""
6160
 
6161
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1500, extensions/search/classes/Filters/DateFilter.php:55
 
6162
  msgid "From"
6163
  msgstr ""
6164
 
6165
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1509
6166
  msgid "To"
6167
  msgstr ""
6168
 
6169
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1525
6170
  msgid "Step 2: Choose Criteria"
6171
  msgstr ""
6172
 
6173
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1528
6174
  msgid "Report for"
6175
  msgstr ""
6176
 
6177
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1533
6178
  msgid "Number of logins for user"
6179
  msgstr ""
6180
 
6181
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1538
6182
  msgid "Number of logins for users with the role of"
6183
  msgstr ""
6184
 
6185
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1543
6186
  msgid "Number of views for user"
6187
  msgstr ""
6188
 
6189
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1548
6190
  msgid "Number of views for users with the role of"
6191
  msgstr ""
6192
 
6193
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1553
6194
  msgid "Number of published content for user"
6195
  msgstr ""
6196
 
6197
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1558
6198
  msgid "Number of published content for users with the role of"
6199
  msgstr ""
6200
 
6201
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1563
6202
  msgid "Different IP addresses for Usernames"
6203
  msgstr ""
6204
 
6205
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1568
6206
  msgid "List only IP addresses used during login"
6207
  msgstr ""
6208
 
6209
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1570
6210
+ msgid "If the above option is enabled the report will only include the IP addresses from where the user logged in. If it is disabled it will list all the IP addresses from where the plugin recorded activity originating from the user."
 
 
 
6211
  msgstr ""
6212
 
6213
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1629
6214
  msgid "Please specify at least one site"
6215
  msgstr ""
6216
 
6217
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1638
6218
  msgid "Please specify at least one user"
6219
  msgstr ""
6220
 
6221
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1647
6222
  msgid "Please specify at least one role"
6223
  msgstr ""
6224
 
6225
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1656
6226
  msgid "Please specify at least one IP address"
6227
  msgstr ""
6228
 
6229
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1665
6230
  msgid "Please specify at least one object"
6231
  msgstr ""
6232
 
6233
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1674
6234
  msgid "Please specify at least one event type"
6235
  msgstr ""
6236
 
6237
+ #: extensions/reports/inc/wsal-reporting-view.inc.php:1683
6238
  msgid "Please specify at least one Alert group or specify an Alert code"
6239
  msgstr ""
6240
 
 
 
 
 
 
 
 
 
6241
  #: extensions/search/classes/FilterManager.php:210
6242
+ msgid "Refer to the <a href=\"https://wpactivitylog.com/support/kb/list-wordpress-activity-log-event-ids/\" target=\"_blank\">list of Event IDs</a> for reference."
 
 
 
6243
  msgstr ""
6244
 
6245
  #: extensions/search/classes/FilterManager.php:374
6250
  msgid "Dismiss this notice."
6251
  msgstr ""
6252
 
 
 
 
 
 
 
 
 
 
 
6253
  #: extensions/search/classes/FilterManager.php:395
6254
  msgid "Save Search & Filters"
6255
  msgstr ""
6259
  msgstr ""
6260
 
6261
  #: extensions/search/classes/FilterManager.php:402
6262
+ msgid "Name can only be 12 characters long and only letters, numbers and underscore are allowed."
 
 
6263
  msgstr ""
6264
 
6265
+ #: extensions/search/classes/FilterManager.php:405, extensions/user-sessions/classes/View/Settings.php:96, extensions/user-sessions/classes/View/Options/Policies.php:314
 
 
6266
  msgid "Save"
6267
  msgstr ""
6268
 
6269
+ #: extensions/search/classes/FilterManager.php:426, extensions/search/classes/FilterManager.php:537
6270
+ msgid "Refer to the <a href=\"https://wpactivitylog.com/support/kb/list-wordpress-activity-log-event-ids/\" target=\"_blank\" rel=\"nofollow noopener\">list of Event IDs</a> for reference."
 
 
 
 
 
 
 
 
 
6271
  msgstr ""
6272
 
6273
  #: extensions/search/classes/FilterManager.php:438
6274
+ msgid "Refer to the <a href=\"https://wpactivitylog.com/support/kb/list-wordpress-activity-log-event-ids/\" target=\"_blank\" rel=\"nofollow noopener\">metadata in the activity log</a> for reference."
 
 
 
6275
  msgstr ""
6276
 
6277
  #: extensions/search/classes/FilterManager.php:450
6278
+ msgid "Refer to the <a href=\"https://wpactivitylog.com/support/kb/severity-levels-wordpress-activity-log/\" target=\"_blank\" rel=\"nofollow noopener\">severity levels in the activity log</a> for reference."
 
 
 
6279
  msgstr ""
6280
 
6281
  #: extensions/search/classes/FilterManager.php:463
6282
+ msgid "Refer to the <a href=\"https://wpactivitylog.com/support/kb/list-wordpress-audit-trail-alerts/\" target=\"_blank\" rel=\"nofollow noopener\">list of Event IDs</a> for reference."
 
 
 
6283
  msgstr ""
6284
 
6285
  #: extensions/search/classes/FilterManager.php:475
6286
  msgid "Filter by username"
6287
  msgstr ""
6288
 
6289
+ #: extensions/search/classes/FilterManager.php:478, extensions/user-sessions/classes/View/Sessions.php:350
 
6290
  msgid "First Name"
6291
  msgstr ""
6292
 
6294
  msgid "Filter by user first name"
6295
  msgstr ""
6296
 
6297
+ #: extensions/search/classes/FilterManager.php:482, extensions/user-sessions/classes/View/Sessions.php:351
 
6298
  msgid "Last Name"
6299
  msgstr ""
6300
 
6318
  msgid "Filter by post type"
6319
  msgstr ""
6320
 
6321
+ #: extensions/search/classes/FilterManager.php:502, extensions/search/classes/Filters/PostIDFilter.php:29, extensions/search/classes/Filters/PostIDFilter.php:57
 
 
6322
  msgid "Post ID"
6323
  msgstr ""
6324
 
6326
  msgid "Filter by post ID"
6327
  msgstr ""
6328
 
6329
+ #: extensions/search/classes/FilterManager.php:506, extensions/search/classes/Filters/PostNameFilter.php:55
 
 
6330
  msgid "Post Name"
6331
  msgstr ""
6332
 
6350
  msgid "Enter an IP address to filter"
6351
  msgstr ""
6352
 
6353
+ #: extensions/user-sessions/classes/Helpers.php:129
6354
+ msgid "ERROR: Your session was blocked with the WP Activity Log plugin because there is already another user logged in with the same username. Please contact the site administrator for more information."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6355
  msgstr ""
6356
 
6357
+ #: extensions/user-sessions/classes/Views.php:110
6358
+ msgid "Users Sessions & Management"
6359
  msgstr ""
6360
 
6361
+ #: extensions/user-sessions/classes/Views.php:124
6362
+ msgid "Logged In Users"
6363
  msgstr ""
6364
 
6365
+ #: extensions/user-sessions/classes/Views.php:185
6366
+ msgid "Logging out..."
6367
  msgstr ""
6368
 
6369
+ #: extensions/user-sessions/classes/Views.php:186
6370
+ msgid "Refreshing..."
6371
  msgstr ""
6372
 
6373
+ #: extensions/user-sessions/classes/Views.php:187
6374
+ msgid "This could result in loss of unsaved work. Are you sure?"
6375
  msgstr ""
6376
 
6377
+ #. translators: %s: Total number of users
6378
+ #: extensions/user-sessions/classes/Views.php:189
6379
+ msgid "out of %s users sessions terminated."
6380
  msgstr ""
6381
 
6382
+ #: extensions/user-sessions/classes/Views.php:191, extensions/user-sessions/classes/View/Sessions.php:114
6383
+ msgid "Retrieve user data"
6384
  msgstr ""
6385
 
6386
+ #: extensions/user-sessions/classes/Views.php:192
6387
+ msgid "Retrieving data"
 
 
 
6388
  msgstr ""
6389
 
6390
+ #: extensions/user-sessions/classes/Views.php:193
6391
+ msgid "Data retrieved"
6392
  msgstr ""
6393
 
6394
+ #: extensions/user-sessions/classes/Views.php:194
6395
+ msgid "Event ID: "
6396
  msgstr ""
6397
 
6398
+ #: extensions/user-sessions/classes/Views.php:195
6399
+ msgid "Object: "
6400
  msgstr ""
6401
 
6402
+ #: extensions/user-sessions/classes/Views.php:196
6403
+ msgid "Event Type: "
6404
  msgstr ""
6405
 
6406
+ #: extensions/user-sessions/classes/Views.php:257
6407
+ msgid "Terminate all logged in sessions"
6408
  msgstr ""
6409
 
6410
+ #: extensions/user-sessions/classes/Views.php:258
6411
+ msgid "This will terminate all users' sessions including yours, which could result in unsaved work. Do you like to proceed?"
6412
  msgstr ""
6413
 
6414
+ #: extensions/user-sessions/classes/Views.php:269
6415
+ msgid "YES"
 
 
 
6416
  msgstr ""
6417
 
6418
+ #: extensions/user-sessions/classes/Views.php:270
6419
+ msgid "NO"
 
 
 
 
 
6420
  msgstr ""
6421
 
6422
+ #: extensions/user-sessions/classes/Views.php:282
6423
+ msgid "Terminate All Sessions"
6424
  msgstr ""
6425
 
6426
+ #: extensions/user-sessions/classes/Views.php:402
6427
+ msgid "Users sessions termination is in progress. Please wait..."
6428
  msgstr ""
6429
 
6430
+ #: extensions/user-sessions/classes/Views.php:429, extensions/reports/classes/Views/Main.php:741
6431
+ msgid "You do not have sufficient permissions."
6432
  msgstr ""
6433
 
6434
+ #: extensions/user-sessions/classes/Views.php:455
6435
+ msgid "No sessions."
 
6436
  msgstr ""
6437
 
6438
+ #: extensions/user-sessions/classes/Views.php:487
6439
+ msgid "Session destroyed."
6440
  msgstr ""
6441
 
6442
+ #: extensions/user-sessions/classes/Views.php:495
6443
+ msgid "User session data is not set."
 
 
 
 
6444
  msgstr ""
6445
 
6446
+ #: extensions/user-sessions/classes/Views.php:511, extensions/user-sessions/classes/Views.php:604
6447
+ msgid "User do not have sufficient permissions."
6448
  msgstr ""
6449
 
6450
+ #: extensions/user-sessions/classes/Views.php:582
6451
+ msgid "Users offset is not set."
6452
  msgstr ""
6453
 
6454
+ #: extensions/user-sessions/classes/Views.php:575, extensions/user-sessions/classes/Views.php:558
6455
+ msgid "Sessions destroyed!"
6456
  msgstr ""
6457
 
6458
+ #: extensions/user-sessions/classes/Views.php:614
6459
+ msgid "Nonce check failed."
 
 
 
 
6460
  msgstr ""
6461
 
6462
+ #: extensions/reports/classes/Views/Main.php:72
6463
+ msgid "Reporting"
 
 
6464
  msgstr ""
6465
 
6466
+ #: extensions/reports/classes/Views/Main.php:86
6467
+ msgid "Reports"
 
 
 
 
6468
  msgstr ""
6469
 
6470
+ #: extensions/reports/classes/Views/Main.php:666
6471
+ msgid " Generating reports. Please do not close this window"
6472
  msgstr ""
6473
 
6474
+ #: extensions/reports/classes/Views/Main.php:679
6475
+ msgid "To generate a report or configure automated scheduled report please contact the administrator of this multisite network on "
6476
  msgstr ""
6477
 
6478
+ #: extensions/reports/classes/Views/Main.php:697
6479
+ msgid "The %s directory which the Reports plugin uses to create reports in was either not found or is not accessible."
6480
  msgstr ""
6481
 
6482
+ #: extensions/reports/classes/Views/Main.php:701
6483
+ msgid "In order for the plugin to function, the directory %1$s must be created and the plugin should have access to write to this directory, so please configure the following permissions: 0755. If you have any questions or need further assistance please %2$s"
 
6484
  msgstr ""
6485
 
6486
+ #: extensions/search/classes/Filters/AlertWidget.php:38
6487
+ msgid "Enter an Event ID to filter - example: 1000"
6488
  msgstr ""
6489
 
6490
+ #: extensions/search/classes/Filters/AlertWidget.php:40, extensions/search/classes/Filters/DateWidget.php:38, extensions/search/classes/Filters/IpWidget.php:40, extensions/search/classes/Filters/postidwidget.php:37, extensions/search/classes/Filters/PostNameWidget.php:38, extensions/search/classes/Filters/userfirstnamewidget.php:37, extensions/search/classes/Filters/userlastnamewidget.php:37, extensions/search/classes/Filters/usernamewidget.php:38
6491
+ msgid "Add this filter"
 
 
 
 
6492
  msgstr ""
6493
 
6494
+ #: extensions/search/classes/Filters/CodeWidget.php:37
6495
+ msgid "Select a Severity to filter"
6496
  msgstr ""
6497
 
6498
+ #: extensions/search/classes/Filters/DateFilter.php:56
6499
+ msgid "Earlier than"
6500
  msgstr ""
6501
 
6502
+ #: extensions/search/classes/Filters/DateFilter.php:57
6503
+ msgid "On this day"
 
 
6504
  msgstr ""
6505
 
6506
+ #: extensions/search/classes/Filters/EventTypeWidget.php:30
6507
+ msgid "Select an Event Type to filter"
6508
  msgstr ""
6509
 
6510
+ #: extensions/search/classes/Filters/IpWidget.php:38
6511
+ msgid "192.168.128.255"
6512
  msgstr ""
6513
 
6514
+ #: extensions/search/classes/Filters/ObjectWidget.php:33
6515
+ msgid "Select an Object to filter"
6516
  msgstr ""
6517
 
6518
+ #: extensions/search/classes/Filters/postidwidget.php:35
6519
+ msgid "Enter post ID to filter"
6520
  msgstr ""
6521
 
6522
+ #: extensions/search/classes/Filters/PostNameWidget.php:36
6523
+ msgid "Enter post name to filter"
6524
  msgstr ""
6525
 
6526
+ #: extensions/search/classes/Filters/PostStatusWidget.php:36
6527
+ msgid "Select a post status to filter"
6528
  msgstr ""
6529
 
6530
+ #: extensions/search/classes/Filters/PostTypeWidget.php:36
6531
+ msgid "Select a post type to filter"
6532
  msgstr ""
6533
 
6534
+ #: extensions/search/classes/Filters/SiteFilter.php:57
6535
+ msgid "Sites"
6536
  msgstr ""
6537
 
6538
+ #: extensions/search/classes/Filters/SiteWidget.php:33
6539
+ msgid "Select a Site to filter"
6540
  msgstr ""
6541
 
6542
+ #: extensions/search/classes/Filters/userfirstnamewidget.php:35, extensions/search/classes/Filters/userlastnamewidget.php:35
6543
+ msgid "Enter users first name to filter"
6544
  msgstr ""
6545
 
6546
+ #: extensions/search/classes/Filters/usernamewidget.php:36
6547
+ msgid "Enter a username to filter"
6548
  msgstr ""
6549
 
6550
+ #: extensions/search/classes/Filters/UserRoleWidget.php:36
6551
+ msgid "Select a user role to filter"
 
6552
  msgstr ""
6553
 
6554
+ #: extensions/user-sessions/classes/Sensors/UserSessionsTracking.php:283, extensions/user-sessions/classes/View/Options/Policies.php:234
6555
+ msgid "ERROR: Your session was blocked with the <a href=\"https://en-gb.wordpress.org/plugins/wp-security-audit-log\" target=\"_blank\">WP Activity Log plugin</a> because there is already another user logged in with the same username. Please contact the site administrator for more information."
 
6556
  msgstr ""
6557
 
6558
+ #: extensions/user-sessions/classes/View/Options.php:30
6559
+ msgid "Users Sessions Management"
 
6560
  msgstr ""
6561
 
6562
+ #: extensions/user-sessions/classes/View/Options.php:44
6563
+ msgid "User Session Options"
6564
  msgstr ""
6565
 
6566
  #: extensions/user-sessions/classes/View/Sessions.php:154
6567
  msgid "Showing results for "
6568
  msgstr ""
6569
 
6570
+ #: extensions/user-sessions/classes/View/Sessions.php:146
6571
+ msgid "No search results were found."
6572
+ msgstr ""
6573
+
6574
  #: extensions/user-sessions/classes/View/Sessions.php:180
6575
  msgid "Expires"
6576
  msgstr ""
6583
  msgid "Last Event"
6584
  msgstr ""
6585
 
6586
+ #: extensions/user-sessions/classes/View/Sessions.php:183, extensions/user-sessions/classes/View/Sessions.php:517
 
6587
  msgid "Actions"
6588
  msgstr ""
6589
 
6590
+ #. translators: Number of sessions
6591
  #: extensions/user-sessions/classes/View/Sessions.php:321
 
6592
  msgid "%s users"
6593
  msgstr ""
6594
 
6624
  msgid "Network-wide Logins"
6625
  msgstr ""
6626
 
 
 
 
 
 
 
 
 
 
 
 
6627
  #: extensions/user-sessions/classes/View/Sessions.php:491
6628
  msgid "Session ID: "
6629
  msgstr ""
6640
  msgid "Terminate Session"
6641
  msgstr ""
6642
 
6643
+ #: extensions/user-sessions/classes/View/Sessions.php:438
6644
+ msgid "WP Activity Log keeps its own user session data. This means that the sessions of already logged in users will only show up once they logout and log back in. The same applies to your session."
6645
+ msgstr ""
6646
+
6647
+ #: extensions/user-sessions/classes/View/Sessions.php:430
6648
+ msgid "No logged in sessions meet your search criteria."
6649
+ msgstr ""
6650
+
6651
  #: extensions/user-sessions/classes/View/Sessions.php:721
6652
  msgid "User sessions do not exist."
6653
  msgstr ""
6657
  msgstr ""
6658
 
6659
  #: extensions/user-sessions/classes/View/Settings.php:90
6660
+ msgid "The plugin will delete the data about expired users sessions from the WordPress database."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6661
  msgstr ""
6662
 
6663
+ #: extensions/user-sessions/classes/View/Options/Policies.php:38
6664
+ msgid "Main Policies"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6665
  msgstr ""
6666
 
6667
+ #: extensions/user-sessions/classes/View/Options/Policies.php:140
6668
+ msgid "Do not enforce policies on users with this role"
6669
  msgstr ""
6670
 
6671
+ #: extensions/user-sessions/classes/View/Options/Policies.php:158
6672
+ msgid "Inherit the sessions policies"
6673
  msgstr ""
6674
 
6675
+ #: extensions/user-sessions/classes/View/Options/Policies.php:110
6676
+ msgid "Users sessions policies"
6677
  msgstr ""
6678
 
6679
+ #: extensions/user-sessions/classes/View/Options/Policies.php:112
6680
+ msgid "Use the settings below to configure the policies to manage the users' sessions policies. These policies are automatically inherited by all profiles. However, you can disable the inheritance or configure different policies for specific roles in the role's tab."
 
6681
  msgstr ""
6682
 
6683
+ #: extensions/user-sessions/classes/View/Options/Policies.php:117
6684
+ msgid "Enable session policies"
 
 
6685
  msgstr ""
6686
 
6687
+ #: extensions/user-sessions/classes/View/Options/Policies.php:178
6688
+ msgid "By default WordPress does not limit how many times the same user can connect simultaneously. So two different users can login at the same time using the same username. Use the settings below to limit and also block simultaneous connections for the same username."
 
 
 
6689
  msgstr ""
6690
 
6691
+ #: extensions/user-sessions/classes/View/Options/Policies.php:180
6692
+ msgid "Do you want to allow two or more people to login simultaneously with the same username?"
 
 
 
6693
  msgstr ""
6694
 
6695
+ #: extensions/user-sessions/classes/View/Options/Policies.php:182
6696
+ msgid "By allowing multiple sessions two or more people can login to WordPress using the same username. By blocking them, once a person is logged in with a username, if another person tries to login with the same username they will be blocked."
 
 
6697
  msgstr ""
6698
 
6699
+ #: extensions/user-sessions/classes/View/Options/Policies.php:187
6700
+ msgid "Multiple Sessions"
6701
  msgstr ""
6702
 
6703
+ #: extensions/user-sessions/classes/View/Options/Policies.php:196
6704
+ msgid "Allow one session only"
 
6705
  msgstr ""
6706
 
6707
+ #: extensions/user-sessions/classes/View/Options/Policies.php:202
6708
+ msgid "Allow one session only and override current session"
6709
  msgstr ""
6710
 
6711
+ #. translators: Number of sessions input tag
6712
+ #: extensions/user-sessions/classes/View/Options/Policies.php:212
6713
+ msgid "Allow up to %s sessions and block the rest"
 
 
6714
  msgstr ""
6715
 
6716
+ #: extensions/user-sessions/classes/View/Options/Policies.php:223
6717
+ msgid "Configure a Blocked Session Notification for Users"
6718
  msgstr ""
6719
 
6720
+ #: extensions/user-sessions/classes/View/Options/Policies.php:225
6721
+ msgid "This error message is shown to users when they try to login with a username that already has a session and their session is blocked. You can change this message by editing the text in the below placeholder. Only <a href> HTML code is allowed."
 
 
6722
  msgstr ""
6723
 
6724
+ #: extensions/user-sessions/classes/View/Options/Policies.php:230
6725
+ msgid "Blocked Sessions Error"
 
 
 
6726
  msgstr ""
6727
 
6728
+ #: extensions/user-sessions/classes/View/Options/Policies.php:248
6729
+ msgid "Do you want to terminate idle sessions automatically?"
 
 
 
6730
  msgstr ""
6731
 
6732
+ #: extensions/user-sessions/classes/View/Options/Policies.php:250
6733
+ msgid "If a session has been idle for more than the configured number of hours, it will be automatically destroyed by the plugin."
6734
  msgstr ""
6735
 
6736
+ #: extensions/user-sessions/classes/View/Options/Policies.php:255
6737
+ msgid "Terminate Idle Sessions"
 
 
 
 
 
6738
  msgstr ""
6739
 
6740
+ #: extensions/user-sessions/classes/View/Options/Policies.php:272
6741
+ msgid "1"
6742
  msgstr ""
6743
 
6744
+ #: extensions/user-sessions/classes/View/Options/Policies.php:273
6745
+ msgid "4"
6746
  msgstr ""
6747
 
6748
+ #: extensions/user-sessions/classes/View/Options/Policies.php:274
6749
+ msgid "8"
6750
  msgstr ""
6751
 
6752
+ #: extensions/user-sessions/classes/View/Options/Policies.php:275
6753
+ msgid "12"
6754
  msgstr ""
6755
 
6756
+ #: extensions/user-sessions/classes/View/Options/Policies.php:276
6757
+ msgid "24"
6758
  msgstr ""
6759
 
6760
+ #: extensions/user-sessions/classes/View/Options/Policies.php:277
6761
+ msgid "32"
6762
  msgstr ""
6763
 
6764
+ #: extensions/user-sessions/classes/View/Options/Policies.php:278
6765
+ msgid "48"
 
6766
  msgstr ""
6767
 
6768
+ #: extensions/user-sessions/classes/View/Options/Policies.php:285
6769
+ msgid "terminate sessions if they have been idle for more than"
6770
  msgstr ""
6771
 
6772
+ #: extensions/user-sessions/classes/View/Options/Policies.php:296
6773
+ msgid " hour"
 
 
 
 
 
 
6774
  msgstr ""
6775
 
6776
+ #: extensions/user-sessions/classes/View/Options/Policies.php:296, extensions/user-sessions/classes/View/Options/Policies.php:303
6777
+ msgid " hours"
6778
  msgstr ""
6779
 
6780
+ #: extensions/user-sessions/classes/View/Options/Policies.php:289
6781
+ msgid " seconds (Testing)"
6782
  msgstr ""
readme.txt CHANGED
@@ -6,7 +6,7 @@ License URI: https://www.gnu.org/licenses/gpl.html
6
  Tags: activity log, wordpress activity logs, security audit log, audit log, user tracking, security event log, audit trail, wordpress security monitor, wordpress admin, wordpress admin monitoring, user activity, admin, multisite, SMS alerts, wordpress monitoring, email notification, wordpress email alerts, tracking, user tracking, user activity report, wordpress audit trail
7
  Requires at least: 3.6
8
  Tested up to: 5.5
9
- Stable tag: 4.1.3.2
10
  Requires PHP: 5.5
11
 
12
  The #1 user-rated activity log plugin. Keep a comprehensive log of the changes that happen on your site with this easy to use plugin.
@@ -155,10 +155,11 @@ We need help translating the plugin and the activity log events. Please visit th
155
 
156
  #### WP Activity Log extensions for third party plugins
157
 
158
- * <strong>[WP Activity Log for WooCommerce](https://wpactivitylog.com/extensions/woocommerce-activity-log/?utm_source=wordpress.org&utm_medium=referral&utm_campaign=WSAL&utm_content=plugin+repos+description)</strong>: When you install this extension you keep a log of changes your team does to the WooCommerce store settings, orders, products, coupons _ much more.
159
- * <strong>[WP Activity Log for WPForms](https://wpactivitylog.com/extensions/wpforms-activity-log/?utm_source=wordpress.org&utm_medium=referral&utm_campaign=WSAL&utm_content=plugin+repos+description)</strong>: When you install this extension you keep a log of changes your team does in the WPForms plugin, forms, form files, entries (leads) and more.
160
- * <strong>[Activity Log for MainWP](https://wpactivitylog.com/extensions/mainwp-activity-log/?utm_source=wordpress.org&utm_medium=referral&utm_campaign=WSAL&utm_content=plugin+repos+description)</strong>: With this MainWP extension you keep a log of the MainWP network changes and can see the activity logs of all child sites from one central location - the MainWP dashboard.
161
- * <strong>[WP Activity Log for bbPress](https://wordpress.org/plugins/wp-security-audit-log-add-on-for-bbpress/)</strong>: With this extension you can keep a log of changes in bbPress forums, topics, bbPress settings and more.
 
162
 
163
  #### Related Links and Documentation
164
 
@@ -205,81 +206,67 @@ Please refer to our [support pages](https://wpactivitylog.com/support/?utm_sourc
205
 
206
  == Changelog ==
207
 
208
- = 4.1.3.2 (2020-08-14) =
209
 
210
- * **Improvement**
211
- * Released extension [WP Activity Log for WooCommerce](https://wordpress.org/plugins/wp-activity-log-for-woocommerce/) update 1.1 (improved logging etc).
212
-
213
- * **Bug fixes**
214
- * The orders details in WooCommerce were not being added to the order ([Support ticket](https://wordpress.org/support/topic/update-4-1-31-broken-woocommerce-urgent/)).
215
- * An empty space was added to the top of the WordPress admin menu.
216
- * Third party plugins extensions notification not showing in the activity log viewer.
217
- * Thurd party plugins extension help text was shown on the wrong pages.
218
-
219
- = 4.1.3 (2020-08-11) =
220
-
221
- Release notes: [WP Activity Log 4.1.3: New extension for WooCommerce & other updates](https://wpactivitylog.com/wsal-4-1-3/)
222
-
223
- * **IMPORTANT**
224
- * Only update from 4.1.2 to 4.1.3. If you are using an older version, first update to 4.1.2 before updating to 4.1.3.
225
 
226
  * **New features**
227
- * The all new [WP Activity Log for WooCommerce](https://wordpress.org/plugins/wp-activity-log-for-woocommerce/) extension (needed to keep a log of changes on WooCommerce store, products, orders & much more).
228
- * New [plugin and activity log privileges](https://wpactivitylog.com/support/kb/managing-wordpress-activity-log-plugin-privileges/) that allow super admins on a multisite network to restrict activity log access to site admins and other super admins.
229
- * Coverage for changes done to relationship custom fields created with ACF.
230
-
231
- * **New activity log events**
232
- * ID 2131: Added relationships in a custom field.
233
- * ID 2132: Removed relationships from a custom field.
234
- * ID 9101: Created new product tag in WooCommerce.
235
- * ID 9102: Deleted a product tag in WooCommerce.
236
- * ID 9103: Renamed a product tag in WooCommerce.
237
- * ID 9104: Changed the slug of a product tag in WooCommerce.
238
-
239
- Refer to the [complete list of activity log event IDs](https://wpactivitylog.com/support/kb/list-wordpress-activity-log-event-ids/) for more detailed information.
 
 
 
 
 
240
 
241
  * **Improvements**
242
- * Improved the plugin's coverage of WooCommerce stores, products, orders etc by adding new events, and updating the current sensor.
243
- * Plugin now uses the default WordPress options table to store settings (performance enhancement).
244
- * Refactored all settings in the database so they all use yes/no values.
245
- * Restricted the plugin's and activity log settings to the network dashboard only on a multisite network.
246
- * Change in wp_wsal_sessions table structure: now plugin uses session ID as unique identifier in table.
247
- * Plugin keeps the ID of the sites a user is logged in to on a multisite network.
248
- * Removed the Import/Export plugin settings functionality (a much better utility will be designed and launched as a replacement).
249
- * File changes detected by the Website File Changes Monitor plugin are now reported in the daily summary email.
250
- * Log files working directory in uploads directory renamed to wp-activity-log.
251
- * If no path is specified for the log files working directory, the default path is used.
252
- * Improved activity log privileges - on multisite super admin can restrict site admins from seeing their own site's activity logs.
253
- * WooCommerce front end sensor is automatically enabled if admin enables events to track purchases of non-logged in users.
254
- * Improved the text of the third party plugins extensions notifications.
255
- * Updated the format of event IDs 9070 and 4020 to matches the standard template.
256
- * Coverage of WooCommerce coupon changes has been improved andplugin can now keep a log of usage restriction changes in coupons.
257
- * IP address in list of logged in users is now linked to WhatIsMyIPAddress.com.
258
- * Added a message for when no sessions are shown in the Logged In users section.
259
- * Minor changes in the plugin's settings pages.
260
- * Updated some notifications used by the third party plugins extensions.
261
- * Third party plugins extensions are now automatically activated on multsite network when installed.
262
- * Removed all code that was used for file scanning. Now plugin is fully integrated with Website File Changes Monitor.
263
 
264
  * **Bug fixes**
265
- * Extensions notifications were wrongly shown to sub sites admins on multisite.
266
- * Event 1002 (failed user login) was wrongly reported when a user session is blocked.
267
- * When the setting Delete data on uninstall was enabled the plugin was not deleting all the data from the database.
268
- * Event ID 1002 (failed user login) incorrectly links to log file.
269
- * Plugin does not send logs to [Activity Log for MainWP](https://wpactivitylog.com/extensions/mainwp-activity-log/) extension when child site uses a non-default admin URL.
270
- * Error when loading user session tokens from usermeta table in some cases.
271
- * Users sessions table was moved to external database when activity log is stored in an external database.
272
- * Plugin was reporting event ID 1000 (login) when user changes own password in user profile page.
273
- * Plugin's log files working directory was hardcoded (uploads directory).
274
- * When super admins changed the plugin's settings on a child site, the settings were not applied globally.
275
- * Users who are allowed to view the activity log can also see who is logged in.
276
- * The old plugin name was shown on the daily summary email template.
277
- * Plugin created working directory in wrong location when site address is different than WordPress address.
278
- * Setup wizard shows all the extensions for third party plugins instead of those for the installed plugins.
279
- * Wrong anchor text "view post in editor" used for WooCommerce products.
280
- * Unknown object reported instead of actual Object in some of the [WPForms activity log](https://wpactivitylog.com/extensions/wpforms-activity-log/) events.
281
- * Event ID 2080 not reported when the last item was removed from the site menu.
282
- * Plugin logo missing from license activation screen.
283
- * [Website File Changes Monitor](https://www.wpwhitesecurity.com/wordpress-plugins/website-file-changes-monitor/) custom posts type changes were reported (these are ignored by default).
6
  Tags: activity log, wordpress activity logs, security audit log, audit log, user tracking, security event log, audit trail, wordpress security monitor, wordpress admin, wordpress admin monitoring, user activity, admin, multisite, SMS alerts, wordpress monitoring, email notification, wordpress email alerts, tracking, user tracking, user activity report, wordpress audit trail
7
  Requires at least: 3.6
8
  Tested up to: 5.5
9
+ Stable tag: 4.1.4
10
  Requires PHP: 5.5
11
 
12
  The #1 user-rated activity log plugin. Keep a comprehensive log of the changes that happen on your site with this easy to use plugin.
155
 
156
  #### WP Activity Log extensions for third party plugins
157
 
158
+ * <strong>[WP Activity Log for WooCommerce](https://wpactivitylog.com/extensions/woocommerce-activity-log/?utm_source=wordpress.org&utm_medium=referral&utm_campaign=WSAL&utm_content=plugin+repos+description)</strong>: Install this extension to keep a log of changes you and yourr team do in the WooCommerce store settings, orders, products, coupons and much more.
159
+ * <strong>[WP Activity Log for Yoast SEO](https://wpactivitylog.com/extensions/yoast-seo-activity-log/?utm_source=wordpress.org&utm_medium=referral&utm_campaign=WSAL&utm_content=plugin+repos+description)</strong>: Install this extension to keep a log of the Yoast SEO plugin settings changes, and also of the on-page SEO changes you and your team make in the Yoast SEO meta box.
160
+ * <strong>[WP Activity Log for WPForms](https://wpactivitylog.com/extensions/wpforms-activity-log/?utm_source=wordpress.org&utm_medium=referral&utm_campaign=WSAL&utm_content=plugin+repos+description)</strong>: Install this extension to keep a log of the changes your team does in the WPForms plugin settings, forms, form files, entries (leads) and more.
161
+ * <strong>[WP Activity Log for bbPress](https://wordpress.org/plugins/wp-security-audit-log-add-on-for-bbpress/)</strong>: Intall this extension to keep a log of changes in bbPress forums, topics, bbPress settings and more.
162
+ * <strong>[Activity Log for MainWP](https://wpactivitylog.com/extensions/mainwp-activity-log/?utm_source=wordpress.org&utm_medium=referral&utm_campaign=WSAL&utm_content=plugin+repos+description)</strong>: Install this MainWP extension to keep a log of the MainWP network changes and can see the activity logs of all child sites from one central location - the MainWP dashboard.
163
 
164
  #### Related Links and Documentation
165
 
206
 
207
  == Changelog ==
208
 
209
+ = 4.1.4 (2020-10-07) =
210
 
211
+ Release notes: [WP Activity Log 4.1.4: New activity log for Yoast SEO extenion & improved coverage](https://wpactivitylog.com/wsal-4-1-4/)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
 
213
  * **New features**
214
+ * [Activity Log for Yoast SEO](https://wpactivitylog.com/extensions/yoast-seo-activity-log/) extension.
215
+ * Plugin detects plugin updates done via a zip file (new feature in WordPress 5.5)
216
+
217
+ * **New Yoast SEO activity log event IDs**
218
+ * ID 8826: user has enabled / disabled the Redirect Attachment URLs in the Yoast SEO plugin.
219
+ * ID 8827: Usage tracking has been enabled / dsabled.
220
+ * ID 8828: The REST API: head endpoint setting was enabled / disabled.
221
+ * ID 8829: The social profile URL was added / modified / deleted.
222
+ * ID 8830: User changed the taxonomies settings to show in search results.
223
+ * ID 8831: Chaged the SEO title template for a taxonomy type.
224
+ * ID 8832: Changed the meta description template for a taxonomy type.
225
+ * ID 8833: Enabled or disabled the display of Author or Date archives.
226
+ * ID 8834: Configured the plugin to show the Author or Date archived in the search results.
227
+ * ID 8835: Changed the SEO title template for the Author or Date archive pages.
228
+ * ID 8836: Changed the Meta description template for the Author or Date archive pages.
229
+ * ID 8837: Enabled / disabled the setting to show SEO settings for specific taxonomy types.
230
+
231
+ Refer to the [complete list of activity log event IDs](https://wpactivitylog.com/support/kb/list-wordpress-activity-log-event-ids/) for more detailed information.
232
 
233
  * **Improvements**
234
+ * Improved the overall coverage and how events of changes in Yoast SEO plugin and YoastSEO metabox are reported.
235
+ * Implemented a single email class that is now used by all email features in the plugin.
236
+ * Updated Freemius SDK to the latest version (2.4.0).
237
+ * Improved the detection mechanism of installed third party plugins used for the activity log extensions notifications.
238
+ * Consolidated all [activity log extensions code](https://github.com/WPWhiteSecurity/wsal-extension-example) - now all third party plugins extensions use the same code.
239
+ * Improved the plugin's activation process on multisite network.
240
+ * Plugin only shows file changes notifications if the [Website File Changes Monitor](https://www.wpwhitesecurity.com/wordpress-plugins/website-file-changes-monitor/) plugin is installed.
241
+ * Plugin prompts user to save unsaved changes in settings page before switching pages.
242
+ * Improved plugin & activity log permissions on multisite network.
243
+ * System information file updated to retrieve settings from the wp_options table.
244
+ * Removed all the obsolete event IDs from the Enable/Disable events section.
245
+ * Updated a number of filters/hooks calls that were calling deprecated ones.
246
+ * Removed all the obsolete code which was used for the old wp_wsal_options table.
247
+ * The handling of disabled event IDs is now done more efficiently, via filters.
248
+ * Improved the session db adaptor which was causing errors in specific edge cases.
249
+ * Branded the notifications for third party plugins extensions and improved the text.
250
+ * Improved the first-time install wizard CSS to correctly display the list of required extensions for third party plugins.
251
+ * Removed event ID 2106 (plugin updated post) and ID 8823 (Yoast SEO date snippet) because they were made redundant.
252
+ * Moved all remaining bbPress code to the [Activity Log for bbPress](https://wordpress.org/plugins/wp-security-audit-log-add-on-for-bbpress/) extension.
253
+ * Added check to prevent identical search filters from being saved.
 
254
 
255
  * **Bug fixes**
256
+ * Removed the old version check from the wp_wsal_options table.
257
+ * Reset plugin settings was not deleting all the settings.
258
+ * Reports UI was not loading in a mixed content environment.
259
+ * Unkown object was reported in event ID 6034 (user purged activity log).
260
+ * Custom login page message was not shown in specific edge cases.
261
+ * Addressed a number of errors that were appearing during WooCommerce setup.
262
+ * List of IP addresses in event ID 1005 (users has multiple logged in sessions) was incorrect.
263
+ * Plugin was generating an error when changing the WooCommerce store address on a multisite network.
264
+ * Event ID 1000 reported twice on websites using the OptimizeMember plugin.
265
+ * Third party plugins detection was not detecting all plugins on multisite network.
266
+ * Built-in email notifications couldn't be disabled after they were enabled.
267
+ * Notification