BuddyPress - Version 3.0.0-beta2

Version Description

= 2.9.4 = See: https://codex.buddypress.org/releases/version-2-9-4/

Download this release

Release Info

Developer DJPaul
Plugin Icon 128x128 BuddyPress
Version 3.0.0-beta2
Comparing to
See all releases

Code changes from version 3.0.0-beta1 to 3.0.0-beta2

Files changed (77) hide show
  1. bp-groups/actions/join.php +3 -3
  2. bp-groups/bp-groups-filters.php +14 -3
  3. bp-loader.php +1 -1
  4. bp-templates/bp-legacy/buddypress-functions.php +4 -3
  5. bp-templates/bp-nouveau/buddypress/common/nav/directory-nav.php +2 -2
  6. bp-templates/bp-nouveau/buddypress/groups/create.php +3 -3
  7. bp-templates/bp-nouveau/buddypress/groups/single/activity.php +9 -11
  8. bp-templates/bp-nouveau/buddypress/groups/single/parts/admin-subnav.php +1 -1
  9. bp-templates/bp-nouveau/buddypress/groups/single/parts/item-nav.php +1 -1
  10. bp-templates/bp-nouveau/buddypress/members/single/notifications.php +1 -1
  11. bp-templates/bp-nouveau/buddypress/members/single/parts/item-nav.php +1 -1
  12. bp-templates/bp-nouveau/buddypress/members/single/parts/item-subnav.php +1 -1
  13. bp-templates/bp-nouveau/common-styles/_bp-mixins.scss +10 -3
  14. bp-templates/bp-nouveau/common-styles/_bp_buttons.scss +1 -1
  15. bp-templates/bp-nouveau/common-styles/_bp_navigation.scss +11 -10
  16. bp-templates/bp-nouveau/css/buddypress-rtl.css +57 -36
  17. bp-templates/bp-nouveau/css/buddypress-rtl.min.css +1 -1
  18. bp-templates/bp-nouveau/css/buddypress.css +57 -36
  19. bp-templates/bp-nouveau/css/buddypress.min.css +1 -1
  20. bp-templates/bp-nouveau/includes/customizer-controls.php +1 -1
  21. bp-templates/bp-nouveau/includes/functions.php +1 -1
  22. bp-templates/bp-nouveau/includes/groups/functions.php +1 -1
  23. bp-templates/bp-nouveau/includes/groups/template-tags.php +1 -1
  24. buddypress.pot +33 -33
  25. class-buddypress.php +5 -1
  26. cli/.distignore +13 -0
  27. cli/.editorconfig +25 -0
  28. cli/.gitignore +6 -0
  29. cli/.travis.yml +59 -0
  30. cli/bin/install-package-tests.sh +10 -0
  31. cli/bin/test.sh +13 -0
  32. cli/component.php +112 -0
  33. cli/components/activity-favorite.php +172 -0
  34. cli/components/activity.php +976 -0
  35. cli/components/component.php +226 -0
  36. cli/components/email.php +228 -0
  37. cli/components/friend.php +314 -0
  38. cli/components/group-invite.php +340 -0
  39. cli/components/group-member.php +358 -0
  40. cli/components/group.php +437 -0
  41. cli/components/member.php +48 -0
  42. cli/components/message.php +552 -0
  43. cli/components/signup.php +371 -0
  44. cli/components/tool.php +52 -0
  45. cli/components/xprofile-data.php +200 -0
  46. cli/components/xprofile-field.php +217 -0
  47. cli/components/xprofile-group.php +174 -0
  48. cli/composer.json +39 -0
  49. cli/features/activity-favorite.feature +39 -0
  50. cli/features/activity.feature +92 -0
  51. cli/features/bootstrap/FeatureContext.php +903 -0
  52. cli/features/bootstrap/Process.php +116 -0
  53. cli/features/bootstrap/ProcessRun.php +68 -0
  54. cli/features/bootstrap/support.php +194 -0
  55. cli/features/bootstrap/utils.php +1194 -0
  56. cli/features/component.feature +46 -0
  57. cli/features/email.feature +10 -0
  58. cli/features/extra/no-mail.php +7 -0
  59. cli/features/friend.feature +56 -0
  60. cli/features/group-invite.feature +62 -0
  61. cli/features/group-member.feature +79 -0
  62. cli/features/group.feature +87 -0
  63. cli/features/message.feature +105 -0
  64. cli/features/signup.feature +83 -0
  65. cli/features/steps/given-custom.php +30 -0
  66. cli/features/steps/given.php +213 -0
  67. cli/features/steps/then.php +217 -0
  68. cli/features/steps/when.php +54 -0
  69. cli/features/tool.feature +10 -0
  70. cli/features/xprofile-data.feature +52 -0
  71. cli/features/xprofile-field.feature +29 -0
  72. cli/features/xprofile-group.feature +26 -0
  73. cli/license.txt +280 -0
  74. cli/readme.md +69 -0
  75. cli/utils/behat-tags.php +76 -0
  76. cli/wp-cli-bp.php +190 -0
  77. cli/wp-cli.yml +2 -0
bp-groups/actions/join.php CHANGED
@@ -28,8 +28,8 @@ function groups_action_join_group() {
28
  // Skip if banned or already a member.
29
  if ( !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) && !groups_is_user_banned( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
30
 
31
- // User wants to join a group that is not public.
32
- if ( bp_current_user_can( 'groups_join_group', array( 'group_id' => $bp->groups->current_group->id ) ) ) {
33
  if ( !groups_check_user_has_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
34
  bp_core_add_message( __( 'There was an error joining the group.', 'buddypress' ), 'error' );
35
  bp_core_redirect( bp_get_group_permalink( $bp->groups->current_group ) );
@@ -54,4 +54,4 @@ function groups_action_join_group() {
54
  */
55
  bp_core_load_template( apply_filters( 'groups_template_group_home', 'groups/single/home' ) );
56
  }
57
- add_action( 'bp_actions', 'groups_action_join_group' );
28
  // Skip if banned or already a member.
29
  if ( !groups_is_user_member( bp_loggedin_user_id(), $bp->groups->current_group->id ) && !groups_is_user_banned( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
30
 
31
+ // User wants to join a group that requires an invitation to join.
32
+ if ( ! bp_current_user_can( 'groups_join_group', array( 'group_id' => $bp->groups->current_group->id ) ) ) {
33
  if ( !groups_check_user_has_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
34
  bp_core_add_message( __( 'There was an error joining the group.', 'buddypress' ), 'error' );
35
  bp_core_redirect( bp_get_group_permalink( $bp->groups->current_group ) );
54
  */
55
  bp_core_load_template( apply_filters( 'groups_template_group_home', 'groups/single/home' ) );
56
  }
57
+ add_action( 'bp_actions', 'groups_action_join_group' );
bp-groups/bp-groups-filters.php CHANGED
@@ -216,11 +216,17 @@ function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $a
216
  break;
217
  }
218
 
 
 
 
219
  // The group must allow joining, and the user should not currently be a member.
220
  $group = groups_get_group( $group_id );
221
- if ( 'public' === bp_get_group_status( $group )
222
  && ! groups_is_user_member( $user_id, $group->id )
223
- && ! groups_is_user_banned( $user_id, $group->id )
 
 
 
224
  ) {
225
  $retval = true;
226
  }
@@ -232,6 +238,9 @@ function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $a
232
  break;
233
  }
234
 
 
 
 
235
  /*
236
  * The group must accept membership requests, and the user should not
237
  * currently be a member, have an active request, or be banned.
@@ -256,7 +265,6 @@ function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $a
256
  * The group must allow invitations, and the user should not
257
  * currently be a member or be banned from the group.
258
  */
259
- $group = groups_get_group( $group_id );
260
  // Users with the 'bp_moderate' cap can always send invitations.
261
  if ( bp_user_can( $user_id, 'bp_moderate' ) ) {
262
  $retval = true;
@@ -291,6 +299,9 @@ function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $a
291
  break;
292
  }
293
 
 
 
 
294
  /*
295
  * The group must allow invitations, and the user should not
296
  * currently be a member or be banned from the group.
216
  break;
217
  }
218
 
219
+ // Set to false to begin with.
220
+ $retval = false;
221
+
222
  // The group must allow joining, and the user should not currently be a member.
223
  $group = groups_get_group( $group_id );
224
+ if ( ( 'public' === bp_get_group_status( $group )
225
  && ! groups_is_user_member( $user_id, $group->id )
226
+ && ! groups_is_user_banned( $user_id, $group->id ) )
227
+ // Site admins can join any group they are not a member of.
228
+ || ( bp_user_can( $user_id, 'bp_moderate' )
229
+ && ! groups_is_user_member( $user_id, $group->id ) )
230
  ) {
231
  $retval = true;
232
  }
238
  break;
239
  }
240
 
241
+ // Set to false to begin with.
242
+ $retval = false;
243
+
244
  /*
245
  * The group must accept membership requests, and the user should not
246
  * currently be a member, have an active request, or be banned.
265
  * The group must allow invitations, and the user should not
266
  * currently be a member or be banned from the group.
267
  */
 
268
  // Users with the 'bp_moderate' cap can always send invitations.
269
  if ( bp_user_can( $user_id, 'bp_moderate' ) ) {
270
  $retval = true;
299
  break;
300
  }
301
 
302
+ // Set to false to begin with.
303
+ $retval = false;
304
+
305
  /*
306
  * The group must allow invitations, and the user should not
307
  * currently be a member or be banned from the group.
bp-loader.php CHANGED
@@ -15,7 +15,7 @@
15
  * Description: BuddyPress adds community features to WordPress. Member Profiles, Activity Streams, Direct Messaging, Notifications, and more!
16
  * Author: The BuddyPress Community
17
  * Author URI: https://buddypress.org/
18
- * Version: 3.0.0-beta1
19
  * Text Domain: buddypress
20
  * Domain Path: /bp-languages/
21
  * License: GPLv2 or later (license.txt)
15
  * Description: BuddyPress adds community features to WordPress. Member Profiles, Activity Streams, Direct Messaging, Notifications, and more!
16
  * Author: The BuddyPress Community
17
  * Author URI: https://buddypress.org/
18
+ * Version: 3.0.0-beta2
19
  * Text Domain: buddypress
20
  * Domain Path: /bp-languages/
21
  * License: GPLv2 or later (license.txt)
bp-templates/bp-legacy/buddypress-functions.php CHANGED
@@ -1327,13 +1327,14 @@ function bp_legacy_theme_ajax_invite_user() {
1327
  if ( ! bp_groups_user_can_send_invites( $_POST['group_id'] ) )
1328
  return;
1329
 
1330
- if ( ! friends_check_friendship( bp_loggedin_user_id(), $_POST['friend_id'] ) )
1331
- return;
1332
-
1333
  $group_id = (int) $_POST['group_id'];
1334
  $friend_id = (int) $_POST['friend_id'];
1335
 
1336
  if ( 'invite' == $_POST['friend_action'] ) {
 
 
 
 
1337
  $group = groups_get_group( $group_id );
1338
 
1339
  // Users who have previously requested membership do not need
1327
  if ( ! bp_groups_user_can_send_invites( $_POST['group_id'] ) )
1328
  return;
1329
 
 
 
 
1330
  $group_id = (int) $_POST['group_id'];
1331
  $friend_id = (int) $_POST['friend_id'];
1332
 
1333
  if ( 'invite' == $_POST['friend_action'] ) {
1334
+ if ( ! friends_check_friendship( bp_loggedin_user_id(), $_POST['friend_id'] ) ) {
1335
+ return;
1336
+ }
1337
+
1338
  $group = groups_get_group( $group_id );
1339
 
1340
  // Users who have previously requested membership do not need
bp-templates/bp-nouveau/buddypress/common/nav/directory-nav.php CHANGED
@@ -10,7 +10,7 @@
10
 
11
  <?php if ( bp_nouveau_has_nav( array( 'object' => 'directory' ) ) ) : ?>
12
 
13
- <ul type="list" class="component-navigation <?php bp_nouveau_directory_list_class(); ?>">
14
 
15
  <?php
16
  while ( bp_nouveau_nav_items() ) :
@@ -22,7 +22,7 @@
22
  <?php bp_nouveau_nav_link_text(); ?>
23
 
24
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
25
- <span><?php bp_nouveau_nav_count(); ?></span>
26
  <?php endif; ?>
27
  </a>
28
  </li>
10
 
11
  <?php if ( bp_nouveau_has_nav( array( 'object' => 'directory' ) ) ) : ?>
12
 
13
+ <ul class="component-navigation <?php bp_nouveau_directory_list_class(); ?>">
14
 
15
  <?php
16
  while ( bp_nouveau_nav_items() ) :
22
  <?php bp_nouveau_nav_link_text(); ?>
23
 
24
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
25
+ <span class="count"><?php bp_nouveau_nav_count(); ?></span>
26
  <?php endif; ?>
27
  </a>
28
  </li>
bp-templates/bp-nouveau/buddypress/groups/create.php CHANGED
@@ -18,11 +18,11 @@ bp_nouveau_groups_create_hook( 'before', 'page' ); ?>
18
  <div class="item-body" id="group-create-body">
19
 
20
  <nav class="<?php bp_nouveau_groups_create_steps_classes(); ?>" id="group-create-tabs" role="navigation" aria-label="<?php esc_attr_e( 'Group creation menu', 'buddypress' ); ?>">
21
- <ul class="group-create-buttons button-tabs">
22
 
23
- <?php bp_nouveau_group_creation_tabs(); ?>
24
 
25
- </ul>
26
  </nav>
27
 
28
  <?php bp_nouveau_group_creation_screen(); ?>
18
  <div class="item-body" id="group-create-body">
19
 
20
  <nav class="<?php bp_nouveau_groups_create_steps_classes(); ?>" id="group-create-tabs" role="navigation" aria-label="<?php esc_attr_e( 'Group creation menu', 'buddypress' ); ?>">
21
+ <ol class="group-create-buttons button-tabs">
22
 
23
+ <?php bp_group_creation_tabs(); ?>
24
 
25
+ </ol>
26
  </nav>
27
 
28
  <?php bp_nouveau_group_creation_screen(); ?>
bp-templates/bp-nouveau/buddypress/groups/single/activity.php CHANGED
@@ -10,28 +10,26 @@
10
  <?php bp_nouveau_groups_activity_post_form(); ?>
11
 
12
 
13
- <div class="subnav-filters filters clearfix">
14
 
15
- <ul>
16
- <li class="feed"><a href="<?php bp_group_activity_feed_link(); ?>" class="bp-tooltip" data-bp-tooltip="<?php esc_attr_e( 'RSS Feed', 'buddypress' ); ?>" class="no-ajax"><span class="bp-screen-reader-text"><?php _e( 'RSS', 'buddypress' ); ?></span></a></li>
17
 
18
- <li class="group-act-search"><?php bp_nouveau_search_form(); ?></li>
19
- </ul>
 
 
 
20
 
21
  <?php bp_get_template_part( 'common/filters/groups-screens-filters' ); ?>
22
- </div><!-- // .subnav-filters -->
23
 
24
 
25
  <?php bp_nouveau_group_hook( 'before', 'activity_content' ); ?>
26
 
27
- <div class="activity single-group">
28
-
29
- <ul id="activity-stream" class="activity-list item-list bp-list" data-bp-list="activity">
30
 
31
  <li id="bp-activity-ajax-loader"><?php bp_nouveau_user_feedback( 'group-activity-loading' ); ?></li>
32
 
33
- </ul>
34
-
35
  </div><!-- .activity -->
36
 
37
  <?php
10
  <?php bp_nouveau_groups_activity_post_form(); ?>
11
 
12
 
13
+ <div class="subnav-filters filters clearfix">
14
 
15
+ <ul>
 
16
 
17
+ <li class="feed"><a href="<?php bp_group_activity_feed_link(); ?>" class="bp-tooltip no-ajax" data-bp-tooltip="<?php esc_attr_e( 'RSS Feed', 'buddypress' ); ?>"><span class="bp-screen-reader-text"><?php _e( 'RSS', 'buddypress' ); ?></span></a></li>
18
+
19
+ <li class="group-act-search"><?php bp_nouveau_search_form(); ?></li>
20
+
21
+ </ul>
22
 
23
  <?php bp_get_template_part( 'common/filters/groups-screens-filters' ); ?>
24
+ </div><!-- // .subnav-filters -->
25
 
26
 
27
  <?php bp_nouveau_group_hook( 'before', 'activity_content' ); ?>
28
 
29
+ <div id="activity-stream" class="activity single-group" data-bp-list="activity">
 
 
30
 
31
  <li id="bp-activity-ajax-loader"><?php bp_nouveau_user_feedback( 'group-activity-loading' ); ?></li>
32
 
 
 
33
  </div><!-- .activity -->
34
 
35
  <?php
bp-templates/bp-nouveau/buddypress/groups/single/parts/admin-subnav.php CHANGED
@@ -22,7 +22,7 @@
22
  <?php bp_nouveau_nav_link_text(); ?>
23
 
24
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
25
- <span><?php bp_nouveau_nav_count(); ?></span>
26
  <?php endif; ?>
27
  </a>
28
  </li>
22
  <?php bp_nouveau_nav_link_text(); ?>
23
 
24
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
25
+ <span class="count"><?php bp_nouveau_nav_count(); ?></span>
26
  <?php endif; ?>
27
  </a>
28
  </li>
bp-templates/bp-nouveau/buddypress/groups/single/parts/item-nav.php CHANGED
@@ -22,7 +22,7 @@
22
  <?php bp_nouveau_nav_link_text(); ?>
23
 
24
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
25
- <span><?php bp_nouveau_nav_count(); ?></span>
26
  <?php endif; ?>
27
  </a>
28
  </li>
22
  <?php bp_nouveau_nav_link_text(); ?>
23
 
24
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
25
+ <span class="count"><?php bp_nouveau_nav_count(); ?></span>
26
  <?php endif; ?>
27
  </a>
28
  </li>
bp-templates/bp-nouveau/buddypress/members/single/notifications.php CHANGED
@@ -6,7 +6,7 @@
6
  */
7
  ?>
8
 
9
- <nav class="<?php bp_nouveau_single_item_subnav_classes(); ?>" id="subnav" role="navigation" aria-label="<?php esc_attr_e( 'Notifcations menu', 'buddypress' ); ?>">
10
  <ul class="subnav">
11
 
12
  <?php bp_get_template_part( 'members/single/parts/item-subnav' ); ?>
6
  */
7
  ?>
8
 
9
+ <nav class="<?php bp_nouveau_single_item_subnav_classes(); ?>" id="subnav" role="navigation" aria-label="<?php esc_attr_e( 'Notifications menu', 'buddypress' ); ?>">
10
  <ul class="subnav">
11
 
12
  <?php bp_get_template_part( 'members/single/parts/item-subnav' ); ?>
bp-templates/bp-nouveau/buddypress/members/single/parts/item-nav.php CHANGED
@@ -22,7 +22,7 @@
22
  <?php bp_nouveau_nav_link_text(); ?>
23
 
24
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
25
- <span><?php bp_nouveau_nav_count(); ?></span>
26
  <?php endif; ?>
27
  </a>
28
  </li>
22
  <?php bp_nouveau_nav_link_text(); ?>
23
 
24
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
25
+ <span class="count"><?php bp_nouveau_nav_count(); ?></span>
26
  <?php endif; ?>
27
  </a>
28
  </li>
bp-templates/bp-nouveau/buddypress/members/single/parts/item-subnav.php CHANGED
@@ -18,7 +18,7 @@
18
  <?php bp_nouveau_nav_link_text(); ?>
19
 
20
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
21
- <span><?php bp_nouveau_nav_count(); ?></span>
22
  <?php endif; ?>
23
  </a>
24
  </li>
18
  <?php bp_nouveau_nav_link_text(); ?>
19
 
20
  <?php if ( bp_nouveau_nav_has_count() ) : ?>
21
+ <span class="count"><?php bp_nouveau_nav_count(); ?></span>
22
  <?php endif; ?>
23
  </a>
24
  </li>
bp-templates/bp-nouveau/common-styles/_bp-mixins.scss CHANGED
@@ -338,7 +338,8 @@
338
 
339
  .tabbed-links {
340
 
341
- ul {
 
342
  border-bottom: 1px solid $bp-border-dark;
343
  float: none;
344
  margin: $marg-lrg 0 $marg-sml;
@@ -358,12 +359,18 @@
358
  list-style: none;
359
  margin: 0 $marg-sml 0 0;
360
 
361
- a {
 
362
  background: none;
363
  border: none;
364
  display: block;
365
  padding: 4px 10px;
366
  }
 
 
 
 
 
367
  }
368
 
369
  li.current {
@@ -373,7 +380,7 @@
373
  border-top-right-radius: 4px;
374
  border-width: 1px;
375
  margin-bottom: -1px;
376
- padding: 0 $pad-sml;
377
 
378
  a {
379
  color: $black;
338
 
339
  .tabbed-links {
340
 
341
+ ul,
342
+ ol {
343
  border-bottom: 1px solid $bp-border-dark;
344
  float: none;
345
  margin: $marg-lrg 0 $marg-sml;
359
  list-style: none;
360
  margin: 0 $marg-sml 0 0;
361
 
362
+ a,
363
+ span {
364
  background: none;
365
  border: none;
366
  display: block;
367
  padding: 4px 10px;
368
  }
369
+
370
+ a:focus,
371
+ a:hover {
372
+ background: none;
373
+ }
374
  }
375
 
376
  li.current {
380
  border-top-right-radius: 4px;
381
  border-width: 1px;
382
  margin-bottom: -1px;
383
+ padding: 0 $pad-sml 1px;
384
 
385
  a {
386
  color: $black;
bp-templates/bp-nouveau/common-styles/_bp_buttons.scss CHANGED
@@ -169,7 +169,7 @@
169
  background: none;
170
  border: none;
171
  border-right: 1px solid $bp-border-color;
172
- color: $light-text;
173
  display: inline-block;
174
  padding: $pad-xsml $pad-med;
175
 
169
  background: none;
170
  border: none;
171
  border-right: 1px solid $bp-border-color;
172
+ color: $light-text-plus;
173
  display: inline-block;
174
  padding: $pad-xsml $pad-med;
175
 
bp-templates/bp-nouveau/common-styles/_bp_navigation.scss CHANGED
@@ -32,7 +32,7 @@
32
  text-decoration: none;
33
  }
34
 
35
- span {
36
  background: $light-grey;
37
  border: 1px solid $bp-border-dark;
38
  border-radius: 50%;
@@ -92,7 +92,7 @@
92
 
93
  a {
94
 
95
- span {
96
  background-color: $grey;
97
  }
98
  }
@@ -117,7 +117,7 @@
117
  background: $dark-grey;
118
  color: $off-white;
119
 
120
- span {
121
  border-color: $off-white;
122
  }
123
  }
@@ -154,7 +154,7 @@
154
 
155
  &.bp-dir-hori-nav {
156
 
157
- nav {
158
  border-bottom: 1px solid $bp-border-color;
159
  border-top: 1px solid $bp-border-color;
160
 
@@ -310,7 +310,7 @@
310
 
311
  a {
312
 
313
- span {
314
  background-color: $white;
315
  }
316
  }
@@ -322,7 +322,7 @@
322
 
323
  a {
324
 
325
- span {
326
  background-color: $highlight;
327
  border: 0;
328
  color: $off-white;
@@ -334,7 +334,7 @@
334
 
335
  a:hover {
336
 
337
- span {
338
  background-color: $highlight;
339
  border: 0;
340
  color: $white;
@@ -346,7 +346,7 @@
346
 
347
  a {
348
 
349
- span:empty {
350
  display: none;
351
  }
352
  }
@@ -359,6 +359,7 @@
359
  ul {
360
 
361
  li:not(.current) {
 
362
 
363
  a {
364
  color: $light-text;
@@ -436,7 +437,7 @@
436
 
437
  a {
438
 
439
- span {
440
  display: inline-block;
441
  float: right;
442
  }
@@ -458,7 +459,7 @@
458
 
459
  a {
460
 
461
- span {
462
  float: right;
463
 
464
  }
32
  text-decoration: none;
33
  }
34
 
35
+ .count {
36
  background: $light-grey;
37
  border: 1px solid $bp-border-dark;
38
  border-radius: 50%;
92
 
93
  a {
94
 
95
+ .count {
96
  background-color: $grey;
97
  }
98
  }
117
  background: $dark-grey;
118
  color: $off-white;
119
 
120
+ .count {
121
  border-color: $off-white;
122
  }
123
  }
154
 
155
  &.bp-dir-hori-nav {
156
 
157
+ nav:not(".tabbed-links") {
158
  border-bottom: 1px solid $bp-border-color;
159
  border-top: 1px solid $bp-border-color;
160
 
310
 
311
  a {
312
 
313
+ .count {
314
  background-color: $white;
315
  }
316
  }
322
 
323
  a {
324
 
325
+ .count {
326
  background-color: $highlight;
327
  border: 0;
328
  color: $off-white;
334
 
335
  a:hover {
336
 
337
+ .count {
338
  background-color: $highlight;
339
  border: 0;
340
  color: $white;
346
 
347
  a {
348
 
349
+ .count:empty {
350
  display: none;
351
  }
352
  }
359
  ul {
360
 
361
  li:not(.current) {
362
+ color: $light-text;
363
 
364
  a {
365
  color: $light-text;
437
 
438
  a {
439
 
440
+ .count {
441
  display: inline-block;
442
  float: right;
443
  }
459
 
460
  a {
461
 
462
+ .count {
463
  float: right;
464
 
465
  }
bp-templates/bp-nouveau/css/buddypress-rtl.css CHANGED
@@ -302,7 +302,7 @@ body.buddypress article.page > .entry-header .entry-title {
302
  text-decoration: none;
303
  }
304
 
305
- .bp-navs ul li span {
306
  background: #eaeaea;
307
  border: 1px solid #ccc;
308
  border-radius: 50%;
@@ -330,9 +330,9 @@ body.buddypress article.page > .entry-header .entry-title {
330
  margin-bottom: 20px;
331
  }
332
 
333
- .buddypress-wrap .bp-navs li.selected a span,
334
- .buddypress-wrap .bp-navs li.current a span,
335
- .buddypress-wrap .bp-navs li a:hover a span {
336
  background-color: #ccc;
337
  }
338
 
@@ -354,12 +354,12 @@ body.buddypress article.page > .entry-header .entry-title {
354
  color: #fafafa;
355
  }
356
 
357
- .buddypress-wrap .bp-navs li.selected a span,
358
- .buddypress-wrap .bp-navs li.selected a:focus span,
359
- .buddypress-wrap .bp-navs li.selected a:hover span,
360
- .buddypress-wrap .bp-navs li.current a span,
361
- .buddypress-wrap .bp-navs li.current a:focus span,
362
- .buddypress-wrap .bp-navs li.current a:hover span {
363
  border-color: #fafafa;
364
  }
365
 
@@ -376,7 +376,7 @@ body.buddypress article.page > .entry-header .entry-title {
376
  color: #fafafa;
377
  text-decoration: none;
378
  }
379
- .buddypress-wrap.bp-dir-hori-nav nav {
380
  border-bottom: 1px solid #eee;
381
  border-top: 1px solid #eee;
382
  -webkit-box-shadow: 0 2px 12px 0 #fafafa;
@@ -461,36 +461,41 @@ body.buddypress article.page > .entry-header .entry-title {
461
  }
462
  }
463
 
464
- .buddypress_object_nav .bp-navs li.selected a span,
465
- .buddypress_object_nav .bp-navs li.current a span,
466
- .buddypress-wrap .bp-navs li.selected a span,
467
- .buddypress-wrap .bp-navs li.current a span {
468
  background-color: #fff;
469
  }
470
 
471
- .buddypress_object_nav .bp-navs li.dynamic a span,
472
- .buddypress_object_nav .bp-navs li.dynamic.selected a span,
473
- .buddypress_object_nav .bp-navs li.dynamic.current a span,
474
- .buddypress-wrap .bp-navs li.dynamic a span,
475
- .buddypress-wrap .bp-navs li.dynamic.selected a span,
476
- .buddypress-wrap .bp-navs li.dynamic.current a span {
477
  background-color: #5087e5;
478
  border: 0;
479
  color: #fafafa;
480
  }
481
 
482
- .buddypress_object_nav .bp-navs li.dynamic a:hover span,
483
- .buddypress-wrap .bp-navs li.dynamic a:hover span {
484
  background-color: #5087e5;
485
  border: 0;
486
  color: #fff;
487
  }
488
 
489
- .buddypress_object_nav .bp-navs li a span:empty,
490
- .buddypress-wrap .bp-navs li a span:empty {
491
  display: none;
492
  }
493
 
 
 
 
 
 
494
  .buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a,
495
  .buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a {
496
  color: #767676;
@@ -532,7 +537,7 @@ body.buddypress article.page > .entry-header .entry-title {
532
  }
533
  }
534
 
535
- .buddypress_object_nav .bp-navs li a span {
536
  display: inline-block;
537
  float: left;
538
  }
@@ -541,45 +546,61 @@ body.buddypress article.page > .entry-header .entry-title {
541
  .bp-dir-vert-nav .bp-navs.dir-navs {
542
  background: none;
543
  }
544
- .bp-dir-vert-nav .bp-navs.dir-navs a span {
545
  float: left;
546
  }
547
  }
548
 
549
  @media screen and (min-width: 46.8em) {
550
- .buddypress-wrap .item-body .tabbed-links ul {
 
551
  border-bottom: 1px solid #ccc;
552
  float: none;
553
  margin: 20px 0 10px;
554
  }
555
- .buddypress-wrap .item-body .tabbed-links ul:before, .buddypress-wrap .item-body .tabbed-links ul:after {
 
 
556
  content: " ";
557
  display: block;
558
  }
559
- .buddypress-wrap .item-body .tabbed-links ul:after {
 
560
  clear: both;
561
  }
562
- .buddypress-wrap .item-body .tabbed-links ul li {
 
563
  float: right;
564
  list-style: none;
565
  margin: 0 0 0 10px;
566
  }
567
- .buddypress-wrap .item-body .tabbed-links ul li a {
 
 
 
568
  background: none;
569
  border: none;
570
  display: block;
571
  padding: 4px 10px;
572
  }
573
- .buddypress-wrap .item-body .tabbed-links ul li.current {
 
 
 
 
 
 
 
574
  border-color: #ccc #ccc #fff;
575
  border-style: solid;
576
  border-top-right-radius: 4px;
577
  border-top-left-radius: 4px;
578
  border-width: 1px;
579
  margin-bottom: -1px;
580
- padding: 0 0.5em;
581
  }
582
- .buddypress-wrap .item-body .tabbed-links ul li.current a {
 
583
  color: #333;
584
  }
585
  .buddypress-wrap .item-body .bp-subnavs.tabbed-links > ul {
@@ -3980,7 +4001,7 @@ body.no-js .buddypress #messages-bulk-management #select-all-messages {
3980
  background: none;
3981
  border: none;
3982
  border-left: 1px solid #eee;
3983
- color: #767676;
3984
  display: inline-block;
3985
  padding: 0.3em 1em;
3986
  }
302
  text-decoration: none;
303
  }
304
 
305
+ .bp-navs ul li .count {
306
  background: #eaeaea;
307
  border: 1px solid #ccc;
308
  border-radius: 50%;
330
  margin-bottom: 20px;
331
  }
332
 
333
+ .buddypress-wrap .bp-navs li.selected a .count,
334
+ .buddypress-wrap .bp-navs li.current a .count,
335
+ .buddypress-wrap .bp-navs li a:hover a .count {
336
  background-color: #ccc;
337
  }
338
 
354
  color: #fafafa;
355
  }
356
 
357
+ .buddypress-wrap .bp-navs li.selected a .count,
358
+ .buddypress-wrap .bp-navs li.selected a:focus .count,
359
+ .buddypress-wrap .bp-navs li.selected a:hover .count,
360
+ .buddypress-wrap .bp-navs li.current a .count,
361
+ .buddypress-wrap .bp-navs li.current a:focus .count,
362
+ .buddypress-wrap .bp-navs li.current a:hover .count {
363
  border-color: #fafafa;
364
  }
365
 
376
  color: #fafafa;
377
  text-decoration: none;
378
  }
379
+ .buddypress-wrap.bp-dir-hori-nav nav:not(".tabbed-links") {
380
  border-bottom: 1px solid #eee;
381
  border-top: 1px solid #eee;
382
  -webkit-box-shadow: 0 2px 12px 0 #fafafa;
461
  }
462
  }
463
 
464
+ .buddypress_object_nav .bp-navs li.selected a .count,
465
+ .buddypress_object_nav .bp-navs li.current a .count,
466
+ .buddypress-wrap .bp-navs li.selected a .count,
467
+ .buddypress-wrap .bp-navs li.current a .count {
468
  background-color: #fff;
469
  }
470
 
471
+ .buddypress_object_nav .bp-navs li.dynamic a .count,
472
+ .buddypress_object_nav .bp-navs li.dynamic.selected a .count,
473
+ .buddypress_object_nav .bp-navs li.dynamic.current a .count,
474
+ .buddypress-wrap .bp-navs li.dynamic a .count,
475
+ .buddypress-wrap .bp-navs li.dynamic.selected a .count,
476
+ .buddypress-wrap .bp-navs li.dynamic.current a .count {
477
  background-color: #5087e5;
478
  border: 0;
479
  color: #fafafa;
480
  }
481
 
482
+ .buddypress_object_nav .bp-navs li.dynamic a:hover .count,
483
+ .buddypress-wrap .bp-navs li.dynamic a:hover .count {
484
  background-color: #5087e5;
485
  border: 0;
486
  color: #fff;
487
  }
488
 
489
+ .buddypress_object_nav .bp-navs li a .count:empty,
490
+ .buddypress-wrap .bp-navs li a .count:empty {
491
  display: none;
492
  }
493
 
494
+ .buddypress_object_nav .bp-navs.group-create-links ul li:not(.current),
495
+ .buddypress-wrap .bp-navs.group-create-links ul li:not(.current) {
496
+ color: #767676;
497
+ }
498
+
499
  .buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a,
500
  .buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a {
501
  color: #767676;
537
  }
538
  }
539
 
540
+ .buddypress_object_nav .bp-navs li a .count {
541
  display: inline-block;
542
  float: left;
543
  }
546
  .bp-dir-vert-nav .bp-navs.dir-navs {
547
  background: none;
548
  }
549
+ .bp-dir-vert-nav .bp-navs.dir-navs a .count {
550
  float: left;
551
  }
552
  }
553
 
554
  @media screen and (min-width: 46.8em) {
555
+ .buddypress-wrap .item-body .tabbed-links ul,
556
+ .buddypress-wrap .item-body .tabbed-links ol {
557
  border-bottom: 1px solid #ccc;
558
  float: none;
559
  margin: 20px 0 10px;
560
  }
561
+ .buddypress-wrap .item-body .tabbed-links ul:before, .buddypress-wrap .item-body .tabbed-links ul:after,
562
+ .buddypress-wrap .item-body .tabbed-links ol:before,
563
+ .buddypress-wrap .item-body .tabbed-links ol:after {
564
  content: " ";
565
  display: block;
566
  }
567
+ .buddypress-wrap .item-body .tabbed-links ul:after,
568
+ .buddypress-wrap .item-body .tabbed-links ol:after {
569
  clear: both;
570
  }
571
+ .buddypress-wrap .item-body .tabbed-links ul li,
572
+ .buddypress-wrap .item-body .tabbed-links ol li {
573
  float: right;
574
  list-style: none;
575
  margin: 0 0 0 10px;
576
  }
577
+ .buddypress-wrap .item-body .tabbed-links ul li a,
578
+ .buddypress-wrap .item-body .tabbed-links ul li span,
579
+ .buddypress-wrap .item-body .tabbed-links ol li a,
580
+ .buddypress-wrap .item-body .tabbed-links ol li span {
581
  background: none;
582
  border: none;
583
  display: block;
584
  padding: 4px 10px;
585
  }
586
+ .buddypress-wrap .item-body .tabbed-links ul li a:focus,
587
+ .buddypress-wrap .item-body .tabbed-links ul li a:hover,
588
+ .buddypress-wrap .item-body .tabbed-links ol li a:focus,
589
+ .buddypress-wrap .item-body .tabbed-links ol li a:hover {
590
+ background: none;
591
+ }
592
+ .buddypress-wrap .item-body .tabbed-links ul li.current,
593
+ .buddypress-wrap .item-body .tabbed-links ol li.current {
594
  border-color: #ccc #ccc #fff;
595
  border-style: solid;
596
  border-top-right-radius: 4px;
597
  border-top-left-radius: 4px;
598
  border-width: 1px;
599
  margin-bottom: -1px;
600
+ padding: 0 0.5em 1px;
601
  }
602
+ .buddypress-wrap .item-body .tabbed-links ul li.current a,
603
+ .buddypress-wrap .item-body .tabbed-links ol li.current a {
604
  color: #333;
605
  }
606
  .buddypress-wrap .item-body .bp-subnavs.tabbed-links > ul {
4001
  background: none;
4002
  border: none;
4003
  border-left: 1px solid #eee;
4004
+ color: #737373;
4005
  display: inline-block;
4006
  padding: 0.3em 1em;
4007
  }
bp-templates/bp-nouveau/css/buddypress-rtl.min.css CHANGED
@@ -1 +1 @@
1
- body #buddypress * a{box-shadow:none;text-decoration:none}body #buddypress #item-body blockquote,body #buddypress .bp-lists blockquote{margin-right:10px}body #buddypress .bp-list .action{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media screen and (min-width:46.8em){body.buddypress .entry-content,body.buddypress .entry-header,body.buddypress .site-content .entry-header{max-width:none}body.buddypress .entry-header{float:none;max-width:none}body.buddypress .entry-content{float:none;max-width:none}body.buddypress .site-content{padding-top:2.5em}body.buddypress #page #primary{max-width:none}body.buddypress #page #primary .entry-content,body.buddypress #page #primary .entry-header{float:none;width:auto}}body.buddypress .buddypress-wrap h1,body.buddypress .buddypress-wrap h2,body.buddypress .buddypress-wrap h3,body.buddypress .buddypress-wrap h4,body.buddypress .buddypress-wrap h5,body.buddypress .buddypress-wrap h6{clear:none;margin:1em 0;padding:0}.bp-wrap:after,.bp-wrap:before{content:" ";display:table}.bp-wrap:after{clear:both}.buddypress-wrap.round-avatars .avatar{border-radius:50%}div,dl,input[type=reset],input[type=search],input[type=submit],li,select,textarea{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;border-radius:2px;background-clip:padding-box}body.buddypress article.page>.entry-header{margin-bottom:2em;padding:0}body.buddypress article.page>.entry-header .entry-title{font-size:28px;font-weight:inherit;color:#767676}@media screen and (min-width:46.8em){body.buddypress article.page>.entry-header .entry-title{font-size:34px}}.buddypress-wrap dt.section-title{font-size:18px}@media screen and (min-width:46.8em){.buddypress-wrap dt.section-title{font-size:22px}}.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:16px}}.buddypress-wrap .activity-header{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-header{font-size:16px}}.buddypress-wrap .activity-inner{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-inner{font-size:18px}}.buddypress-wrap #whats-new-post-in{font-size:16px}.buddypress-wrap .acomment-meta,.buddypress-wrap .mini .activity-header{font-size:16px}.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:16px}}.buddypress-wrap .bp-tables-user th{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user th{font-size:16px}}.buddypress-wrap .bp-tables-user td{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user td{font-size:14px}}.buddypress-wrap .profile-fields th{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields th{font-size:18px}}.buddypress-wrap .profile-fields td{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields td{font-size:16px}}.buddypress-wrap #notification-select{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap #notification-select{font-size:14px}}.bp-navs{background:0 0;clear:both;overflow:hidden}.bp-navs ul{margin:0;padding:0}.bp-navs ul li{list-style:none;margin:0}.bp-navs ul li.last select{max-width:185px}.bp-navs ul li a,.bp-navs ul li span{border:0;display:block;padding:5px 10px;text-decoration:none}.bp-navs ul li span{background:#eaeaea;border:1px solid #ccc;border-radius:50%;color:#555;display:inline;font-size:12px;margin-right:2px;padding:3px 6px;text-align:center;vertical-align:middle}.bp-navs ul li.current a,.bp-navs ul li.selected a{color:#333;opacity:1}.bp-navs.bp-invites-filters ul li a,.bp-navs.bp-messages-filters ul li a{border:1px solid #ccc;display:inline-block}.main-navs.dir-navs{margin-bottom:20px}.buddypress-wrap .bp-navs li a:hover a span,.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.selected a span{background-color:#ccc}.buddypress-wrap .bp-navs li:not(.current) a:focus,.buddypress-wrap .bp-navs li:not(.current) a:hover,.buddypress-wrap .bp-navs li:not(.selected) a:focus,.buddypress-wrap .bp-navs li:not(.selected) a:hover{background:#ccc;color:#333}.buddypress-wrap .bp-navs li.current a,.buddypress-wrap .bp-navs li.current a:focus,.buddypress-wrap .bp-navs li.current a:hover,.buddypress-wrap .bp-navs li.selected a,.buddypress-wrap .bp-navs li.selected a:focus,.buddypress-wrap .bp-navs li.selected a:hover{background:#555;color:#fafafa}.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.current a:focus span,.buddypress-wrap .bp-navs li.current a:hover span,.buddypress-wrap .bp-navs li.selected a span,.buddypress-wrap .bp-navs li.selected a:focus span,.buddypress-wrap .bp-navs li.selected a:hover span{border-color:#fafafa}@media screen and (min-width:46.8em){.buddypress-wrap .main-navs:not(.dir-navs) li.current a,.buddypress-wrap .main-navs:not(.dir-navs) li.selected a{background:#fff;color:#333;font-weight:600}.buddypress-wrap .main-navs.vertical li.current a,.buddypress-wrap .main-navs.vertical li.selected a{background:#555;color:#fafafa;text-decoration:none}.buddypress-wrap.bp-dir-hori-nav nav{border-bottom:1px solid #eee;border-top:1px solid #eee;-webkit-box-shadow:0 2px 12px 0 #fafafa;-moz-box-shadow:0 2px 12px 0 #fafafa;box-shadow:0 2px 12px 0 #fafafa}}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.selected a{background:#fff;color:#333;font-weight:600}@media screen and (max-width:46.8em){.buddypress-wrap:not(.bp-single-vert-nav) .bp-navs li{background:#eaeaea}}.buddypress-wrap:not(.bp-single-vert-nav) .main-navs>ul>li>a{padding:.5em calc(.5em + 2px)}.buddypress-wrap:not(.bp-single-vert-nav) .group-subnav#subsubnav,.buddypress-wrap:not(.bp-single-vert-nav) .user-subnav#subsubnav{background:0 0}.buddypress-wrap .bp-subnavs,.buddypress-wrap ul.subnav{width:100%}.buddypress-wrap .bp-subnavs{margin:10px 0;overflow:hidden}.buddypress-wrap .bp-subnavs ul li{margin-top:0}.buddypress-wrap .bp-subnavs ul li.current :focus,.buddypress-wrap .bp-subnavs ul li.current :hover,.buddypress-wrap .bp-subnavs ul li.selected :focus,.buddypress-wrap .bp-subnavs ul li.selected :hover{background:0 0;color:#333}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap .bp-navs.bp-invites-filters#subsubnav ul li.last,.buddypress-wrap .bp-navs.bp-invites-nav#subnav ul li.last,.buddypress-wrap .bp-navs.bp-messages-filters#subsubnav ul li.last{margin-top:0}@media screen and (max-width:46.8em){.buddypress-wrap .single-screen-navs{border:1px solid #eee}.buddypress-wrap .single-screen-navs li{border-bottom:1px solid #eee}.buddypress-wrap .single-screen-navs li:last-child{border-bottom:none}.buddypress-wrap .bp-subnavs li a{font-size:14px}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.current a:focus,.buddypress-wrap .bp-subnavs li.current a:hover,.buddypress-wrap .bp-subnavs li.selected a,.buddypress-wrap .bp-subnavs li.selected a:focus,.buddypress-wrap .bp-subnavs li.selected a:hover{background:#555;color:#fff}}.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.selected a span,.buddypress_object_nav .bp-navs li.current a span,.buddypress_object_nav .bp-navs li.selected a span{background-color:#fff}.buddypress-wrap .bp-navs li.dynamic a span,.buddypress-wrap .bp-navs li.dynamic.current a span,.buddypress-wrap .bp-navs li.dynamic.selected a span,.buddypress_object_nav .bp-navs li.dynamic a span,.buddypress_object_nav .bp-navs li.dynamic.current a span,.buddypress_object_nav .bp-navs li.dynamic.selected a span{background-color:#5087e5;border:0;color:#fafafa}.buddypress-wrap .bp-navs li.dynamic a:hover span,.buddypress_object_nav .bp-navs li.dynamic a:hover span{background-color:#5087e5;border:0;color:#fff}.buddypress-wrap .bp-navs li a span:empty,.buddypress_object_nav .bp-navs li a span:empty{display:none}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:hover{background:0 0;color:#333}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li.current a,.buddypress_object_nav .bp-navs.group-create-links ul li.current a{text-align:center}@media screen and (min-width:46.8em){.buddypress-wrap .bp-navs li{float:right}.buddypress-wrap .subnav{float:right}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap #subsubnav .activity-search{float:right}.buddypress-wrap #subsubnav .filter{float:left}}.buddypress_object_nav .bp-navs li a span{display:inline-block;float:left}@media screen and (min-width:46.8em){.bp-dir-vert-nav .bp-navs.dir-navs{background:0 0}.bp-dir-vert-nav .bp-navs.dir-navs a span{float:left}}@media screen and (min-width:46.8em){.buddypress-wrap .item-body .tabbed-links ul{border-bottom:1px solid #ccc;float:none;margin:20px 0 10px}.buddypress-wrap .item-body .tabbed-links ul:after,.buddypress-wrap .item-body .tabbed-links ul:before{content:" ";display:block}.buddypress-wrap .item-body .tabbed-links ul:after{clear:both}.buddypress-wrap .item-body .tabbed-links ul li{float:right;list-style:none;margin:0 0 0 10px}.buddypress-wrap .item-body .tabbed-links ul li a{background:0 0;border:none;display:block;padding:4px 10px}.buddypress-wrap .item-body .tabbed-links ul li.current{border-color:#ccc #ccc #fff;border-style:solid;border-top-right-radius:4px;border-top-left-radius:4px;border-width:1px;margin-bottom:-1px;padding:0 .5em}.buddypress-wrap .item-body .tabbed-links ul li.current a{color:#333}.buddypress-wrap .item-body .bp-subnavs.tabbed-links>ul{margin-top:0}.buddypress-wrap .item-body .bp-navs.tabbed-links{background:0 0;margin-top:2px}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a{border-left:0;font-size:inherit}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last{float:left;margin:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last a{margin-top:-.5em}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:hover,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:hover{background:0 0;border:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:active,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:active{outline:0}}.buddypress-wrap .dir-component-filters .filter label{display:inline}.buddypress-wrap .subnav-filters:after,.buddypress-wrap .subnav-filters:before{content:" ";display:table}.buddypress-wrap .subnav-filters:after{clear:both}.buddypress-wrap .subnav-filters{background:0 0;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .subnav-filters div{margin:0}.buddypress-wrap .subnav-filters>ul{float:right;list-style:none}.buddypress-wrap .subnav-filters.bp-messages-filters ul{width:100%}.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:1em}@media screen and (min-width:46.8em){.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:0}}.buddypress-wrap .subnav-filters div{float:none}.buddypress-wrap .subnav-filters div input[type=search],.buddypress-wrap .subnav-filters div select{font-size:16px}.buddypress-wrap .subnav-filters div button.nouveau-search-submit{padding:5px .8em 6px}.buddypress-wrap .subnav-filters div button#user_messages_search_submit{padding:7px .8em}.buddypress-wrap .subnav-filters .component-filters{margin-top:10px}.buddypress-wrap .subnav-filters .feed{margin-left:15px}.buddypress-wrap .subnav-filters .last.filter label{display:inline}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:before{content:" ";display:table}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after{clear:both}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-show{display:inline-block}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-hide{display:none}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap{border:0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:focus,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:hover{outline:1px solid #d6d6d6}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions{float:right}.buddypress-wrap .subnav-filters .user-messages-bulk-actions label{display:inline-block;font-weight:300;margin-left:25px;padding:5px 0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions div select{-webkit-appearance:textfield}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply{border:0;border-radius:none;font-weight:400;line-height:1.8;margin:0 10px 0 0;padding:3px 5px;text-align:center;text-transform:none;width:auto}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply span{vertical-align:middle}@media screen and (min-width:32em){.buddypress-wrap .subnav-filters li{margin-bottom:0}.buddypress-wrap .subnav-filters .bp-search,.buddypress-wrap .subnav-filters .dir-search,.buddypress-wrap .subnav-filters .feed,.buddypress-wrap .subnav-filters .group-act-search,.buddypress-wrap .subnav-filters .group-invites-search,.buddypress-wrap .subnav-filters .subnav-search,.buddypress-wrap .subnav-filters .subnav-search form,.buddypress-wrap .subnav-filters .user-messages-bulk-actions,.buddypress-wrap .subnav-filters .user-messages-search{float:right}.buddypress-wrap .subnav-filters .component-filters,.buddypress-wrap .subnav-filters .last{float:left;margin-top:0;width:auto}.buddypress-wrap .subnav-filters .component-filters select,.buddypress-wrap .subnav-filters .last select{max-width:250px}.buddypress-wrap .subnav-filters .user-messages-search{float:left}}.buddypress-wrap .notifications-options-nav input#notification-bulk-manage{border:0;border-radius:0;line-height:1.6}.buddypress-wrap .bp-pagination{background:0 0;border:0;color:#767676;float:right;font-size:small;margin:0;padding:.5em 0;position:relative;width:100%}.buddypress-wrap .bp-pagination .pag-count{float:right}.buddypress-wrap .bp-pagination .bp-pagination-links{float:left;margin-left:10px}.buddypress-wrap .bp-pagination .bp-pagination-links a,.buddypress-wrap .bp-pagination .bp-pagination-links span{font-size:small;padding:0 5px}.buddypress-wrap .bp-pagination .bp-pagination-links a:focus,.buddypress-wrap .bp-pagination .bp-pagination-links a:hover{opacity:1}.buddypress-wrap .bp-pagination p{margin:0}.bp-list:after,.bp-list:before{content:" ";display:table}.bp-list:after{clear:both}.bp-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #eaeaea;clear:both;list-style:none;margin:20px 0;padding:.5em 0;width:100%}.bp-list li:after,.bp-list li:before{content:" ";display:table}.bp-list li:after{clear:both}.bp-list>li{border-bottom:1px solid #eaeaea}.bp-list li{list-style:none;margin:10px 0;padding:.5em 0;position:relative}.bp-list li .item-avatar{text-align:center}.bp-list li .item-avatar img.avatar{display:inline}.bp-list li .item .group-details,.bp-list li .item .item-avatar,.bp-list li .item .item-meta,.bp-list li .item .list-title{text-align:center}.bp-list li .item .list-title{clear:none;font-size:22px;font-weight:400;line-height:1.1;margin:0 auto}@media screen and (min-width:46.8em){.bp-list li .item .list-title{font-size:26px}}.bp-list li .item-meta,.bp-list li .meta{color:#737373;font-size:12px;margin-top:10px}.bp-list li .last-post{text-align:center}.bp-list li .action{margin:0;text-align:center}.bp-list li .action .generic-button{display:inline-block;font-size:12px;margin:0 0 0 10px}.bp-list li .action div.generic-button{margin:10px 0}@media screen and (min-width:46.8em){.bp-list li .item-avatar{float:right;margin-left:5%}.bp-list li .item{margin:0;overflow:hidden}.bp-list li .item .item-block{float:right;margin-left:2%;width:50%}.bp-list li .item .item-meta,.bp-list li .item .list-title{float:right;text-align:right}.bp-list li .item .group-details,.bp-list li .item .last-post{text-align:right}.bp-list li .group-desc,.bp-list li .last-post,.bp-list li .user-update{clear:none;overflow:hidden;width:auto}.bp-list li .action{clear:right;padding:0;text-align:right}.bp-list li .action li.generic-button{margin-left:0}.bp-list li .action div.generic-button{margin:0 0 10px}.bp-list li .generic-button{display:block;margin:0 0 5px 0}}@media screen and (min-width:32em){#activity-stream{clear:both;padding-top:1em}}.activity-list.bp-list{background:#fafafa;border:1px solid #eee}.activity-list.bp-list .activity-item{background:#fff;border:1px solid #b7b7b7;-webkit-box-shadow:0 0 6px #d2d2d2;-moz-box-shadow:0 0 6px #d2d2d2;box-shadow:0 0 6px #d2d2d2;margin:20px 0}.activity-list.bp-list li:first-child{margin-top:0}.friends-request-list .item-title{text-align:center}@media screen and (min-width:46.8em){.friends-request-list li{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap}.friends-request-list li .item{-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;-o-flex:1 1 auto;flex:1 1 auto}.friends-request-list li .action{text-align:left}.friends-request-list li .item-title{font-size:22px;text-align:right}}#notifications-user-list{clear:both;padding-top:1em}@media screen and (min-width:46.8em){body:not(.logged-in) .bp-list .item{margin-left:0}}.activity-permalink .item-list,.activity-permalink .item-list li.activity-item{border:0}.activity-update-form{padding:10px 10px 0}.item-body .activity-update-form .activity-form{margin:0;padding:0}.activity-update-form{border:1px solid #ccc;-webkit-box-shadow:inset 0 0 6px #eee;-moz-box-shadow:inset 0 0 6px #eee;box-shadow:inset 0 0 6px #eee;margin:15px 0}.activity-update-form #whats-new-avatar{margin:10px 0;text-align:center}.activity-update-form #whats-new-avatar img{display:inline-block}.activity-update-form #whats-new-content{padding:0 0 20px 0}.activity-update-form #whats-new-textarea textarea{background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;font-family:inherit;font-size:medium;height:2.2em;line-height:1.4;padding:6px;width:100%}.activity-update-form #whats-new-textarea textarea:focus{-webkit-box-shadow:0 0 6px 0 #d6d6d6;-moz-box-shadow:0 0 6px 0 #d6d6d6;box-shadow:0 0 6px 0 #d6d6d6}.activity-update-form #whats-new-post-in-box{margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items{list-style:none;margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items li{margin-bottom:10px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items #activity-autocomplete{padding:.3em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;padding:.2em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object .avatar{width:30px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object span{padding-right:10px;vertical-align:middle}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:focus,.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:hover{background:#eaeaea;cursor:pointer}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object.selected{border:1px solid #d6d6d6}.activity-update-form #whats-new-submit{margin:15px 0 10px}.activity-update-form #whats-new-submit input{font-size:14px;line-height:inherit;margin-bottom:10px;margin-left:10px;padding:.2em 0;text-align:center;width:100%}@media screen and (min-width:46.8em){.activity-update-form #whats-new-avatar{display:block;float:right;margin:0 0 0 10px}.activity-update-form #whats-new-content,.activity-update-form #whats-new-post-in-box,.activity-update-form #whats-new-submit{margin-right:12%}.activity-update-form #whats-new-submit input{margin-bottom:0;margin-left:10px;width:8em}}.activity-list{padding:.5em}.activity-list .activity-item:after,.activity-list .activity-item:before{content:" ";display:table}.activity-list .activity-item:after{clear:both}.activity-list .activity-item{list-style:none;padding:1em}.activity-list .activity-item.has-comments{padding-bottom:1em}.activity-list .activity-item div.item-avatar{margin:0 auto;text-align:center;width:auto}.activity-list .activity-item div.item-avatar img{max-width:40%}@media screen and (min-width:46.8em){.activity-list .activity-item div.item-avatar{margin:0 0 0 2%;text-align:right;width:15%}.activity-list .activity-item div.item-avatar img{max-width:80%}}.activity-list .activity-item.mini{font-size:13px;position:relative}.activity-list .activity-item.mini .activity-avatar{margin-right:0 auto;text-align:center;width:auto}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:15%}@media screen and (min-width:46.8em){.activity-list .activity-item.mini .activity-avatar{margin-right:15px;text-align:right;width:15%}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:60%}}.activity-list .activity-item.new_forum_post .activity-inner,.activity-list .activity-item.new_forum_topic .activity-inner{border-right:2px solid #eaeaea;margin-right:10px;padding-right:1em}.activity-list .activity-item.newest_blogs_activity,.activity-list .activity-item.newest_friends_activity,.activity-list .activity-item.newest_groups_activity,.activity-list .activity-item.newest_mentions_activity{background:rgba(31,179,221,.1)}.activity-list .activity-item .activity-inreplyto{color:#767676;font-size:13px}.activity-list .activity-item .activity-inreplyto>p{display:inline;margin:0}.activity-list .activity-item .activity-inreplyto .activity-inner,.activity-list .activity-item .activity-inreplyto blockquote{background:0 0;border:0;display:inline;margin:0;overflow:hidden;padding:0}.activity-list .activity-item .activity-header{margin:0 auto;width:80%}.activity-list .activity-item .activity-header a,.activity-list .activity-item .activity-header img{display:inline}.activity-list .activity-item .activity-header .avatar{display:inline-block;margin:0 5px;vertical-align:bottom}.activity-list .activity-item .activity-header .time-since{font-size:14px;color:#767676;text-decoration:none}.activity-list .activity-item .activity-header .time-since:hover{color:#767676;cursor:pointer;text-decoration:underline}.activity-list .activity-item .activity-content .activity-header,.activity-list .activity-item .activity-content .comment-header{color:#767676;margin-bottom:10px}.activity-list .activity-item .activity-content .activity-inner,.activity-list .activity-item .activity-content blockquote{background:#fafafa;margin:15px 0 10px;overflow:hidden;padding:1em}.activity-list .activity-item .activity-content p{margin:0}.activity-list .activity-item .activity-inner p{word-wrap:break-word}.activity-list .activity-item .activity-read-more{margin-right:1em;white-space:nowrap}.activity-list .activity-item ul.activity-meta{margin:0;padding-right:0}.activity-list .activity-item ul.activity-meta li{border:0;display:inline-block}.activity-list .activity-item .activity-meta.action{border:1px solid transparent;background:#fafafa;padding:2px;position:relative;text-align:right}.activity-list .activity-item .activity-meta.action div.generic-button{margin:0}.activity-list .activity-item .activity-meta.action .button{background:0 0}.activity-list .activity-item .activity-meta.action a{padding:4px 8px}.activity-list .activity-item .activity-meta.action .button:focus,.activity-list .activity-item .activity-meta.action .button:hover{background:0 0}.activity-list .activity-item .activity-meta.action .button:before,.activity-list .activity-item .activity-meta.action .icons:before{font-family:dashicons;font-size:18px;vertical-align:middle}.activity-list .activity-item .activity-meta.action .acomment-reply.button:before{content:"\f101"}.activity-list .activity-item .activity-meta.action .view:before{content:"\f125"}.activity-list .activity-item .activity-meta.action .fav:before{content:"\f154"}.activity-list .activity-item .activity-meta.action .unfav:before{content:"\f155"}.activity-list .activity-item .activity-meta.action .delete-activity:before{content:"\f153"}.activity-list .activity-item .activity-meta.action .delete-activity:hover{color:#800}.activity-list .activity-item .activity-meta.action .button{border:0;box-shadow:none}.activity-list .activity-item .activity-meta.action .button span{background:0 0;color:#555;font-weight:700}@media screen and (min-width:46.8em){.activity-list.bp-list{padding:30px}.activity-list .activity-item .activity-content{margin:0;position:relative}.activity-list .activity-item .activity-content:after{clear:both;content:"";display:table}.activity-list .activity-item .activity-header{margin:0 0 0 15px;width:auto}}.buddypress-wrap .activity-list .load-more,.buddypress-wrap .activity-list .load-newest{background:#fafafa;border:1px solid #eee;font-size:110%;margin:15px 0;padding:0;text-align:center}.buddypress-wrap .activity-list .load-more a,.buddypress-wrap .activity-list .load-newest a{color:#555;display:block;padding:.5em 0}.buddypress-wrap .activity-list .load-more a:focus,.buddypress-wrap .activity-list .load-more a:hover,.buddypress-wrap .activity-list .load-newest a:focus,.buddypress-wrap .activity-list .load-newest a:hover{background:#fff;color:#333}.buddypress-wrap .activity-list .load-more:focus,.buddypress-wrap .activity-list .load-more:hover,.buddypress-wrap .activity-list .load-newest:focus,.buddypress-wrap .activity-list .load-newest:hover{border-color:#e1e1e1;-webkit-box-shadow:0 0 6px 0 #eaeaea;-moz-box-shadow:0 0 6px 0 #eaeaea;box-shadow:0 0 6px 0 #eaeaea}body.activity-permalink .activity-list li{border-width:1px;padding:1em 0 0 0}body.activity-permalink .activity-list li:first-child{padding-top:0}body.activity-permalink .activity-list li.has-comments{padding-bottom:0}body.activity-permalink .activity-list .activity-avatar{width:auto}body.activity-permalink .activity-list .activity-avatar a{display:block}body.activity-permalink .activity-list .activity-avatar img{max-width:100%}body.activity-permalink .activity-list .activity-content{border:0;font-size:100%;line-height:1.5;padding:0}body.activity-permalink .activity-list .activity-content .activity-header{margin:0;padding:.5em 0 0 0;text-align:center;width:100%}body.activity-permalink .activity-list .activity-content .activity-inner,body.activity-permalink .activity-list .activity-content blockquote{margin-right:0;margin-top:10px}body.activity-permalink .activity-list .activity-meta{margin:10px 0 10px}body.activity-permalink .activity-list .activity-comments{margin-bottom:10px}@media screen and (min-width:46.8em){body.activity-permalink .activity-list .activity-avatar{right:-20px;margin-left:0;position:relative;top:-20px}body.activity-permalink .activity-list .activity-content{margin-left:10px}body.activity-permalink .activity-list .activity-content .activity-header p{text-align:right}}.buddypress-wrap .activity-comments{clear:both;margin:0 5%;overflow:hidden;position:relative;width:auto}.buddypress-wrap .activity-comments ul{clear:both;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .activity-comments ul li{border-top:1px solid #eee;border-bottom:0;padding:1em 0 0}.buddypress-wrap .activity-comments ul li ul{margin-right:5%}.buddypress-wrap .activity-comments ul li:first-child{border-top:0}.buddypress-wrap .activity-comments ul li:last-child{margin-bottom:0}.buddypress-wrap .activity-comments div.acomment-avatar{width:auto}.buddypress-wrap .activity-comments div.acomment-avatar img{border-width:1px;float:right;height:25px;max-width:none;width:25px}.buddypress-wrap .activity-comments .acomment-content p,.buddypress-wrap .activity-comments .acomment-meta{font-size:14px}.buddypress-wrap .activity-comments .acomment-meta{color:#555;overflow:hidden;padding-right:2%}.buddypress-wrap .activity-comments .acomment-content{border-right:1px solid #ccc;margin:15px 10% 0 0;padding:.5em 1em}.buddypress-wrap .activity-comments .acomment-content p{margin-bottom:.5em}.buddypress-wrap .activity-comments .acomment-options{float:right;margin:10px 20px 10px 0}.buddypress-wrap .activity-comments .acomment-options a{color:#767676;font-size:14px}.buddypress-wrap .activity-comments .acomment-options a:focus,.buddypress-wrap .activity-comments .acomment-options a:hover{color:inherit}.buddypress-wrap .activity-comments .activity-meta.action{background:0 0;margin-top:10px}.buddypress-wrap .activity-comments .activity-meta.action button{font-size:14px;font-weight:400;text-transform:none}.buddypress-wrap .activity-comments .show-all button{font-size:14px;text-decoration:underline;padding-right:.5em}.buddypress-wrap .activity-comments .show-all button span{text-decoration:none}.buddypress-wrap .activity-comments .show-all button:focus span,.buddypress-wrap .activity-comments .show-all button:hover span{color:#5087e5}.buddypress-wrap .mini .activity-comments{clear:both;margin-top:0}body.activity-permalink .activity-comments{background:0 0;width:auto}body.activity-permalink .activity-comments>ul{padding:0 1em 0 .5em}body.activity-permalink .activity-comments ul li>ul{margin-top:10px}form.ac-form{display:none;padding:1em}form.ac-form .ac-reply-avatar{float:right}form.ac-form .ac-reply-avatar img{border:1px solid #eee}form.ac-form .ac-reply-content{color:#767676;padding-right:1em}form.ac-form .ac-reply-content a{text-decoration:none}form.ac-form .ac-reply-content .ac-textarea{margin-bottom:15px;padding:0 .5em;overflow:hidden}form.ac-form .ac-reply-content .ac-textarea textarea{background:0 0;box-shadow:none;color:#555;font-family:inherit;font-size:100%;height:60px;margin:0;outline:0;padding:.5em;width:100%}form.ac-form .ac-reply-content .ac-textarea textarea:focus{-webkit-box-shadow:0 0 6px #d6d6d6;-moz-box-shadow:0 0 6px #d6d6d6;box-shadow:0 0 6px #d6d6d6}form.ac-form .ac-reply-content input{margin-top:10px}.activity-comments li form.ac-form{clear:both;margin-left:15px}.activity-comments form.root{margin-right:0}@media screen and (min-width:46.8em){.buddypress-wrap .blogs-list li .item-block{float:none;width:auto}.buddypress-wrap .blogs-list li .item-meta{clear:right;float:none}}@media screen and (min-width:46.8em){.buddypress-wrap .bp-dir-vert-nav .blogs-list .list-title{width:auto}}.buddypress-wrap .groups-list li .list-title{text-align:center}.buddypress-wrap .groups-list li .group-details{clear:right}.buddypress-wrap .groups-list li .group-desc{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;font-size:13px;color:#737373;font-style:italic;margin:10px auto 0;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .group-desc{font-size:16px}}.buddypress-wrap .groups-list li p{margin:0 0 .5em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .item{margin-left:0}.buddypress-wrap .groups-list li .item-meta,.buddypress-wrap .groups-list li .list-title{text-align:right;width:auto}.buddypress-wrap .groups-list li .item-meta{margin-bottom:20px}.buddypress-wrap .groups-list li .last-activity{clear:right;margin-top:-20px}}.buddypress-wrap .groups-list li.group-no-avatar div.group-desc{margin-right:0}.buddypress-wrap .mygroups .groups-list.grid .wrap{min-height:450px;padding-bottom:0}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list.grid.four .group-desc,.buddypress-wrap .groups-list.grid.three .group-desc{font-size:14px}}@media screen and (min-width:46.8em){.buddypress .bp-vertical-navs .groups-list .item-avatar{margin-left:3%;width:15%}}.buddypress-wrap .members-list li .member-name{margin-bottom:10px}.buddypress-wrap .members-list li .user-update{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;color:#737373;font-style:italic;font-size:13px;margin:15px auto;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .user-update{font-size:16px}}.buddypress-wrap .members-list li .user-update .activity-read-more{display:block;font-size:12px;font-style:normal;margin-top:10px;padding-right:2px}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .last-activity{clear:right;margin-top:-10px}}@media screen and (min-width:46.8em){.buddypress-wrap .members-group-list li .joined{clear:right;float:none}}@media screen and (min-width:32em){body:not(.logged-in) .members-list .user-update{width:96%}}.register-page .register-section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.register-page .signup-form{margin-top:20px}.register-page .signup-form .default-profile input{margin-bottom:20px}.register-page .signup-form label,.register-page .signup-form legend{margin:10px 0 0}.register-page .signup-form .editfield{margin:15px 0}.register-page .signup-form .editfield fieldset{border:0;padding:0}.register-page .signup-form .editfield fieldset legend{margin:0 0 5px;text-indent:0}.register-page .signup-form .editfield .field-visibility-settings{padding:.5em}.register-page .signup-form .editfield .field-visibility-settings fieldset{margin:0 0 10px}.register-page .signup-form #signup-avatar img{margin:0 0 10px 15px}.register-page .signup-form .password-entry,.register-page .signup-form .password-entry-confirm{border:1px solid #eee}@media screen and (min-width:46.8em){.buddypress-wrap .register-page .layout-wrap{display:flex;flex-flow:row wrap;justify-content:space-around}.buddypress-wrap .register-page .layout-wrap .default-profile{flex:1;padding-left:2em}.buddypress-wrap .register-page .layout-wrap .blog-details{flex:1;padding-right:2em}.buddypress-wrap .register-page .submit{clear:both}}@media screen and (min-width:46.8em){.buddypress-wrap.extended-default-reg .register-page .default-profile{flex:1;padding-left:1em}.buddypress-wrap.extended-default-reg .register-page .extended-profile{flex:2;padding-right:1em}.buddypress-wrap.extended-default-reg .register-page .blog-details{flex:1 100%}}#group-create-body{padding:.5em}#group-create-body .creation-step-name{text-align:center}#group-create-body .avatar-nav-items{margin-top:15px}.single-headers:after,.single-headers:before{content:" ";display:table}.single-headers:after{clear:both}.single-headers{margin-bottom:15px}.single-headers #item-header-avatar a{display:block;text-align:center}.single-headers #item-header-avatar a img{float:none}.single-headers div#item-header-content{float:none}@media screen and (min-width:46.8em){.single-headers #item-header-avatar a{text-align:right}.single-headers #item-header-avatar a img{float:right}}.single-headers .activity,.single-headers .group-status{display:inline}.single-headers .group-status{font-size:18px;color:#333;padding-left:1em}.single-headers .activity{display:inline-block;font-size:12px;padding:0}.single-headers #sitewide-notice p,.single-headers div#message p{background-color:#ffd;border:1px solid #cb2;color:#440;font-weight:400;margin-top:3px;text-decoration:none}.single-headers h2{line-height:1.2;margin:0 0 5px}.single-headers h2 a{color:#767676;text-decoration:none}.single-headers h2 span.highlight{display:inline-block;font-size:60%;font-weight:400;line-height:1.7;vertical-align:middle}.single-headers h2 span.highlight span{background:#a1dcfa;color:#fff;cursor:pointer;font-size:80%;font-weight:700;margin-bottom:2px;padding:1px 4px;position:relative;left:-2px;top:-2px;vertical-align:middle}.single-headers img.avatar{float:right;margin:0 0 19px 15px}.single-headers .item-meta{color:#767676;font-size:14px;margin:15px 0 5px;padding-bottom:.5em}.single-headers ul{margin-bottom:15px}.single-headers ul li{float:left;list-style:none}.single-headers div.generic-button{text-align:center}.single-headers li.generic-button{display:inline-block;text-align:center}@media screen and (min-width:46.8em){.single-headers a.button,.single-headers div.generic-button,.single-headers li.generic-button{float:right}}.single-headers a.button,.single-headers div.generic-button{margin:10px 0 0 10px}.single-headers li.generic-button{margin:2px 10px}.single-headers li.generic-button:first-child{margin-right:0}.single-headers div#message.info{line-height:.8}body.no-js .single-item-header .js-self-profile-button{display:none}#cover-image-container{position:relative}#header-cover-image{background-color:#c5c5c5;background-position:center top;background-repeat:no-repeat;background-size:cover;border:0;display:block;right:0;margin:0;padding:0;position:absolute;top:0;width:100%;z-index:1}#item-header-cover-image{position:relative;z-index:2}#item-header-cover-image #item-header-avatar{padding:0 1em}.groups-header .bp-group-type-list{margin:0}.groups-header .bp-feedback{clear:both}.groups-header .group-item-actions{float:right;margin:0 15px 15px 0;padding-top:0;width:100%}.groups-header .moderators-lists{margin-top:0}.groups-header .moderators-lists .moderators-title{font-size:14px}.groups-header .moderators-lists .user-list{margin:0 0 5px}.groups-header .moderators-lists .user-list ul:after{clear:both;content:"";display:table}.groups-header .moderators-lists .user-list li{display:inline-block;float:none;margin-right:4px;padding:4px}.groups-header .moderators-lists img.avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;float:none;height:30px;margin:0;max-width:100%;width:30px}@media screen and (min-width:46.8em){.groups-header div#item-header-content{float:right;margin-right:10%;text-align:right;padding-top:15px;width:42%}.groups-header .group-item-actions{float:left;margin:0 15px 15px 0;text-align:left;width:20%}.groups-header .groups-meta{clear:both}}.groups-header .desc-wrap{background:#eaeaea;border:1px solid #d6d6d6;margin:0 0 15px;padding:1em;text-align:center}.groups-header .desc-wrap .group-description{background:#fafafa;-webkit-box-shadow:inset 0 0 9px #ccc;-moz-box-shadow:inset 0 0 9px #ccc;box-shadow:inset 0 0 9px #ccc;padding:1em;text-align:right}.bp-user .users-header .user-nicename{margin-bottom:5px}.bp-user .member-header-actions{overflow:hidden}.bp-user .member-header-actions *>*{display:block}.buddypress-wrap .item-body{margin:20px 0}.buddypress-wrap .item-body .screen-heading{font-size:20px;font-weight:400}.buddypress-wrap .item-body .button-tabs{margin:30px 0 15px}.buddypress-wrap.bp-single-vert-nav .bp-list:not(.grid) .item-entry{padding-right:.5em}.single-item.group-members .item-body .filters:not(.no-subnav){border-top:5px solid #eaeaea;padding-top:1em}.single-item.group-members .item-body .filters{margin-top:0}.buddypress-wrap .group-status-type ul{margin:0 20px 20px 0}.groups-manage-members-list{padding:.5em 0}.groups-manage-members-list dd{margin:0;padding:1em 0}.groups-manage-members-list .section-title{background:#eaeaea;padding-right:.3em}.groups-manage-members-list ul{list-style:none;margin-bottom:0}.groups-manage-members-list ul li{border-bottom:1px solid #eee;margin-bottom:10px;padding:.5em .3em .3em}.groups-manage-members-list ul li:last-child,.groups-manage-members-list ul li:only-child{border-bottom:0}.groups-manage-members-list ul li:nth-child(even){background:#fafafa}.groups-manage-members-list ul li.banned-user{background:#fad3d3}.groups-manage-members-list ul .member-name{margin-bottom:0;text-align:center}.groups-manage-members-list ul img{display:block;margin:0 auto;width:20%}@media screen and (min-width:32em){.groups-manage-members-list ul .member-name{text-align:right}.groups-manage-members-list ul img{display:inline;width:50px}}.groups-manage-members-list ul .members-manage-buttons:after,.groups-manage-members-list ul .members-manage-buttons:before{content:" ";display:table}.groups-manage-members-list ul .members-manage-buttons:after{clear:both}.groups-manage-members-list ul .members-manage-buttons{margin:15px 0 5px}.groups-manage-members-list ul .members-manage-buttons a.button{color:#767676;display:block;font-size:13px}@media screen and (min-width:32em){.groups-manage-members-list ul .members-manage-buttons a.button{display:inline-block}}.groups-manage-members-list ul .members-manage-buttons.text-links-list{margin-bottom:0}@media screen and (max-width:32em){.groups-manage-members-list ul .members-manage-buttons.text-links-list a.button{background:#fafafa;border:1px solid #eee;display:block;margin-bottom:10px}}.groups-manage-members-list ul .action:not(.text-links-list) a.button{font-size:12px}@media screen and (min-width:46.8em){.groups-manage-members-list ul li .avatar,.groups-manage-members-list ul li .member-name{float:right}.groups-manage-members-list ul li .avatar{margin-left:15px}.groups-manage-members-list ul li .action{clear:both;float:right}}.buddypress .bp-invites-content ul.item-list{border-top:0}.buddypress .bp-invites-content ul.item-list li{border:1px solid #eaeaea;margin:0 0 1%;padding-right:5px;padding-left:5px;position:relative;width:auto}.buddypress .bp-invites-content ul.item-list li .list-title{text-align:center;width:auto}.buddypress .bp-invites-content ul.item-list li .action{position:absolute;top:10px;left:10px}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button{border:0}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:focus,.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:hover{color:#1fb3dd}.buddypress .bp-invites-content ul.item-list li.selected{-webkit-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);-moz-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2)}.buddypress .bp-invites-content .group-inviters li,.buddypress .bp-invites-content .item-list .item-meta span{color:#767676}.buddypress .bp-invites-content li ul.group-inviters{clear:both;margin:0;overflow:hidden}.buddypress .bp-invites-content li ul.group-inviters li{border:0;float:right;font-size:20px;width:inherit}.buddypress .bp-invites-content li .status{font-size:20px;font-style:italic;clear:both;color:#555;margin:10px 0}.buddypress .bp-invites-content #send-invites-editor{overflow:hidden}.buddypress .bp-invites-content #send-invites-editor textarea{width:100%}.buddypress .bp-invites-content #send-invites-editor ul{clear:both;list-style:none;margin:10px 0;overflow:hidden}.buddypress .bp-invites-content #send-invites-editor ul li{float:right;margin:.5%;max-height:50px;max-width:50px}.buddypress .bp-invites-content #send-invites-editor .action{margin-top:10px;padding-top:10px}.buddypress .bp-invites-content #send-invites-editor.bp-hide{display:none}@media screen and (min-width:46.8em){.buddypress .bp-invites-content ul.item-list>li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #eaeaea;float:right;padding-right:.5em;padding-left:.5em;width:49.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(odd){margin-left:.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(even){margin-right:.5%}.buddypress .bp-invites-content ul.item-list ul.group-inviters{float:right;width:auto}}.buddypress.groups .activity-update-form{margin-top:0}.buddypress-wrap .profile{margin-top:30px}.buddypress-wrap .public .profile-fields td.label{width:30%}.buddypress-wrap .profile.edit .button-nav{list-style:none;margin:30px 0 10px}.buddypress-wrap .profile.edit .button-nav li{display:inline-block;margin-left:10px}.buddypress-wrap .profile.edit .button-nav li a{font-size:18px}.buddypress-wrap .profile.edit .editfield{background:#fafafa;border:1px solid #eee;margin:15px 0;padding:1em}.buddypress-wrap .profile.edit .editfield fieldset{border:0}.buddypress-wrap .profile.edit .editfield fieldset label{font-weight:400}.buddypress-wrap .profile.edit .editfield fieldset label.xprofile-field-label{display:inline}.buddypress-wrap .profile.edit .editfield{display:flex;flex-direction:column}.buddypress-wrap .profile.edit .editfield .description{margin-top:10px;order:2}.buddypress-wrap .profile.edit .editfield>fieldset{order:1}.buddypress-wrap .profile.edit .editfield .field-visibility-settings,.buddypress-wrap .profile.edit .editfield .field-visibility-settings-toggle{order:3}body.no-js .buddypress-wrap .field-visibility-settings-close,body.no-js .buddypress-wrap .field-visibility-settings-toggle{display:none}body.no-js .buddypress-wrap .field-visibility-settings{display:block}.buddypress-wrap .field-visibility-settings{margin:10px 0}.buddypress-wrap .current-visibility-level{font-style:normal;font-weight:700}.buddypress-wrap .field-visibility-settings,.buddypress-wrap .field-visibility-settings-header{color:#737373}.buddypress-wrap .field-visibility-settings fieldset{margin:5px 0}.buddypress-wrap .standard-form .editfield fieldset{margin:0}.buddypress-wrap .standard-form .field-visibility-settings label{font-weight:400;margin:0}.buddypress-wrap .standard-form .field-visibility-settings .radio{list-style:none;margin-bottom:0}.buddypress-wrap .standard-form .field-visibility-settings .field-visibility-settings-close{font-size:12px}.buddypress-wrap .standard-form .wp-editor-container{border:1px solid #dedede}.buddypress-wrap .standard-form .wp-editor-container textarea{background:#fff;width:100%}.buddypress-wrap .standard-form .description{background:#fafafa;font-size:inherit}.buddypress-wrap .standard-form .field-visibility-settings legend,.buddypress-wrap .standard-form .field-visibility-settings-header{font-style:italic}.buddypress-wrap .standard-form .field-visibility-settings-header{font-size:14px}.buddypress-wrap .standard-form .field-visibility-settings label,.buddypress-wrap .standard-form .field-visibility-settings legend{font-size:14px}.buddypress-wrap .standard-form .field-visibility select{margin:0}.buddypress-wrap .html-active button.switch-html{background:#f5f5f5;border-bottom-color:transparent;border-bottom-right-radius:0;border-bottom-left-radius:0}.buddypress-wrap .tmce-active button.switch-tmce{background:#f5f5f5;border-bottom-color:transparent;border-bottom-right-radius:0;border-bottom-left-radius:0}.buddypress-wrap .profile.public .profile-group-title{border-bottom:1px solid #ccc}body.register .buddypress-wrap .page ul{list-style:none}.buddypress-wrap .profile .bp-avatar-nav{margin-top:20px}.message-action-delete:before,.message-action-star:before,.message-action-unstar:before,.message-action-view:before{font-family:dashicons;font-size:18px}.message-action-star:before{color:#aaa;content:"\f154"}.message-action-unstar:before{color:#fcdd77;content:"\f155"}.message-action-view:before{content:"\f473"}.message-action-delete:before{content:"\f153"}.message-action-delete:hover:before{color:#a00}.preview-content .actions a{text-decoration:none}.bp-messages-content{margin:15px 0}.bp-messages-content .avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.bp-messages-content .thread-participants{list-style:none}.bp-messages-content .thread-participants dd{margin-right:0}.bp-messages-content time{color:#737373;font-size:12px}#message-threads{border-top:1px solid #eaeaea;clear:both;list-style:none;margin:0;max-height:220px;overflow-x:hidden;overflow-y:auto;padding:0;width:100%}#message-threads li{border-bottom:1px solid #eaeaea;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;margin:0;overflow:hidden;padding:.5em 0}#message-threads li .thread-cb{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;-webkit-flex:1 2 5%;-moz-flex:1 2 5%;-ms-flex:1 2 5%;-o-flex:1 2 5%;flex:1 2 5%}#message-threads li .thread-from{-webkit-flex:1 2 20%;-moz-flex:1 2 20%;-ms-flex:1 2 20%;-o-flex:1 2 20%;flex:1 2 20%}#message-threads li .thread-from img.avatar{float:right;margin:0 0 0 10px}#message-threads li .thread-from .user-name{display:inline-block;line-height:1.1}#message-threads li .thread-content{-webkit-flex:1 2 60%;-moz-flex:1 2 60%;-ms-flex:1 2 60%;-o-flex:1 2 60%;flex:1 2 60%}#message-threads li .thread-date{-webkit-flex:1 2 15%;-moz-flex:1 2 15%;-ms-flex:1 2 15%;-o-flex:1 2 15%;flex:1 2 15%}#message-threads li.selected{background-color:#fafafa}#message-threads li.selected .thread-subject .subject{color:#5087e5}#message-threads li .thread-content{cursor:pointer}#message-threads li .thread-content .excerpt{color:#737373;font-size:12px;margin:0}#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:13px}@media screen and (min-width:46.8em){#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:16px}}#message-threads li .thread-content .thread-subject{vertical-align:top}#message-threads li .thread-content .thread-subject .excerpt{font-weight:400}#message-threads li .thread-date{padding-left:5px;text-align:left}.bp-messages-content .actions{float:left;max-width:30%}.bp-messages-content .actions .bp-icons{display:inline-block;margin:0;padding:.3em .5em}.bp-messages-content .actions .bp-icons:before{font-size:26px}.bp-messages-content #thread-preview{border:1px solid #eaeaea;margin-top:20px}.bp-messages-content #thread-preview .preview-message{clear:both}.bp-messages-content #thread-preview .preview-content{margin:.5em}.bp-messages-content #thread-preview .preview-content .preview-message{background:#fafafa;margin:10px 0;padding:1em .3em .3em}.bp-messages-content #bp-message-thread-list{border-top:1px solid #eaeaea;clear:both;list-style:none;padding:1em 0 .3em}.bp-messages-content #bp-message-thread-list li{padding:.5em}.bp-messages-content #bp-message-thread-list li:nth-child(2n) .message-content{background:#fafafa}.bp-messages-content #bp-message-thread-list .message-metadata{border-bottom:1px solid #ccc;-webkit-box-shadow:2px 1px 9px 0 #eee;-moz-box-shadow:2px 1px 9px 0 #eee;box-shadow:2px 1px 9px 0 #eee;overflow:hidden;padding:.2em}.bp-messages-content #bp-message-thread-list .message-metadata .avatar{width:30px}.bp-messages-content #bp-message-thread-list .message-metadata .user-link{display:block;font-size:13px;float:right}@media screen and (min-width:46.8em){.bp-messages-content #bp-message-thread-list .message-metadata .user-link{font-size:16px}}.bp-messages-content #bp-message-thread-list .message-metadata time{color:#737373;font-size:12px;padding:0 .5em}.bp-messages-content #bp-message-thread-list .message-metadata button{padding:0 .3em}.bp-messages-content #bp-message-thread-list .message-metadata button:before{font-size:20px}.bp-messages-content #bp-message-thread-list .message-content{clear:both;margin:1em auto 0;width:90%}.bp-messages-content #bp-message-thread-list img.avatar{float:right;margin:0 0 0 10px}.bp-messages-content #bp-message-thread-list .actions a:before{font-size:18px}.bp-messages-content form.send-reply .avatar-box{padding:.5em 0}.bp-messages-content .preview-pane-header,.bp-messages-content .single-message-thread-header{border-bottom:1px solid #eaeaea}.bp-messages-content .preview-pane-header:after,.bp-messages-content .single-message-thread-header:after{clear:both;content:"";display:table}.bp-messages-content .preview-thread-title,.bp-messages-content .single-thread-title{font-size:16px}.bp-messages-content .preview-thread-title .messages-title,.bp-messages-content .single-thread-title .messages-title{padding-right:2em}.bp-messages-content .thread-participants{float:right;margin:5px 0;width:70%}.bp-messages-content .thread-participants dd,.bp-messages-content .thread-participants ul{margin-bottom:10px}.bp-messages-content .thread-participants ul{list-style:none}.bp-messages-content .thread-participants ul:after{clear:both;content:"";display:table}.bp-messages-content .thread-participants li{float:right;margin-right:5px}.bp-messages-content .thread-participants img{width:30px}.bp-messages-content #bp-message-thread-list li .message-content blockquote,.bp-messages-content #bp-message-thread-list li .message-content ol,.bp-messages-content #bp-message-thread-list li .message-content ul,.bp-messages-content #thread-preview .preview-message blockquote,.bp-messages-content #thread-preview .preview-message ol,.bp-messages-content #thread-preview .preview-message ul{list-style-position:inside;margin-right:0}.bp-messages-content #thread-preview:empty,.bp-messages-content ul#message-threads:empty{display:none}.bp-messages-content #bp-message-thread-header h2:first-child,.bp-messages-content #thread-preview h2:first-child{background-color:#eaeaea;color:#555;font-weight:700;margin:0;padding:.5em}.bp-messages-content #bp-message-thread-list li a.user-link,.bp-messages-content #message-threads .thread-content a{border:0;text-decoration:none}.bp-messages-content .standard-form #subject{margin-bottom:20px}div.bp-navs#subsubnav.bp-messages-filters .user-messages-bulk-actions{margin-left:15px;max-width:42.5%}.buddypress.settings .profile-settings.bp-tables-user select{width:100%}.buddypress-wrap #whats-new-post-in-box select,.buddypress-wrap .filter select{border:1px solid #d6d6d6}.buddypress-wrap input.action[disabled]{cursor:pointer;opacity:.4}.buddypress-wrap #notification-bulk-manage[disabled]{display:none}.buddypress-wrap fieldset legend{font-size:inherit;font-weight:600}.buddypress-wrap input[type=email]:focus,.buddypress-wrap input[type=password]:focus,.buddypress-wrap input[type=tel]:focus,.buddypress-wrap input[type=text]:focus,.buddypress-wrap input[type=url]:focus,.buddypress-wrap textarea:focus{-webkit-box-shadow:0 0 8px #eaeaea;-moz-box-shadow:0 0 8px #eaeaea;box-shadow:0 0 8px #eaeaea}.buddypress-wrap select{height:auto}.buddypress-wrap textarea{resize:vertical}.buddypress-wrap .standard-form .bp-controls-wrap{margin:1em 0}.buddypress-wrap .standard-form .groups-members-search input[type=search],.buddypress-wrap .standard-form .groups-members-search input[type=text],.buddypress-wrap .standard-form [data-bp-search] input[type=search],.buddypress-wrap .standard-form [data-bp-search] input[type=text],.buddypress-wrap .standard-form input[type=color],.buddypress-wrap .standard-form input[type=date],.buddypress-wrap .standard-form input[type=datetime-local],.buddypress-wrap .standard-form input[type=datetime],.buddypress-wrap .standard-form input[type=email],.buddypress-wrap .standard-form input[type=month],.buddypress-wrap .standard-form input[type=number],.buddypress-wrap .standard-form input[type=password],.buddypress-wrap .standard-form input[type=range],.buddypress-wrap .standard-form input[type=search],.buddypress-wrap .standard-form input[type=tel],.buddypress-wrap .standard-form input[type=text],.buddypress-wrap .standard-form input[type=time],.buddypress-wrap .standard-form input[type=url],.buddypress-wrap .standard-form input[type=week],.buddypress-wrap .standard-form select,.buddypress-wrap .standard-form textarea{background:#fafafa;border:1px solid #d6d6d6;border-radius:0;font:inherit;font-size:100%;padding:.5em}.buddypress-wrap .standard-form input[required],.buddypress-wrap .standard-form select[required],.buddypress-wrap .standard-form textarea[required]{box-shadow:none;border-width:2px;outline:0}.buddypress-wrap .standard-form input[required]:invalid,.buddypress-wrap .standard-form select[required]:invalid,.buddypress-wrap .standard-form textarea[required]:invalid{border-color:#b71717}.buddypress-wrap .standard-form input[required]:valid,.buddypress-wrap .standard-form select[required]:valid,.buddypress-wrap .standard-form textarea[required]:valid{border-color:#91cc2c}.buddypress-wrap .standard-form input[required]:focus,.buddypress-wrap .standard-form select[required]:focus,.buddypress-wrap .standard-form textarea[required]:focus{border-color:#d6d6d6;border-width:1px}.buddypress-wrap .standard-form input.invalid[required],.buddypress-wrap .standard-form select.invalid[required],.buddypress-wrap .standard-form textarea.invalid[required]{border-color:#b71717}.buddypress-wrap .standard-form input:not(.button-small),.buddypress-wrap .standard-form textarea{width:100%}.buddypress-wrap .standard-form input[type=checkbox],.buddypress-wrap .standard-form input[type=radio]{margin-left:5px;width:auto}.buddypress-wrap .standard-form select{padding:3px}.buddypress-wrap .standard-form textarea{height:120px}.buddypress-wrap .standard-form textarea#message_content{height:200px}.buddypress-wrap .standard-form input[type=password]{margin-bottom:5px}.buddypress-wrap .standard-form input:focus,.buddypress-wrap .standard-form select:focus,.buddypress-wrap .standard-form textarea:focus{background:#fafafa;color:#555;outline:0}.buddypress-wrap .standard-form label,.buddypress-wrap .standard-form span.label{display:block;font-weight:600;margin:15px 0 5px;width:auto}.buddypress-wrap .standard-form a.clear-value{display:block;margin-top:5px;outline:0}.buddypress-wrap .standard-form .submit{clear:both;padding:15px 0 0}.buddypress-wrap .standard-form p.submit{margin-bottom:0}.buddypress-wrap .standard-form div.submit input{margin-left:15px}.buddypress-wrap .standard-form #invite-list label,.buddypress-wrap .standard-form p label{font-weight:400;margin:auto}.buddypress-wrap .standard-form p.description{color:#737373;margin:5px 0}.buddypress-wrap .standard-form div.checkbox label:nth-child(n+2),.buddypress-wrap .standard-form div.radio div label{color:#737373;font-size:100%;font-weight:400;margin:5px 0 0}.buddypress-wrap .standard-form#send-reply textarea{width:97.5%}.buddypress-wrap .standard-form#sidebar-login-form label{margin-top:5px}.buddypress-wrap .standard-form#sidebar-login-form input[type=password],.buddypress-wrap .standard-form#sidebar-login-form input[type=text]{padding:4px;width:95%}.buddypress-wrap .standard-form.profile-edit input:focus{background:#fff}@media screen and (min-width:46.8em){.buddypress-wrap .standard-form .left-menu{float:right}.buddypress-wrap .standard-form #invite-list ul{list-style:none;margin:1%}.buddypress-wrap .standard-form #invite-list ul li{margin:0 1% 0 0}.buddypress-wrap .standard-form .main-column{margin-right:190px}.buddypress-wrap .standard-form .main-column ul#friend-list{clear:none;float:right}.buddypress-wrap .standard-form .main-column ul#friend-list h4{clear:none}}.buddypress-wrap .standard-form .bp-tables-user label{margin:0}.buddypress-wrap .signup-form label,.buddypress-wrap .signup-form legend{font-weight:400}body.no-js .buddypress #delete_inbox_messages,body.no-js .buddypress #delete_sentbox_messages,body.no-js .buddypress #message-type-select,body.no-js .buddypress #messages-bulk-management #select-all-messages,body.no-js .buddypress #notifications-bulk-management #select-all-notifications,body.no-js .buddypress label[for=message-type-select]{display:none}.buddypress-wrap .wp-editor-wrap .wp-editor-wrap button,.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=button],.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=submit],.buddypress-wrap .wp-editor-wrap a.button,.buddypress-wrap .wp-editor-wrap input[type=reset]{padding:0 8px 1px}.buddypress-wrap .select-wrap{border:1px solid #eee}.buddypress-wrap .select-wrap label{display:inline}.buddypress-wrap .select-wrap select::-ms-expand{display:none}.buddypress-wrap .select-wrap select{-moz-appearance:none;-webkit-appearance:none;-o-appearance:none;appearance:none;border:0;cursor:pointer;margin-left:-25px;padding:6px 10px 6px 25px;position:relative;text-indent:-2px;z-index:1;width:100%}.buddypress-wrap .select-wrap select,.buddypress-wrap .select-wrap select:active,.buddypress-wrap .select-wrap select:focus{background:0 0}.buddypress-wrap .select-wrap span.select-arrow{display:inline-block;position:relative;z-index:0}.buddypress-wrap .select-wrap span.select-arrow:before{color:#ccc;content:"\25BC"}.buddypress-wrap .select-wrap:focus .select-arrow:before,.buddypress-wrap .select-wrap:hover .select-arrow:before{color:#a6a6a6}.buddypress-wrap .bp-search form:focus,.buddypress-wrap .bp-search form:hover,.buddypress-wrap .select-wrap:focus,.buddypress-wrap .select-wrap:hover{border:1px solid #d5d4d4;box-shadow:inset 0 0 3px #eee}@media screen and (min-width:32em){.buddypress-wrap .notifications-options-nav .select-wrap{float:right}}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after,.buddypress-wrap .bp-messages-search-form:before{content:" ";display:table}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after{clear:both}.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{border:1px solid #eee;width:100%}@media screen and (min-width:55em){.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{width:15em}}.buddypress-wrap form.bp-dir-search-form label,.buddypress-wrap form.bp-invites-search-form label,.buddypress-wrap form.bp-messages-search-form label{margin:0}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{background:0 0;border:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;border-radius:0;background-clip:padding-box}.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{float:right;line-height:1.5;padding:3px 10px;width:80%}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form button[type=submit]{float:left;font-size:inherit;font-weight:400;line-height:1.5;padding:3px .7em;text-align:center;text-transform:none;width:20%}.buddypress-wrap form.bp-dir-search-form button[type=submit] span,.buddypress-wrap form.bp-invites-search-form button[type=submit] span,.buddypress-wrap form.bp-messages-search-form button[type=submit] span{font-family:dashicons;font-size:18px;line-height:1.6}.buddypress-wrap form.bp-dir-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-invites-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-messages-search-form button[type=submit].bp-show{height:auto;right:0;overflow:visible;position:static;top:0}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-decoration{display:none}.buddypress-wrap ul.filters li form label input{line-height:1.4;padding:.1em .7em}.buddypress-wrap .current-member-type{font-style:italic}.buddypress-wrap .dir-form{clear:both}.budypress.no-js form.bp-dir-search-form button[type=submit]{height:auto;right:0;overflow:visible;position:static;top:0}.bp-user [data-bp-search] form input[type=search],.bp-user [data-bp-search] form input[type=text]{padding:6px 10px 7px}.buddypress-wrap .bp-tables-user,.buddypress-wrap table.forum,.buddypress-wrap table.wp-profile-fields{width:100%}.buddypress-wrap .bp-tables-user thead tr,.buddypress-wrap table.forum thead tr,.buddypress-wrap table.wp-profile-fields thead tr{background:0 0;border-bottom:2px solid #ccc}.buddypress-wrap .bp-tables-user tbody tr,.buddypress-wrap table.forum tbody tr,.buddypress-wrap table.wp-profile-fields tbody tr{background:#fafafa}.buddypress-wrap .bp-tables-user tr td,.buddypress-wrap .bp-tables-user tr th,.buddypress-wrap table.forum tr td,.buddypress-wrap table.forum tr th,.buddypress-wrap table.wp-profile-fields tr td,.buddypress-wrap table.wp-profile-fields tr th{padding:.5em;vertical-align:middle}.buddypress-wrap .bp-tables-user tr td.label,.buddypress-wrap table.forum tr td.label,.buddypress-wrap table.wp-profile-fields tr td.label{border-left:1px solid #eaeaea;font-weight:600;width:25%}.buddypress-wrap .bp-tables-user tr.alt td,.buddypress-wrap table.wp-profile-fields tr.alt td{background:#fafafa}.buddypress-wrap table.profile-fields .data{padding:.5em 1em}.buddypress-wrap table.profile-fields tr:last-child{border-bottom:none}.buddypress-wrap table.notifications td{padding:1em .5em}.buddypress-wrap table.notifications .bulk-select-all,.buddypress-wrap table.notifications .bulk-select-check{width:7%}.buddypress-wrap table.notifications .bulk-select-check{vertical-align:middle}.buddypress-wrap table.notifications .date,.buddypress-wrap table.notifications .notification-description,.buddypress-wrap table.notifications .notification-since,.buddypress-wrap table.notifications .title{width:39%}.buddypress-wrap table.notifications .actions,.buddypress-wrap table.notifications .notification-actions{width:15%}.buddypress-wrap table.notification-settings th.title,.buddypress-wrap table.profile-settings th.title{width:80%}.buddypress-wrap table.notifications .notification-actions a.delete,.buddypress-wrap table.notifications .notification-actions a.mark-read{display:inline-block}.buddypress-wrap table.notification-settings{margin-bottom:15px;text-align:right}.buddypress-wrap #groups-notification-settings{margin-bottom:0}.buddypress-wrap table.notification-settings td:first-child,.buddypress-wrap table.notification-settings th.icon,.buddypress-wrap table.notifications td:first-child,.buddypress-wrap table.notifications th.icon{display:none}.buddypress-wrap table.notification-settings .no,.buddypress-wrap table.notification-settings .yes{text-align:center;width:40px;vertical-align:middle}.buddypress-wrap table#message-threads{clear:both}.buddypress-wrap table#message-threads .thread-info{min-width:40%}.buddypress-wrap table#message-threads .thread-info p{margin:0}.buddypress-wrap table#message-threads .thread-info p.thread-excerpt{color:#737373;font-size:12px;margin-top:3px}.buddypress-wrap table.profile-fields{margin-bottom:20px}.buddypress-wrap table.profile-fields:last-child{margin-bottom:0}.buddypress-wrap table.profile-fields p{margin:0}.buddypress-wrap table.profile-fields p:last-child{margin-top:0}.bp-screen-reader-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.center-vert{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.bp-hide{display:none}.bp-show{height:auto;right:0;overflow:visible;position:static;top:0}.buddypress .buddypress-wrap .activity-read-more a,.buddypress .buddypress-wrap .comment-reply-link,.buddypress .buddypress-wrap .generic-button a,.buddypress .buddypress-wrap a.bp-title-button,.buddypress .buddypress-wrap a.button,.buddypress .buddypress-wrap button,.buddypress .buddypress-wrap input[type=button],.buddypress .buddypress-wrap input[type=reset],.buddypress .buddypress-wrap input[type=submit],.buddypress .buddypress-wrap ul.button-nav:not(.button-tabs) li a{background:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#555;cursor:pointer;font-size:inherit;font-weight:400;outline:0;padding:.3em .5em;text-align:center;text-decoration:none;width:auto}.buddypress .buddypress-wrap .button-small[type=button]{padding:0 8px 1px}.buddypress .buddypress-wrap .activity-read-more a:focus,.buddypress .buddypress-wrap .activity-read-more a:hover,.buddypress .buddypress-wrap .button-nav li a:focus,.buddypress .buddypress-wrap .button-nav li a:hover,.buddypress .buddypress-wrap .button-nav li.current a,.buddypress .buddypress-wrap .comment-reply-link:focus,.buddypress .buddypress-wrap .comment-reply-link:hover,.buddypress .buddypress-wrap .generic-button a:focus,.buddypress .buddypress-wrap .generic-button a:hover,.buddypress .buddypress-wrap a.button:focus,.buddypress .buddypress-wrap a.button:hover,.buddypress .buddypress-wrap button:focus,.buddypress .buddypress-wrap button:hover,.buddypress .buddypress-wrap input[type=button]:focus,.buddypress .buddypress-wrap input[type=button]:hover,.buddypress .buddypress-wrap input[type=reset]:focus,.buddypress .buddypress-wrap input[type=reset]:hover,.buddypress .buddypress-wrap input[type=submit]:focus,.buddypress .buddypress-wrap input[type=submit]:hover{background:#ededed;border-color:#999;color:#333;outline:0;text-decoration:none}.buddypress .buddypress-wrap a.disabled,.buddypress .buddypress-wrap button.disabled,.buddypress .buddypress-wrap button.pending,.buddypress .buddypress-wrap div.pending a,.buddypress .buddypress-wrap input[type=button].disabled,.buddypress .buddypress-wrap input[type=button].pending,.buddypress .buddypress-wrap input[type=reset].disabled,.buddypress .buddypress-wrap input[type=reset].pending,.buddypress .buddypress-wrap input[type=submit].pending,.buddypress .buddypress-wrap input[type=submit][disabled=disabled]{border-color:#eee;color:#767676;cursor:default}.buddypress .buddypress-wrap a.disabled:hover,.buddypress .buddypress-wrap button.disabled:hover,.buddypress .buddypress-wrap button.pending:hover,.buddypress .buddypress-wrap div.pending a:hover,.buddypress .buddypress-wrap input[type=button]:hover.disabled,.buddypress .buddypress-wrap input[type=button]:hover.pending,.buddypress .buddypress-wrap input[type=reset]:hover.disabled,.buddypress .buddypress-wrap input[type=reset]:hover.pending,.buddypress .buddypress-wrap input[type=submit]:hover.disabled,.buddypress .buddypress-wrap input[type=submit]:hover.pending{border-color:#eee;color:#767676}.buddypress .buddypress-wrap button.text-button,.buddypress .buddypress-wrap input.text-button{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#767676}.buddypress .buddypress-wrap button.text-button.small,.buddypress .buddypress-wrap input.text-button.small{font-size:13px}.buddypress .buddypress-wrap button.text-button:focus,.buddypress .buddypress-wrap button.text-button:hover,.buddypress .buddypress-wrap input.text-button:focus,.buddypress .buddypress-wrap input.text-button:hover{background:0 0;text-decoration:underline}.buddypress .buddypress-wrap .activity-list a.button{border:none}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover{color:#1fb3dd}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.invite-button:hover{color:#a00}.buddypress .buddypress-wrap #item-buttons:empty{display:none}.buddypress .buddypress-wrap input:disabled:focus,.buddypress .buddypress-wrap input:disabled:hover{background:0 0}.buddypress .buddypress-wrap .text-links-list a.button{background:0 0;border:none;border-left:1px solid #eee;color:#767676;display:inline-block;padding:.3em 1em}.buddypress .buddypress-wrap .text-links-list a.button:visited{color:#d6d6d6}.buddypress .buddypress-wrap .text-links-list a.button:focus,.buddypress .buddypress-wrap .text-links-list a.button:hover{color:#5087e5}.buddypress .buddypress-wrap .text-links-list a:first-child{padding-right:0}.buddypress .buddypress-wrap .text-links-list a:last-child{border-left:none}.buddypress .buddypress-wrap .bp-list.grid .action a,.buddypress .buddypress-wrap .bp-list.grid .action button{border:1px solid #ccc;display:block;margin:0}.buddypress .buddypress-wrap .bp-list.grid .action a:focus,.buddypress .buddypress-wrap .bp-list.grid .action a:hover,.buddypress .buddypress-wrap .bp-list.grid .action button:focus,.buddypress .buddypress-wrap .bp-list.grid .action button:hover{background:#ededed}.buddypress #buddypress .create-button{background:0 0;text-align:center}@media screen and (min-width:46.8em){.buddypress #buddypress .create-button{float:left}}.buddypress #buddypress .create-button a{border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-clip:padding-box;-webkit-box-shadow:inset 0 0 6px 0 #eaeaea;-moz-box-shadow:inset 0 0 6px 0 #eaeaea;box-shadow:inset 0 0 6px 0 #eaeaea;margin:.2em 0;width:auto}.buddypress #buddypress .create-button a:focus,.buddypress #buddypress .create-button a:hover{background:0 0;border-color:#ccc;-webkit-box-shadow:inset 0 0 12px 0 #eaeaea;-moz-box-shadow:inset 0 0 12px 0 #eaeaea;box-shadow:inset 0 0 12px 0 #eaeaea}@media screen and (min-width:46.8em){.buddypress #buddypress.bp-dir-vert-nav .create-button{float:none;padding-top:2em}.buddypress #buddypress.bp-dir-vert-nav .create-button a{margin-left:.5em}}.buddypress #buddypress.bp-dir-hori-nav .create-button{float:right}.buddypress #buddypress.bp-dir-hori-nav .create-button a,.buddypress #buddypress.bp-dir-hori-nav .create-button a:hover{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;margin:0}.buddypress-wrap button.ac-reply-cancel,.buddypress-wrap button.bp-icons{background:0 0;border:0}.buddypress-wrap button.bp-icons:focus,.buddypress-wrap button.bp-icons:hover{background:0 0}.buddypress-wrap button.ac-reply-cancel:focus,.buddypress-wrap button.ac-reply-cancel:hover{background:0 0;text-decoration:underline}.buddypress-wrap .bp-invites-content li .invite-button span.icons:before,.buddypress-wrap .bp-invites-filters .invite-button span.icons:before,.buddypress-wrap .bp-messages-filters li a.messages-button:before,.buddypress-wrap .feed a:before,.buddypress-wrap .filter label:before{font-family:dashicons;font-size:18px}.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:27px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:32px}}.buddypress-wrap .bp-list a.button.invite-button:focus,.buddypress-wrap .bp-list a.button.invite-button:hover{background:0 0}.buddypress-wrap .filter label:before{content:"\f536"}.buddypress-wrap div.feed a:before,.buddypress-wrap li.feed a:before{content:"\f303"}.buddypress-wrap ul.item-list li .invite-button:not(.group-remove-invite-button) span.icons:before{content:"\f502"}.buddypress-wrap ul.item-list li .group-remove-invite-button span.icons:before,.buddypress-wrap ul.item-list li.selected .invite-button span.icons:before{content:"\f153"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-next-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-next-page:before{content:"\f345"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-prev-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-prev-page:before{content:"\f341"}.buddypress-wrap .warn{color:#b71717}.buddypress-wrap .bp-messages{border:1px solid #ccc;margin:0 0 15px}.buddypress-wrap .bp-messages .sitewide-notices{display:block;margin:5px;padding:.5em}.buddypress-wrap .bp-messages.info{margin-bottom:0}.buddypress-wrap .bp-messages.updated{clear:both;display:block}.buddypress-wrap .bp-messages.bp-user-messages-feedback{border:0}.buddypress-wrap #group-create-body .bp-cover-image-status p.warning{background:#0b80a4;border:0;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.2);-moz-box-shadow:0 0 3px 0 rgba(0,0,0,.2);box-shadow:0 0 3px 0 rgba(0,0,0,.2);color:#fff}.buddypress-wrap .bp-feedback:not(.custom-homepage-info){display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch}.buddypress-wrap .bp-feedback{background:#fff;color:#807f7f;-webkit-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px 1px rgba(0,0,0,.1);color:#737373;margin:10px 0;position:relative}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback span.bp-icon{color:#fff;display:block;font-family:dashicons;right:0;margin-left:10px;position:relative;padding:0 .5em}.buddypress-wrap .bp-feedback .bp-help-text{font-style:italic}.buddypress-wrap .bp-feedback .text{font-size:14px;margin:0;padding:.5em 0}.buddypress-wrap .bp-feedback.no-icon{padding:.5em}.buddypress-wrap .bp-feedback.small:before{line-height:inherit}.buddypress-wrap a[data-bp-close] span:before,.buddypress-wrap button[data-bp-close] span:before{font-size:32px}.buddypress-wrap a[data-bp-close],.buddypress-wrap button[data-bp-close]{border:0;position:absolute;top:10px;left:10px;width:32px}.buddypress-wrap .bp-feedback.no-icon a[data-bp-close],.buddypress-wrap .bp-feedback.no-icon button[data-bp-close]{top:-6px;left:6px}.buddypress-wrap button[data-bp-close]:hover{background-color:transparent}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback .bp-icon{font-size:20px;padding:0 2px}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon,.buddypress-wrap .bp-feedback.loading .bp-icon,.buddypress-wrap .bp-feedback.success .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon{background-color:#0b80a4}.buddypress-wrap .bp-feedback.help .bp-icon:before,.buddypress-wrap .bp-feedback.info .bp-icon:before{content:"\f348"}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{background-color:#d33}.buddypress-wrap .bp-feedback.error .bp-icon:before,.buddypress-wrap .bp-feedback.warning .bp-icon:before{content:"\f534"}.buddypress-wrap .bp-feedback.loading .bp-icon{background-color:#ffd087}.buddypress-wrap .bp-feedback.loading .bp-icon:before{content:"\f469"}.buddypress-wrap .bp-feedback.success .bp-icon{background-color:#8a2}.buddypress-wrap .bp-feedback.success .bp-icon:before{content:"\f147"}.buddypress-wrap .bp-feedback.help .bp-icon:before{content:"\f468"}.buddypress-wrap #pass-strength-result{background-color:#eee;border-color:#ddd;border-style:solid;border-width:1px;display:none;font-weight:700;margin:10px 0 10px 0;padding:.5em;text-align:center;width:auto}.buddypress-wrap #pass-strength-result.show{display:block}.buddypress-wrap #pass-strength-result.mismatch{background-color:#333;border-color:transparent;color:#fff}.buddypress-wrap #pass-strength-result.bad,.buddypress-wrap #pass-strength-result.error{background-color:#ffb78c;border-color:#ff853c;color:#fff}.buddypress-wrap #pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040;color:#fff}.buddypress-wrap #pass-strength-result.strong{background-color:#66d66e;border-color:#438c48;color:#fff}.buddypress-wrap .standard-form#signup_form div div.error{background:#faa;color:#a00;margin:0 0 10px 0;padding:.5em;width:90%}.buddypress-wrap .accept,.buddypress-wrap .reject{float:right;margin-right:10px}.buddypress-wrap .members-list.grid .bp-ajax-message{background:rgba(255,255,255,.9);border:1px solid #eee;font-size:14px;right:2%;position:absolute;padding:.5em 1em;left:2%;top:30px}.buddypress.widget .item-options{font-size:14px}.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;-o-flex-flow:column nowrap;flex-flow:column nowrap;list-style:none;margin:10px -2%;overflow:hidden}@media screen and (min-width:32em){.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;-o-flex-flow:row wrap;flex-flow:row wrap}}.buddypress.widget ul.item-list li{border:1px solid #eee;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch;-webkit-flex:1 1 46%;-moz-flex:1 1 46%;-ms-flex:1 1 46%;-o-flex:1 1 46%;flex:1 1 46%;margin:2%}@media screen and (min-width:75em){.buddypress.widget ul.item-list li{-webkit-flex:0 1 20%;-moz-flex:0 1 20%;-ms-flex:0 1 20%;-o-flex:0 1 20%;flex:0 1 20%}}.buddypress.widget ul.item-list li .item-avatar{padding:.5em;text-align:center}.buddypress.widget ul.item-list li .item-avatar .avatar{width:60%}.buddypress.widget ul.item-list li .item{padding:0 .5em .5em}.buddypress.widget ul.item-list li .item .item-meta{font-size:12px;overflow-wrap:break-word}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 46%;-moz-flex:0 1 46%;-ms-flex:0 1 46%;-o-flex:0 1 46%;flex:0 1 46%;margin:2% 2% 10px}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list li .avatar{width:100%}}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list{margin:10px -2%;width:100%}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 auto;-moz-flex:0 1 auto;-ms-flex:0 1 auto;-o-flex:0 1 auto;flex:0 1 auto;margin:10px 2% 1%;width:46%}}#buddypress-wrap *{transition:opacity .1s ease-in-out .1s}#buddypress-wrap a.button,#buddypress-wrap a.generic-button,#buddypress-wrap button,#buddypress-wrap input[type=reset],#buddypress-wrap input[type=submit]{transition:background .1s ease-in-out .1s,color .1s ease-in-out .1s,border-color .1s ease-in-out .1s}.buddypress-wrap a.loading,.buddypress-wrap input.loading{-moz-animation:loader-pulsate .5s infinite ease-in-out alternate;-webkit-animation:loader-pulsate .5s infinite ease-in-out alternate;animation:loader-pulsate .5s infinite ease-in-out alternate;border-color:#aaa}@-webkit-keyframes loader-pulsate{from{border-color:#aaa;-webkit-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-webkit-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@-moz-keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}.buddypress-wrap a.loading:hover,.buddypress-wrap input.loading:hover{color:#777}[data-bp-tooltip]{position:relative}[data-bp-tooltip]:after{background-color:#fff;display:none;opacity:0;position:absolute;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden}[data-bp-tooltip]:after{border:1px solid #737373;border-radius:1px;box-shadow:-4px 4px 8px rgba(0,0,0,.2);color:#333;content:attr(data-bp-tooltip);font-family:"Helvetica Neue",helvetica,arial,san-serif;font-size:12px;font-weight:400;letter-spacing:normal;line-height:1.25;max-width:200px;padding:5px 8px;pointer-events:none;text-shadow:none;text-transform:none;-webkit-transition:all 1.5s ease;-ms-transition:all 1.5s ease;transition:all 1.5s ease;white-space:nowrap;word-wrap:break-word;z-index:100000}[data-bp-tooltip]:active:after,[data-bp-tooltip]:focus:after,[data-bp-tooltip]:hover:after{display:block;opacity:1;overflow:visible;visibility:visible}[data-bp-tooltip=""]{display:none;opacity:0;visibility:hidden}.bp-tooltip:after{right:50%;margin-top:7px;top:110%;-webkit-transform:translate(50%,0);-ms-transform:translate(50%,0);transform:translate(50%,0)}.user-list .bp-tooltip:after{right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}@media screen and (min-width:46.8em){.user-list .bp-tooltip:after{right:auto;left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}.activity-meta-action .bp-tooltip:after,.notification-actions .bp-tooltip:after,.participants-list .bp-tooltip:after{right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.bp-invites-content .bp-tooltip:after{right:auto;left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#item-body,.single-screen-navs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li,.grid>li .generic-button a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li{border-bottom:0;padding-bottom:10px;padding-top:0}.grid>li .list-wrap{background:#fafafa;border:1px solid #eee;padding-bottom:15px;position:relative;overflow:hidden;padding-top:14px}.grid>li .list-wrap .list-title{padding:.5em}.grid>li .list-wrap .update{color:#737373;padding:.5em 2em}.grid>li .item-avatar{text-align:center}.grid>li .item-avatar .avatar{border-radius:50%;display:inline-block;width:50%}@media screen and (min-width:24em){.grid.members-list .list-wrap{min-height:340px}.grid.members-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.members-group-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.groups-list .list-wrap{min-height:470px}.grid.groups-list .list-wrap .item-block{min-height:6rem}.grid.groups-list .list-wrap .group-desc{margin:15px auto 0;min-height:5em;overflow:hidden}.grid.groups-list .list-wrap .group-details,.grid.groups-list .list-wrap .item-desc,.grid.groups-list .list-wrap .last-activity{margin-bottom:0}.grid.groups-list .list-wrap .group-details p,.grid.groups-list .list-wrap .item-desc p,.grid.groups-list .list-wrap .last-activity p{margin-bottom:0}.grid.blogs-list .list-wrap{min-height:350px}.grid.blogs-list .list-wrap .item-block{margin:0 auto;min-height:7rem}}@media screen and (min-width:24em){.grid>li.item-entry{float:right;margin:0}.grid.two>li{padding-bottom:20px}}@media screen and (min-width:24em) and (min-width:75em){.grid.two>li .list-wrap{max-width:500px;margin:0 auto}}@media screen and (min-width:24em){.grid.three>li,.grid.two>li{width:50%}.grid.three>li:nth-child(odd),.grid.two>li:nth-child(odd){padding-left:10px}.grid.three>li:nth-child(even),.grid.two>li:nth-child(even){padding-right:10px}.grid.three>li .item,.grid.two>li .item{margin:1rem auto 0;width:80%}.grid.three>li .item .item-title,.grid.two>li .item .item-title{width:auto}}@media screen and (min-width:46.8em){.grid.three>li{padding-top:0;width:33.333333%;width:calc(100% / 3)}.grid.three>li:nth-child(1n+1){padding-right:5px;padding-left:5px}.grid.three>li:nth-child(3n+3){padding-right:5px;padding-left:0}.grid.three>li:nth-child(3n+1){padding-right:0;padding-left:5px}}@media screen and (min-width:46.8em){.grid.four>li{width:25%}.grid.four>li:nth-child(1n+1){padding-right:5px;padding-left:5px}.grid.four>li:nth-child(4n+4){padding-right:5px;padding-left:0}.grid.four>li:nth-child(4n+1){padding-right:0;padding-left:5px}}.buddypress-wrap .grid.bp-list{padding-top:1em}.buddypress-wrap .grid.bp-list>li{border-bottom:none}.buddypress-wrap .grid.bp-list>li .list-wrap{padding-bottom:3em}.buddypress-wrap .grid.bp-list>li .item-avatar{margin:0;text-align:center;width:auto}.buddypress-wrap .grid.bp-list>li .item-avatar img.avatar{display:inline-block;height:auto;width:50%}.buddypress-wrap .grid.bp-list>li .item-meta,.buddypress-wrap .grid.bp-list>li .list-title{float:none;text-align:center}.buddypress-wrap .grid.bp-list>li .list-title{font-size:inherit;line-height:1.1}.buddypress-wrap .grid.bp-list>li .item{font-size:18px;right:0;margin:0 auto;text-align:center;width:96%}@media screen and (min-width:46.8em){.buddypress-wrap .grid.bp-list>li .item{font-size:22px}}.buddypress-wrap .grid.bp-list>li .item .group-desc,.buddypress-wrap .grid.bp-list>li .item .item-block{float:none;width:96%}.buddypress-wrap .grid.bp-list>li .item .item-block{margin-bottom:10px}.buddypress-wrap .grid.bp-list>li .item .last-activity{margin-top:5px}.buddypress-wrap .grid.bp-list>li .item .group-desc{clear:none}.buddypress-wrap .grid.bp-list>li .item .user-update{clear:both;text-align:right}.buddypress-wrap .grid.bp-list>li .item .activity-read-more a{display:inline}.buddypress-wrap .grid.bp-list>li .action{bottom:5px;float:none;height:auto;right:0;margin:0;padding:0 5px;position:absolute;text-align:center;top:auto;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button{float:none;margin:5px 0 0;text-align:center;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button a,.buddypress-wrap .grid.bp-list>li .action .generic-button button{width:100%}.buddypress-wrap .grid.bp-list>li .avatar,.buddypress-wrap .grid.bp-list>li .item,.buddypress-wrap .grid.bp-list>li .item-avatar{float:none}.buddypress-wrap .blogs-list.grid.two>li .blogs-title{min-height:5em}.buddypress-wrap .grid.four>li .group-desc,.buddypress-wrap .grid.three>li .group-desc{min-height:8em}.buddypress-wrap .blogs-list.grid.four>li,.buddypress-wrap .blogs-list.grid.three>li{min-height:350px}.buddypress-wrap .blogs-list.grid.four>li .last-activity,.buddypress-wrap .blogs-list.grid.three>li .last-activity{margin-bottom:0}.buddypress-wrap .blogs-list.grid.four>li .last-post,.buddypress-wrap .blogs-list.grid.three>li .last-post{margin-top:0}.buddypress:not(.logged-in) .grid.bp-list .list-wrap{padding-bottom:5px}.buddypress:not(.logged-in) .grid.groups-list .list-wrap{min-height:430px}.buddypress:not(.logged-in) .grid.members-list .list-wrap{min-height:300px}.buddypress:not(.logged-in) .grid.blogs-list .list-wrap{min-height:320px}@media screen and (min-width:46.8em){.bp-single-vert-nav .vertical{overflow:visible}.bp-single-vert-nav .vertical ul{border-left:1px solid #d6d6d6;float:right;margin-left:-1px;width:25%}.bp-single-vert-nav .vertical li{float:none}.bp-single-vert-nav .vertical li.selected a{background:#ccc;color:#333}.bp-single-vert-nav .vertical li:focus,.bp-single-vert-nav .vertical li:hover{background:#ccc}.bp-single-vert-nav .vertical li span{background:#d6d6d6;border-radius:10%;float:left;margin-left:2px}.bp-single-vert-nav .vertical li:hover span{border-color:#eaeaea}.bp-single-vert-nav .bp-wrap{margin-bottom:15px}.bp-single-vert-nav .bp-wrap .group-nav-tabs.groups-nav ul li,.bp-single-vert-nav .bp-wrap .user-nav-tabs.users-nav ul li{right:1px;position:relative}.bp-single-vert-nav .item-body:not(#group-create-body){background:#fff;border-right:1px solid #d6d6d6;float:left;margin:0;min-height:400px;padding:0 1em 0 0;width:calc(75% + 1px)}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links){background:#eaeaea;margin:0 -5px 0 0;width:auto}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li{font-size:16px;margin:10px 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a{border-left:1px solid #ccc;padding:0 .5em}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:focus,.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:hover{background:0 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li.current a{background:0 0;color:#333;text-decoration:underline}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li:last-child a{border:none}.bp-dir-vert-nav .dir-navs{float:right;right:1px;position:relative;width:20%}.bp-dir-vert-nav .dir-navs ul li{float:none;overflow:hidden;width:auto}.bp-dir-vert-nav .dir-navs ul li.selected{border:1px solid #eee}.bp-dir-vert-nav .dir-navs ul li.selected a{background:#555;color:#fff}.bp-dir-vert-nav .dir-navs ul li.selected a span{background:#eaeaea;border-color:#ccc;color:#5087e5}.bp-dir-vert-nav .dir-navs ul li a:focus,.bp-dir-vert-nav .dir-navs ul li a:hover{background:#ccc;color:#333}.bp-dir-vert-nav .dir-navs ul li a:focus span,.bp-dir-vert-nav .dir-navs ul li a:hover span{border:1px solid #555}.bp-dir-vert-nav .screen-content{border-right:1px solid #d6d6d6;margin-right:20%;overflow:hidden;padding:0 1em 2em 0}.bp-dir-vert-nav .screen-content .subnav-filters{margin-top:0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:hover{background:0 0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected{background:0 0;border:1px solid #d6d6d6;border-left-color:#fff}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a{background:0 0;color:#333;font-weight:600}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a span{background:#555;border:1px solid #d6d6d6;color:#fff}}
1
+ body #buddypress * a{box-shadow:none;text-decoration:none}body #buddypress #item-body blockquote,body #buddypress .bp-lists blockquote{margin-right:10px}body #buddypress .bp-list .action{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media screen and (min-width:46.8em){body.buddypress .entry-content,body.buddypress .entry-header,body.buddypress .site-content .entry-header{max-width:none}body.buddypress .entry-header{float:none;max-width:none}body.buddypress .entry-content{float:none;max-width:none}body.buddypress .site-content{padding-top:2.5em}body.buddypress #page #primary{max-width:none}body.buddypress #page #primary .entry-content,body.buddypress #page #primary .entry-header{float:none;width:auto}}body.buddypress .buddypress-wrap h1,body.buddypress .buddypress-wrap h2,body.buddypress .buddypress-wrap h3,body.buddypress .buddypress-wrap h4,body.buddypress .buddypress-wrap h5,body.buddypress .buddypress-wrap h6{clear:none;margin:1em 0;padding:0}.bp-wrap:after,.bp-wrap:before{content:" ";display:table}.bp-wrap:after{clear:both}.buddypress-wrap.round-avatars .avatar{border-radius:50%}div,dl,input[type=reset],input[type=search],input[type=submit],li,select,textarea{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;border-radius:2px;background-clip:padding-box}body.buddypress article.page>.entry-header{margin-bottom:2em;padding:0}body.buddypress article.page>.entry-header .entry-title{font-size:28px;font-weight:inherit;color:#767676}@media screen and (min-width:46.8em){body.buddypress article.page>.entry-header .entry-title{font-size:34px}}.buddypress-wrap dt.section-title{font-size:18px}@media screen and (min-width:46.8em){.buddypress-wrap dt.section-title{font-size:22px}}.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:16px}}.buddypress-wrap .activity-header{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-header{font-size:16px}}.buddypress-wrap .activity-inner{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-inner{font-size:18px}}.buddypress-wrap #whats-new-post-in{font-size:16px}.buddypress-wrap .acomment-meta,.buddypress-wrap .mini .activity-header{font-size:16px}.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:16px}}.buddypress-wrap .bp-tables-user th{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user th{font-size:16px}}.buddypress-wrap .bp-tables-user td{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user td{font-size:14px}}.buddypress-wrap .profile-fields th{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields th{font-size:18px}}.buddypress-wrap .profile-fields td{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields td{font-size:16px}}.buddypress-wrap #notification-select{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap #notification-select{font-size:14px}}.bp-navs{background:0 0;clear:both;overflow:hidden}.bp-navs ul{margin:0;padding:0}.bp-navs ul li{list-style:none;margin:0}.bp-navs ul li.last select{max-width:185px}.bp-navs ul li a,.bp-navs ul li span{border:0;display:block;padding:5px 10px;text-decoration:none}.bp-navs ul li .count{background:#eaeaea;border:1px solid #ccc;border-radius:50%;color:#555;display:inline;font-size:12px;margin-right:2px;padding:3px 6px;text-align:center;vertical-align:middle}.bp-navs ul li.current a,.bp-navs ul li.selected a{color:#333;opacity:1}.bp-navs.bp-invites-filters ul li a,.bp-navs.bp-messages-filters ul li a{border:1px solid #ccc;display:inline-block}.main-navs.dir-navs{margin-bottom:20px}.buddypress-wrap .bp-navs li a:hover a .count,.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.selected a .count{background-color:#ccc}.buddypress-wrap .bp-navs li:not(.current) a:focus,.buddypress-wrap .bp-navs li:not(.current) a:hover,.buddypress-wrap .bp-navs li:not(.selected) a:focus,.buddypress-wrap .bp-navs li:not(.selected) a:hover{background:#ccc;color:#333}.buddypress-wrap .bp-navs li.current a,.buddypress-wrap .bp-navs li.current a:focus,.buddypress-wrap .bp-navs li.current a:hover,.buddypress-wrap .bp-navs li.selected a,.buddypress-wrap .bp-navs li.selected a:focus,.buddypress-wrap .bp-navs li.selected a:hover{background:#555;color:#fafafa}.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.current a:focus .count,.buddypress-wrap .bp-navs li.current a:hover .count,.buddypress-wrap .bp-navs li.selected a .count,.buddypress-wrap .bp-navs li.selected a:focus .count,.buddypress-wrap .bp-navs li.selected a:hover .count{border-color:#fafafa}@media screen and (min-width:46.8em){.buddypress-wrap .main-navs:not(.dir-navs) li.current a,.buddypress-wrap .main-navs:not(.dir-navs) li.selected a{background:#fff;color:#333;font-weight:600}.buddypress-wrap .main-navs.vertical li.current a,.buddypress-wrap .main-navs.vertical li.selected a{background:#555;color:#fafafa;text-decoration:none}.buddypress-wrap.bp-dir-hori-nav nav:not(".tabbed-links"){border-bottom:1px solid #eee;border-top:1px solid #eee;-webkit-box-shadow:0 2px 12px 0 #fafafa;-moz-box-shadow:0 2px 12px 0 #fafafa;box-shadow:0 2px 12px 0 #fafafa}}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.selected a{background:#fff;color:#333;font-weight:600}@media screen and (max-width:46.8em){.buddypress-wrap:not(.bp-single-vert-nav) .bp-navs li{background:#eaeaea}}.buddypress-wrap:not(.bp-single-vert-nav) .main-navs>ul>li>a{padding:.5em calc(.5em + 2px)}.buddypress-wrap:not(.bp-single-vert-nav) .group-subnav#subsubnav,.buddypress-wrap:not(.bp-single-vert-nav) .user-subnav#subsubnav{background:0 0}.buddypress-wrap .bp-subnavs,.buddypress-wrap ul.subnav{width:100%}.buddypress-wrap .bp-subnavs{margin:10px 0;overflow:hidden}.buddypress-wrap .bp-subnavs ul li{margin-top:0}.buddypress-wrap .bp-subnavs ul li.current :focus,.buddypress-wrap .bp-subnavs ul li.current :hover,.buddypress-wrap .bp-subnavs ul li.selected :focus,.buddypress-wrap .bp-subnavs ul li.selected :hover{background:0 0;color:#333}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap .bp-navs.bp-invites-filters#subsubnav ul li.last,.buddypress-wrap .bp-navs.bp-invites-nav#subnav ul li.last,.buddypress-wrap .bp-navs.bp-messages-filters#subsubnav ul li.last{margin-top:0}@media screen and (max-width:46.8em){.buddypress-wrap .single-screen-navs{border:1px solid #eee}.buddypress-wrap .single-screen-navs li{border-bottom:1px solid #eee}.buddypress-wrap .single-screen-navs li:last-child{border-bottom:none}.buddypress-wrap .bp-subnavs li a{font-size:14px}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.current a:focus,.buddypress-wrap .bp-subnavs li.current a:hover,.buddypress-wrap .bp-subnavs li.selected a,.buddypress-wrap .bp-subnavs li.selected a:focus,.buddypress-wrap .bp-subnavs li.selected a:hover{background:#555;color:#fff}}.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.selected a .count,.buddypress_object_nav .bp-navs li.current a .count,.buddypress_object_nav .bp-navs li.selected a .count{background-color:#fff}.buddypress-wrap .bp-navs li.dynamic a .count,.buddypress-wrap .bp-navs li.dynamic.current a .count,.buddypress-wrap .bp-navs li.dynamic.selected a .count,.buddypress_object_nav .bp-navs li.dynamic a .count,.buddypress_object_nav .bp-navs li.dynamic.current a .count,.buddypress_object_nav .bp-navs li.dynamic.selected a .count{background-color:#5087e5;border:0;color:#fafafa}.buddypress-wrap .bp-navs li.dynamic a:hover .count,.buddypress_object_nav .bp-navs li.dynamic a:hover .count{background-color:#5087e5;border:0;color:#fff}.buddypress-wrap .bp-navs li a .count:empty,.buddypress_object_nav .bp-navs li a .count:empty{display:none}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current),.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current){color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:hover{background:0 0;color:#333}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li.current a,.buddypress_object_nav .bp-navs.group-create-links ul li.current a{text-align:center}@media screen and (min-width:46.8em){.buddypress-wrap .bp-navs li{float:right}.buddypress-wrap .subnav{float:right}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap #subsubnav .activity-search{float:right}.buddypress-wrap #subsubnav .filter{float:left}}.buddypress_object_nav .bp-navs li a .count{display:inline-block;float:left}@media screen and (min-width:46.8em){.bp-dir-vert-nav .bp-navs.dir-navs{background:0 0}.bp-dir-vert-nav .bp-navs.dir-navs a .count{float:left}}@media screen and (min-width:46.8em){.buddypress-wrap .item-body .tabbed-links ol,.buddypress-wrap .item-body .tabbed-links ul{border-bottom:1px solid #ccc;float:none;margin:20px 0 10px}.buddypress-wrap .item-body .tabbed-links ol:after,.buddypress-wrap .item-body .tabbed-links ol:before,.buddypress-wrap .item-body .tabbed-links ul:after,.buddypress-wrap .item-body .tabbed-links ul:before{content:" ";display:block}.buddypress-wrap .item-body .tabbed-links ol:after,.buddypress-wrap .item-body .tabbed-links ul:after{clear:both}.buddypress-wrap .item-body .tabbed-links ol li,.buddypress-wrap .item-body .tabbed-links ul li{float:right;list-style:none;margin:0 0 0 10px}.buddypress-wrap .item-body .tabbed-links ol li a,.buddypress-wrap .item-body .tabbed-links ol li span,.buddypress-wrap .item-body .tabbed-links ul li a,.buddypress-wrap .item-body .tabbed-links ul li span{background:0 0;border:none;display:block;padding:4px 10px}.buddypress-wrap .item-body .tabbed-links ol li a:focus,.buddypress-wrap .item-body .tabbed-links ol li a:hover,.buddypress-wrap .item-body .tabbed-links ul li a:focus,.buddypress-wrap .item-body .tabbed-links ul li a:hover{background:0 0}.buddypress-wrap .item-body .tabbed-links ol li.current,.buddypress-wrap .item-body .tabbed-links ul li.current{border-color:#ccc #ccc #fff;border-style:solid;border-top-right-radius:4px;border-top-left-radius:4px;border-width:1px;margin-bottom:-1px;padding:0 .5em 1px}.buddypress-wrap .item-body .tabbed-links ol li.current a,.buddypress-wrap .item-body .tabbed-links ul li.current a{color:#333}.buddypress-wrap .item-body .bp-subnavs.tabbed-links>ul{margin-top:0}.buddypress-wrap .item-body .bp-navs.tabbed-links{background:0 0;margin-top:2px}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a{border-left:0;font-size:inherit}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last{float:left;margin:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last a{margin-top:-.5em}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:hover,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:hover{background:0 0;border:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:active,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:active{outline:0}}.buddypress-wrap .dir-component-filters .filter label{display:inline}.buddypress-wrap .subnav-filters:after,.buddypress-wrap .subnav-filters:before{content:" ";display:table}.buddypress-wrap .subnav-filters:after{clear:both}.buddypress-wrap .subnav-filters{background:0 0;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .subnav-filters div{margin:0}.buddypress-wrap .subnav-filters>ul{float:right;list-style:none}.buddypress-wrap .subnav-filters.bp-messages-filters ul{width:100%}.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:1em}@media screen and (min-width:46.8em){.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:0}}.buddypress-wrap .subnav-filters div{float:none}.buddypress-wrap .subnav-filters div input[type=search],.buddypress-wrap .subnav-filters div select{font-size:16px}.buddypress-wrap .subnav-filters div button.nouveau-search-submit{padding:5px .8em 6px}.buddypress-wrap .subnav-filters div button#user_messages_search_submit{padding:7px .8em}.buddypress-wrap .subnav-filters .component-filters{margin-top:10px}.buddypress-wrap .subnav-filters .feed{margin-left:15px}.buddypress-wrap .subnav-filters .last.filter label{display:inline}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:before{content:" ";display:table}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after{clear:both}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-show{display:inline-block}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-hide{display:none}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap{border:0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:focus,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:hover{outline:1px solid #d6d6d6}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions{float:right}.buddypress-wrap .subnav-filters .user-messages-bulk-actions label{display:inline-block;font-weight:300;margin-left:25px;padding:5px 0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions div select{-webkit-appearance:textfield}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply{border:0;border-radius:none;font-weight:400;line-height:1.8;margin:0 10px 0 0;padding:3px 5px;text-align:center;text-transform:none;width:auto}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply span{vertical-align:middle}@media screen and (min-width:32em){.buddypress-wrap .subnav-filters li{margin-bottom:0}.buddypress-wrap .subnav-filters .bp-search,.buddypress-wrap .subnav-filters .dir-search,.buddypress-wrap .subnav-filters .feed,.buddypress-wrap .subnav-filters .group-act-search,.buddypress-wrap .subnav-filters .group-invites-search,.buddypress-wrap .subnav-filters .subnav-search,.buddypress-wrap .subnav-filters .subnav-search form,.buddypress-wrap .subnav-filters .user-messages-bulk-actions,.buddypress-wrap .subnav-filters .user-messages-search{float:right}.buddypress-wrap .subnav-filters .component-filters,.buddypress-wrap .subnav-filters .last{float:left;margin-top:0;width:auto}.buddypress-wrap .subnav-filters .component-filters select,.buddypress-wrap .subnav-filters .last select{max-width:250px}.buddypress-wrap .subnav-filters .user-messages-search{float:left}}.buddypress-wrap .notifications-options-nav input#notification-bulk-manage{border:0;border-radius:0;line-height:1.6}.buddypress-wrap .bp-pagination{background:0 0;border:0;color:#767676;float:right;font-size:small;margin:0;padding:.5em 0;position:relative;width:100%}.buddypress-wrap .bp-pagination .pag-count{float:right}.buddypress-wrap .bp-pagination .bp-pagination-links{float:left;margin-left:10px}.buddypress-wrap .bp-pagination .bp-pagination-links a,.buddypress-wrap .bp-pagination .bp-pagination-links span{font-size:small;padding:0 5px}.buddypress-wrap .bp-pagination .bp-pagination-links a:focus,.buddypress-wrap .bp-pagination .bp-pagination-links a:hover{opacity:1}.buddypress-wrap .bp-pagination p{margin:0}.bp-list:after,.bp-list:before{content:" ";display:table}.bp-list:after{clear:both}.bp-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #eaeaea;clear:both;list-style:none;margin:20px 0;padding:.5em 0;width:100%}.bp-list li:after,.bp-list li:before{content:" ";display:table}.bp-list li:after{clear:both}.bp-list>li{border-bottom:1px solid #eaeaea}.bp-list li{list-style:none;margin:10px 0;padding:.5em 0;position:relative}.bp-list li .item-avatar{text-align:center}.bp-list li .item-avatar img.avatar{display:inline}.bp-list li .item .group-details,.bp-list li .item .item-avatar,.bp-list li .item .item-meta,.bp-list li .item .list-title{text-align:center}.bp-list li .item .list-title{clear:none;font-size:22px;font-weight:400;line-height:1.1;margin:0 auto}@media screen and (min-width:46.8em){.bp-list li .item .list-title{font-size:26px}}.bp-list li .item-meta,.bp-list li .meta{color:#737373;font-size:12px;margin-top:10px}.bp-list li .last-post{text-align:center}.bp-list li .action{margin:0;text-align:center}.bp-list li .action .generic-button{display:inline-block;font-size:12px;margin:0 0 0 10px}.bp-list li .action div.generic-button{margin:10px 0}@media screen and (min-width:46.8em){.bp-list li .item-avatar{float:right;margin-left:5%}.bp-list li .item{margin:0;overflow:hidden}.bp-list li .item .item-block{float:right;margin-left:2%;width:50%}.bp-list li .item .item-meta,.bp-list li .item .list-title{float:right;text-align:right}.bp-list li .item .group-details,.bp-list li .item .last-post{text-align:right}.bp-list li .group-desc,.bp-list li .last-post,.bp-list li .user-update{clear:none;overflow:hidden;width:auto}.bp-list li .action{clear:right;padding:0;text-align:right}.bp-list li .action li.generic-button{margin-left:0}.bp-list li .action div.generic-button{margin:0 0 10px}.bp-list li .generic-button{display:block;margin:0 0 5px 0}}@media screen and (min-width:32em){#activity-stream{clear:both;padding-top:1em}}.activity-list.bp-list{background:#fafafa;border:1px solid #eee}.activity-list.bp-list .activity-item{background:#fff;border:1px solid #b7b7b7;-webkit-box-shadow:0 0 6px #d2d2d2;-moz-box-shadow:0 0 6px #d2d2d2;box-shadow:0 0 6px #d2d2d2;margin:20px 0}.activity-list.bp-list li:first-child{margin-top:0}.friends-request-list .item-title{text-align:center}@media screen and (min-width:46.8em){.friends-request-list li{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap}.friends-request-list li .item{-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;-o-flex:1 1 auto;flex:1 1 auto}.friends-request-list li .action{text-align:left}.friends-request-list li .item-title{font-size:22px;text-align:right}}#notifications-user-list{clear:both;padding-top:1em}@media screen and (min-width:46.8em){body:not(.logged-in) .bp-list .item{margin-left:0}}.activity-permalink .item-list,.activity-permalink .item-list li.activity-item{border:0}.activity-update-form{padding:10px 10px 0}.item-body .activity-update-form .activity-form{margin:0;padding:0}.activity-update-form{border:1px solid #ccc;-webkit-box-shadow:inset 0 0 6px #eee;-moz-box-shadow:inset 0 0 6px #eee;box-shadow:inset 0 0 6px #eee;margin:15px 0}.activity-update-form #whats-new-avatar{margin:10px 0;text-align:center}.activity-update-form #whats-new-avatar img{display:inline-block}.activity-update-form #whats-new-content{padding:0 0 20px 0}.activity-update-form #whats-new-textarea textarea{background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;font-family:inherit;font-size:medium;height:2.2em;line-height:1.4;padding:6px;width:100%}.activity-update-form #whats-new-textarea textarea:focus{-webkit-box-shadow:0 0 6px 0 #d6d6d6;-moz-box-shadow:0 0 6px 0 #d6d6d6;box-shadow:0 0 6px 0 #d6d6d6}.activity-update-form #whats-new-post-in-box{margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items{list-style:none;margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items li{margin-bottom:10px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items #activity-autocomplete{padding:.3em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;padding:.2em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object .avatar{width:30px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object span{padding-right:10px;vertical-align:middle}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:focus,.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:hover{background:#eaeaea;cursor:pointer}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object.selected{border:1px solid #d6d6d6}.activity-update-form #whats-new-submit{margin:15px 0 10px}.activity-update-form #whats-new-submit input{font-size:14px;line-height:inherit;margin-bottom:10px;margin-left:10px;padding:.2em 0;text-align:center;width:100%}@media screen and (min-width:46.8em){.activity-update-form #whats-new-avatar{display:block;float:right;margin:0 0 0 10px}.activity-update-form #whats-new-content,.activity-update-form #whats-new-post-in-box,.activity-update-form #whats-new-submit{margin-right:12%}.activity-update-form #whats-new-submit input{margin-bottom:0;margin-left:10px;width:8em}}.activity-list{padding:.5em}.activity-list .activity-item:after,.activity-list .activity-item:before{content:" ";display:table}.activity-list .activity-item:after{clear:both}.activity-list .activity-item{list-style:none;padding:1em}.activity-list .activity-item.has-comments{padding-bottom:1em}.activity-list .activity-item div.item-avatar{margin:0 auto;text-align:center;width:auto}.activity-list .activity-item div.item-avatar img{max-width:40%}@media screen and (min-width:46.8em){.activity-list .activity-item div.item-avatar{margin:0 0 0 2%;text-align:right;width:15%}.activity-list .activity-item div.item-avatar img{max-width:80%}}.activity-list .activity-item.mini{font-size:13px;position:relative}.activity-list .activity-item.mini .activity-avatar{margin-right:0 auto;text-align:center;width:auto}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:15%}@media screen and (min-width:46.8em){.activity-list .activity-item.mini .activity-avatar{margin-right:15px;text-align:right;width:15%}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:60%}}.activity-list .activity-item.new_forum_post .activity-inner,.activity-list .activity-item.new_forum_topic .activity-inner{border-right:2px solid #eaeaea;margin-right:10px;padding-right:1em}.activity-list .activity-item.newest_blogs_activity,.activity-list .activity-item.newest_friends_activity,.activity-list .activity-item.newest_groups_activity,.activity-list .activity-item.newest_mentions_activity{background:rgba(31,179,221,.1)}.activity-list .activity-item .activity-inreplyto{color:#767676;font-size:13px}.activity-list .activity-item .activity-inreplyto>p{display:inline;margin:0}.activity-list .activity-item .activity-inreplyto .activity-inner,.activity-list .activity-item .activity-inreplyto blockquote{background:0 0;border:0;display:inline;margin:0;overflow:hidden;padding:0}.activity-list .activity-item .activity-header{margin:0 auto;width:80%}.activity-list .activity-item .activity-header a,.activity-list .activity-item .activity-header img{display:inline}.activity-list .activity-item .activity-header .avatar{display:inline-block;margin:0 5px;vertical-align:bottom}.activity-list .activity-item .activity-header .time-since{font-size:14px;color:#767676;text-decoration:none}.activity-list .activity-item .activity-header .time-since:hover{color:#767676;cursor:pointer;text-decoration:underline}.activity-list .activity-item .activity-content .activity-header,.activity-list .activity-item .activity-content .comment-header{color:#767676;margin-bottom:10px}.activity-list .activity-item .activity-content .activity-inner,.activity-list .activity-item .activity-content blockquote{background:#fafafa;margin:15px 0 10px;overflow:hidden;padding:1em}.activity-list .activity-item .activity-content p{margin:0}.activity-list .activity-item .activity-inner p{word-wrap:break-word}.activity-list .activity-item .activity-read-more{margin-right:1em;white-space:nowrap}.activity-list .activity-item ul.activity-meta{margin:0;padding-right:0}.activity-list .activity-item ul.activity-meta li{border:0;display:inline-block}.activity-list .activity-item .activity-meta.action{border:1px solid transparent;background:#fafafa;padding:2px;position:relative;text-align:right}.activity-list .activity-item .activity-meta.action div.generic-button{margin:0}.activity-list .activity-item .activity-meta.action .button{background:0 0}.activity-list .activity-item .activity-meta.action a{padding:4px 8px}.activity-list .activity-item .activity-meta.action .button:focus,.activity-list .activity-item .activity-meta.action .button:hover{background:0 0}.activity-list .activity-item .activity-meta.action .button:before,.activity-list .activity-item .activity-meta.action .icons:before{font-family:dashicons;font-size:18px;vertical-align:middle}.activity-list .activity-item .activity-meta.action .acomment-reply.button:before{content:"\f101"}.activity-list .activity-item .activity-meta.action .view:before{content:"\f125"}.activity-list .activity-item .activity-meta.action .fav:before{content:"\f154"}.activity-list .activity-item .activity-meta.action .unfav:before{content:"\f155"}.activity-list .activity-item .activity-meta.action .delete-activity:before{content:"\f153"}.activity-list .activity-item .activity-meta.action .delete-activity:hover{color:#800}.activity-list .activity-item .activity-meta.action .button{border:0;box-shadow:none}.activity-list .activity-item .activity-meta.action .button span{background:0 0;color:#555;font-weight:700}@media screen and (min-width:46.8em){.activity-list.bp-list{padding:30px}.activity-list .activity-item .activity-content{margin:0;position:relative}.activity-list .activity-item .activity-content:after{clear:both;content:"";display:table}.activity-list .activity-item .activity-header{margin:0 0 0 15px;width:auto}}.buddypress-wrap .activity-list .load-more,.buddypress-wrap .activity-list .load-newest{background:#fafafa;border:1px solid #eee;font-size:110%;margin:15px 0;padding:0;text-align:center}.buddypress-wrap .activity-list .load-more a,.buddypress-wrap .activity-list .load-newest a{color:#555;display:block;padding:.5em 0}.buddypress-wrap .activity-list .load-more a:focus,.buddypress-wrap .activity-list .load-more a:hover,.buddypress-wrap .activity-list .load-newest a:focus,.buddypress-wrap .activity-list .load-newest a:hover{background:#fff;color:#333}.buddypress-wrap .activity-list .load-more:focus,.buddypress-wrap .activity-list .load-more:hover,.buddypress-wrap .activity-list .load-newest:focus,.buddypress-wrap .activity-list .load-newest:hover{border-color:#e1e1e1;-webkit-box-shadow:0 0 6px 0 #eaeaea;-moz-box-shadow:0 0 6px 0 #eaeaea;box-shadow:0 0 6px 0 #eaeaea}body.activity-permalink .activity-list li{border-width:1px;padding:1em 0 0 0}body.activity-permalink .activity-list li:first-child{padding-top:0}body.activity-permalink .activity-list li.has-comments{padding-bottom:0}body.activity-permalink .activity-list .activity-avatar{width:auto}body.activity-permalink .activity-list .activity-avatar a{display:block}body.activity-permalink .activity-list .activity-avatar img{max-width:100%}body.activity-permalink .activity-list .activity-content{border:0;font-size:100%;line-height:1.5;padding:0}body.activity-permalink .activity-list .activity-content .activity-header{margin:0;padding:.5em 0 0 0;text-align:center;width:100%}body.activity-permalink .activity-list .activity-content .activity-inner,body.activity-permalink .activity-list .activity-content blockquote{margin-right:0;margin-top:10px}body.activity-permalink .activity-list .activity-meta{margin:10px 0 10px}body.activity-permalink .activity-list .activity-comments{margin-bottom:10px}@media screen and (min-width:46.8em){body.activity-permalink .activity-list .activity-avatar{right:-20px;margin-left:0;position:relative;top:-20px}body.activity-permalink .activity-list .activity-content{margin-left:10px}body.activity-permalink .activity-list .activity-content .activity-header p{text-align:right}}.buddypress-wrap .activity-comments{clear:both;margin:0 5%;overflow:hidden;position:relative;width:auto}.buddypress-wrap .activity-comments ul{clear:both;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .activity-comments ul li{border-top:1px solid #eee;border-bottom:0;padding:1em 0 0}.buddypress-wrap .activity-comments ul li ul{margin-right:5%}.buddypress-wrap .activity-comments ul li:first-child{border-top:0}.buddypress-wrap .activity-comments ul li:last-child{margin-bottom:0}.buddypress-wrap .activity-comments div.acomment-avatar{width:auto}.buddypress-wrap .activity-comments div.acomment-avatar img{border-width:1px;float:right;height:25px;max-width:none;width:25px}.buddypress-wrap .activity-comments .acomment-content p,.buddypress-wrap .activity-comments .acomment-meta{font-size:14px}.buddypress-wrap .activity-comments .acomment-meta{color:#555;overflow:hidden;padding-right:2%}.buddypress-wrap .activity-comments .acomment-content{border-right:1px solid #ccc;margin:15px 10% 0 0;padding:.5em 1em}.buddypress-wrap .activity-comments .acomment-content p{margin-bottom:.5em}.buddypress-wrap .activity-comments .acomment-options{float:right;margin:10px 20px 10px 0}.buddypress-wrap .activity-comments .acomment-options a{color:#767676;font-size:14px}.buddypress-wrap .activity-comments .acomment-options a:focus,.buddypress-wrap .activity-comments .acomment-options a:hover{color:inherit}.buddypress-wrap .activity-comments .activity-meta.action{background:0 0;margin-top:10px}.buddypress-wrap .activity-comments .activity-meta.action button{font-size:14px;font-weight:400;text-transform:none}.buddypress-wrap .activity-comments .show-all button{font-size:14px;text-decoration:underline;padding-right:.5em}.buddypress-wrap .activity-comments .show-all button span{text-decoration:none}.buddypress-wrap .activity-comments .show-all button:focus span,.buddypress-wrap .activity-comments .show-all button:hover span{color:#5087e5}.buddypress-wrap .mini .activity-comments{clear:both;margin-top:0}body.activity-permalink .activity-comments{background:0 0;width:auto}body.activity-permalink .activity-comments>ul{padding:0 1em 0 .5em}body.activity-permalink .activity-comments ul li>ul{margin-top:10px}form.ac-form{display:none;padding:1em}form.ac-form .ac-reply-avatar{float:right}form.ac-form .ac-reply-avatar img{border:1px solid #eee}form.ac-form .ac-reply-content{color:#767676;padding-right:1em}form.ac-form .ac-reply-content a{text-decoration:none}form.ac-form .ac-reply-content .ac-textarea{margin-bottom:15px;padding:0 .5em;overflow:hidden}form.ac-form .ac-reply-content .ac-textarea textarea{background:0 0;box-shadow:none;color:#555;font-family:inherit;font-size:100%;height:60px;margin:0;outline:0;padding:.5em;width:100%}form.ac-form .ac-reply-content .ac-textarea textarea:focus{-webkit-box-shadow:0 0 6px #d6d6d6;-moz-box-shadow:0 0 6px #d6d6d6;box-shadow:0 0 6px #d6d6d6}form.ac-form .ac-reply-content input{margin-top:10px}.activity-comments li form.ac-form{clear:both;margin-left:15px}.activity-comments form.root{margin-right:0}@media screen and (min-width:46.8em){.buddypress-wrap .blogs-list li .item-block{float:none;width:auto}.buddypress-wrap .blogs-list li .item-meta{clear:right;float:none}}@media screen and (min-width:46.8em){.buddypress-wrap .bp-dir-vert-nav .blogs-list .list-title{width:auto}}.buddypress-wrap .groups-list li .list-title{text-align:center}.buddypress-wrap .groups-list li .group-details{clear:right}.buddypress-wrap .groups-list li .group-desc{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;font-size:13px;color:#737373;font-style:italic;margin:10px auto 0;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .group-desc{font-size:16px}}.buddypress-wrap .groups-list li p{margin:0 0 .5em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .item{margin-left:0}.buddypress-wrap .groups-list li .item-meta,.buddypress-wrap .groups-list li .list-title{text-align:right;width:auto}.buddypress-wrap .groups-list li .item-meta{margin-bottom:20px}.buddypress-wrap .groups-list li .last-activity{clear:right;margin-top:-20px}}.buddypress-wrap .groups-list li.group-no-avatar div.group-desc{margin-right:0}.buddypress-wrap .mygroups .groups-list.grid .wrap{min-height:450px;padding-bottom:0}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list.grid.four .group-desc,.buddypress-wrap .groups-list.grid.three .group-desc{font-size:14px}}@media screen and (min-width:46.8em){.buddypress .bp-vertical-navs .groups-list .item-avatar{margin-left:3%;width:15%}}.buddypress-wrap .members-list li .member-name{margin-bottom:10px}.buddypress-wrap .members-list li .user-update{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;color:#737373;font-style:italic;font-size:13px;margin:15px auto;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .user-update{font-size:16px}}.buddypress-wrap .members-list li .user-update .activity-read-more{display:block;font-size:12px;font-style:normal;margin-top:10px;padding-right:2px}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .last-activity{clear:right;margin-top:-10px}}@media screen and (min-width:46.8em){.buddypress-wrap .members-group-list li .joined{clear:right;float:none}}@media screen and (min-width:32em){body:not(.logged-in) .members-list .user-update{width:96%}}.register-page .register-section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.register-page .signup-form{margin-top:20px}.register-page .signup-form .default-profile input{margin-bottom:20px}.register-page .signup-form label,.register-page .signup-form legend{margin:10px 0 0}.register-page .signup-form .editfield{margin:15px 0}.register-page .signup-form .editfield fieldset{border:0;padding:0}.register-page .signup-form .editfield fieldset legend{margin:0 0 5px;text-indent:0}.register-page .signup-form .editfield .field-visibility-settings{padding:.5em}.register-page .signup-form .editfield .field-visibility-settings fieldset{margin:0 0 10px}.register-page .signup-form #signup-avatar img{margin:0 0 10px 15px}.register-page .signup-form .password-entry,.register-page .signup-form .password-entry-confirm{border:1px solid #eee}@media screen and (min-width:46.8em){.buddypress-wrap .register-page .layout-wrap{display:flex;flex-flow:row wrap;justify-content:space-around}.buddypress-wrap .register-page .layout-wrap .default-profile{flex:1;padding-left:2em}.buddypress-wrap .register-page .layout-wrap .blog-details{flex:1;padding-right:2em}.buddypress-wrap .register-page .submit{clear:both}}@media screen and (min-width:46.8em){.buddypress-wrap.extended-default-reg .register-page .default-profile{flex:1;padding-left:1em}.buddypress-wrap.extended-default-reg .register-page .extended-profile{flex:2;padding-right:1em}.buddypress-wrap.extended-default-reg .register-page .blog-details{flex:1 100%}}#group-create-body{padding:.5em}#group-create-body .creation-step-name{text-align:center}#group-create-body .avatar-nav-items{margin-top:15px}.single-headers:after,.single-headers:before{content:" ";display:table}.single-headers:after{clear:both}.single-headers{margin-bottom:15px}.single-headers #item-header-avatar a{display:block;text-align:center}.single-headers #item-header-avatar a img{float:none}.single-headers div#item-header-content{float:none}@media screen and (min-width:46.8em){.single-headers #item-header-avatar a{text-align:right}.single-headers #item-header-avatar a img{float:right}}.single-headers .activity,.single-headers .group-status{display:inline}.single-headers .group-status{font-size:18px;color:#333;padding-left:1em}.single-headers .activity{display:inline-block;font-size:12px;padding:0}.single-headers #sitewide-notice p,.single-headers div#message p{background-color:#ffd;border:1px solid #cb2;color:#440;font-weight:400;margin-top:3px;text-decoration:none}.single-headers h2{line-height:1.2;margin:0 0 5px}.single-headers h2 a{color:#767676;text-decoration:none}.single-headers h2 span.highlight{display:inline-block;font-size:60%;font-weight:400;line-height:1.7;vertical-align:middle}.single-headers h2 span.highlight span{background:#a1dcfa;color:#fff;cursor:pointer;font-size:80%;font-weight:700;margin-bottom:2px;padding:1px 4px;position:relative;left:-2px;top:-2px;vertical-align:middle}.single-headers img.avatar{float:right;margin:0 0 19px 15px}.single-headers .item-meta{color:#767676;font-size:14px;margin:15px 0 5px;padding-bottom:.5em}.single-headers ul{margin-bottom:15px}.single-headers ul li{float:left;list-style:none}.single-headers div.generic-button{text-align:center}.single-headers li.generic-button{display:inline-block;text-align:center}@media screen and (min-width:46.8em){.single-headers a.button,.single-headers div.generic-button,.single-headers li.generic-button{float:right}}.single-headers a.button,.single-headers div.generic-button{margin:10px 0 0 10px}.single-headers li.generic-button{margin:2px 10px}.single-headers li.generic-button:first-child{margin-right:0}.single-headers div#message.info{line-height:.8}body.no-js .single-item-header .js-self-profile-button{display:none}#cover-image-container{position:relative}#header-cover-image{background-color:#c5c5c5;background-position:center top;background-repeat:no-repeat;background-size:cover;border:0;display:block;right:0;margin:0;padding:0;position:absolute;top:0;width:100%;z-index:1}#item-header-cover-image{position:relative;z-index:2}#item-header-cover-image #item-header-avatar{padding:0 1em}.groups-header .bp-group-type-list{margin:0}.groups-header .bp-feedback{clear:both}.groups-header .group-item-actions{float:right;margin:0 15px 15px 0;padding-top:0;width:100%}.groups-header .moderators-lists{margin-top:0}.groups-header .moderators-lists .moderators-title{font-size:14px}.groups-header .moderators-lists .user-list{margin:0 0 5px}.groups-header .moderators-lists .user-list ul:after{clear:both;content:"";display:table}.groups-header .moderators-lists .user-list li{display:inline-block;float:none;margin-right:4px;padding:4px}.groups-header .moderators-lists img.avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;float:none;height:30px;margin:0;max-width:100%;width:30px}@media screen and (min-width:46.8em){.groups-header div#item-header-content{float:right;margin-right:10%;text-align:right;padding-top:15px;width:42%}.groups-header .group-item-actions{float:left;margin:0 15px 15px 0;text-align:left;width:20%}.groups-header .groups-meta{clear:both}}.groups-header .desc-wrap{background:#eaeaea;border:1px solid #d6d6d6;margin:0 0 15px;padding:1em;text-align:center}.groups-header .desc-wrap .group-description{background:#fafafa;-webkit-box-shadow:inset 0 0 9px #ccc;-moz-box-shadow:inset 0 0 9px #ccc;box-shadow:inset 0 0 9px #ccc;padding:1em;text-align:right}.bp-user .users-header .user-nicename{margin-bottom:5px}.bp-user .member-header-actions{overflow:hidden}.bp-user .member-header-actions *>*{display:block}.buddypress-wrap .item-body{margin:20px 0}.buddypress-wrap .item-body .screen-heading{font-size:20px;font-weight:400}.buddypress-wrap .item-body .button-tabs{margin:30px 0 15px}.buddypress-wrap.bp-single-vert-nav .bp-list:not(.grid) .item-entry{padding-right:.5em}.single-item.group-members .item-body .filters:not(.no-subnav){border-top:5px solid #eaeaea;padding-top:1em}.single-item.group-members .item-body .filters{margin-top:0}.buddypress-wrap .group-status-type ul{margin:0 20px 20px 0}.groups-manage-members-list{padding:.5em 0}.groups-manage-members-list dd{margin:0;padding:1em 0}.groups-manage-members-list .section-title{background:#eaeaea;padding-right:.3em}.groups-manage-members-list ul{list-style:none;margin-bottom:0}.groups-manage-members-list ul li{border-bottom:1px solid #eee;margin-bottom:10px;padding:.5em .3em .3em}.groups-manage-members-list ul li:last-child,.groups-manage-members-list ul li:only-child{border-bottom:0}.groups-manage-members-list ul li:nth-child(even){background:#fafafa}.groups-manage-members-list ul li.banned-user{background:#fad3d3}.groups-manage-members-list ul .member-name{margin-bottom:0;text-align:center}.groups-manage-members-list ul img{display:block;margin:0 auto;width:20%}@media screen and (min-width:32em){.groups-manage-members-list ul .member-name{text-align:right}.groups-manage-members-list ul img{display:inline;width:50px}}.groups-manage-members-list ul .members-manage-buttons:after,.groups-manage-members-list ul .members-manage-buttons:before{content:" ";display:table}.groups-manage-members-list ul .members-manage-buttons:after{clear:both}.groups-manage-members-list ul .members-manage-buttons{margin:15px 0 5px}.groups-manage-members-list ul .members-manage-buttons a.button{color:#767676;display:block;font-size:13px}@media screen and (min-width:32em){.groups-manage-members-list ul .members-manage-buttons a.button{display:inline-block}}.groups-manage-members-list ul .members-manage-buttons.text-links-list{margin-bottom:0}@media screen and (max-width:32em){.groups-manage-members-list ul .members-manage-buttons.text-links-list a.button{background:#fafafa;border:1px solid #eee;display:block;margin-bottom:10px}}.groups-manage-members-list ul .action:not(.text-links-list) a.button{font-size:12px}@media screen and (min-width:46.8em){.groups-manage-members-list ul li .avatar,.groups-manage-members-list ul li .member-name{float:right}.groups-manage-members-list ul li .avatar{margin-left:15px}.groups-manage-members-list ul li .action{clear:both;float:right}}.buddypress .bp-invites-content ul.item-list{border-top:0}.buddypress .bp-invites-content ul.item-list li{border:1px solid #eaeaea;margin:0 0 1%;padding-right:5px;padding-left:5px;position:relative;width:auto}.buddypress .bp-invites-content ul.item-list li .list-title{text-align:center;width:auto}.buddypress .bp-invites-content ul.item-list li .action{position:absolute;top:10px;left:10px}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button{border:0}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:focus,.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:hover{color:#1fb3dd}.buddypress .bp-invites-content ul.item-list li.selected{-webkit-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);-moz-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2)}.buddypress .bp-invites-content .group-inviters li,.buddypress .bp-invites-content .item-list .item-meta span{color:#767676}.buddypress .bp-invites-content li ul.group-inviters{clear:both;margin:0;overflow:hidden}.buddypress .bp-invites-content li ul.group-inviters li{border:0;float:right;font-size:20px;width:inherit}.buddypress .bp-invites-content li .status{font-size:20px;font-style:italic;clear:both;color:#555;margin:10px 0}.buddypress .bp-invites-content #send-invites-editor{overflow:hidden}.buddypress .bp-invites-content #send-invites-editor textarea{width:100%}.buddypress .bp-invites-content #send-invites-editor ul{clear:both;list-style:none;margin:10px 0;overflow:hidden}.buddypress .bp-invites-content #send-invites-editor ul li{float:right;margin:.5%;max-height:50px;max-width:50px}.buddypress .bp-invites-content #send-invites-editor .action{margin-top:10px;padding-top:10px}.buddypress .bp-invites-content #send-invites-editor.bp-hide{display:none}@media screen and (min-width:46.8em){.buddypress .bp-invites-content ul.item-list>li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #eaeaea;float:right;padding-right:.5em;padding-left:.5em;width:49.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(odd){margin-left:.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(even){margin-right:.5%}.buddypress .bp-invites-content ul.item-list ul.group-inviters{float:right;width:auto}}.buddypress.groups .activity-update-form{margin-top:0}.buddypress-wrap .profile{margin-top:30px}.buddypress-wrap .public .profile-fields td.label{width:30%}.buddypress-wrap .profile.edit .button-nav{list-style:none;margin:30px 0 10px}.buddypress-wrap .profile.edit .button-nav li{display:inline-block;margin-left:10px}.buddypress-wrap .profile.edit .button-nav li a{font-size:18px}.buddypress-wrap .profile.edit .editfield{background:#fafafa;border:1px solid #eee;margin:15px 0;padding:1em}.buddypress-wrap .profile.edit .editfield fieldset{border:0}.buddypress-wrap .profile.edit .editfield fieldset label{font-weight:400}.buddypress-wrap .profile.edit .editfield fieldset label.xprofile-field-label{display:inline}.buddypress-wrap .profile.edit .editfield{display:flex;flex-direction:column}.buddypress-wrap .profile.edit .editfield .description{margin-top:10px;order:2}.buddypress-wrap .profile.edit .editfield>fieldset{order:1}.buddypress-wrap .profile.edit .editfield .field-visibility-settings,.buddypress-wrap .profile.edit .editfield .field-visibility-settings-toggle{order:3}body.no-js .buddypress-wrap .field-visibility-settings-close,body.no-js .buddypress-wrap .field-visibility-settings-toggle{display:none}body.no-js .buddypress-wrap .field-visibility-settings{display:block}.buddypress-wrap .field-visibility-settings{margin:10px 0}.buddypress-wrap .current-visibility-level{font-style:normal;font-weight:700}.buddypress-wrap .field-visibility-settings,.buddypress-wrap .field-visibility-settings-header{color:#737373}.buddypress-wrap .field-visibility-settings fieldset{margin:5px 0}.buddypress-wrap .standard-form .editfield fieldset{margin:0}.buddypress-wrap .standard-form .field-visibility-settings label{font-weight:400;margin:0}.buddypress-wrap .standard-form .field-visibility-settings .radio{list-style:none;margin-bottom:0}.buddypress-wrap .standard-form .field-visibility-settings .field-visibility-settings-close{font-size:12px}.buddypress-wrap .standard-form .wp-editor-container{border:1px solid #dedede}.buddypress-wrap .standard-form .wp-editor-container textarea{background:#fff;width:100%}.buddypress-wrap .standard-form .description{background:#fafafa;font-size:inherit}.buddypress-wrap .standard-form .field-visibility-settings legend,.buddypress-wrap .standard-form .field-visibility-settings-header{font-style:italic}.buddypress-wrap .standard-form .field-visibility-settings-header{font-size:14px}.buddypress-wrap .standard-form .field-visibility-settings label,.buddypress-wrap .standard-form .field-visibility-settings legend{font-size:14px}.buddypress-wrap .standard-form .field-visibility select{margin:0}.buddypress-wrap .html-active button.switch-html{background:#f5f5f5;border-bottom-color:transparent;border-bottom-right-radius:0;border-bottom-left-radius:0}.buddypress-wrap .tmce-active button.switch-tmce{background:#f5f5f5;border-bottom-color:transparent;border-bottom-right-radius:0;border-bottom-left-radius:0}.buddypress-wrap .profile.public .profile-group-title{border-bottom:1px solid #ccc}body.register .buddypress-wrap .page ul{list-style:none}.buddypress-wrap .profile .bp-avatar-nav{margin-top:20px}.message-action-delete:before,.message-action-star:before,.message-action-unstar:before,.message-action-view:before{font-family:dashicons;font-size:18px}.message-action-star:before{color:#aaa;content:"\f154"}.message-action-unstar:before{color:#fcdd77;content:"\f155"}.message-action-view:before{content:"\f473"}.message-action-delete:before{content:"\f153"}.message-action-delete:hover:before{color:#a00}.preview-content .actions a{text-decoration:none}.bp-messages-content{margin:15px 0}.bp-messages-content .avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.bp-messages-content .thread-participants{list-style:none}.bp-messages-content .thread-participants dd{margin-right:0}.bp-messages-content time{color:#737373;font-size:12px}#message-threads{border-top:1px solid #eaeaea;clear:both;list-style:none;margin:0;max-height:220px;overflow-x:hidden;overflow-y:auto;padding:0;width:100%}#message-threads li{border-bottom:1px solid #eaeaea;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;margin:0;overflow:hidden;padding:.5em 0}#message-threads li .thread-cb{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;-webkit-flex:1 2 5%;-moz-flex:1 2 5%;-ms-flex:1 2 5%;-o-flex:1 2 5%;flex:1 2 5%}#message-threads li .thread-from{-webkit-flex:1 2 20%;-moz-flex:1 2 20%;-ms-flex:1 2 20%;-o-flex:1 2 20%;flex:1 2 20%}#message-threads li .thread-from img.avatar{float:right;margin:0 0 0 10px}#message-threads li .thread-from .user-name{display:inline-block;line-height:1.1}#message-threads li .thread-content{-webkit-flex:1 2 60%;-moz-flex:1 2 60%;-ms-flex:1 2 60%;-o-flex:1 2 60%;flex:1 2 60%}#message-threads li .thread-date{-webkit-flex:1 2 15%;-moz-flex:1 2 15%;-ms-flex:1 2 15%;-o-flex:1 2 15%;flex:1 2 15%}#message-threads li.selected{background-color:#fafafa}#message-threads li.selected .thread-subject .subject{color:#5087e5}#message-threads li .thread-content{cursor:pointer}#message-threads li .thread-content .excerpt{color:#737373;font-size:12px;margin:0}#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:13px}@media screen and (min-width:46.8em){#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:16px}}#message-threads li .thread-content .thread-subject{vertical-align:top}#message-threads li .thread-content .thread-subject .excerpt{font-weight:400}#message-threads li .thread-date{padding-left:5px;text-align:left}.bp-messages-content .actions{float:left;max-width:30%}.bp-messages-content .actions .bp-icons{display:inline-block;margin:0;padding:.3em .5em}.bp-messages-content .actions .bp-icons:before{font-size:26px}.bp-messages-content #thread-preview{border:1px solid #eaeaea;margin-top:20px}.bp-messages-content #thread-preview .preview-message{clear:both}.bp-messages-content #thread-preview .preview-content{margin:.5em}.bp-messages-content #thread-preview .preview-content .preview-message{background:#fafafa;margin:10px 0;padding:1em .3em .3em}.bp-messages-content #bp-message-thread-list{border-top:1px solid #eaeaea;clear:both;list-style:none;padding:1em 0 .3em}.bp-messages-content #bp-message-thread-list li{padding:.5em}.bp-messages-content #bp-message-thread-list li:nth-child(2n) .message-content{background:#fafafa}.bp-messages-content #bp-message-thread-list .message-metadata{border-bottom:1px solid #ccc;-webkit-box-shadow:2px 1px 9px 0 #eee;-moz-box-shadow:2px 1px 9px 0 #eee;box-shadow:2px 1px 9px 0 #eee;overflow:hidden;padding:.2em}.bp-messages-content #bp-message-thread-list .message-metadata .avatar{width:30px}.bp-messages-content #bp-message-thread-list .message-metadata .user-link{display:block;font-size:13px;float:right}@media screen and (min-width:46.8em){.bp-messages-content #bp-message-thread-list .message-metadata .user-link{font-size:16px}}.bp-messages-content #bp-message-thread-list .message-metadata time{color:#737373;font-size:12px;padding:0 .5em}.bp-messages-content #bp-message-thread-list .message-metadata button{padding:0 .3em}.bp-messages-content #bp-message-thread-list .message-metadata button:before{font-size:20px}.bp-messages-content #bp-message-thread-list .message-content{clear:both;margin:1em auto 0;width:90%}.bp-messages-content #bp-message-thread-list img.avatar{float:right;margin:0 0 0 10px}.bp-messages-content #bp-message-thread-list .actions a:before{font-size:18px}.bp-messages-content form.send-reply .avatar-box{padding:.5em 0}.bp-messages-content .preview-pane-header,.bp-messages-content .single-message-thread-header{border-bottom:1px solid #eaeaea}.bp-messages-content .preview-pane-header:after,.bp-messages-content .single-message-thread-header:after{clear:both;content:"";display:table}.bp-messages-content .preview-thread-title,.bp-messages-content .single-thread-title{font-size:16px}.bp-messages-content .preview-thread-title .messages-title,.bp-messages-content .single-thread-title .messages-title{padding-right:2em}.bp-messages-content .thread-participants{float:right;margin:5px 0;width:70%}.bp-messages-content .thread-participants dd,.bp-messages-content .thread-participants ul{margin-bottom:10px}.bp-messages-content .thread-participants ul{list-style:none}.bp-messages-content .thread-participants ul:after{clear:both;content:"";display:table}.bp-messages-content .thread-participants li{float:right;margin-right:5px}.bp-messages-content .thread-participants img{width:30px}.bp-messages-content #bp-message-thread-list li .message-content blockquote,.bp-messages-content #bp-message-thread-list li .message-content ol,.bp-messages-content #bp-message-thread-list li .message-content ul,.bp-messages-content #thread-preview .preview-message blockquote,.bp-messages-content #thread-preview .preview-message ol,.bp-messages-content #thread-preview .preview-message ul{list-style-position:inside;margin-right:0}.bp-messages-content #thread-preview:empty,.bp-messages-content ul#message-threads:empty{display:none}.bp-messages-content #bp-message-thread-header h2:first-child,.bp-messages-content #thread-preview h2:first-child{background-color:#eaeaea;color:#555;font-weight:700;margin:0;padding:.5em}.bp-messages-content #bp-message-thread-list li a.user-link,.bp-messages-content #message-threads .thread-content a{border:0;text-decoration:none}.bp-messages-content .standard-form #subject{margin-bottom:20px}div.bp-navs#subsubnav.bp-messages-filters .user-messages-bulk-actions{margin-left:15px;max-width:42.5%}.buddypress.settings .profile-settings.bp-tables-user select{width:100%}.buddypress-wrap #whats-new-post-in-box select,.buddypress-wrap .filter select{border:1px solid #d6d6d6}.buddypress-wrap input.action[disabled]{cursor:pointer;opacity:.4}.buddypress-wrap #notification-bulk-manage[disabled]{display:none}.buddypress-wrap fieldset legend{font-size:inherit;font-weight:600}.buddypress-wrap input[type=email]:focus,.buddypress-wrap input[type=password]:focus,.buddypress-wrap input[type=tel]:focus,.buddypress-wrap input[type=text]:focus,.buddypress-wrap input[type=url]:focus,.buddypress-wrap textarea:focus{-webkit-box-shadow:0 0 8px #eaeaea;-moz-box-shadow:0 0 8px #eaeaea;box-shadow:0 0 8px #eaeaea}.buddypress-wrap select{height:auto}.buddypress-wrap textarea{resize:vertical}.buddypress-wrap .standard-form .bp-controls-wrap{margin:1em 0}.buddypress-wrap .standard-form .groups-members-search input[type=search],.buddypress-wrap .standard-form .groups-members-search input[type=text],.buddypress-wrap .standard-form [data-bp-search] input[type=search],.buddypress-wrap .standard-form [data-bp-search] input[type=text],.buddypress-wrap .standard-form input[type=color],.buddypress-wrap .standard-form input[type=date],.buddypress-wrap .standard-form input[type=datetime-local],.buddypress-wrap .standard-form input[type=datetime],.buddypress-wrap .standard-form input[type=email],.buddypress-wrap .standard-form input[type=month],.buddypress-wrap .standard-form input[type=number],.buddypress-wrap .standard-form input[type=password],.buddypress-wrap .standard-form input[type=range],.buddypress-wrap .standard-form input[type=search],.buddypress-wrap .standard-form input[type=tel],.buddypress-wrap .standard-form input[type=text],.buddypress-wrap .standard-form input[type=time],.buddypress-wrap .standard-form input[type=url],.buddypress-wrap .standard-form input[type=week],.buddypress-wrap .standard-form select,.buddypress-wrap .standard-form textarea{background:#fafafa;border:1px solid #d6d6d6;border-radius:0;font:inherit;font-size:100%;padding:.5em}.buddypress-wrap .standard-form input[required],.buddypress-wrap .standard-form select[required],.buddypress-wrap .standard-form textarea[required]{box-shadow:none;border-width:2px;outline:0}.buddypress-wrap .standard-form input[required]:invalid,.buddypress-wrap .standard-form select[required]:invalid,.buddypress-wrap .standard-form textarea[required]:invalid{border-color:#b71717}.buddypress-wrap .standard-form input[required]:valid,.buddypress-wrap .standard-form select[required]:valid,.buddypress-wrap .standard-form textarea[required]:valid{border-color:#91cc2c}.buddypress-wrap .standard-form input[required]:focus,.buddypress-wrap .standard-form select[required]:focus,.buddypress-wrap .standard-form textarea[required]:focus{border-color:#d6d6d6;border-width:1px}.buddypress-wrap .standard-form input.invalid[required],.buddypress-wrap .standard-form select.invalid[required],.buddypress-wrap .standard-form textarea.invalid[required]{border-color:#b71717}.buddypress-wrap .standard-form input:not(.button-small),.buddypress-wrap .standard-form textarea{width:100%}.buddypress-wrap .standard-form input[type=checkbox],.buddypress-wrap .standard-form input[type=radio]{margin-left:5px;width:auto}.buddypress-wrap .standard-form select{padding:3px}.buddypress-wrap .standard-form textarea{height:120px}.buddypress-wrap .standard-form textarea#message_content{height:200px}.buddypress-wrap .standard-form input[type=password]{margin-bottom:5px}.buddypress-wrap .standard-form input:focus,.buddypress-wrap .standard-form select:focus,.buddypress-wrap .standard-form textarea:focus{background:#fafafa;color:#555;outline:0}.buddypress-wrap .standard-form label,.buddypress-wrap .standard-form span.label{display:block;font-weight:600;margin:15px 0 5px;width:auto}.buddypress-wrap .standard-form a.clear-value{display:block;margin-top:5px;outline:0}.buddypress-wrap .standard-form .submit{clear:both;padding:15px 0 0}.buddypress-wrap .standard-form p.submit{margin-bottom:0}.buddypress-wrap .standard-form div.submit input{margin-left:15px}.buddypress-wrap .standard-form #invite-list label,.buddypress-wrap .standard-form p label{font-weight:400;margin:auto}.buddypress-wrap .standard-form p.description{color:#737373;margin:5px 0}.buddypress-wrap .standard-form div.checkbox label:nth-child(n+2),.buddypress-wrap .standard-form div.radio div label{color:#737373;font-size:100%;font-weight:400;margin:5px 0 0}.buddypress-wrap .standard-form#send-reply textarea{width:97.5%}.buddypress-wrap .standard-form#sidebar-login-form label{margin-top:5px}.buddypress-wrap .standard-form#sidebar-login-form input[type=password],.buddypress-wrap .standard-form#sidebar-login-form input[type=text]{padding:4px;width:95%}.buddypress-wrap .standard-form.profile-edit input:focus{background:#fff}@media screen and (min-width:46.8em){.buddypress-wrap .standard-form .left-menu{float:right}.buddypress-wrap .standard-form #invite-list ul{list-style:none;margin:1%}.buddypress-wrap .standard-form #invite-list ul li{margin:0 1% 0 0}.buddypress-wrap .standard-form .main-column{margin-right:190px}.buddypress-wrap .standard-form .main-column ul#friend-list{clear:none;float:right}.buddypress-wrap .standard-form .main-column ul#friend-list h4{clear:none}}.buddypress-wrap .standard-form .bp-tables-user label{margin:0}.buddypress-wrap .signup-form label,.buddypress-wrap .signup-form legend{font-weight:400}body.no-js .buddypress #delete_inbox_messages,body.no-js .buddypress #delete_sentbox_messages,body.no-js .buddypress #message-type-select,body.no-js .buddypress #messages-bulk-management #select-all-messages,body.no-js .buddypress #notifications-bulk-management #select-all-notifications,body.no-js .buddypress label[for=message-type-select]{display:none}.buddypress-wrap .wp-editor-wrap .wp-editor-wrap button,.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=button],.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=submit],.buddypress-wrap .wp-editor-wrap a.button,.buddypress-wrap .wp-editor-wrap input[type=reset]{padding:0 8px 1px}.buddypress-wrap .select-wrap{border:1px solid #eee}.buddypress-wrap .select-wrap label{display:inline}.buddypress-wrap .select-wrap select::-ms-expand{display:none}.buddypress-wrap .select-wrap select{-moz-appearance:none;-webkit-appearance:none;-o-appearance:none;appearance:none;border:0;cursor:pointer;margin-left:-25px;padding:6px 10px 6px 25px;position:relative;text-indent:-2px;z-index:1;width:100%}.buddypress-wrap .select-wrap select,.buddypress-wrap .select-wrap select:active,.buddypress-wrap .select-wrap select:focus{background:0 0}.buddypress-wrap .select-wrap span.select-arrow{display:inline-block;position:relative;z-index:0}.buddypress-wrap .select-wrap span.select-arrow:before{color:#ccc;content:"\25BC"}.buddypress-wrap .select-wrap:focus .select-arrow:before,.buddypress-wrap .select-wrap:hover .select-arrow:before{color:#a6a6a6}.buddypress-wrap .bp-search form:focus,.buddypress-wrap .bp-search form:hover,.buddypress-wrap .select-wrap:focus,.buddypress-wrap .select-wrap:hover{border:1px solid #d5d4d4;box-shadow:inset 0 0 3px #eee}@media screen and (min-width:32em){.buddypress-wrap .notifications-options-nav .select-wrap{float:right}}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after,.buddypress-wrap .bp-messages-search-form:before{content:" ";display:table}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after{clear:both}.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{border:1px solid #eee;width:100%}@media screen and (min-width:55em){.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{width:15em}}.buddypress-wrap form.bp-dir-search-form label,.buddypress-wrap form.bp-invites-search-form label,.buddypress-wrap form.bp-messages-search-form label{margin:0}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{background:0 0;border:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;border-radius:0;background-clip:padding-box}.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{float:right;line-height:1.5;padding:3px 10px;width:80%}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form button[type=submit]{float:left;font-size:inherit;font-weight:400;line-height:1.5;padding:3px .7em;text-align:center;text-transform:none;width:20%}.buddypress-wrap form.bp-dir-search-form button[type=submit] span,.buddypress-wrap form.bp-invites-search-form button[type=submit] span,.buddypress-wrap form.bp-messages-search-form button[type=submit] span{font-family:dashicons;font-size:18px;line-height:1.6}.buddypress-wrap form.bp-dir-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-invites-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-messages-search-form button[type=submit].bp-show{height:auto;right:0;overflow:visible;position:static;top:0}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-decoration{display:none}.buddypress-wrap ul.filters li form label input{line-height:1.4;padding:.1em .7em}.buddypress-wrap .current-member-type{font-style:italic}.buddypress-wrap .dir-form{clear:both}.budypress.no-js form.bp-dir-search-form button[type=submit]{height:auto;right:0;overflow:visible;position:static;top:0}.bp-user [data-bp-search] form input[type=search],.bp-user [data-bp-search] form input[type=text]{padding:6px 10px 7px}.buddypress-wrap .bp-tables-user,.buddypress-wrap table.forum,.buddypress-wrap table.wp-profile-fields{width:100%}.buddypress-wrap .bp-tables-user thead tr,.buddypress-wrap table.forum thead tr,.buddypress-wrap table.wp-profile-fields thead tr{background:0 0;border-bottom:2px solid #ccc}.buddypress-wrap .bp-tables-user tbody tr,.buddypress-wrap table.forum tbody tr,.buddypress-wrap table.wp-profile-fields tbody tr{background:#fafafa}.buddypress-wrap .bp-tables-user tr td,.buddypress-wrap .bp-tables-user tr th,.buddypress-wrap table.forum tr td,.buddypress-wrap table.forum tr th,.buddypress-wrap table.wp-profile-fields tr td,.buddypress-wrap table.wp-profile-fields tr th{padding:.5em;vertical-align:middle}.buddypress-wrap .bp-tables-user tr td.label,.buddypress-wrap table.forum tr td.label,.buddypress-wrap table.wp-profile-fields tr td.label{border-left:1px solid #eaeaea;font-weight:600;width:25%}.buddypress-wrap .bp-tables-user tr.alt td,.buddypress-wrap table.wp-profile-fields tr.alt td{background:#fafafa}.buddypress-wrap table.profile-fields .data{padding:.5em 1em}.buddypress-wrap table.profile-fields tr:last-child{border-bottom:none}.buddypress-wrap table.notifications td{padding:1em .5em}.buddypress-wrap table.notifications .bulk-select-all,.buddypress-wrap table.notifications .bulk-select-check{width:7%}.buddypress-wrap table.notifications .bulk-select-check{vertical-align:middle}.buddypress-wrap table.notifications .date,.buddypress-wrap table.notifications .notification-description,.buddypress-wrap table.notifications .notification-since,.buddypress-wrap table.notifications .title{width:39%}.buddypress-wrap table.notifications .actions,.buddypress-wrap table.notifications .notification-actions{width:15%}.buddypress-wrap table.notification-settings th.title,.buddypress-wrap table.profile-settings th.title{width:80%}.buddypress-wrap table.notifications .notification-actions a.delete,.buddypress-wrap table.notifications .notification-actions a.mark-read{display:inline-block}.buddypress-wrap table.notification-settings{margin-bottom:15px;text-align:right}.buddypress-wrap #groups-notification-settings{margin-bottom:0}.buddypress-wrap table.notification-settings td:first-child,.buddypress-wrap table.notification-settings th.icon,.buddypress-wrap table.notifications td:first-child,.buddypress-wrap table.notifications th.icon{display:none}.buddypress-wrap table.notification-settings .no,.buddypress-wrap table.notification-settings .yes{text-align:center;width:40px;vertical-align:middle}.buddypress-wrap table#message-threads{clear:both}.buddypress-wrap table#message-threads .thread-info{min-width:40%}.buddypress-wrap table#message-threads .thread-info p{margin:0}.buddypress-wrap table#message-threads .thread-info p.thread-excerpt{color:#737373;font-size:12px;margin-top:3px}.buddypress-wrap table.profile-fields{margin-bottom:20px}.buddypress-wrap table.profile-fields:last-child{margin-bottom:0}.buddypress-wrap table.profile-fields p{margin:0}.buddypress-wrap table.profile-fields p:last-child{margin-top:0}.bp-screen-reader-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.center-vert{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.bp-hide{display:none}.bp-show{height:auto;right:0;overflow:visible;position:static;top:0}.buddypress .buddypress-wrap .activity-read-more a,.buddypress .buddypress-wrap .comment-reply-link,.buddypress .buddypress-wrap .generic-button a,.buddypress .buddypress-wrap a.bp-title-button,.buddypress .buddypress-wrap a.button,.buddypress .buddypress-wrap button,.buddypress .buddypress-wrap input[type=button],.buddypress .buddypress-wrap input[type=reset],.buddypress .buddypress-wrap input[type=submit],.buddypress .buddypress-wrap ul.button-nav:not(.button-tabs) li a{background:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#555;cursor:pointer;font-size:inherit;font-weight:400;outline:0;padding:.3em .5em;text-align:center;text-decoration:none;width:auto}.buddypress .buddypress-wrap .button-small[type=button]{padding:0 8px 1px}.buddypress .buddypress-wrap .activity-read-more a:focus,.buddypress .buddypress-wrap .activity-read-more a:hover,.buddypress .buddypress-wrap .button-nav li a:focus,.buddypress .buddypress-wrap .button-nav li a:hover,.buddypress .buddypress-wrap .button-nav li.current a,.buddypress .buddypress-wrap .comment-reply-link:focus,.buddypress .buddypress-wrap .comment-reply-link:hover,.buddypress .buddypress-wrap .generic-button a:focus,.buddypress .buddypress-wrap .generic-button a:hover,.buddypress .buddypress-wrap a.button:focus,.buddypress .buddypress-wrap a.button:hover,.buddypress .buddypress-wrap button:focus,.buddypress .buddypress-wrap button:hover,.buddypress .buddypress-wrap input[type=button]:focus,.buddypress .buddypress-wrap input[type=button]:hover,.buddypress .buddypress-wrap input[type=reset]:focus,.buddypress .buddypress-wrap input[type=reset]:hover,.buddypress .buddypress-wrap input[type=submit]:focus,.buddypress .buddypress-wrap input[type=submit]:hover{background:#ededed;border-color:#999;color:#333;outline:0;text-decoration:none}.buddypress .buddypress-wrap a.disabled,.buddypress .buddypress-wrap button.disabled,.buddypress .buddypress-wrap button.pending,.buddypress .buddypress-wrap div.pending a,.buddypress .buddypress-wrap input[type=button].disabled,.buddypress .buddypress-wrap input[type=button].pending,.buddypress .buddypress-wrap input[type=reset].disabled,.buddypress .buddypress-wrap input[type=reset].pending,.buddypress .buddypress-wrap input[type=submit].pending,.buddypress .buddypress-wrap input[type=submit][disabled=disabled]{border-color:#eee;color:#767676;cursor:default}.buddypress .buddypress-wrap a.disabled:hover,.buddypress .buddypress-wrap button.disabled:hover,.buddypress .buddypress-wrap button.pending:hover,.buddypress .buddypress-wrap div.pending a:hover,.buddypress .buddypress-wrap input[type=button]:hover.disabled,.buddypress .buddypress-wrap input[type=button]:hover.pending,.buddypress .buddypress-wrap input[type=reset]:hover.disabled,.buddypress .buddypress-wrap input[type=reset]:hover.pending,.buddypress .buddypress-wrap input[type=submit]:hover.disabled,.buddypress .buddypress-wrap input[type=submit]:hover.pending{border-color:#eee;color:#767676}.buddypress .buddypress-wrap button.text-button,.buddypress .buddypress-wrap input.text-button{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#767676}.buddypress .buddypress-wrap button.text-button.small,.buddypress .buddypress-wrap input.text-button.small{font-size:13px}.buddypress .buddypress-wrap button.text-button:focus,.buddypress .buddypress-wrap button.text-button:hover,.buddypress .buddypress-wrap input.text-button:focus,.buddypress .buddypress-wrap input.text-button:hover{background:0 0;text-decoration:underline}.buddypress .buddypress-wrap .activity-list a.button{border:none}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover{color:#1fb3dd}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.invite-button:hover{color:#a00}.buddypress .buddypress-wrap #item-buttons:empty{display:none}.buddypress .buddypress-wrap input:disabled:focus,.buddypress .buddypress-wrap input:disabled:hover{background:0 0}.buddypress .buddypress-wrap .text-links-list a.button{background:0 0;border:none;border-left:1px solid #eee;color:#737373;display:inline-block;padding:.3em 1em}.buddypress .buddypress-wrap .text-links-list a.button:visited{color:#d6d6d6}.buddypress .buddypress-wrap .text-links-list a.button:focus,.buddypress .buddypress-wrap .text-links-list a.button:hover{color:#5087e5}.buddypress .buddypress-wrap .text-links-list a:first-child{padding-right:0}.buddypress .buddypress-wrap .text-links-list a:last-child{border-left:none}.buddypress .buddypress-wrap .bp-list.grid .action a,.buddypress .buddypress-wrap .bp-list.grid .action button{border:1px solid #ccc;display:block;margin:0}.buddypress .buddypress-wrap .bp-list.grid .action a:focus,.buddypress .buddypress-wrap .bp-list.grid .action a:hover,.buddypress .buddypress-wrap .bp-list.grid .action button:focus,.buddypress .buddypress-wrap .bp-list.grid .action button:hover{background:#ededed}.buddypress #buddypress .create-button{background:0 0;text-align:center}@media screen and (min-width:46.8em){.buddypress #buddypress .create-button{float:left}}.buddypress #buddypress .create-button a{border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-clip:padding-box;-webkit-box-shadow:inset 0 0 6px 0 #eaeaea;-moz-box-shadow:inset 0 0 6px 0 #eaeaea;box-shadow:inset 0 0 6px 0 #eaeaea;margin:.2em 0;width:auto}.buddypress #buddypress .create-button a:focus,.buddypress #buddypress .create-button a:hover{background:0 0;border-color:#ccc;-webkit-box-shadow:inset 0 0 12px 0 #eaeaea;-moz-box-shadow:inset 0 0 12px 0 #eaeaea;box-shadow:inset 0 0 12px 0 #eaeaea}@media screen and (min-width:46.8em){.buddypress #buddypress.bp-dir-vert-nav .create-button{float:none;padding-top:2em}.buddypress #buddypress.bp-dir-vert-nav .create-button a{margin-left:.5em}}.buddypress #buddypress.bp-dir-hori-nav .create-button{float:right}.buddypress #buddypress.bp-dir-hori-nav .create-button a,.buddypress #buddypress.bp-dir-hori-nav .create-button a:hover{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;margin:0}.buddypress-wrap button.ac-reply-cancel,.buddypress-wrap button.bp-icons{background:0 0;border:0}.buddypress-wrap button.bp-icons:focus,.buddypress-wrap button.bp-icons:hover{background:0 0}.buddypress-wrap button.ac-reply-cancel:focus,.buddypress-wrap button.ac-reply-cancel:hover{background:0 0;text-decoration:underline}.buddypress-wrap .bp-invites-content li .invite-button span.icons:before,.buddypress-wrap .bp-invites-filters .invite-button span.icons:before,.buddypress-wrap .bp-messages-filters li a.messages-button:before,.buddypress-wrap .feed a:before,.buddypress-wrap .filter label:before{font-family:dashicons;font-size:18px}.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:27px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:32px}}.buddypress-wrap .bp-list a.button.invite-button:focus,.buddypress-wrap .bp-list a.button.invite-button:hover{background:0 0}.buddypress-wrap .filter label:before{content:"\f536"}.buddypress-wrap div.feed a:before,.buddypress-wrap li.feed a:before{content:"\f303"}.buddypress-wrap ul.item-list li .invite-button:not(.group-remove-invite-button) span.icons:before{content:"\f502"}.buddypress-wrap ul.item-list li .group-remove-invite-button span.icons:before,.buddypress-wrap ul.item-list li.selected .invite-button span.icons:before{content:"\f153"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-next-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-next-page:before{content:"\f345"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-prev-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-prev-page:before{content:"\f341"}.buddypress-wrap .warn{color:#b71717}.buddypress-wrap .bp-messages{border:1px solid #ccc;margin:0 0 15px}.buddypress-wrap .bp-messages .sitewide-notices{display:block;margin:5px;padding:.5em}.buddypress-wrap .bp-messages.info{margin-bottom:0}.buddypress-wrap .bp-messages.updated{clear:both;display:block}.buddypress-wrap .bp-messages.bp-user-messages-feedback{border:0}.buddypress-wrap #group-create-body .bp-cover-image-status p.warning{background:#0b80a4;border:0;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.2);-moz-box-shadow:0 0 3px 0 rgba(0,0,0,.2);box-shadow:0 0 3px 0 rgba(0,0,0,.2);color:#fff}.buddypress-wrap .bp-feedback:not(.custom-homepage-info){display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch}.buddypress-wrap .bp-feedback{background:#fff;color:#807f7f;-webkit-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px 1px rgba(0,0,0,.1);color:#737373;margin:10px 0;position:relative}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback span.bp-icon{color:#fff;display:block;font-family:dashicons;right:0;margin-left:10px;position:relative;padding:0 .5em}.buddypress-wrap .bp-feedback .bp-help-text{font-style:italic}.buddypress-wrap .bp-feedback .text{font-size:14px;margin:0;padding:.5em 0}.buddypress-wrap .bp-feedback.no-icon{padding:.5em}.buddypress-wrap .bp-feedback.small:before{line-height:inherit}.buddypress-wrap a[data-bp-close] span:before,.buddypress-wrap button[data-bp-close] span:before{font-size:32px}.buddypress-wrap a[data-bp-close],.buddypress-wrap button[data-bp-close]{border:0;position:absolute;top:10px;left:10px;width:32px}.buddypress-wrap .bp-feedback.no-icon a[data-bp-close],.buddypress-wrap .bp-feedback.no-icon button[data-bp-close]{top:-6px;left:6px}.buddypress-wrap button[data-bp-close]:hover{background-color:transparent}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback .bp-icon{font-size:20px;padding:0 2px}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon,.buddypress-wrap .bp-feedback.loading .bp-icon,.buddypress-wrap .bp-feedback.success .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon{background-color:#0b80a4}.buddypress-wrap .bp-feedback.help .bp-icon:before,.buddypress-wrap .bp-feedback.info .bp-icon:before{content:"\f348"}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{background-color:#d33}.buddypress-wrap .bp-feedback.error .bp-icon:before,.buddypress-wrap .bp-feedback.warning .bp-icon:before{content:"\f534"}.buddypress-wrap .bp-feedback.loading .bp-icon{background-color:#ffd087}.buddypress-wrap .bp-feedback.loading .bp-icon:before{content:"\f469"}.buddypress-wrap .bp-feedback.success .bp-icon{background-color:#8a2}.buddypress-wrap .bp-feedback.success .bp-icon:before{content:"\f147"}.buddypress-wrap .bp-feedback.help .bp-icon:before{content:"\f468"}.buddypress-wrap #pass-strength-result{background-color:#eee;border-color:#ddd;border-style:solid;border-width:1px;display:none;font-weight:700;margin:10px 0 10px 0;padding:.5em;text-align:center;width:auto}.buddypress-wrap #pass-strength-result.show{display:block}.buddypress-wrap #pass-strength-result.mismatch{background-color:#333;border-color:transparent;color:#fff}.buddypress-wrap #pass-strength-result.bad,.buddypress-wrap #pass-strength-result.error{background-color:#ffb78c;border-color:#ff853c;color:#fff}.buddypress-wrap #pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040;color:#fff}.buddypress-wrap #pass-strength-result.strong{background-color:#66d66e;border-color:#438c48;color:#fff}.buddypress-wrap .standard-form#signup_form div div.error{background:#faa;color:#a00;margin:0 0 10px 0;padding:.5em;width:90%}.buddypress-wrap .accept,.buddypress-wrap .reject{float:right;margin-right:10px}.buddypress-wrap .members-list.grid .bp-ajax-message{background:rgba(255,255,255,.9);border:1px solid #eee;font-size:14px;right:2%;position:absolute;padding:.5em 1em;left:2%;top:30px}.buddypress.widget .item-options{font-size:14px}.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;-o-flex-flow:column nowrap;flex-flow:column nowrap;list-style:none;margin:10px -2%;overflow:hidden}@media screen and (min-width:32em){.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;-o-flex-flow:row wrap;flex-flow:row wrap}}.buddypress.widget ul.item-list li{border:1px solid #eee;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch;-webkit-flex:1 1 46%;-moz-flex:1 1 46%;-ms-flex:1 1 46%;-o-flex:1 1 46%;flex:1 1 46%;margin:2%}@media screen and (min-width:75em){.buddypress.widget ul.item-list li{-webkit-flex:0 1 20%;-moz-flex:0 1 20%;-ms-flex:0 1 20%;-o-flex:0 1 20%;flex:0 1 20%}}.buddypress.widget ul.item-list li .item-avatar{padding:.5em;text-align:center}.buddypress.widget ul.item-list li .item-avatar .avatar{width:60%}.buddypress.widget ul.item-list li .item{padding:0 .5em .5em}.buddypress.widget ul.item-list li .item .item-meta{font-size:12px;overflow-wrap:break-word}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 46%;-moz-flex:0 1 46%;-ms-flex:0 1 46%;-o-flex:0 1 46%;flex:0 1 46%;margin:2% 2% 10px}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list li .avatar{width:100%}}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list{margin:10px -2%;width:100%}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 auto;-moz-flex:0 1 auto;-ms-flex:0 1 auto;-o-flex:0 1 auto;flex:0 1 auto;margin:10px 2% 1%;width:46%}}#buddypress-wrap *{transition:opacity .1s ease-in-out .1s}#buddypress-wrap a.button,#buddypress-wrap a.generic-button,#buddypress-wrap button,#buddypress-wrap input[type=reset],#buddypress-wrap input[type=submit]{transition:background .1s ease-in-out .1s,color .1s ease-in-out .1s,border-color .1s ease-in-out .1s}.buddypress-wrap a.loading,.buddypress-wrap input.loading{-moz-animation:loader-pulsate .5s infinite ease-in-out alternate;-webkit-animation:loader-pulsate .5s infinite ease-in-out alternate;animation:loader-pulsate .5s infinite ease-in-out alternate;border-color:#aaa}@-webkit-keyframes loader-pulsate{from{border-color:#aaa;-webkit-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-webkit-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@-moz-keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}.buddypress-wrap a.loading:hover,.buddypress-wrap input.loading:hover{color:#777}[data-bp-tooltip]{position:relative}[data-bp-tooltip]:after{background-color:#fff;display:none;opacity:0;position:absolute;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden}[data-bp-tooltip]:after{border:1px solid #737373;border-radius:1px;box-shadow:-4px 4px 8px rgba(0,0,0,.2);color:#333;content:attr(data-bp-tooltip);font-family:"Helvetica Neue",helvetica,arial,san-serif;font-size:12px;font-weight:400;letter-spacing:normal;line-height:1.25;max-width:200px;padding:5px 8px;pointer-events:none;text-shadow:none;text-transform:none;-webkit-transition:all 1.5s ease;-ms-transition:all 1.5s ease;transition:all 1.5s ease;white-space:nowrap;word-wrap:break-word;z-index:100000}[data-bp-tooltip]:active:after,[data-bp-tooltip]:focus:after,[data-bp-tooltip]:hover:after{display:block;opacity:1;overflow:visible;visibility:visible}[data-bp-tooltip=""]{display:none;opacity:0;visibility:hidden}.bp-tooltip:after{right:50%;margin-top:7px;top:110%;-webkit-transform:translate(50%,0);-ms-transform:translate(50%,0);transform:translate(50%,0)}.user-list .bp-tooltip:after{right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}@media screen and (min-width:46.8em){.user-list .bp-tooltip:after{right:auto;left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}.activity-meta-action .bp-tooltip:after,.notification-actions .bp-tooltip:after,.participants-list .bp-tooltip:after{right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.bp-invites-content .bp-tooltip:after{right:auto;left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#item-body,.single-screen-navs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li,.grid>li .generic-button a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li{border-bottom:0;padding-bottom:10px;padding-top:0}.grid>li .list-wrap{background:#fafafa;border:1px solid #eee;padding-bottom:15px;position:relative;overflow:hidden;padding-top:14px}.grid>li .list-wrap .list-title{padding:.5em}.grid>li .list-wrap .update{color:#737373;padding:.5em 2em}.grid>li .item-avatar{text-align:center}.grid>li .item-avatar .avatar{border-radius:50%;display:inline-block;width:50%}@media screen and (min-width:24em){.grid.members-list .list-wrap{min-height:340px}.grid.members-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.members-group-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.groups-list .list-wrap{min-height:470px}.grid.groups-list .list-wrap .item-block{min-height:6rem}.grid.groups-list .list-wrap .group-desc{margin:15px auto 0;min-height:5em;overflow:hidden}.grid.groups-list .list-wrap .group-details,.grid.groups-list .list-wrap .item-desc,.grid.groups-list .list-wrap .last-activity{margin-bottom:0}.grid.groups-list .list-wrap .group-details p,.grid.groups-list .list-wrap .item-desc p,.grid.groups-list .list-wrap .last-activity p{margin-bottom:0}.grid.blogs-list .list-wrap{min-height:350px}.grid.blogs-list .list-wrap .item-block{margin:0 auto;min-height:7rem}}@media screen and (min-width:24em){.grid>li.item-entry{float:right;margin:0}.grid.two>li{padding-bottom:20px}}@media screen and (min-width:24em) and (min-width:75em){.grid.two>li .list-wrap{max-width:500px;margin:0 auto}}@media screen and (min-width:24em){.grid.three>li,.grid.two>li{width:50%}.grid.three>li:nth-child(odd),.grid.two>li:nth-child(odd){padding-left:10px}.grid.three>li:nth-child(even),.grid.two>li:nth-child(even){padding-right:10px}.grid.three>li .item,.grid.two>li .item{margin:1rem auto 0;width:80%}.grid.three>li .item .item-title,.grid.two>li .item .item-title{width:auto}}@media screen and (min-width:46.8em){.grid.three>li{padding-top:0;width:33.333333%;width:calc(100% / 3)}.grid.three>li:nth-child(1n+1){padding-right:5px;padding-left:5px}.grid.three>li:nth-child(3n+3){padding-right:5px;padding-left:0}.grid.three>li:nth-child(3n+1){padding-right:0;padding-left:5px}}@media screen and (min-width:46.8em){.grid.four>li{width:25%}.grid.four>li:nth-child(1n+1){padding-right:5px;padding-left:5px}.grid.four>li:nth-child(4n+4){padding-right:5px;padding-left:0}.grid.four>li:nth-child(4n+1){padding-right:0;padding-left:5px}}.buddypress-wrap .grid.bp-list{padding-top:1em}.buddypress-wrap .grid.bp-list>li{border-bottom:none}.buddypress-wrap .grid.bp-list>li .list-wrap{padding-bottom:3em}.buddypress-wrap .grid.bp-list>li .item-avatar{margin:0;text-align:center;width:auto}.buddypress-wrap .grid.bp-list>li .item-avatar img.avatar{display:inline-block;height:auto;width:50%}.buddypress-wrap .grid.bp-list>li .item-meta,.buddypress-wrap .grid.bp-list>li .list-title{float:none;text-align:center}.buddypress-wrap .grid.bp-list>li .list-title{font-size:inherit;line-height:1.1}.buddypress-wrap .grid.bp-list>li .item{font-size:18px;right:0;margin:0 auto;text-align:center;width:96%}@media screen and (min-width:46.8em){.buddypress-wrap .grid.bp-list>li .item{font-size:22px}}.buddypress-wrap .grid.bp-list>li .item .group-desc,.buddypress-wrap .grid.bp-list>li .item .item-block{float:none;width:96%}.buddypress-wrap .grid.bp-list>li .item .item-block{margin-bottom:10px}.buddypress-wrap .grid.bp-list>li .item .last-activity{margin-top:5px}.buddypress-wrap .grid.bp-list>li .item .group-desc{clear:none}.buddypress-wrap .grid.bp-list>li .item .user-update{clear:both;text-align:right}.buddypress-wrap .grid.bp-list>li .item .activity-read-more a{display:inline}.buddypress-wrap .grid.bp-list>li .action{bottom:5px;float:none;height:auto;right:0;margin:0;padding:0 5px;position:absolute;text-align:center;top:auto;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button{float:none;margin:5px 0 0;text-align:center;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button a,.buddypress-wrap .grid.bp-list>li .action .generic-button button{width:100%}.buddypress-wrap .grid.bp-list>li .avatar,.buddypress-wrap .grid.bp-list>li .item,.buddypress-wrap .grid.bp-list>li .item-avatar{float:none}.buddypress-wrap .blogs-list.grid.two>li .blogs-title{min-height:5em}.buddypress-wrap .grid.four>li .group-desc,.buddypress-wrap .grid.three>li .group-desc{min-height:8em}.buddypress-wrap .blogs-list.grid.four>li,.buddypress-wrap .blogs-list.grid.three>li{min-height:350px}.buddypress-wrap .blogs-list.grid.four>li .last-activity,.buddypress-wrap .blogs-list.grid.three>li .last-activity{margin-bottom:0}.buddypress-wrap .blogs-list.grid.four>li .last-post,.buddypress-wrap .blogs-list.grid.three>li .last-post{margin-top:0}.buddypress:not(.logged-in) .grid.bp-list .list-wrap{padding-bottom:5px}.buddypress:not(.logged-in) .grid.groups-list .list-wrap{min-height:430px}.buddypress:not(.logged-in) .grid.members-list .list-wrap{min-height:300px}.buddypress:not(.logged-in) .grid.blogs-list .list-wrap{min-height:320px}@media screen and (min-width:46.8em){.bp-single-vert-nav .vertical{overflow:visible}.bp-single-vert-nav .vertical ul{border-left:1px solid #d6d6d6;float:right;margin-left:-1px;width:25%}.bp-single-vert-nav .vertical li{float:none}.bp-single-vert-nav .vertical li.selected a{background:#ccc;color:#333}.bp-single-vert-nav .vertical li:focus,.bp-single-vert-nav .vertical li:hover{background:#ccc}.bp-single-vert-nav .vertical li span{background:#d6d6d6;border-radius:10%;float:left;margin-left:2px}.bp-single-vert-nav .vertical li:hover span{border-color:#eaeaea}.bp-single-vert-nav .bp-wrap{margin-bottom:15px}.bp-single-vert-nav .bp-wrap .group-nav-tabs.groups-nav ul li,.bp-single-vert-nav .bp-wrap .user-nav-tabs.users-nav ul li{right:1px;position:relative}.bp-single-vert-nav .item-body:not(#group-create-body){background:#fff;border-right:1px solid #d6d6d6;float:left;margin:0;min-height:400px;padding:0 1em 0 0;width:calc(75% + 1px)}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links){background:#eaeaea;margin:0 -5px 0 0;width:auto}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li{font-size:16px;margin:10px 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a{border-left:1px solid #ccc;padding:0 .5em}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:focus,.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:hover{background:0 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li.current a{background:0 0;color:#333;text-decoration:underline}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li:last-child a{border:none}.bp-dir-vert-nav .dir-navs{float:right;right:1px;position:relative;width:20%}.bp-dir-vert-nav .dir-navs ul li{float:none;overflow:hidden;width:auto}.bp-dir-vert-nav .dir-navs ul li.selected{border:1px solid #eee}.bp-dir-vert-nav .dir-navs ul li.selected a{background:#555;color:#fff}.bp-dir-vert-nav .dir-navs ul li.selected a span{background:#eaeaea;border-color:#ccc;color:#5087e5}.bp-dir-vert-nav .dir-navs ul li a:focus,.bp-dir-vert-nav .dir-navs ul li a:hover{background:#ccc;color:#333}.bp-dir-vert-nav .dir-navs ul li a:focus span,.bp-dir-vert-nav .dir-navs ul li a:hover span{border:1px solid #555}.bp-dir-vert-nav .screen-content{border-right:1px solid #d6d6d6;margin-right:20%;overflow:hidden;padding:0 1em 2em 0}.bp-dir-vert-nav .screen-content .subnav-filters{margin-top:0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:hover{background:0 0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected{background:0 0;border:1px solid #d6d6d6;border-left-color:#fff}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a{background:0 0;color:#333;font-weight:600}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a span{background:#555;border:1px solid #d6d6d6;color:#fff}}
bp-templates/bp-nouveau/css/buddypress.css CHANGED
@@ -302,7 +302,7 @@ body.buddypress article.page > .entry-header .entry-title {
302
  text-decoration: none;
303
  }
304
 
305
- .bp-navs ul li span {
306
  background: #eaeaea;
307
  border: 1px solid #ccc;
308
  border-radius: 50%;
@@ -330,9 +330,9 @@ body.buddypress article.page > .entry-header .entry-title {
330
  margin-bottom: 20px;
331
  }
332
 
333
- .buddypress-wrap .bp-navs li.selected a span,
334
- .buddypress-wrap .bp-navs li.current a span,
335
- .buddypress-wrap .bp-navs li a:hover a span {
336
  background-color: #ccc;
337
  }
338
 
@@ -354,12 +354,12 @@ body.buddypress article.page > .entry-header .entry-title {
354
  color: #fafafa;
355
  }
356
 
357
- .buddypress-wrap .bp-navs li.selected a span,
358
- .buddypress-wrap .bp-navs li.selected a:focus span,
359
- .buddypress-wrap .bp-navs li.selected a:hover span,
360
- .buddypress-wrap .bp-navs li.current a span,
361
- .buddypress-wrap .bp-navs li.current a:focus span,
362
- .buddypress-wrap .bp-navs li.current a:hover span {
363
  border-color: #fafafa;
364
  }
365
 
@@ -376,7 +376,7 @@ body.buddypress article.page > .entry-header .entry-title {
376
  color: #fafafa;
377
  text-decoration: none;
378
  }
379
- .buddypress-wrap.bp-dir-hori-nav nav {
380
  border-bottom: 1px solid #eee;
381
  border-top: 1px solid #eee;
382
  -webkit-box-shadow: 0 2px 12px 0 #fafafa;
@@ -461,36 +461,41 @@ body.buddypress article.page > .entry-header .entry-title {
461
  }
462
  }
463
 
464
- .buddypress_object_nav .bp-navs li.selected a span,
465
- .buddypress_object_nav .bp-navs li.current a span,
466
- .buddypress-wrap .bp-navs li.selected a span,
467
- .buddypress-wrap .bp-navs li.current a span {
468
  background-color: #fff;
469
  }
470
 
471
- .buddypress_object_nav .bp-navs li.dynamic a span,
472
- .buddypress_object_nav .bp-navs li.dynamic.selected a span,
473
- .buddypress_object_nav .bp-navs li.dynamic.current a span,
474
- .buddypress-wrap .bp-navs li.dynamic a span,
475
- .buddypress-wrap .bp-navs li.dynamic.selected a span,
476
- .buddypress-wrap .bp-navs li.dynamic.current a span {
477
  background-color: #5087e5;
478
  border: 0;
479
  color: #fafafa;
480
  }
481
 
482
- .buddypress_object_nav .bp-navs li.dynamic a:hover span,
483
- .buddypress-wrap .bp-navs li.dynamic a:hover span {
484
  background-color: #5087e5;
485
  border: 0;
486
  color: #fff;
487
  }
488
 
489
- .buddypress_object_nav .bp-navs li a span:empty,
490
- .buddypress-wrap .bp-navs li a span:empty {
491
  display: none;
492
  }
493
 
 
 
 
 
 
494
  .buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a,
495
  .buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a {
496
  color: #767676;
@@ -532,7 +537,7 @@ body.buddypress article.page > .entry-header .entry-title {
532
  }
533
  }
534
 
535
- .buddypress_object_nav .bp-navs li a span {
536
  display: inline-block;
537
  float: right;
538
  }
@@ -541,45 +546,61 @@ body.buddypress article.page > .entry-header .entry-title {
541
  .bp-dir-vert-nav .bp-navs.dir-navs {
542
  background: none;
543
  }
544
- .bp-dir-vert-nav .bp-navs.dir-navs a span {
545
  float: right;
546
  }
547
  }
548
 
549
  @media screen and (min-width: 46.8em) {
550
- .buddypress-wrap .item-body .tabbed-links ul {
 
551
  border-bottom: 1px solid #ccc;
552
  float: none;
553
  margin: 20px 0 10px;
554
  }
555
- .buddypress-wrap .item-body .tabbed-links ul:before, .buddypress-wrap .item-body .tabbed-links ul:after {
 
 
556
  content: " ";
557
  display: block;
558
  }
559
- .buddypress-wrap .item-body .tabbed-links ul:after {
 
560
  clear: both;
561
  }
562
- .buddypress-wrap .item-body .tabbed-links ul li {
 
563
  float: left;
564
  list-style: none;
565
  margin: 0 10px 0 0;
566
  }
567
- .buddypress-wrap .item-body .tabbed-links ul li a {
 
 
 
568
  background: none;
569
  border: none;
570
  display: block;
571
  padding: 4px 10px;
572
  }
573
- .buddypress-wrap .item-body .tabbed-links ul li.current {
 
 
 
 
 
 
 
574
  border-color: #ccc #ccc #fff;
575
  border-style: solid;
576
  border-top-left-radius: 4px;
577
  border-top-right-radius: 4px;
578
  border-width: 1px;
579
  margin-bottom: -1px;
580
- padding: 0 0.5em;
581
  }
582
- .buddypress-wrap .item-body .tabbed-links ul li.current a {
 
583
  color: #333;
584
  }
585
  .buddypress-wrap .item-body .bp-subnavs.tabbed-links > ul {
@@ -3980,7 +4001,7 @@ body.no-js .buddypress #messages-bulk-management #select-all-messages {
3980
  background: none;
3981
  border: none;
3982
  border-right: 1px solid #eee;
3983
- color: #767676;
3984
  display: inline-block;
3985
  padding: 0.3em 1em;
3986
  }
302
  text-decoration: none;
303
  }
304
 
305
+ .bp-navs ul li .count {
306
  background: #eaeaea;
307
  border: 1px solid #ccc;
308
  border-radius: 50%;
330
  margin-bottom: 20px;
331
  }
332
 
333
+ .buddypress-wrap .bp-navs li.selected a .count,
334
+ .buddypress-wrap .bp-navs li.current a .count,
335
+ .buddypress-wrap .bp-navs li a:hover a .count {
336
  background-color: #ccc;
337
  }
338
 
354
  color: #fafafa;
355
  }
356
 
357
+ .buddypress-wrap .bp-navs li.selected a .count,
358
+ .buddypress-wrap .bp-navs li.selected a:focus .count,
359
+ .buddypress-wrap .bp-navs li.selected a:hover .count,
360
+ .buddypress-wrap .bp-navs li.current a .count,
361
+ .buddypress-wrap .bp-navs li.current a:focus .count,
362
+ .buddypress-wrap .bp-navs li.current a:hover .count {
363
  border-color: #fafafa;
364
  }
365
 
376
  color: #fafafa;
377
  text-decoration: none;
378
  }
379
+ .buddypress-wrap.bp-dir-hori-nav nav:not(".tabbed-links") {
380
  border-bottom: 1px solid #eee;
381
  border-top: 1px solid #eee;
382
  -webkit-box-shadow: 0 2px 12px 0 #fafafa;
461
  }
462
  }
463
 
464
+ .buddypress_object_nav .bp-navs li.selected a .count,
465
+ .buddypress_object_nav .bp-navs li.current a .count,
466
+ .buddypress-wrap .bp-navs li.selected a .count,
467
+ .buddypress-wrap .bp-navs li.current a .count {
468
  background-color: #fff;
469
  }
470
 
471
+ .buddypress_object_nav .bp-navs li.dynamic a .count,
472
+ .buddypress_object_nav .bp-navs li.dynamic.selected a .count,
473
+ .buddypress_object_nav .bp-navs li.dynamic.current a .count,
474
+ .buddypress-wrap .bp-navs li.dynamic a .count,
475
+ .buddypress-wrap .bp-navs li.dynamic.selected a .count,
476
+ .buddypress-wrap .bp-navs li.dynamic.current a .count {
477
  background-color: #5087e5;
478
  border: 0;
479
  color: #fafafa;
480
  }
481
 
482
+ .buddypress_object_nav .bp-navs li.dynamic a:hover .count,
483
+ .buddypress-wrap .bp-navs li.dynamic a:hover .count {
484
  background-color: #5087e5;
485
  border: 0;
486
  color: #fff;
487
  }
488
 
489
+ .buddypress_object_nav .bp-navs li a .count:empty,
490
+ .buddypress-wrap .bp-navs li a .count:empty {
491
  display: none;
492
  }
493
 
494
+ .buddypress_object_nav .bp-navs.group-create-links ul li:not(.current),
495
+ .buddypress-wrap .bp-navs.group-create-links ul li:not(.current) {
496
+ color: #767676;
497
+ }
498
+
499
  .buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a,
500
  .buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a {
501
  color: #767676;
537
  }
538
  }
539
 
540
+ .buddypress_object_nav .bp-navs li a .count {
541
  display: inline-block;
542
  float: right;
543
  }
546
  .bp-dir-vert-nav .bp-navs.dir-navs {
547
  background: none;
548
  }
549
+ .bp-dir-vert-nav .bp-navs.dir-navs a .count {
550
  float: right;
551
  }
552
  }
553
 
554
  @media screen and (min-width: 46.8em) {
555
+ .buddypress-wrap .item-body .tabbed-links ul,
556
+ .buddypress-wrap .item-body .tabbed-links ol {
557
  border-bottom: 1px solid #ccc;
558
  float: none;
559
  margin: 20px 0 10px;
560
  }
561
+ .buddypress-wrap .item-body .tabbed-links ul:before, .buddypress-wrap .item-body .tabbed-links ul:after,
562
+ .buddypress-wrap .item-body .tabbed-links ol:before,
563
+ .buddypress-wrap .item-body .tabbed-links ol:after {
564
  content: " ";
565
  display: block;
566
  }
567
+ .buddypress-wrap .item-body .tabbed-links ul:after,
568
+ .buddypress-wrap .item-body .tabbed-links ol:after {
569
  clear: both;
570
  }
571
+ .buddypress-wrap .item-body .tabbed-links ul li,
572
+ .buddypress-wrap .item-body .tabbed-links ol li {
573
  float: left;
574
  list-style: none;
575
  margin: 0 10px 0 0;
576
  }
577
+ .buddypress-wrap .item-body .tabbed-links ul li a,
578
+ .buddypress-wrap .item-body .tabbed-links ul li span,
579
+ .buddypress-wrap .item-body .tabbed-links ol li a,
580
+ .buddypress-wrap .item-body .tabbed-links ol li span {
581
  background: none;
582
  border: none;
583
  display: block;
584
  padding: 4px 10px;
585
  }
586
+ .buddypress-wrap .item-body .tabbed-links ul li a:focus,
587
+ .buddypress-wrap .item-body .tabbed-links ul li a:hover,
588
+ .buddypress-wrap .item-body .tabbed-links ol li a:focus,
589
+ .buddypress-wrap .item-body .tabbed-links ol li a:hover {
590
+ background: none;
591
+ }
592
+ .buddypress-wrap .item-body .tabbed-links ul li.current,
593
+ .buddypress-wrap .item-body .tabbed-links ol li.current {
594
  border-color: #ccc #ccc #fff;
595
  border-style: solid;
596
  border-top-left-radius: 4px;
597
  border-top-right-radius: 4px;
598
  border-width: 1px;
599
  margin-bottom: -1px;
600
+ padding: 0 0.5em 1px;
601
  }
602
+ .buddypress-wrap .item-body .tabbed-links ul li.current a,
603
+ .buddypress-wrap .item-body .tabbed-links ol li.current a {
604
  color: #333;
605
  }
606
  .buddypress-wrap .item-body .bp-subnavs.tabbed-links > ul {
4001
  background: none;
4002
  border: none;
4003
  border-right: 1px solid #eee;
4004
+ color: #737373;
4005
  display: inline-block;
4006
  padding: 0.3em 1em;
4007
  }
bp-templates/bp-nouveau/css/buddypress.min.css CHANGED
@@ -1 +1 @@
1
- body #buddypress * a{box-shadow:none;text-decoration:none}body #buddypress #item-body blockquote,body #buddypress .bp-lists blockquote{margin-left:10px}body #buddypress .bp-list .action{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media screen and (min-width:46.8em){body.buddypress .entry-content,body.buddypress .entry-header,body.buddypress .site-content .entry-header{max-width:none}body.buddypress .entry-header{float:none;max-width:none}body.buddypress .entry-content{float:none;max-width:none}body.buddypress .site-content{padding-top:2.5em}body.buddypress #page #primary{max-width:none}body.buddypress #page #primary .entry-content,body.buddypress #page #primary .entry-header{float:none;width:auto}}body.buddypress .buddypress-wrap h1,body.buddypress .buddypress-wrap h2,body.buddypress .buddypress-wrap h3,body.buddypress .buddypress-wrap h4,body.buddypress .buddypress-wrap h5,body.buddypress .buddypress-wrap h6{clear:none;margin:1em 0;padding:0}.bp-wrap:after,.bp-wrap:before{content:" ";display:table}.bp-wrap:after{clear:both}.buddypress-wrap.round-avatars .avatar{border-radius:50%}div,dl,input[type=reset],input[type=search],input[type=submit],li,select,textarea{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;border-radius:2px;background-clip:padding-box}body.buddypress article.page>.entry-header{margin-bottom:2em;padding:0}body.buddypress article.page>.entry-header .entry-title{font-size:28px;font-weight:inherit;color:#767676}@media screen and (min-width:46.8em){body.buddypress article.page>.entry-header .entry-title{font-size:34px}}.buddypress-wrap dt.section-title{font-size:18px}@media screen and (min-width:46.8em){.buddypress-wrap dt.section-title{font-size:22px}}.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:16px}}.buddypress-wrap .activity-header{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-header{font-size:16px}}.buddypress-wrap .activity-inner{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-inner{font-size:18px}}.buddypress-wrap #whats-new-post-in{font-size:16px}.buddypress-wrap .acomment-meta,.buddypress-wrap .mini .activity-header{font-size:16px}.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:16px}}.buddypress-wrap .bp-tables-user th{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user th{font-size:16px}}.buddypress-wrap .bp-tables-user td{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user td{font-size:14px}}.buddypress-wrap .profile-fields th{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields th{font-size:18px}}.buddypress-wrap .profile-fields td{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields td{font-size:16px}}.buddypress-wrap #notification-select{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap #notification-select{font-size:14px}}.bp-navs{background:0 0;clear:both;overflow:hidden}.bp-navs ul{margin:0;padding:0}.bp-navs ul li{list-style:none;margin:0}.bp-navs ul li.last select{max-width:185px}.bp-navs ul li a,.bp-navs ul li span{border:0;display:block;padding:5px 10px;text-decoration:none}.bp-navs ul li span{background:#eaeaea;border:1px solid #ccc;border-radius:50%;color:#555;display:inline;font-size:12px;margin-left:2px;padding:3px 6px;text-align:center;vertical-align:middle}.bp-navs ul li.current a,.bp-navs ul li.selected a{color:#333;opacity:1}.bp-navs.bp-invites-filters ul li a,.bp-navs.bp-messages-filters ul li a{border:1px solid #ccc;display:inline-block}.main-navs.dir-navs{margin-bottom:20px}.buddypress-wrap .bp-navs li a:hover a span,.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.selected a span{background-color:#ccc}.buddypress-wrap .bp-navs li:not(.current) a:focus,.buddypress-wrap .bp-navs li:not(.current) a:hover,.buddypress-wrap .bp-navs li:not(.selected) a:focus,.buddypress-wrap .bp-navs li:not(.selected) a:hover{background:#ccc;color:#333}.buddypress-wrap .bp-navs li.current a,.buddypress-wrap .bp-navs li.current a:focus,.buddypress-wrap .bp-navs li.current a:hover,.buddypress-wrap .bp-navs li.selected a,.buddypress-wrap .bp-navs li.selected a:focus,.buddypress-wrap .bp-navs li.selected a:hover{background:#555;color:#fafafa}.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.current a:focus span,.buddypress-wrap .bp-navs li.current a:hover span,.buddypress-wrap .bp-navs li.selected a span,.buddypress-wrap .bp-navs li.selected a:focus span,.buddypress-wrap .bp-navs li.selected a:hover span{border-color:#fafafa}@media screen and (min-width:46.8em){.buddypress-wrap .main-navs:not(.dir-navs) li.current a,.buddypress-wrap .main-navs:not(.dir-navs) li.selected a{background:#fff;color:#333;font-weight:600}.buddypress-wrap .main-navs.vertical li.current a,.buddypress-wrap .main-navs.vertical li.selected a{background:#555;color:#fafafa;text-decoration:none}.buddypress-wrap.bp-dir-hori-nav nav{border-bottom:1px solid #eee;border-top:1px solid #eee;-webkit-box-shadow:0 2px 12px 0 #fafafa;-moz-box-shadow:0 2px 12px 0 #fafafa;box-shadow:0 2px 12px 0 #fafafa}}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.selected a{background:#fff;color:#333;font-weight:600}@media screen and (max-width:46.8em){.buddypress-wrap:not(.bp-single-vert-nav) .bp-navs li{background:#eaeaea}}.buddypress-wrap:not(.bp-single-vert-nav) .main-navs>ul>li>a{padding:.5em calc(.5em + 2px)}.buddypress-wrap:not(.bp-single-vert-nav) .group-subnav#subsubnav,.buddypress-wrap:not(.bp-single-vert-nav) .user-subnav#subsubnav{background:0 0}.buddypress-wrap .bp-subnavs,.buddypress-wrap ul.subnav{width:100%}.buddypress-wrap .bp-subnavs{margin:10px 0;overflow:hidden}.buddypress-wrap .bp-subnavs ul li{margin-top:0}.buddypress-wrap .bp-subnavs ul li.current :focus,.buddypress-wrap .bp-subnavs ul li.current :hover,.buddypress-wrap .bp-subnavs ul li.selected :focus,.buddypress-wrap .bp-subnavs ul li.selected :hover{background:0 0;color:#333}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap .bp-navs.bp-invites-filters#subsubnav ul li.last,.buddypress-wrap .bp-navs.bp-invites-nav#subnav ul li.last,.buddypress-wrap .bp-navs.bp-messages-filters#subsubnav ul li.last{margin-top:0}@media screen and (max-width:46.8em){.buddypress-wrap .single-screen-navs{border:1px solid #eee}.buddypress-wrap .single-screen-navs li{border-bottom:1px solid #eee}.buddypress-wrap .single-screen-navs li:last-child{border-bottom:none}.buddypress-wrap .bp-subnavs li a{font-size:14px}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.current a:focus,.buddypress-wrap .bp-subnavs li.current a:hover,.buddypress-wrap .bp-subnavs li.selected a,.buddypress-wrap .bp-subnavs li.selected a:focus,.buddypress-wrap .bp-subnavs li.selected a:hover{background:#555;color:#fff}}.buddypress-wrap .bp-navs li.current a span,.buddypress-wrap .bp-navs li.selected a span,.buddypress_object_nav .bp-navs li.current a span,.buddypress_object_nav .bp-navs li.selected a span{background-color:#fff}.buddypress-wrap .bp-navs li.dynamic a span,.buddypress-wrap .bp-navs li.dynamic.current a span,.buddypress-wrap .bp-navs li.dynamic.selected a span,.buddypress_object_nav .bp-navs li.dynamic a span,.buddypress_object_nav .bp-navs li.dynamic.current a span,.buddypress_object_nav .bp-navs li.dynamic.selected a span{background-color:#5087e5;border:0;color:#fafafa}.buddypress-wrap .bp-navs li.dynamic a:hover span,.buddypress_object_nav .bp-navs li.dynamic a:hover span{background-color:#5087e5;border:0;color:#fff}.buddypress-wrap .bp-navs li a span:empty,.buddypress_object_nav .bp-navs li a span:empty{display:none}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:hover{background:0 0;color:#333}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li.current a,.buddypress_object_nav .bp-navs.group-create-links ul li.current a{text-align:center}@media screen and (min-width:46.8em){.buddypress-wrap .bp-navs li{float:left}.buddypress-wrap .subnav{float:left}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap #subsubnav .activity-search{float:left}.buddypress-wrap #subsubnav .filter{float:right}}.buddypress_object_nav .bp-navs li a span{display:inline-block;float:right}@media screen and (min-width:46.8em){.bp-dir-vert-nav .bp-navs.dir-navs{background:0 0}.bp-dir-vert-nav .bp-navs.dir-navs a span{float:right}}@media screen and (min-width:46.8em){.buddypress-wrap .item-body .tabbed-links ul{border-bottom:1px solid #ccc;float:none;margin:20px 0 10px}.buddypress-wrap .item-body .tabbed-links ul:after,.buddypress-wrap .item-body .tabbed-links ul:before{content:" ";display:block}.buddypress-wrap .item-body .tabbed-links ul:after{clear:both}.buddypress-wrap .item-body .tabbed-links ul li{float:left;list-style:none;margin:0 10px 0 0}.buddypress-wrap .item-body .tabbed-links ul li a{background:0 0;border:none;display:block;padding:4px 10px}.buddypress-wrap .item-body .tabbed-links ul li.current{border-color:#ccc #ccc #fff;border-style:solid;border-top-left-radius:4px;border-top-right-radius:4px;border-width:1px;margin-bottom:-1px;padding:0 .5em}.buddypress-wrap .item-body .tabbed-links ul li.current a{color:#333}.buddypress-wrap .item-body .bp-subnavs.tabbed-links>ul{margin-top:0}.buddypress-wrap .item-body .bp-navs.tabbed-links{background:0 0;margin-top:2px}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a{border-right:0;font-size:inherit}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last{float:right;margin:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last a{margin-top:-.5em}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:hover,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:hover{background:0 0;border:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:active,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:active{outline:0}}.buddypress-wrap .dir-component-filters .filter label{display:inline}.buddypress-wrap .subnav-filters:after,.buddypress-wrap .subnav-filters:before{content:" ";display:table}.buddypress-wrap .subnav-filters:after{clear:both}.buddypress-wrap .subnav-filters{background:0 0;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .subnav-filters div{margin:0}.buddypress-wrap .subnav-filters>ul{float:left;list-style:none}.buddypress-wrap .subnav-filters.bp-messages-filters ul{width:100%}.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:1em}@media screen and (min-width:46.8em){.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:0}}.buddypress-wrap .subnav-filters div{float:none}.buddypress-wrap .subnav-filters div input[type=search],.buddypress-wrap .subnav-filters div select{font-size:16px}.buddypress-wrap .subnav-filters div button.nouveau-search-submit{padding:5px .8em 6px}.buddypress-wrap .subnav-filters div button#user_messages_search_submit{padding:7px .8em}.buddypress-wrap .subnav-filters .component-filters{margin-top:10px}.buddypress-wrap .subnav-filters .feed{margin-right:15px}.buddypress-wrap .subnav-filters .last.filter label{display:inline}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:before{content:" ";display:table}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after{clear:both}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-show{display:inline-block}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-hide{display:none}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap{border:0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:focus,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:hover{outline:1px solid #d6d6d6}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions{float:left}.buddypress-wrap .subnav-filters .user-messages-bulk-actions label{display:inline-block;font-weight:300;margin-right:25px;padding:5px 0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions div select{-webkit-appearance:textfield}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply{border:0;border-radius:none;font-weight:400;line-height:1.8;margin:0 0 0 10px;padding:3px 5px;text-align:center;text-transform:none;width:auto}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply span{vertical-align:middle}@media screen and (min-width:32em){.buddypress-wrap .subnav-filters li{margin-bottom:0}.buddypress-wrap .subnav-filters .bp-search,.buddypress-wrap .subnav-filters .dir-search,.buddypress-wrap .subnav-filters .feed,.buddypress-wrap .subnav-filters .group-act-search,.buddypress-wrap .subnav-filters .group-invites-search,.buddypress-wrap .subnav-filters .subnav-search,.buddypress-wrap .subnav-filters .subnav-search form,.buddypress-wrap .subnav-filters .user-messages-bulk-actions,.buddypress-wrap .subnav-filters .user-messages-search{float:left}.buddypress-wrap .subnav-filters .component-filters,.buddypress-wrap .subnav-filters .last{float:right;margin-top:0;width:auto}.buddypress-wrap .subnav-filters .component-filters select,.buddypress-wrap .subnav-filters .last select{max-width:250px}.buddypress-wrap .subnav-filters .user-messages-search{float:right}}.buddypress-wrap .notifications-options-nav input#notification-bulk-manage{border:0;border-radius:0;line-height:1.6}.buddypress-wrap .bp-pagination{background:0 0;border:0;color:#767676;float:left;font-size:small;margin:0;padding:.5em 0;position:relative;width:100%}.buddypress-wrap .bp-pagination .pag-count{float:left}.buddypress-wrap .bp-pagination .bp-pagination-links{float:right;margin-right:10px}.buddypress-wrap .bp-pagination .bp-pagination-links a,.buddypress-wrap .bp-pagination .bp-pagination-links span{font-size:small;padding:0 5px}.buddypress-wrap .bp-pagination .bp-pagination-links a:focus,.buddypress-wrap .bp-pagination .bp-pagination-links a:hover{opacity:1}.buddypress-wrap .bp-pagination p{margin:0}.bp-list:after,.bp-list:before{content:" ";display:table}.bp-list:after{clear:both}.bp-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #eaeaea;clear:both;list-style:none;margin:20px 0;padding:.5em 0;width:100%}.bp-list li:after,.bp-list li:before{content:" ";display:table}.bp-list li:after{clear:both}.bp-list>li{border-bottom:1px solid #eaeaea}.bp-list li{list-style:none;margin:10px 0;padding:.5em 0;position:relative}.bp-list li .item-avatar{text-align:center}.bp-list li .item-avatar img.avatar{display:inline}.bp-list li .item .group-details,.bp-list li .item .item-avatar,.bp-list li .item .item-meta,.bp-list li .item .list-title{text-align:center}.bp-list li .item .list-title{clear:none;font-size:22px;font-weight:400;line-height:1.1;margin:0 auto}@media screen and (min-width:46.8em){.bp-list li .item .list-title{font-size:26px}}.bp-list li .item-meta,.bp-list li .meta{color:#737373;font-size:12px;margin-top:10px}.bp-list li .last-post{text-align:center}.bp-list li .action{margin:0;text-align:center}.bp-list li .action .generic-button{display:inline-block;font-size:12px;margin:0 10px 0 0}.bp-list li .action div.generic-button{margin:10px 0}@media screen and (min-width:46.8em){.bp-list li .item-avatar{float:left;margin-right:5%}.bp-list li .item{margin:0;overflow:hidden}.bp-list li .item .item-block{float:left;margin-right:2%;width:50%}.bp-list li .item .item-meta,.bp-list li .item .list-title{float:left;text-align:left}.bp-list li .item .group-details,.bp-list li .item .last-post{text-align:left}.bp-list li .group-desc,.bp-list li .last-post,.bp-list li .user-update{clear:none;overflow:hidden;width:auto}.bp-list li .action{clear:left;padding:0;text-align:left}.bp-list li .action li.generic-button{margin-right:0}.bp-list li .action div.generic-button{margin:0 0 10px}.bp-list li .generic-button{display:block;margin:0 0 5px 0}}@media screen and (min-width:32em){#activity-stream{clear:both;padding-top:1em}}.activity-list.bp-list{background:#fafafa;border:1px solid #eee}.activity-list.bp-list .activity-item{background:#fff;border:1px solid #b7b7b7;-webkit-box-shadow:0 0 6px #d2d2d2;-moz-box-shadow:0 0 6px #d2d2d2;box-shadow:0 0 6px #d2d2d2;margin:20px 0}.activity-list.bp-list li:first-child{margin-top:0}.friends-request-list .item-title{text-align:center}@media screen and (min-width:46.8em){.friends-request-list li{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap}.friends-request-list li .item{-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;-o-flex:1 1 auto;flex:1 1 auto}.friends-request-list li .action{text-align:right}.friends-request-list li .item-title{font-size:22px;text-align:left}}#notifications-user-list{clear:both;padding-top:1em}@media screen and (min-width:46.8em){body:not(.logged-in) .bp-list .item{margin-right:0}}.activity-permalink .item-list,.activity-permalink .item-list li.activity-item{border:0}.activity-update-form{padding:10px 10px 0}.item-body .activity-update-form .activity-form{margin:0;padding:0}.activity-update-form{border:1px solid #ccc;-webkit-box-shadow:inset 0 0 6px #eee;-moz-box-shadow:inset 0 0 6px #eee;box-shadow:inset 0 0 6px #eee;margin:15px 0}.activity-update-form #whats-new-avatar{margin:10px 0;text-align:center}.activity-update-form #whats-new-avatar img{display:inline-block}.activity-update-form #whats-new-content{padding:0 0 20px 0}.activity-update-form #whats-new-textarea textarea{background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;font-family:inherit;font-size:medium;height:2.2em;line-height:1.4;padding:6px;width:100%}.activity-update-form #whats-new-textarea textarea:focus{-webkit-box-shadow:0 0 6px 0 #d6d6d6;-moz-box-shadow:0 0 6px 0 #d6d6d6;box-shadow:0 0 6px 0 #d6d6d6}.activity-update-form #whats-new-post-in-box{margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items{list-style:none;margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items li{margin-bottom:10px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items #activity-autocomplete{padding:.3em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;padding:.2em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object .avatar{width:30px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object span{padding-left:10px;vertical-align:middle}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:focus,.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:hover{background:#eaeaea;cursor:pointer}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object.selected{border:1px solid #d6d6d6}.activity-update-form #whats-new-submit{margin:15px 0 10px}.activity-update-form #whats-new-submit input{font-size:14px;line-height:inherit;margin-bottom:10px;margin-right:10px;padding:.2em 0;text-align:center;width:100%}@media screen and (min-width:46.8em){.activity-update-form #whats-new-avatar{display:block;float:left;margin:0 10px 0 0}.activity-update-form #whats-new-content,.activity-update-form #whats-new-post-in-box,.activity-update-form #whats-new-submit{margin-left:12%}.activity-update-form #whats-new-submit input{margin-bottom:0;margin-right:10px;width:8em}}.activity-list{padding:.5em}.activity-list .activity-item:after,.activity-list .activity-item:before{content:" ";display:table}.activity-list .activity-item:after{clear:both}.activity-list .activity-item{list-style:none;padding:1em}.activity-list .activity-item.has-comments{padding-bottom:1em}.activity-list .activity-item div.item-avatar{margin:0 auto;text-align:center;width:auto}.activity-list .activity-item div.item-avatar img{max-width:40%}@media screen and (min-width:46.8em){.activity-list .activity-item div.item-avatar{margin:0 2% 0 0;text-align:left;width:15%}.activity-list .activity-item div.item-avatar img{max-width:80%}}.activity-list .activity-item.mini{font-size:13px;position:relative}.activity-list .activity-item.mini .activity-avatar{margin-left:0 auto;text-align:center;width:auto}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:15%}@media screen and (min-width:46.8em){.activity-list .activity-item.mini .activity-avatar{margin-left:15px;text-align:left;width:15%}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:60%}}.activity-list .activity-item.new_forum_post .activity-inner,.activity-list .activity-item.new_forum_topic .activity-inner{border-left:2px solid #eaeaea;margin-left:10px;padding-left:1em}.activity-list .activity-item.newest_blogs_activity,.activity-list .activity-item.newest_friends_activity,.activity-list .activity-item.newest_groups_activity,.activity-list .activity-item.newest_mentions_activity{background:rgba(31,179,221,.1)}.activity-list .activity-item .activity-inreplyto{color:#767676;font-size:13px}.activity-list .activity-item .activity-inreplyto>p{display:inline;margin:0}.activity-list .activity-item .activity-inreplyto .activity-inner,.activity-list .activity-item .activity-inreplyto blockquote{background:0 0;border:0;display:inline;margin:0;overflow:hidden;padding:0}.activity-list .activity-item .activity-header{margin:0 auto;width:80%}.activity-list .activity-item .activity-header a,.activity-list .activity-item .activity-header img{display:inline}.activity-list .activity-item .activity-header .avatar{display:inline-block;margin:0 5px;vertical-align:bottom}.activity-list .activity-item .activity-header .time-since{font-size:14px;color:#767676;text-decoration:none}.activity-list .activity-item .activity-header .time-since:hover{color:#767676;cursor:pointer;text-decoration:underline}.activity-list .activity-item .activity-content .activity-header,.activity-list .activity-item .activity-content .comment-header{color:#767676;margin-bottom:10px}.activity-list .activity-item .activity-content .activity-inner,.activity-list .activity-item .activity-content blockquote{background:#fafafa;margin:15px 0 10px;overflow:hidden;padding:1em}.activity-list .activity-item .activity-content p{margin:0}.activity-list .activity-item .activity-inner p{word-wrap:break-word}.activity-list .activity-item .activity-read-more{margin-left:1em;white-space:nowrap}.activity-list .activity-item ul.activity-meta{margin:0;padding-left:0}.activity-list .activity-item ul.activity-meta li{border:0;display:inline-block}.activity-list .activity-item .activity-meta.action{border:1px solid transparent;background:#fafafa;padding:2px;position:relative;text-align:left}.activity-list .activity-item .activity-meta.action div.generic-button{margin:0}.activity-list .activity-item .activity-meta.action .button{background:0 0}.activity-list .activity-item .activity-meta.action a{padding:4px 8px}.activity-list .activity-item .activity-meta.action .button:focus,.activity-list .activity-item .activity-meta.action .button:hover{background:0 0}.activity-list .activity-item .activity-meta.action .button:before,.activity-list .activity-item .activity-meta.action .icons:before{font-family:dashicons;font-size:18px;vertical-align:middle}.activity-list .activity-item .activity-meta.action .acomment-reply.button:before{content:"\f101"}.activity-list .activity-item .activity-meta.action .view:before{content:"\f125"}.activity-list .activity-item .activity-meta.action .fav:before{content:"\f154"}.activity-list .activity-item .activity-meta.action .unfav:before{content:"\f155"}.activity-list .activity-item .activity-meta.action .delete-activity:before{content:"\f153"}.activity-list .activity-item .activity-meta.action .delete-activity:hover{color:#800}.activity-list .activity-item .activity-meta.action .button{border:0;box-shadow:none}.activity-list .activity-item .activity-meta.action .button span{background:0 0;color:#555;font-weight:700}@media screen and (min-width:46.8em){.activity-list.bp-list{padding:30px}.activity-list .activity-item .activity-content{margin:0;position:relative}.activity-list .activity-item .activity-content:after{clear:both;content:"";display:table}.activity-list .activity-item .activity-header{margin:0 15px 0 0;width:auto}}.buddypress-wrap .activity-list .load-more,.buddypress-wrap .activity-list .load-newest{background:#fafafa;border:1px solid #eee;font-size:110%;margin:15px 0;padding:0;text-align:center}.buddypress-wrap .activity-list .load-more a,.buddypress-wrap .activity-list .load-newest a{color:#555;display:block;padding:.5em 0}.buddypress-wrap .activity-list .load-more a:focus,.buddypress-wrap .activity-list .load-more a:hover,.buddypress-wrap .activity-list .load-newest a:focus,.buddypress-wrap .activity-list .load-newest a:hover{background:#fff;color:#333}.buddypress-wrap .activity-list .load-more:focus,.buddypress-wrap .activity-list .load-more:hover,.buddypress-wrap .activity-list .load-newest:focus,.buddypress-wrap .activity-list .load-newest:hover{border-color:#e1e1e1;-webkit-box-shadow:0 0 6px 0 #eaeaea;-moz-box-shadow:0 0 6px 0 #eaeaea;box-shadow:0 0 6px 0 #eaeaea}body.activity-permalink .activity-list li{border-width:1px;padding:1em 0 0 0}body.activity-permalink .activity-list li:first-child{padding-top:0}body.activity-permalink .activity-list li.has-comments{padding-bottom:0}body.activity-permalink .activity-list .activity-avatar{width:auto}body.activity-permalink .activity-list .activity-avatar a{display:block}body.activity-permalink .activity-list .activity-avatar img{max-width:100%}body.activity-permalink .activity-list .activity-content{border:0;font-size:100%;line-height:1.5;padding:0}body.activity-permalink .activity-list .activity-content .activity-header{margin:0;padding:.5em 0 0 0;text-align:center;width:100%}body.activity-permalink .activity-list .activity-content .activity-inner,body.activity-permalink .activity-list .activity-content blockquote{margin-left:0;margin-top:10px}body.activity-permalink .activity-list .activity-meta{margin:10px 0 10px}body.activity-permalink .activity-list .activity-comments{margin-bottom:10px}@media screen and (min-width:46.8em){body.activity-permalink .activity-list .activity-avatar{left:-20px;margin-right:0;position:relative;top:-20px}body.activity-permalink .activity-list .activity-content{margin-right:10px}body.activity-permalink .activity-list .activity-content .activity-header p{text-align:left}}.buddypress-wrap .activity-comments{clear:both;margin:0 5%;overflow:hidden;position:relative;width:auto}.buddypress-wrap .activity-comments ul{clear:both;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .activity-comments ul li{border-top:1px solid #eee;border-bottom:0;padding:1em 0 0}.buddypress-wrap .activity-comments ul li ul{margin-left:5%}.buddypress-wrap .activity-comments ul li:first-child{border-top:0}.buddypress-wrap .activity-comments ul li:last-child{margin-bottom:0}.buddypress-wrap .activity-comments div.acomment-avatar{width:auto}.buddypress-wrap .activity-comments div.acomment-avatar img{border-width:1px;float:left;height:25px;max-width:none;width:25px}.buddypress-wrap .activity-comments .acomment-content p,.buddypress-wrap .activity-comments .acomment-meta{font-size:14px}.buddypress-wrap .activity-comments .acomment-meta{color:#555;overflow:hidden;padding-left:2%}.buddypress-wrap .activity-comments .acomment-content{border-left:1px solid #ccc;margin:15px 0 0 10%;padding:.5em 1em}.buddypress-wrap .activity-comments .acomment-content p{margin-bottom:.5em}.buddypress-wrap .activity-comments .acomment-options{float:left;margin:10px 0 10px 20px}.buddypress-wrap .activity-comments .acomment-options a{color:#767676;font-size:14px}.buddypress-wrap .activity-comments .acomment-options a:focus,.buddypress-wrap .activity-comments .acomment-options a:hover{color:inherit}.buddypress-wrap .activity-comments .activity-meta.action{background:0 0;margin-top:10px}.buddypress-wrap .activity-comments .activity-meta.action button{font-size:14px;font-weight:400;text-transform:none}.buddypress-wrap .activity-comments .show-all button{font-size:14px;text-decoration:underline;padding-left:.5em}.buddypress-wrap .activity-comments .show-all button span{text-decoration:none}.buddypress-wrap .activity-comments .show-all button:focus span,.buddypress-wrap .activity-comments .show-all button:hover span{color:#5087e5}.buddypress-wrap .mini .activity-comments{clear:both;margin-top:0}body.activity-permalink .activity-comments{background:0 0;width:auto}body.activity-permalink .activity-comments>ul{padding:0 .5em 0 1em}body.activity-permalink .activity-comments ul li>ul{margin-top:10px}form.ac-form{display:none;padding:1em}form.ac-form .ac-reply-avatar{float:left}form.ac-form .ac-reply-avatar img{border:1px solid #eee}form.ac-form .ac-reply-content{color:#767676;padding-left:1em}form.ac-form .ac-reply-content a{text-decoration:none}form.ac-form .ac-reply-content .ac-textarea{margin-bottom:15px;padding:0 .5em;overflow:hidden}form.ac-form .ac-reply-content .ac-textarea textarea{background:0 0;box-shadow:none;color:#555;font-family:inherit;font-size:100%;height:60px;margin:0;outline:0;padding:.5em;width:100%}form.ac-form .ac-reply-content .ac-textarea textarea:focus{-webkit-box-shadow:0 0 6px #d6d6d6;-moz-box-shadow:0 0 6px #d6d6d6;box-shadow:0 0 6px #d6d6d6}form.ac-form .ac-reply-content input{margin-top:10px}.activity-comments li form.ac-form{clear:both;margin-right:15px}.activity-comments form.root{margin-left:0}@media screen and (min-width:46.8em){.buddypress-wrap .blogs-list li .item-block{float:none;width:auto}.buddypress-wrap .blogs-list li .item-meta{clear:left;float:none}}@media screen and (min-width:46.8em){.buddypress-wrap .bp-dir-vert-nav .blogs-list .list-title{width:auto}}.buddypress-wrap .groups-list li .list-title{text-align:center}.buddypress-wrap .groups-list li .group-details{clear:left}.buddypress-wrap .groups-list li .group-desc{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;font-size:13px;color:#737373;font-style:italic;margin:10px auto 0;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .group-desc{font-size:16px}}.buddypress-wrap .groups-list li p{margin:0 0 .5em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .item{margin-right:0}.buddypress-wrap .groups-list li .item-meta,.buddypress-wrap .groups-list li .list-title{text-align:left;width:auto}.buddypress-wrap .groups-list li .item-meta{margin-bottom:20px}.buddypress-wrap .groups-list li .last-activity{clear:left;margin-top:-20px}}.buddypress-wrap .groups-list li.group-no-avatar div.group-desc{margin-left:0}.buddypress-wrap .mygroups .groups-list.grid .wrap{min-height:450px;padding-bottom:0}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list.grid.four .group-desc,.buddypress-wrap .groups-list.grid.three .group-desc{font-size:14px}}@media screen and (min-width:46.8em){.buddypress .bp-vertical-navs .groups-list .item-avatar{margin-right:3%;width:15%}}.buddypress-wrap .members-list li .member-name{margin-bottom:10px}.buddypress-wrap .members-list li .user-update{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;color:#737373;font-style:italic;font-size:13px;margin:15px auto;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .user-update{font-size:16px}}.buddypress-wrap .members-list li .user-update .activity-read-more{display:block;font-size:12px;font-style:normal;margin-top:10px;padding-left:2px}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .last-activity{clear:left;margin-top:-10px}}@media screen and (min-width:46.8em){.buddypress-wrap .members-group-list li .joined{clear:left;float:none}}@media screen and (min-width:32em){body:not(.logged-in) .members-list .user-update{width:96%}}.register-page .register-section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.register-page .signup-form{margin-top:20px}.register-page .signup-form .default-profile input{margin-bottom:20px}.register-page .signup-form label,.register-page .signup-form legend{margin:10px 0 0}.register-page .signup-form .editfield{margin:15px 0}.register-page .signup-form .editfield fieldset{border:0;padding:0}.register-page .signup-form .editfield fieldset legend{margin:0 0 5px;text-indent:0}.register-page .signup-form .editfield .field-visibility-settings{padding:.5em}.register-page .signup-form .editfield .field-visibility-settings fieldset{margin:0 0 10px}.register-page .signup-form #signup-avatar img{margin:0 15px 10px 0}.register-page .signup-form .password-entry,.register-page .signup-form .password-entry-confirm{border:1px solid #eee}@media screen and (min-width:46.8em){.buddypress-wrap .register-page .layout-wrap{display:flex;flex-flow:row wrap;justify-content:space-around}.buddypress-wrap .register-page .layout-wrap .default-profile{flex:1;padding-right:2em}.buddypress-wrap .register-page .layout-wrap .blog-details{flex:1;padding-left:2em}.buddypress-wrap .register-page .submit{clear:both}}@media screen and (min-width:46.8em){.buddypress-wrap.extended-default-reg .register-page .default-profile{flex:1;padding-right:1em}.buddypress-wrap.extended-default-reg .register-page .extended-profile{flex:2;padding-left:1em}.buddypress-wrap.extended-default-reg .register-page .blog-details{flex:1 100%}}#group-create-body{padding:.5em}#group-create-body .creation-step-name{text-align:center}#group-create-body .avatar-nav-items{margin-top:15px}.single-headers:after,.single-headers:before{content:" ";display:table}.single-headers:after{clear:both}.single-headers{margin-bottom:15px}.single-headers #item-header-avatar a{display:block;text-align:center}.single-headers #item-header-avatar a img{float:none}.single-headers div#item-header-content{float:none}@media screen and (min-width:46.8em){.single-headers #item-header-avatar a{text-align:left}.single-headers #item-header-avatar a img{float:left}}.single-headers .activity,.single-headers .group-status{display:inline}.single-headers .group-status{font-size:18px;color:#333;padding-right:1em}.single-headers .activity{display:inline-block;font-size:12px;padding:0}.single-headers #sitewide-notice p,.single-headers div#message p{background-color:#ffd;border:1px solid #cb2;color:#440;font-weight:400;margin-top:3px;text-decoration:none}.single-headers h2{line-height:1.2;margin:0 0 5px}.single-headers h2 a{color:#767676;text-decoration:none}.single-headers h2 span.highlight{display:inline-block;font-size:60%;font-weight:400;line-height:1.7;vertical-align:middle}.single-headers h2 span.highlight span{background:#a1dcfa;color:#fff;cursor:pointer;font-size:80%;font-weight:700;margin-bottom:2px;padding:1px 4px;position:relative;right:-2px;top:-2px;vertical-align:middle}.single-headers img.avatar{float:left;margin:0 15px 19px 0}.single-headers .item-meta{color:#767676;font-size:14px;margin:15px 0 5px;padding-bottom:.5em}.single-headers ul{margin-bottom:15px}.single-headers ul li{float:right;list-style:none}.single-headers div.generic-button{text-align:center}.single-headers li.generic-button{display:inline-block;text-align:center}@media screen and (min-width:46.8em){.single-headers a.button,.single-headers div.generic-button,.single-headers li.generic-button{float:left}}.single-headers a.button,.single-headers div.generic-button{margin:10px 10px 0 0}.single-headers li.generic-button{margin:2px 10px}.single-headers li.generic-button:first-child{margin-left:0}.single-headers div#message.info{line-height:.8}body.no-js .single-item-header .js-self-profile-button{display:none}#cover-image-container{position:relative}#header-cover-image{background-color:#c5c5c5;background-position:center top;background-repeat:no-repeat;background-size:cover;border:0;display:block;left:0;margin:0;padding:0;position:absolute;top:0;width:100%;z-index:1}#item-header-cover-image{position:relative;z-index:2}#item-header-cover-image #item-header-avatar{padding:0 1em}.groups-header .bp-group-type-list{margin:0}.groups-header .bp-feedback{clear:both}.groups-header .group-item-actions{float:left;margin:0 0 15px 15px;padding-top:0;width:100%}.groups-header .moderators-lists{margin-top:0}.groups-header .moderators-lists .moderators-title{font-size:14px}.groups-header .moderators-lists .user-list{margin:0 0 5px}.groups-header .moderators-lists .user-list ul:after{clear:both;content:"";display:table}.groups-header .moderators-lists .user-list li{display:inline-block;float:none;margin-left:4px;padding:4px}.groups-header .moderators-lists img.avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;float:none;height:30px;margin:0;max-width:100%;width:30px}@media screen and (min-width:46.8em){.groups-header div#item-header-content{float:left;margin-left:10%;text-align:left;padding-top:15px;width:42%}.groups-header .group-item-actions{float:right;margin:0 0 15px 15px;text-align:right;width:20%}.groups-header .groups-meta{clear:both}}.groups-header .desc-wrap{background:#eaeaea;border:1px solid #d6d6d6;margin:0 0 15px;padding:1em;text-align:center}.groups-header .desc-wrap .group-description{background:#fafafa;-webkit-box-shadow:inset 0 0 9px #ccc;-moz-box-shadow:inset 0 0 9px #ccc;box-shadow:inset 0 0 9px #ccc;padding:1em;text-align:left}.bp-user .users-header .user-nicename{margin-bottom:5px}.bp-user .member-header-actions{overflow:hidden}.bp-user .member-header-actions *>*{display:block}.buddypress-wrap .item-body{margin:20px 0}.buddypress-wrap .item-body .screen-heading{font-size:20px;font-weight:400}.buddypress-wrap .item-body .button-tabs{margin:30px 0 15px}.buddypress-wrap.bp-single-vert-nav .bp-list:not(.grid) .item-entry{padding-left:.5em}.single-item.group-members .item-body .filters:not(.no-subnav){border-top:5px solid #eaeaea;padding-top:1em}.single-item.group-members .item-body .filters{margin-top:0}.buddypress-wrap .group-status-type ul{margin:0 0 20px 20px}.groups-manage-members-list{padding:.5em 0}.groups-manage-members-list dd{margin:0;padding:1em 0}.groups-manage-members-list .section-title{background:#eaeaea;padding-left:.3em}.groups-manage-members-list ul{list-style:none;margin-bottom:0}.groups-manage-members-list ul li{border-bottom:1px solid #eee;margin-bottom:10px;padding:.5em .3em .3em}.groups-manage-members-list ul li:last-child,.groups-manage-members-list ul li:only-child{border-bottom:0}.groups-manage-members-list ul li:nth-child(even){background:#fafafa}.groups-manage-members-list ul li.banned-user{background:#fad3d3}.groups-manage-members-list ul .member-name{margin-bottom:0;text-align:center}.groups-manage-members-list ul img{display:block;margin:0 auto;width:20%}@media screen and (min-width:32em){.groups-manage-members-list ul .member-name{text-align:left}.groups-manage-members-list ul img{display:inline;width:50px}}.groups-manage-members-list ul .members-manage-buttons:after,.groups-manage-members-list ul .members-manage-buttons:before{content:" ";display:table}.groups-manage-members-list ul .members-manage-buttons:after{clear:both}.groups-manage-members-list ul .members-manage-buttons{margin:15px 0 5px}.groups-manage-members-list ul .members-manage-buttons a.button{color:#767676;display:block;font-size:13px}@media screen and (min-width:32em){.groups-manage-members-list ul .members-manage-buttons a.button{display:inline-block}}.groups-manage-members-list ul .members-manage-buttons.text-links-list{margin-bottom:0}@media screen and (max-width:32em){.groups-manage-members-list ul .members-manage-buttons.text-links-list a.button{background:#fafafa;border:1px solid #eee;display:block;margin-bottom:10px}}.groups-manage-members-list ul .action:not(.text-links-list) a.button{font-size:12px}@media screen and (min-width:46.8em){.groups-manage-members-list ul li .avatar,.groups-manage-members-list ul li .member-name{float:left}.groups-manage-members-list ul li .avatar{margin-right:15px}.groups-manage-members-list ul li .action{clear:both;float:left}}.buddypress .bp-invites-content ul.item-list{border-top:0}.buddypress .bp-invites-content ul.item-list li{border:1px solid #eaeaea;margin:0 0 1%;padding-left:5px;padding-right:5px;position:relative;width:auto}.buddypress .bp-invites-content ul.item-list li .list-title{text-align:center;width:auto}.buddypress .bp-invites-content ul.item-list li .action{position:absolute;top:10px;right:10px}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button{border:0}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:focus,.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:hover{color:#1fb3dd}.buddypress .bp-invites-content ul.item-list li.selected{-webkit-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);-moz-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2)}.buddypress .bp-invites-content .group-inviters li,.buddypress .bp-invites-content .item-list .item-meta span{color:#767676}.buddypress .bp-invites-content li ul.group-inviters{clear:both;margin:0;overflow:hidden}.buddypress .bp-invites-content li ul.group-inviters li{border:0;float:left;font-size:20px;width:inherit}.buddypress .bp-invites-content li .status{font-size:20px;font-style:italic;clear:both;color:#555;margin:10px 0}.buddypress .bp-invites-content #send-invites-editor{overflow:hidden}.buddypress .bp-invites-content #send-invites-editor textarea{width:100%}.buddypress .bp-invites-content #send-invites-editor ul{clear:both;list-style:none;margin:10px 0;overflow:hidden}.buddypress .bp-invites-content #send-invites-editor ul li{float:left;margin:.5%;max-height:50px;max-width:50px}.buddypress .bp-invites-content #send-invites-editor .action{margin-top:10px;padding-top:10px}.buddypress .bp-invites-content #send-invites-editor.bp-hide{display:none}@media screen and (min-width:46.8em){.buddypress .bp-invites-content ul.item-list>li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #eaeaea;float:left;padding-left:.5em;padding-right:.5em;width:49.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(odd){margin-right:.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(even){margin-left:.5%}.buddypress .bp-invites-content ul.item-list ul.group-inviters{float:left;width:auto}}.buddypress.groups .activity-update-form{margin-top:0}.buddypress-wrap .profile{margin-top:30px}.buddypress-wrap .public .profile-fields td.label{width:30%}.buddypress-wrap .profile.edit .button-nav{list-style:none;margin:30px 0 10px}.buddypress-wrap .profile.edit .button-nav li{display:inline-block;margin-right:10px}.buddypress-wrap .profile.edit .button-nav li a{font-size:18px}.buddypress-wrap .profile.edit .editfield{background:#fafafa;border:1px solid #eee;margin:15px 0;padding:1em}.buddypress-wrap .profile.edit .editfield fieldset{border:0}.buddypress-wrap .profile.edit .editfield fieldset label{font-weight:400}.buddypress-wrap .profile.edit .editfield fieldset label.xprofile-field-label{display:inline}.buddypress-wrap .profile.edit .editfield{display:flex;flex-direction:column}.buddypress-wrap .profile.edit .editfield .description{margin-top:10px;order:2}.buddypress-wrap .profile.edit .editfield>fieldset{order:1}.buddypress-wrap .profile.edit .editfield .field-visibility-settings,.buddypress-wrap .profile.edit .editfield .field-visibility-settings-toggle{order:3}body.no-js .buddypress-wrap .field-visibility-settings-close,body.no-js .buddypress-wrap .field-visibility-settings-toggle{display:none}body.no-js .buddypress-wrap .field-visibility-settings{display:block}.buddypress-wrap .field-visibility-settings{margin:10px 0}.buddypress-wrap .current-visibility-level{font-style:normal;font-weight:700}.buddypress-wrap .field-visibility-settings,.buddypress-wrap .field-visibility-settings-header{color:#737373}.buddypress-wrap .field-visibility-settings fieldset{margin:5px 0}.buddypress-wrap .standard-form .editfield fieldset{margin:0}.buddypress-wrap .standard-form .field-visibility-settings label{font-weight:400;margin:0}.buddypress-wrap .standard-form .field-visibility-settings .radio{list-style:none;margin-bottom:0}.buddypress-wrap .standard-form .field-visibility-settings .field-visibility-settings-close{font-size:12px}.buddypress-wrap .standard-form .wp-editor-container{border:1px solid #dedede}.buddypress-wrap .standard-form .wp-editor-container textarea{background:#fff;width:100%}.buddypress-wrap .standard-form .description{background:#fafafa;font-size:inherit}.buddypress-wrap .standard-form .field-visibility-settings legend,.buddypress-wrap .standard-form .field-visibility-settings-header{font-style:italic}.buddypress-wrap .standard-form .field-visibility-settings-header{font-size:14px}.buddypress-wrap .standard-form .field-visibility-settings label,.buddypress-wrap .standard-form .field-visibility-settings legend{font-size:14px}.buddypress-wrap .standard-form .field-visibility select{margin:0}.buddypress-wrap .html-active button.switch-html{background:#f5f5f5;border-bottom-color:transparent;border-bottom-left-radius:0;border-bottom-right-radius:0}.buddypress-wrap .tmce-active button.switch-tmce{background:#f5f5f5;border-bottom-color:transparent;border-bottom-left-radius:0;border-bottom-right-radius:0}.buddypress-wrap .profile.public .profile-group-title{border-bottom:1px solid #ccc}body.register .buddypress-wrap .page ul{list-style:none}.buddypress-wrap .profile .bp-avatar-nav{margin-top:20px}.message-action-delete:before,.message-action-star:before,.message-action-unstar:before,.message-action-view:before{font-family:dashicons;font-size:18px}.message-action-star:before{color:#aaa;content:"\f154"}.message-action-unstar:before{color:#fcdd77;content:"\f155"}.message-action-view:before{content:"\f473"}.message-action-delete:before{content:"\f153"}.message-action-delete:hover:before{color:#a00}.preview-content .actions a{text-decoration:none}.bp-messages-content{margin:15px 0}.bp-messages-content .avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.bp-messages-content .thread-participants{list-style:none}.bp-messages-content .thread-participants dd{margin-left:0}.bp-messages-content time{color:#737373;font-size:12px}#message-threads{border-top:1px solid #eaeaea;clear:both;list-style:none;margin:0;max-height:220px;overflow-x:hidden;overflow-y:auto;padding:0;width:100%}#message-threads li{border-bottom:1px solid #eaeaea;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;margin:0;overflow:hidden;padding:.5em 0}#message-threads li .thread-cb{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;-webkit-flex:1 2 5%;-moz-flex:1 2 5%;-ms-flex:1 2 5%;-o-flex:1 2 5%;flex:1 2 5%}#message-threads li .thread-from{-webkit-flex:1 2 20%;-moz-flex:1 2 20%;-ms-flex:1 2 20%;-o-flex:1 2 20%;flex:1 2 20%}#message-threads li .thread-from img.avatar{float:left;margin:0 10px 0 0}#message-threads li .thread-from .user-name{display:inline-block;line-height:1.1}#message-threads li .thread-content{-webkit-flex:1 2 60%;-moz-flex:1 2 60%;-ms-flex:1 2 60%;-o-flex:1 2 60%;flex:1 2 60%}#message-threads li .thread-date{-webkit-flex:1 2 15%;-moz-flex:1 2 15%;-ms-flex:1 2 15%;-o-flex:1 2 15%;flex:1 2 15%}#message-threads li.selected{background-color:#fafafa}#message-threads li.selected .thread-subject .subject{color:#5087e5}#message-threads li .thread-content{cursor:pointer}#message-threads li .thread-content .excerpt{color:#737373;font-size:12px;margin:0}#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:13px}@media screen and (min-width:46.8em){#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:16px}}#message-threads li .thread-content .thread-subject{vertical-align:top}#message-threads li .thread-content .thread-subject .excerpt{font-weight:400}#message-threads li .thread-date{padding-right:5px;text-align:right}.bp-messages-content .actions{float:right;max-width:30%}.bp-messages-content .actions .bp-icons{display:inline-block;margin:0;padding:.3em .5em}.bp-messages-content .actions .bp-icons:before{font-size:26px}.bp-messages-content #thread-preview{border:1px solid #eaeaea;margin-top:20px}.bp-messages-content #thread-preview .preview-message{clear:both}.bp-messages-content #thread-preview .preview-content{margin:.5em}.bp-messages-content #thread-preview .preview-content .preview-message{background:#fafafa;margin:10px 0;padding:1em .3em .3em}.bp-messages-content #bp-message-thread-list{border-top:1px solid #eaeaea;clear:both;list-style:none;padding:1em 0 .3em}.bp-messages-content #bp-message-thread-list li{padding:.5em}.bp-messages-content #bp-message-thread-list li:nth-child(2n) .message-content{background:#fafafa}.bp-messages-content #bp-message-thread-list .message-metadata{border-bottom:1px solid #ccc;-webkit-box-shadow:-2px 1px 9px 0 #eee;-moz-box-shadow:-2px 1px 9px 0 #eee;box-shadow:-2px 1px 9px 0 #eee;overflow:hidden;padding:.2em}.bp-messages-content #bp-message-thread-list .message-metadata .avatar{width:30px}.bp-messages-content #bp-message-thread-list .message-metadata .user-link{display:block;font-size:13px;float:left}@media screen and (min-width:46.8em){.bp-messages-content #bp-message-thread-list .message-metadata .user-link{font-size:16px}}.bp-messages-content #bp-message-thread-list .message-metadata time{color:#737373;font-size:12px;padding:0 .5em}.bp-messages-content #bp-message-thread-list .message-metadata button{padding:0 .3em}.bp-messages-content #bp-message-thread-list .message-metadata button:before{font-size:20px}.bp-messages-content #bp-message-thread-list .message-content{clear:both;margin:1em auto 0;width:90%}.bp-messages-content #bp-message-thread-list img.avatar{float:left;margin:0 10px 0 0}.bp-messages-content #bp-message-thread-list .actions a:before{font-size:18px}.bp-messages-content form.send-reply .avatar-box{padding:.5em 0}.bp-messages-content .preview-pane-header,.bp-messages-content .single-message-thread-header{border-bottom:1px solid #eaeaea}.bp-messages-content .preview-pane-header:after,.bp-messages-content .single-message-thread-header:after{clear:both;content:"";display:table}.bp-messages-content .preview-thread-title,.bp-messages-content .single-thread-title{font-size:16px}.bp-messages-content .preview-thread-title .messages-title,.bp-messages-content .single-thread-title .messages-title{padding-left:2em}.bp-messages-content .thread-participants{float:left;margin:5px 0;width:70%}.bp-messages-content .thread-participants dd,.bp-messages-content .thread-participants ul{margin-bottom:10px}.bp-messages-content .thread-participants ul{list-style:none}.bp-messages-content .thread-participants ul:after{clear:both;content:"";display:table}.bp-messages-content .thread-participants li{float:left;margin-left:5px}.bp-messages-content .thread-participants img{width:30px}.bp-messages-content #bp-message-thread-list li .message-content blockquote,.bp-messages-content #bp-message-thread-list li .message-content ol,.bp-messages-content #bp-message-thread-list li .message-content ul,.bp-messages-content #thread-preview .preview-message blockquote,.bp-messages-content #thread-preview .preview-message ol,.bp-messages-content #thread-preview .preview-message ul{list-style-position:inside;margin-left:0}.bp-messages-content #thread-preview:empty,.bp-messages-content ul#message-threads:empty{display:none}.bp-messages-content #bp-message-thread-header h2:first-child,.bp-messages-content #thread-preview h2:first-child{background-color:#eaeaea;color:#555;font-weight:700;margin:0;padding:.5em}.bp-messages-content #bp-message-thread-list li a.user-link,.bp-messages-content #message-threads .thread-content a{border:0;text-decoration:none}.bp-messages-content .standard-form #subject{margin-bottom:20px}div.bp-navs#subsubnav.bp-messages-filters .user-messages-bulk-actions{margin-right:15px;max-width:42.5%}.buddypress.settings .profile-settings.bp-tables-user select{width:100%}.buddypress-wrap #whats-new-post-in-box select,.buddypress-wrap .filter select{border:1px solid #d6d6d6}.buddypress-wrap input.action[disabled]{cursor:pointer;opacity:.4}.buddypress-wrap #notification-bulk-manage[disabled]{display:none}.buddypress-wrap fieldset legend{font-size:inherit;font-weight:600}.buddypress-wrap input[type=email]:focus,.buddypress-wrap input[type=password]:focus,.buddypress-wrap input[type=tel]:focus,.buddypress-wrap input[type=text]:focus,.buddypress-wrap input[type=url]:focus,.buddypress-wrap textarea:focus{-webkit-box-shadow:0 0 8px #eaeaea;-moz-box-shadow:0 0 8px #eaeaea;box-shadow:0 0 8px #eaeaea}.buddypress-wrap select{height:auto}.buddypress-wrap textarea{resize:vertical}.buddypress-wrap .standard-form .bp-controls-wrap{margin:1em 0}.buddypress-wrap .standard-form .groups-members-search input[type=search],.buddypress-wrap .standard-form .groups-members-search input[type=text],.buddypress-wrap .standard-form [data-bp-search] input[type=search],.buddypress-wrap .standard-form [data-bp-search] input[type=text],.buddypress-wrap .standard-form input[type=color],.buddypress-wrap .standard-form input[type=date],.buddypress-wrap .standard-form input[type=datetime-local],.buddypress-wrap .standard-form input[type=datetime],.buddypress-wrap .standard-form input[type=email],.buddypress-wrap .standard-form input[type=month],.buddypress-wrap .standard-form input[type=number],.buddypress-wrap .standard-form input[type=password],.buddypress-wrap .standard-form input[type=range],.buddypress-wrap .standard-form input[type=search],.buddypress-wrap .standard-form input[type=tel],.buddypress-wrap .standard-form input[type=text],.buddypress-wrap .standard-form input[type=time],.buddypress-wrap .standard-form input[type=url],.buddypress-wrap .standard-form input[type=week],.buddypress-wrap .standard-form select,.buddypress-wrap .standard-form textarea{background:#fafafa;border:1px solid #d6d6d6;border-radius:0;font:inherit;font-size:100%;padding:.5em}.buddypress-wrap .standard-form input[required],.buddypress-wrap .standard-form select[required],.buddypress-wrap .standard-form textarea[required]{box-shadow:none;border-width:2px;outline:0}.buddypress-wrap .standard-form input[required]:invalid,.buddypress-wrap .standard-form select[required]:invalid,.buddypress-wrap .standard-form textarea[required]:invalid{border-color:#b71717}.buddypress-wrap .standard-form input[required]:valid,.buddypress-wrap .standard-form select[required]:valid,.buddypress-wrap .standard-form textarea[required]:valid{border-color:#91cc2c}.buddypress-wrap .standard-form input[required]:focus,.buddypress-wrap .standard-form select[required]:focus,.buddypress-wrap .standard-form textarea[required]:focus{border-color:#d6d6d6;border-width:1px}.buddypress-wrap .standard-form input.invalid[required],.buddypress-wrap .standard-form select.invalid[required],.buddypress-wrap .standard-form textarea.invalid[required]{border-color:#b71717}.buddypress-wrap .standard-form input:not(.button-small),.buddypress-wrap .standard-form textarea{width:100%}.buddypress-wrap .standard-form input[type=checkbox],.buddypress-wrap .standard-form input[type=radio]{margin-right:5px;width:auto}.buddypress-wrap .standard-form select{padding:3px}.buddypress-wrap .standard-form textarea{height:120px}.buddypress-wrap .standard-form textarea#message_content{height:200px}.buddypress-wrap .standard-form input[type=password]{margin-bottom:5px}.buddypress-wrap .standard-form input:focus,.buddypress-wrap .standard-form select:focus,.buddypress-wrap .standard-form textarea:focus{background:#fafafa;color:#555;outline:0}.buddypress-wrap .standard-form label,.buddypress-wrap .standard-form span.label{display:block;font-weight:600;margin:15px 0 5px;width:auto}.buddypress-wrap .standard-form a.clear-value{display:block;margin-top:5px;outline:0}.buddypress-wrap .standard-form .submit{clear:both;padding:15px 0 0}.buddypress-wrap .standard-form p.submit{margin-bottom:0}.buddypress-wrap .standard-form div.submit input{margin-right:15px}.buddypress-wrap .standard-form #invite-list label,.buddypress-wrap .standard-form p label{font-weight:400;margin:auto}.buddypress-wrap .standard-form p.description{color:#737373;margin:5px 0}.buddypress-wrap .standard-form div.checkbox label:nth-child(n+2),.buddypress-wrap .standard-form div.radio div label{color:#737373;font-size:100%;font-weight:400;margin:5px 0 0}.buddypress-wrap .standard-form#send-reply textarea{width:97.5%}.buddypress-wrap .standard-form#sidebar-login-form label{margin-top:5px}.buddypress-wrap .standard-form#sidebar-login-form input[type=password],.buddypress-wrap .standard-form#sidebar-login-form input[type=text]{padding:4px;width:95%}.buddypress-wrap .standard-form.profile-edit input:focus{background:#fff}@media screen and (min-width:46.8em){.buddypress-wrap .standard-form .left-menu{float:left}.buddypress-wrap .standard-form #invite-list ul{list-style:none;margin:1%}.buddypress-wrap .standard-form #invite-list ul li{margin:0 0 0 1%}.buddypress-wrap .standard-form .main-column{margin-left:190px}.buddypress-wrap .standard-form .main-column ul#friend-list{clear:none;float:left}.buddypress-wrap .standard-form .main-column ul#friend-list h4{clear:none}}.buddypress-wrap .standard-form .bp-tables-user label{margin:0}.buddypress-wrap .signup-form label,.buddypress-wrap .signup-form legend{font-weight:400}body.no-js .buddypress #delete_inbox_messages,body.no-js .buddypress #delete_sentbox_messages,body.no-js .buddypress #message-type-select,body.no-js .buddypress #messages-bulk-management #select-all-messages,body.no-js .buddypress #notifications-bulk-management #select-all-notifications,body.no-js .buddypress label[for=message-type-select]{display:none}.buddypress-wrap .wp-editor-wrap .wp-editor-wrap button,.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=button],.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=submit],.buddypress-wrap .wp-editor-wrap a.button,.buddypress-wrap .wp-editor-wrap input[type=reset]{padding:0 8px 1px}.buddypress-wrap .select-wrap{border:1px solid #eee}.buddypress-wrap .select-wrap label{display:inline}.buddypress-wrap .select-wrap select::-ms-expand{display:none}.buddypress-wrap .select-wrap select{-moz-appearance:none;-webkit-appearance:none;-o-appearance:none;appearance:none;border:0;cursor:pointer;margin-right:-25px;padding:6px 25px 6px 10px;position:relative;text-indent:-2px;z-index:1;width:100%}.buddypress-wrap .select-wrap select,.buddypress-wrap .select-wrap select:active,.buddypress-wrap .select-wrap select:focus{background:0 0}.buddypress-wrap .select-wrap span.select-arrow{display:inline-block;position:relative;z-index:0}.buddypress-wrap .select-wrap span.select-arrow:before{color:#ccc;content:"\25BC"}.buddypress-wrap .select-wrap:focus .select-arrow:before,.buddypress-wrap .select-wrap:hover .select-arrow:before{color:#a6a6a6}.buddypress-wrap .bp-search form:focus,.buddypress-wrap .bp-search form:hover,.buddypress-wrap .select-wrap:focus,.buddypress-wrap .select-wrap:hover{border:1px solid #d5d4d4;box-shadow:inset 0 0 3px #eee}@media screen and (min-width:32em){.buddypress-wrap .notifications-options-nav .select-wrap{float:left}}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after,.buddypress-wrap .bp-messages-search-form:before{content:" ";display:table}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after{clear:both}.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{border:1px solid #eee;width:100%}@media screen and (min-width:55em){.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{width:15em}}.buddypress-wrap form.bp-dir-search-form label,.buddypress-wrap form.bp-invites-search-form label,.buddypress-wrap form.bp-messages-search-form label{margin:0}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{background:0 0;border:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;border-radius:0;background-clip:padding-box}.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{float:left;line-height:1.5;padding:3px 10px;width:80%}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form button[type=submit]{float:right;font-size:inherit;font-weight:400;line-height:1.5;padding:3px .7em;text-align:center;text-transform:none;width:20%}.buddypress-wrap form.bp-dir-search-form button[type=submit] span,.buddypress-wrap form.bp-invites-search-form button[type=submit] span,.buddypress-wrap form.bp-messages-search-form button[type=submit] span{font-family:dashicons;font-size:18px;line-height:1.6}.buddypress-wrap form.bp-dir-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-invites-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-messages-search-form button[type=submit].bp-show{height:auto;left:0;overflow:visible;position:static;top:0}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-decoration{display:none}.buddypress-wrap ul.filters li form label input{line-height:1.4;padding:.1em .7em}.buddypress-wrap .current-member-type{font-style:italic}.buddypress-wrap .dir-form{clear:both}.budypress.no-js form.bp-dir-search-form button[type=submit]{height:auto;left:0;overflow:visible;position:static;top:0}.bp-user [data-bp-search] form input[type=search],.bp-user [data-bp-search] form input[type=text]{padding:6px 10px 7px}.buddypress-wrap .bp-tables-user,.buddypress-wrap table.forum,.buddypress-wrap table.wp-profile-fields{width:100%}.buddypress-wrap .bp-tables-user thead tr,.buddypress-wrap table.forum thead tr,.buddypress-wrap table.wp-profile-fields thead tr{background:0 0;border-bottom:2px solid #ccc}.buddypress-wrap .bp-tables-user tbody tr,.buddypress-wrap table.forum tbody tr,.buddypress-wrap table.wp-profile-fields tbody tr{background:#fafafa}.buddypress-wrap .bp-tables-user tr td,.buddypress-wrap .bp-tables-user tr th,.buddypress-wrap table.forum tr td,.buddypress-wrap table.forum tr th,.buddypress-wrap table.wp-profile-fields tr td,.buddypress-wrap table.wp-profile-fields tr th{padding:.5em;vertical-align:middle}.buddypress-wrap .bp-tables-user tr td.label,.buddypress-wrap table.forum tr td.label,.buddypress-wrap table.wp-profile-fields tr td.label{border-right:1px solid #eaeaea;font-weight:600;width:25%}.buddypress-wrap .bp-tables-user tr.alt td,.buddypress-wrap table.wp-profile-fields tr.alt td{background:#fafafa}.buddypress-wrap table.profile-fields .data{padding:.5em 1em}.buddypress-wrap table.profile-fields tr:last-child{border-bottom:none}.buddypress-wrap table.notifications td{padding:1em .5em}.buddypress-wrap table.notifications .bulk-select-all,.buddypress-wrap table.notifications .bulk-select-check{width:7%}.buddypress-wrap table.notifications .bulk-select-check{vertical-align:middle}.buddypress-wrap table.notifications .date,.buddypress-wrap table.notifications .notification-description,.buddypress-wrap table.notifications .notification-since,.buddypress-wrap table.notifications .title{width:39%}.buddypress-wrap table.notifications .actions,.buddypress-wrap table.notifications .notification-actions{width:15%}.buddypress-wrap table.notification-settings th.title,.buddypress-wrap table.profile-settings th.title{width:80%}.buddypress-wrap table.notifications .notification-actions a.delete,.buddypress-wrap table.notifications .notification-actions a.mark-read{display:inline-block}.buddypress-wrap table.notification-settings{margin-bottom:15px;text-align:left}.buddypress-wrap #groups-notification-settings{margin-bottom:0}.buddypress-wrap table.notification-settings td:first-child,.buddypress-wrap table.notification-settings th.icon,.buddypress-wrap table.notifications td:first-child,.buddypress-wrap table.notifications th.icon{display:none}.buddypress-wrap table.notification-settings .no,.buddypress-wrap table.notification-settings .yes{text-align:center;width:40px;vertical-align:middle}.buddypress-wrap table#message-threads{clear:both}.buddypress-wrap table#message-threads .thread-info{min-width:40%}.buddypress-wrap table#message-threads .thread-info p{margin:0}.buddypress-wrap table#message-threads .thread-info p.thread-excerpt{color:#737373;font-size:12px;margin-top:3px}.buddypress-wrap table.profile-fields{margin-bottom:20px}.buddypress-wrap table.profile-fields:last-child{margin-bottom:0}.buddypress-wrap table.profile-fields p{margin:0}.buddypress-wrap table.profile-fields p:last-child{margin-top:0}.bp-screen-reader-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.center-vert{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.bp-hide{display:none}.bp-show{height:auto;left:0;overflow:visible;position:static;top:0}.buddypress .buddypress-wrap .activity-read-more a,.buddypress .buddypress-wrap .comment-reply-link,.buddypress .buddypress-wrap .generic-button a,.buddypress .buddypress-wrap a.bp-title-button,.buddypress .buddypress-wrap a.button,.buddypress .buddypress-wrap button,.buddypress .buddypress-wrap input[type=button],.buddypress .buddypress-wrap input[type=reset],.buddypress .buddypress-wrap input[type=submit],.buddypress .buddypress-wrap ul.button-nav:not(.button-tabs) li a{background:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#555;cursor:pointer;font-size:inherit;font-weight:400;outline:0;padding:.3em .5em;text-align:center;text-decoration:none;width:auto}.buddypress .buddypress-wrap .button-small[type=button]{padding:0 8px 1px}.buddypress .buddypress-wrap .activity-read-more a:focus,.buddypress .buddypress-wrap .activity-read-more a:hover,.buddypress .buddypress-wrap .button-nav li a:focus,.buddypress .buddypress-wrap .button-nav li a:hover,.buddypress .buddypress-wrap .button-nav li.current a,.buddypress .buddypress-wrap .comment-reply-link:focus,.buddypress .buddypress-wrap .comment-reply-link:hover,.buddypress .buddypress-wrap .generic-button a:focus,.buddypress .buddypress-wrap .generic-button a:hover,.buddypress .buddypress-wrap a.button:focus,.buddypress .buddypress-wrap a.button:hover,.buddypress .buddypress-wrap button:focus,.buddypress .buddypress-wrap button:hover,.buddypress .buddypress-wrap input[type=button]:focus,.buddypress .buddypress-wrap input[type=button]:hover,.buddypress .buddypress-wrap input[type=reset]:focus,.buddypress .buddypress-wrap input[type=reset]:hover,.buddypress .buddypress-wrap input[type=submit]:focus,.buddypress .buddypress-wrap input[type=submit]:hover{background:#ededed;border-color:#999;color:#333;outline:0;text-decoration:none}.buddypress .buddypress-wrap a.disabled,.buddypress .buddypress-wrap button.disabled,.buddypress .buddypress-wrap button.pending,.buddypress .buddypress-wrap div.pending a,.buddypress .buddypress-wrap input[type=button].disabled,.buddypress .buddypress-wrap input[type=button].pending,.buddypress .buddypress-wrap input[type=reset].disabled,.buddypress .buddypress-wrap input[type=reset].pending,.buddypress .buddypress-wrap input[type=submit].pending,.buddypress .buddypress-wrap input[type=submit][disabled=disabled]{border-color:#eee;color:#767676;cursor:default}.buddypress .buddypress-wrap a.disabled:hover,.buddypress .buddypress-wrap button.disabled:hover,.buddypress .buddypress-wrap button.pending:hover,.buddypress .buddypress-wrap div.pending a:hover,.buddypress .buddypress-wrap input[type=button]:hover.disabled,.buddypress .buddypress-wrap input[type=button]:hover.pending,.buddypress .buddypress-wrap input[type=reset]:hover.disabled,.buddypress .buddypress-wrap input[type=reset]:hover.pending,.buddypress .buddypress-wrap input[type=submit]:hover.disabled,.buddypress .buddypress-wrap input[type=submit]:hover.pending{border-color:#eee;color:#767676}.buddypress .buddypress-wrap button.text-button,.buddypress .buddypress-wrap input.text-button{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#767676}.buddypress .buddypress-wrap button.text-button.small,.buddypress .buddypress-wrap input.text-button.small{font-size:13px}.buddypress .buddypress-wrap button.text-button:focus,.buddypress .buddypress-wrap button.text-button:hover,.buddypress .buddypress-wrap input.text-button:focus,.buddypress .buddypress-wrap input.text-button:hover{background:0 0;text-decoration:underline}.buddypress .buddypress-wrap .activity-list a.button{border:none}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover{color:#1fb3dd}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.invite-button:hover{color:#a00}.buddypress .buddypress-wrap #item-buttons:empty{display:none}.buddypress .buddypress-wrap input:disabled:focus,.buddypress .buddypress-wrap input:disabled:hover{background:0 0}.buddypress .buddypress-wrap .text-links-list a.button{background:0 0;border:none;border-right:1px solid #eee;color:#767676;display:inline-block;padding:.3em 1em}.buddypress .buddypress-wrap .text-links-list a.button:visited{color:#d6d6d6}.buddypress .buddypress-wrap .text-links-list a.button:focus,.buddypress .buddypress-wrap .text-links-list a.button:hover{color:#5087e5}.buddypress .buddypress-wrap .text-links-list a:first-child{padding-left:0}.buddypress .buddypress-wrap .text-links-list a:last-child{border-right:none}.buddypress .buddypress-wrap .bp-list.grid .action a,.buddypress .buddypress-wrap .bp-list.grid .action button{border:1px solid #ccc;display:block;margin:0}.buddypress .buddypress-wrap .bp-list.grid .action a:focus,.buddypress .buddypress-wrap .bp-list.grid .action a:hover,.buddypress .buddypress-wrap .bp-list.grid .action button:focus,.buddypress .buddypress-wrap .bp-list.grid .action button:hover{background:#ededed}.buddypress #buddypress .create-button{background:0 0;text-align:center}@media screen and (min-width:46.8em){.buddypress #buddypress .create-button{float:right}}.buddypress #buddypress .create-button a{border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-clip:padding-box;-webkit-box-shadow:inset 0 0 6px 0 #eaeaea;-moz-box-shadow:inset 0 0 6px 0 #eaeaea;box-shadow:inset 0 0 6px 0 #eaeaea;margin:.2em 0;width:auto}.buddypress #buddypress .create-button a:focus,.buddypress #buddypress .create-button a:hover{background:0 0;border-color:#ccc;-webkit-box-shadow:inset 0 0 12px 0 #eaeaea;-moz-box-shadow:inset 0 0 12px 0 #eaeaea;box-shadow:inset 0 0 12px 0 #eaeaea}@media screen and (min-width:46.8em){.buddypress #buddypress.bp-dir-vert-nav .create-button{float:none;padding-top:2em}.buddypress #buddypress.bp-dir-vert-nav .create-button a{margin-right:.5em}}.buddypress #buddypress.bp-dir-hori-nav .create-button{float:left}.buddypress #buddypress.bp-dir-hori-nav .create-button a,.buddypress #buddypress.bp-dir-hori-nav .create-button a:hover{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;margin:0}.buddypress-wrap button.ac-reply-cancel,.buddypress-wrap button.bp-icons{background:0 0;border:0}.buddypress-wrap button.bp-icons:focus,.buddypress-wrap button.bp-icons:hover{background:0 0}.buddypress-wrap button.ac-reply-cancel:focus,.buddypress-wrap button.ac-reply-cancel:hover{background:0 0;text-decoration:underline}.buddypress-wrap .bp-invites-content li .invite-button span.icons:before,.buddypress-wrap .bp-invites-filters .invite-button span.icons:before,.buddypress-wrap .bp-messages-filters li a.messages-button:before,.buddypress-wrap .feed a:before,.buddypress-wrap .filter label:before{font-family:dashicons;font-size:18px}.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:27px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:32px}}.buddypress-wrap .bp-list a.button.invite-button:focus,.buddypress-wrap .bp-list a.button.invite-button:hover{background:0 0}.buddypress-wrap .filter label:before{content:"\f536"}.buddypress-wrap div.feed a:before,.buddypress-wrap li.feed a:before{content:"\f303"}.buddypress-wrap ul.item-list li .invite-button:not(.group-remove-invite-button) span.icons:before{content:"\f502"}.buddypress-wrap ul.item-list li .group-remove-invite-button span.icons:before,.buddypress-wrap ul.item-list li.selected .invite-button span.icons:before{content:"\f153"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-next-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-next-page:before{content:"\f345"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-prev-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-prev-page:before{content:"\f341"}.buddypress-wrap .warn{color:#b71717}.buddypress-wrap .bp-messages{border:1px solid #ccc;margin:0 0 15px}.buddypress-wrap .bp-messages .sitewide-notices{display:block;margin:5px;padding:.5em}.buddypress-wrap .bp-messages.info{margin-bottom:0}.buddypress-wrap .bp-messages.updated{clear:both;display:block}.buddypress-wrap .bp-messages.bp-user-messages-feedback{border:0}.buddypress-wrap #group-create-body .bp-cover-image-status p.warning{background:#0b80a4;border:0;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.2);-moz-box-shadow:0 0 3px 0 rgba(0,0,0,.2);box-shadow:0 0 3px 0 rgba(0,0,0,.2);color:#fff}.buddypress-wrap .bp-feedback:not(.custom-homepage-info){display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch}.buddypress-wrap .bp-feedback{background:#fff;color:#807f7f;-webkit-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px 1px rgba(0,0,0,.1);color:#737373;margin:10px 0;position:relative}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback span.bp-icon{color:#fff;display:block;font-family:dashicons;left:0;margin-right:10px;position:relative;padding:0 .5em}.buddypress-wrap .bp-feedback .bp-help-text{font-style:italic}.buddypress-wrap .bp-feedback .text{font-size:14px;margin:0;padding:.5em 0}.buddypress-wrap .bp-feedback.no-icon{padding:.5em}.buddypress-wrap .bp-feedback.small:before{line-height:inherit}.buddypress-wrap a[data-bp-close] span:before,.buddypress-wrap button[data-bp-close] span:before{font-size:32px}.buddypress-wrap a[data-bp-close],.buddypress-wrap button[data-bp-close]{border:0;position:absolute;top:10px;right:10px;width:32px}.buddypress-wrap .bp-feedback.no-icon a[data-bp-close],.buddypress-wrap .bp-feedback.no-icon button[data-bp-close]{top:-6px;right:6px}.buddypress-wrap button[data-bp-close]:hover{background-color:transparent}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback .bp-icon{font-size:20px;padding:0 2px}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon,.buddypress-wrap .bp-feedback.loading .bp-icon,.buddypress-wrap .bp-feedback.success .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon{background-color:#0b80a4}.buddypress-wrap .bp-feedback.help .bp-icon:before,.buddypress-wrap .bp-feedback.info .bp-icon:before{content:"\f348"}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{background-color:#d33}.buddypress-wrap .bp-feedback.error .bp-icon:before,.buddypress-wrap .bp-feedback.warning .bp-icon:before{content:"\f534"}.buddypress-wrap .bp-feedback.loading .bp-icon{background-color:#ffd087}.buddypress-wrap .bp-feedback.loading .bp-icon:before{content:"\f469"}.buddypress-wrap .bp-feedback.success .bp-icon{background-color:#8a2}.buddypress-wrap .bp-feedback.success .bp-icon:before{content:"\f147"}.buddypress-wrap .bp-feedback.help .bp-icon:before{content:"\f468"}.buddypress-wrap #pass-strength-result{background-color:#eee;border-color:#ddd;border-style:solid;border-width:1px;display:none;font-weight:700;margin:10px 0 10px 0;padding:.5em;text-align:center;width:auto}.buddypress-wrap #pass-strength-result.show{display:block}.buddypress-wrap #pass-strength-result.mismatch{background-color:#333;border-color:transparent;color:#fff}.buddypress-wrap #pass-strength-result.bad,.buddypress-wrap #pass-strength-result.error{background-color:#ffb78c;border-color:#ff853c;color:#fff}.buddypress-wrap #pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040;color:#fff}.buddypress-wrap #pass-strength-result.strong{background-color:#66d66e;border-color:#438c48;color:#fff}.buddypress-wrap .standard-form#signup_form div div.error{background:#faa;color:#a00;margin:0 0 10px 0;padding:.5em;width:90%}.buddypress-wrap .accept,.buddypress-wrap .reject{float:left;margin-left:10px}.buddypress-wrap .members-list.grid .bp-ajax-message{background:rgba(255,255,255,.9);border:1px solid #eee;font-size:14px;left:2%;position:absolute;padding:.5em 1em;right:2%;top:30px}.buddypress.widget .item-options{font-size:14px}.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;-o-flex-flow:column nowrap;flex-flow:column nowrap;list-style:none;margin:10px -2%;overflow:hidden}@media screen and (min-width:32em){.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;-o-flex-flow:row wrap;flex-flow:row wrap}}.buddypress.widget ul.item-list li{border:1px solid #eee;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch;-webkit-flex:1 1 46%;-moz-flex:1 1 46%;-ms-flex:1 1 46%;-o-flex:1 1 46%;flex:1 1 46%;margin:2%}@media screen and (min-width:75em){.buddypress.widget ul.item-list li{-webkit-flex:0 1 20%;-moz-flex:0 1 20%;-ms-flex:0 1 20%;-o-flex:0 1 20%;flex:0 1 20%}}.buddypress.widget ul.item-list li .item-avatar{padding:.5em;text-align:center}.buddypress.widget ul.item-list li .item-avatar .avatar{width:60%}.buddypress.widget ul.item-list li .item{padding:0 .5em .5em}.buddypress.widget ul.item-list li .item .item-meta{font-size:12px;overflow-wrap:break-word}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 46%;-moz-flex:0 1 46%;-ms-flex:0 1 46%;-o-flex:0 1 46%;flex:0 1 46%;margin:2% 2% 10px}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list li .avatar{width:100%}}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list{margin:10px -2%;width:100%}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 auto;-moz-flex:0 1 auto;-ms-flex:0 1 auto;-o-flex:0 1 auto;flex:0 1 auto;margin:10px 2% 1%;width:46%}}#buddypress-wrap *{transition:opacity .1s ease-in-out .1s}#buddypress-wrap a.button,#buddypress-wrap a.generic-button,#buddypress-wrap button,#buddypress-wrap input[type=reset],#buddypress-wrap input[type=submit]{transition:background .1s ease-in-out .1s,color .1s ease-in-out .1s,border-color .1s ease-in-out .1s}.buddypress-wrap a.loading,.buddypress-wrap input.loading{-moz-animation:loader-pulsate .5s infinite ease-in-out alternate;-webkit-animation:loader-pulsate .5s infinite ease-in-out alternate;animation:loader-pulsate .5s infinite ease-in-out alternate;border-color:#aaa}@-webkit-keyframes loader-pulsate{from{border-color:#aaa;-webkit-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-webkit-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@-moz-keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}.buddypress-wrap a.loading:hover,.buddypress-wrap input.loading:hover{color:#777}[data-bp-tooltip]{position:relative}[data-bp-tooltip]:after{background-color:#fff;display:none;opacity:0;position:absolute;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden}[data-bp-tooltip]:after{border:1px solid #737373;border-radius:1px;box-shadow:4px 4px 8px rgba(0,0,0,.2);color:#333;content:attr(data-bp-tooltip);font-family:"Helvetica Neue",helvetica,arial,san-serif;font-size:12px;font-weight:400;letter-spacing:normal;line-height:1.25;max-width:200px;padding:5px 8px;pointer-events:none;text-shadow:none;text-transform:none;-webkit-transition:all 1.5s ease;-ms-transition:all 1.5s ease;transition:all 1.5s ease;white-space:nowrap;word-wrap:break-word;z-index:100000}[data-bp-tooltip]:active:after,[data-bp-tooltip]:focus:after,[data-bp-tooltip]:hover:after{display:block;opacity:1;overflow:visible;visibility:visible}[data-bp-tooltip=""]{display:none;opacity:0;visibility:hidden}.bp-tooltip:after{left:50%;margin-top:7px;top:110%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}.user-list .bp-tooltip:after{left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}@media screen and (min-width:46.8em){.user-list .bp-tooltip:after{left:auto;right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}.activity-meta-action .bp-tooltip:after,.notification-actions .bp-tooltip:after,.participants-list .bp-tooltip:after{left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.bp-invites-content .bp-tooltip:after{left:auto;right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#item-body,.single-screen-navs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li,.grid>li .generic-button a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li{border-bottom:0;padding-bottom:10px;padding-top:0}.grid>li .list-wrap{background:#fafafa;border:1px solid #eee;padding-bottom:15px;position:relative;overflow:hidden;padding-top:14px}.grid>li .list-wrap .list-title{padding:.5em}.grid>li .list-wrap .update{color:#737373;padding:.5em 2em}.grid>li .item-avatar{text-align:center}.grid>li .item-avatar .avatar{border-radius:50%;display:inline-block;width:50%}@media screen and (min-width:24em){.grid.members-list .list-wrap{min-height:340px}.grid.members-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.members-group-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.groups-list .list-wrap{min-height:470px}.grid.groups-list .list-wrap .item-block{min-height:6rem}.grid.groups-list .list-wrap .group-desc{margin:15px auto 0;min-height:5em;overflow:hidden}.grid.groups-list .list-wrap .group-details,.grid.groups-list .list-wrap .item-desc,.grid.groups-list .list-wrap .last-activity{margin-bottom:0}.grid.groups-list .list-wrap .group-details p,.grid.groups-list .list-wrap .item-desc p,.grid.groups-list .list-wrap .last-activity p{margin-bottom:0}.grid.blogs-list .list-wrap{min-height:350px}.grid.blogs-list .list-wrap .item-block{margin:0 auto;min-height:7rem}}@media screen and (min-width:24em){.grid>li.item-entry{float:left;margin:0}.grid.two>li{padding-bottom:20px}}@media screen and (min-width:24em) and (min-width:75em){.grid.two>li .list-wrap{max-width:500px;margin:0 auto}}@media screen and (min-width:24em){.grid.three>li,.grid.two>li{width:50%}.grid.three>li:nth-child(odd),.grid.two>li:nth-child(odd){padding-right:10px}.grid.three>li:nth-child(even),.grid.two>li:nth-child(even){padding-left:10px}.grid.three>li .item,.grid.two>li .item{margin:1rem auto 0;width:80%}.grid.three>li .item .item-title,.grid.two>li .item .item-title{width:auto}}@media screen and (min-width:46.8em){.grid.three>li{padding-top:0;width:33.333333%;width:calc(100% / 3)}.grid.three>li:nth-child(1n+1){padding-left:5px;padding-right:5px}.grid.three>li:nth-child(3n+3){padding-left:5px;padding-right:0}.grid.three>li:nth-child(3n+1){padding-left:0;padding-right:5px}}@media screen and (min-width:46.8em){.grid.four>li{width:25%}.grid.four>li:nth-child(1n+1){padding-left:5px;padding-right:5px}.grid.four>li:nth-child(4n+4){padding-left:5px;padding-right:0}.grid.four>li:nth-child(4n+1){padding-left:0;padding-right:5px}}.buddypress-wrap .grid.bp-list{padding-top:1em}.buddypress-wrap .grid.bp-list>li{border-bottom:none}.buddypress-wrap .grid.bp-list>li .list-wrap{padding-bottom:3em}.buddypress-wrap .grid.bp-list>li .item-avatar{margin:0;text-align:center;width:auto}.buddypress-wrap .grid.bp-list>li .item-avatar img.avatar{display:inline-block;height:auto;width:50%}.buddypress-wrap .grid.bp-list>li .item-meta,.buddypress-wrap .grid.bp-list>li .list-title{float:none;text-align:center}.buddypress-wrap .grid.bp-list>li .list-title{font-size:inherit;line-height:1.1}.buddypress-wrap .grid.bp-list>li .item{font-size:18px;left:0;margin:0 auto;text-align:center;width:96%}@media screen and (min-width:46.8em){.buddypress-wrap .grid.bp-list>li .item{font-size:22px}}.buddypress-wrap .grid.bp-list>li .item .group-desc,.buddypress-wrap .grid.bp-list>li .item .item-block{float:none;width:96%}.buddypress-wrap .grid.bp-list>li .item .item-block{margin-bottom:10px}.buddypress-wrap .grid.bp-list>li .item .last-activity{margin-top:5px}.buddypress-wrap .grid.bp-list>li .item .group-desc{clear:none}.buddypress-wrap .grid.bp-list>li .item .user-update{clear:both;text-align:left}.buddypress-wrap .grid.bp-list>li .item .activity-read-more a{display:inline}.buddypress-wrap .grid.bp-list>li .action{bottom:5px;float:none;height:auto;left:0;margin:0;padding:0 5px;position:absolute;text-align:center;top:auto;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button{float:none;margin:5px 0 0;text-align:center;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button a,.buddypress-wrap .grid.bp-list>li .action .generic-button button{width:100%}.buddypress-wrap .grid.bp-list>li .avatar,.buddypress-wrap .grid.bp-list>li .item,.buddypress-wrap .grid.bp-list>li .item-avatar{float:none}.buddypress-wrap .blogs-list.grid.two>li .blogs-title{min-height:5em}.buddypress-wrap .grid.four>li .group-desc,.buddypress-wrap .grid.three>li .group-desc{min-height:8em}.buddypress-wrap .blogs-list.grid.four>li,.buddypress-wrap .blogs-list.grid.three>li{min-height:350px}.buddypress-wrap .blogs-list.grid.four>li .last-activity,.buddypress-wrap .blogs-list.grid.three>li .last-activity{margin-bottom:0}.buddypress-wrap .blogs-list.grid.four>li .last-post,.buddypress-wrap .blogs-list.grid.three>li .last-post{margin-top:0}.buddypress:not(.logged-in) .grid.bp-list .list-wrap{padding-bottom:5px}.buddypress:not(.logged-in) .grid.groups-list .list-wrap{min-height:430px}.buddypress:not(.logged-in) .grid.members-list .list-wrap{min-height:300px}.buddypress:not(.logged-in) .grid.blogs-list .list-wrap{min-height:320px}@media screen and (min-width:46.8em){.bp-single-vert-nav .vertical{overflow:visible}.bp-single-vert-nav .vertical ul{border-right:1px solid #d6d6d6;float:left;margin-right:-1px;width:25%}.bp-single-vert-nav .vertical li{float:none}.bp-single-vert-nav .vertical li.selected a{background:#ccc;color:#333}.bp-single-vert-nav .vertical li:focus,.bp-single-vert-nav .vertical li:hover{background:#ccc}.bp-single-vert-nav .vertical li span{background:#d6d6d6;border-radius:10%;float:right;margin-right:2px}.bp-single-vert-nav .vertical li:hover span{border-color:#eaeaea}.bp-single-vert-nav .bp-wrap{margin-bottom:15px}.bp-single-vert-nav .bp-wrap .group-nav-tabs.groups-nav ul li,.bp-single-vert-nav .bp-wrap .user-nav-tabs.users-nav ul li{left:1px;position:relative}.bp-single-vert-nav .item-body:not(#group-create-body){background:#fff;border-left:1px solid #d6d6d6;float:right;margin:0;min-height:400px;padding:0 0 0 1em;width:calc(75% + 1px)}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links){background:#eaeaea;margin:0 0 0 -5px;width:auto}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li{font-size:16px;margin:10px 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a{border-right:1px solid #ccc;padding:0 .5em}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:focus,.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:hover{background:0 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li.current a{background:0 0;color:#333;text-decoration:underline}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li:last-child a{border:none}.bp-dir-vert-nav .dir-navs{float:left;left:1px;position:relative;width:20%}.bp-dir-vert-nav .dir-navs ul li{float:none;overflow:hidden;width:auto}.bp-dir-vert-nav .dir-navs ul li.selected{border:1px solid #eee}.bp-dir-vert-nav .dir-navs ul li.selected a{background:#555;color:#fff}.bp-dir-vert-nav .dir-navs ul li.selected a span{background:#eaeaea;border-color:#ccc;color:#5087e5}.bp-dir-vert-nav .dir-navs ul li a:focus,.bp-dir-vert-nav .dir-navs ul li a:hover{background:#ccc;color:#333}.bp-dir-vert-nav .dir-navs ul li a:focus span,.bp-dir-vert-nav .dir-navs ul li a:hover span{border:1px solid #555}.bp-dir-vert-nav .screen-content{border-left:1px solid #d6d6d6;margin-left:20%;overflow:hidden;padding:0 0 2em 1em}.bp-dir-vert-nav .screen-content .subnav-filters{margin-top:0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:hover{background:0 0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected{background:0 0;border:1px solid #d6d6d6;border-right-color:#fff}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a{background:0 0;color:#333;font-weight:600}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a span{background:#555;border:1px solid #d6d6d6;color:#fff}}
1
+ body #buddypress * a{box-shadow:none;text-decoration:none}body #buddypress #item-body blockquote,body #buddypress .bp-lists blockquote{margin-left:10px}body #buddypress .bp-list .action{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@media screen and (min-width:46.8em){body.buddypress .entry-content,body.buddypress .entry-header,body.buddypress .site-content .entry-header{max-width:none}body.buddypress .entry-header{float:none;max-width:none}body.buddypress .entry-content{float:none;max-width:none}body.buddypress .site-content{padding-top:2.5em}body.buddypress #page #primary{max-width:none}body.buddypress #page #primary .entry-content,body.buddypress #page #primary .entry-header{float:none;width:auto}}body.buddypress .buddypress-wrap h1,body.buddypress .buddypress-wrap h2,body.buddypress .buddypress-wrap h3,body.buddypress .buddypress-wrap h4,body.buddypress .buddypress-wrap h5,body.buddypress .buddypress-wrap h6{clear:none;margin:1em 0;padding:0}.bp-wrap:after,.bp-wrap:before{content:" ";display:table}.bp-wrap:after{clear:both}.buddypress-wrap.round-avatars .avatar{border-radius:50%}div,dl,input[type=reset],input[type=search],input[type=submit],li,select,textarea{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;border-radius:2px;background-clip:padding-box}body.buddypress article.page>.entry-header{margin-bottom:2em;padding:0}body.buddypress article.page>.entry-header .entry-title{font-size:28px;font-weight:inherit;color:#767676}@media screen and (min-width:46.8em){body.buddypress article.page>.entry-header .entry-title{font-size:34px}}.buddypress-wrap dt.section-title{font-size:18px}@media screen and (min-width:46.8em){.buddypress-wrap dt.section-title{font-size:22px}}.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-label-text,.buddypress-wrap .message-threads{font-size:16px}}.buddypress-wrap .activity-header{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-header{font-size:16px}}.buddypress-wrap .activity-inner{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .activity-inner{font-size:18px}}.buddypress-wrap #whats-new-post-in{font-size:16px}.buddypress-wrap .acomment-meta,.buddypress-wrap .mini .activity-header{font-size:16px}.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .dir-component-filters #activity-filter-by{font-size:16px}}.buddypress-wrap .bp-tables-user th{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user th{font-size:16px}}.buddypress-wrap .bp-tables-user td{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-tables-user td{font-size:14px}}.buddypress-wrap .profile-fields th{font-size:15px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields th{font-size:18px}}.buddypress-wrap .profile-fields td{font-size:13px}@media screen and (min-width:46.8em){.buddypress-wrap .profile-fields td{font-size:16px}}.buddypress-wrap #notification-select{font-size:12px}@media screen and (min-width:46.8em){.buddypress-wrap #notification-select{font-size:14px}}.bp-navs{background:0 0;clear:both;overflow:hidden}.bp-navs ul{margin:0;padding:0}.bp-navs ul li{list-style:none;margin:0}.bp-navs ul li.last select{max-width:185px}.bp-navs ul li a,.bp-navs ul li span{border:0;display:block;padding:5px 10px;text-decoration:none}.bp-navs ul li .count{background:#eaeaea;border:1px solid #ccc;border-radius:50%;color:#555;display:inline;font-size:12px;margin-left:2px;padding:3px 6px;text-align:center;vertical-align:middle}.bp-navs ul li.current a,.bp-navs ul li.selected a{color:#333;opacity:1}.bp-navs.bp-invites-filters ul li a,.bp-navs.bp-messages-filters ul li a{border:1px solid #ccc;display:inline-block}.main-navs.dir-navs{margin-bottom:20px}.buddypress-wrap .bp-navs li a:hover a .count,.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.selected a .count{background-color:#ccc}.buddypress-wrap .bp-navs li:not(.current) a:focus,.buddypress-wrap .bp-navs li:not(.current) a:hover,.buddypress-wrap .bp-navs li:not(.selected) a:focus,.buddypress-wrap .bp-navs li:not(.selected) a:hover{background:#ccc;color:#333}.buddypress-wrap .bp-navs li.current a,.buddypress-wrap .bp-navs li.current a:focus,.buddypress-wrap .bp-navs li.current a:hover,.buddypress-wrap .bp-navs li.selected a,.buddypress-wrap .bp-navs li.selected a:focus,.buddypress-wrap .bp-navs li.selected a:hover{background:#555;color:#fafafa}.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.current a:focus .count,.buddypress-wrap .bp-navs li.current a:hover .count,.buddypress-wrap .bp-navs li.selected a .count,.buddypress-wrap .bp-navs li.selected a:focus .count,.buddypress-wrap .bp-navs li.selected a:hover .count{border-color:#fafafa}@media screen and (min-width:46.8em){.buddypress-wrap .main-navs:not(.dir-navs) li.current a,.buddypress-wrap .main-navs:not(.dir-navs) li.selected a{background:#fff;color:#333;font-weight:600}.buddypress-wrap .main-navs.vertical li.current a,.buddypress-wrap .main-navs.vertical li.selected a{background:#555;color:#fafafa;text-decoration:none}.buddypress-wrap.bp-dir-hori-nav nav:not(".tabbed-links"){border-bottom:1px solid #eee;border-top:1px solid #eee;-webkit-box-shadow:0 2px 12px 0 #fafafa;-moz-box-shadow:0 2px 12px 0 #fafafa;box-shadow:0 2px 12px 0 #fafafa}}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.selected a{background:#fff;color:#333;font-weight:600}@media screen and (max-width:46.8em){.buddypress-wrap:not(.bp-single-vert-nav) .bp-navs li{background:#eaeaea}}.buddypress-wrap:not(.bp-single-vert-nav) .main-navs>ul>li>a{padding:.5em calc(.5em + 2px)}.buddypress-wrap:not(.bp-single-vert-nav) .group-subnav#subsubnav,.buddypress-wrap:not(.bp-single-vert-nav) .user-subnav#subsubnav{background:0 0}.buddypress-wrap .bp-subnavs,.buddypress-wrap ul.subnav{width:100%}.buddypress-wrap .bp-subnavs{margin:10px 0;overflow:hidden}.buddypress-wrap .bp-subnavs ul li{margin-top:0}.buddypress-wrap .bp-subnavs ul li.current :focus,.buddypress-wrap .bp-subnavs ul li.current :hover,.buddypress-wrap .bp-subnavs ul li.selected :focus,.buddypress-wrap .bp-subnavs ul li.selected :hover{background:0 0;color:#333}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap .bp-navs.bp-invites-filters#subsubnav ul li.last,.buddypress-wrap .bp-navs.bp-invites-nav#subnav ul li.last,.buddypress-wrap .bp-navs.bp-messages-filters#subsubnav ul li.last{margin-top:0}@media screen and (max-width:46.8em){.buddypress-wrap .single-screen-navs{border:1px solid #eee}.buddypress-wrap .single-screen-navs li{border-bottom:1px solid #eee}.buddypress-wrap .single-screen-navs li:last-child{border-bottom:none}.buddypress-wrap .bp-subnavs li a{font-size:14px}.buddypress-wrap .bp-subnavs li.current a,.buddypress-wrap .bp-subnavs li.current a:focus,.buddypress-wrap .bp-subnavs li.current a:hover,.buddypress-wrap .bp-subnavs li.selected a,.buddypress-wrap .bp-subnavs li.selected a:focus,.buddypress-wrap .bp-subnavs li.selected a:hover{background:#555;color:#fff}}.buddypress-wrap .bp-navs li.current a .count,.buddypress-wrap .bp-navs li.selected a .count,.buddypress_object_nav .bp-navs li.current a .count,.buddypress_object_nav .bp-navs li.selected a .count{background-color:#fff}.buddypress-wrap .bp-navs li.dynamic a .count,.buddypress-wrap .bp-navs li.dynamic.current a .count,.buddypress-wrap .bp-navs li.dynamic.selected a .count,.buddypress_object_nav .bp-navs li.dynamic a .count,.buddypress_object_nav .bp-navs li.dynamic.current a .count,.buddypress_object_nav .bp-navs li.dynamic.selected a .count{background-color:#5087e5;border:0;color:#fafafa}.buddypress-wrap .bp-navs li.dynamic a:hover .count,.buddypress_object_nav .bp-navs li.dynamic a:hover .count{background-color:#5087e5;border:0;color:#fff}.buddypress-wrap .bp-navs li a .count:empty,.buddypress_object_nav .bp-navs li a .count:empty{display:none}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current),.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current){color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a:hover{background:0 0;color:#333}.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress-wrap .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:focus,.buddypress_object_nav .bp-navs.group-create-links ul li:not(.current) a[disabled]:hover{color:#767676}.buddypress-wrap .bp-navs.group-create-links ul li.current a,.buddypress_object_nav .bp-navs.group-create-links ul li.current a{text-align:center}@media screen and (min-width:46.8em){.buddypress-wrap .bp-navs li{float:left}.buddypress-wrap .subnav{float:left}.buddypress-wrap ul.subnav{width:auto}.buddypress-wrap #subsubnav .activity-search{float:left}.buddypress-wrap #subsubnav .filter{float:right}}.buddypress_object_nav .bp-navs li a .count{display:inline-block;float:right}@media screen and (min-width:46.8em){.bp-dir-vert-nav .bp-navs.dir-navs{background:0 0}.bp-dir-vert-nav .bp-navs.dir-navs a .count{float:right}}@media screen and (min-width:46.8em){.buddypress-wrap .item-body .tabbed-links ol,.buddypress-wrap .item-body .tabbed-links ul{border-bottom:1px solid #ccc;float:none;margin:20px 0 10px}.buddypress-wrap .item-body .tabbed-links ol:after,.buddypress-wrap .item-body .tabbed-links ol:before,.buddypress-wrap .item-body .tabbed-links ul:after,.buddypress-wrap .item-body .tabbed-links ul:before{content:" ";display:block}.buddypress-wrap .item-body .tabbed-links ol:after,.buddypress-wrap .item-body .tabbed-links ul:after{clear:both}.buddypress-wrap .item-body .tabbed-links ol li,.buddypress-wrap .item-body .tabbed-links ul li{float:left;list-style:none;margin:0 10px 0 0}.buddypress-wrap .item-body .tabbed-links ol li a,.buddypress-wrap .item-body .tabbed-links ol li span,.buddypress-wrap .item-body .tabbed-links ul li a,.buddypress-wrap .item-body .tabbed-links ul li span{background:0 0;border:none;display:block;padding:4px 10px}.buddypress-wrap .item-body .tabbed-links ol li a:focus,.buddypress-wrap .item-body .tabbed-links ol li a:hover,.buddypress-wrap .item-body .tabbed-links ul li a:focus,.buddypress-wrap .item-body .tabbed-links ul li a:hover{background:0 0}.buddypress-wrap .item-body .tabbed-links ol li.current,.buddypress-wrap .item-body .tabbed-links ul li.current{border-color:#ccc #ccc #fff;border-style:solid;border-top-left-radius:4px;border-top-right-radius:4px;border-width:1px;margin-bottom:-1px;padding:0 .5em 1px}.buddypress-wrap .item-body .tabbed-links ol li.current a,.buddypress-wrap .item-body .tabbed-links ul li.current a{color:#333}.buddypress-wrap .item-body .bp-subnavs.tabbed-links>ul{margin-top:0}.buddypress-wrap .item-body .bp-navs.tabbed-links{background:0 0;margin-top:2px}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a{border-right:0;font-size:inherit}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last{float:right;margin:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.last a{margin-top:-.5em}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:hover,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:focus,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:hover{background:0 0;border:0}.buddypress-wrap .item-body .bp-navs.tabbed-links ul li a:active,.buddypress-wrap .item-body .bp-navs.tabbed-links ul li.current a:active{outline:0}}.buddypress-wrap .dir-component-filters .filter label{display:inline}.buddypress-wrap .subnav-filters:after,.buddypress-wrap .subnav-filters:before{content:" ";display:table}.buddypress-wrap .subnav-filters:after{clear:both}.buddypress-wrap .subnav-filters{background:0 0;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .subnav-filters div{margin:0}.buddypress-wrap .subnav-filters>ul{float:left;list-style:none}.buddypress-wrap .subnav-filters.bp-messages-filters ul{width:100%}.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:1em}@media screen and (min-width:46.8em){.buddypress-wrap .subnav-filters.bp-messages-filters .messages-search{margin-bottom:0}}.buddypress-wrap .subnav-filters div{float:none}.buddypress-wrap .subnav-filters div input[type=search],.buddypress-wrap .subnav-filters div select{font-size:16px}.buddypress-wrap .subnav-filters div button.nouveau-search-submit{padding:5px .8em 6px}.buddypress-wrap .subnav-filters div button#user_messages_search_submit{padding:7px .8em}.buddypress-wrap .subnav-filters .component-filters{margin-top:10px}.buddypress-wrap .subnav-filters .feed{margin-right:15px}.buddypress-wrap .subnav-filters .last.filter label{display:inline}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:before{content:" ";display:table}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap:after{clear:both}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-show{display:inline-block}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions-wrap.bp-hide{display:none}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap{border:0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:focus,.buddypress-wrap .subnav-filters .user-messages-bulk-actions .select-wrap:hover{outline:1px solid #d6d6d6}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-actions{float:left}.buddypress-wrap .subnav-filters .user-messages-bulk-actions label{display:inline-block;font-weight:300;margin-right:25px;padding:5px 0}.buddypress-wrap .subnav-filters .user-messages-bulk-actions div select{-webkit-appearance:textfield}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply{border:0;border-radius:none;font-weight:400;line-height:1.8;margin:0 0 0 10px;padding:3px 5px;text-align:center;text-transform:none;width:auto}.buddypress-wrap .subnav-filters .user-messages-bulk-actions .bulk-apply span{vertical-align:middle}@media screen and (min-width:32em){.buddypress-wrap .subnav-filters li{margin-bottom:0}.buddypress-wrap .subnav-filters .bp-search,.buddypress-wrap .subnav-filters .dir-search,.buddypress-wrap .subnav-filters .feed,.buddypress-wrap .subnav-filters .group-act-search,.buddypress-wrap .subnav-filters .group-invites-search,.buddypress-wrap .subnav-filters .subnav-search,.buddypress-wrap .subnav-filters .subnav-search form,.buddypress-wrap .subnav-filters .user-messages-bulk-actions,.buddypress-wrap .subnav-filters .user-messages-search{float:left}.buddypress-wrap .subnav-filters .component-filters,.buddypress-wrap .subnav-filters .last{float:right;margin-top:0;width:auto}.buddypress-wrap .subnav-filters .component-filters select,.buddypress-wrap .subnav-filters .last select{max-width:250px}.buddypress-wrap .subnav-filters .user-messages-search{float:right}}.buddypress-wrap .notifications-options-nav input#notification-bulk-manage{border:0;border-radius:0;line-height:1.6}.buddypress-wrap .bp-pagination{background:0 0;border:0;color:#767676;float:left;font-size:small;margin:0;padding:.5em 0;position:relative;width:100%}.buddypress-wrap .bp-pagination .pag-count{float:left}.buddypress-wrap .bp-pagination .bp-pagination-links{float:right;margin-right:10px}.buddypress-wrap .bp-pagination .bp-pagination-links a,.buddypress-wrap .bp-pagination .bp-pagination-links span{font-size:small;padding:0 5px}.buddypress-wrap .bp-pagination .bp-pagination-links a:focus,.buddypress-wrap .bp-pagination .bp-pagination-links a:hover{opacity:1}.buddypress-wrap .bp-pagination p{margin:0}.bp-list:after,.bp-list:before{content:" ";display:table}.bp-list:after{clear:both}.bp-list{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #eaeaea;clear:both;list-style:none;margin:20px 0;padding:.5em 0;width:100%}.bp-list li:after,.bp-list li:before{content:" ";display:table}.bp-list li:after{clear:both}.bp-list>li{border-bottom:1px solid #eaeaea}.bp-list li{list-style:none;margin:10px 0;padding:.5em 0;position:relative}.bp-list li .item-avatar{text-align:center}.bp-list li .item-avatar img.avatar{display:inline}.bp-list li .item .group-details,.bp-list li .item .item-avatar,.bp-list li .item .item-meta,.bp-list li .item .list-title{text-align:center}.bp-list li .item .list-title{clear:none;font-size:22px;font-weight:400;line-height:1.1;margin:0 auto}@media screen and (min-width:46.8em){.bp-list li .item .list-title{font-size:26px}}.bp-list li .item-meta,.bp-list li .meta{color:#737373;font-size:12px;margin-top:10px}.bp-list li .last-post{text-align:center}.bp-list li .action{margin:0;text-align:center}.bp-list li .action .generic-button{display:inline-block;font-size:12px;margin:0 10px 0 0}.bp-list li .action div.generic-button{margin:10px 0}@media screen and (min-width:46.8em){.bp-list li .item-avatar{float:left;margin-right:5%}.bp-list li .item{margin:0;overflow:hidden}.bp-list li .item .item-block{float:left;margin-right:2%;width:50%}.bp-list li .item .item-meta,.bp-list li .item .list-title{float:left;text-align:left}.bp-list li .item .group-details,.bp-list li .item .last-post{text-align:left}.bp-list li .group-desc,.bp-list li .last-post,.bp-list li .user-update{clear:none;overflow:hidden;width:auto}.bp-list li .action{clear:left;padding:0;text-align:left}.bp-list li .action li.generic-button{margin-right:0}.bp-list li .action div.generic-button{margin:0 0 10px}.bp-list li .generic-button{display:block;margin:0 0 5px 0}}@media screen and (min-width:32em){#activity-stream{clear:both;padding-top:1em}}.activity-list.bp-list{background:#fafafa;border:1px solid #eee}.activity-list.bp-list .activity-item{background:#fff;border:1px solid #b7b7b7;-webkit-box-shadow:0 0 6px #d2d2d2;-moz-box-shadow:0 0 6px #d2d2d2;box-shadow:0 0 6px #d2d2d2;margin:20px 0}.activity-list.bp-list li:first-child{margin-top:0}.friends-request-list .item-title{text-align:center}@media screen and (min-width:46.8em){.friends-request-list li{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap}.friends-request-list li .item{-webkit-flex:1 1 auto;-moz-flex:1 1 auto;-ms-flex:1 1 auto;-o-flex:1 1 auto;flex:1 1 auto}.friends-request-list li .action{text-align:right}.friends-request-list li .item-title{font-size:22px;text-align:left}}#notifications-user-list{clear:both;padding-top:1em}@media screen and (min-width:46.8em){body:not(.logged-in) .bp-list .item{margin-right:0}}.activity-permalink .item-list,.activity-permalink .item-list li.activity-item{border:0}.activity-update-form{padding:10px 10px 0}.item-body .activity-update-form .activity-form{margin:0;padding:0}.activity-update-form{border:1px solid #ccc;-webkit-box-shadow:inset 0 0 6px #eee;-moz-box-shadow:inset 0 0 6px #eee;box-shadow:inset 0 0 6px #eee;margin:15px 0}.activity-update-form #whats-new-avatar{margin:10px 0;text-align:center}.activity-update-form #whats-new-avatar img{display:inline-block}.activity-update-form #whats-new-content{padding:0 0 20px 0}.activity-update-form #whats-new-textarea textarea{background:#fff;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;font-family:inherit;font-size:medium;height:2.2em;line-height:1.4;padding:6px;width:100%}.activity-update-form #whats-new-textarea textarea:focus{-webkit-box-shadow:0 0 6px 0 #d6d6d6;-moz-box-shadow:0 0 6px 0 #d6d6d6;box-shadow:0 0 6px 0 #d6d6d6}.activity-update-form #whats-new-post-in-box{margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items{list-style:none;margin:10px 0}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items li{margin-bottom:10px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items #activity-autocomplete{padding:.3em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;padding:.2em}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object .avatar{width:30px}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object span{padding-left:10px;vertical-align:middle}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:focus,.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object:hover{background:#eaeaea;cursor:pointer}.activity-update-form #whats-new-post-in-box #whats-new-post-in-box-items .bp-activity-object.selected{border:1px solid #d6d6d6}.activity-update-form #whats-new-submit{margin:15px 0 10px}.activity-update-form #whats-new-submit input{font-size:14px;line-height:inherit;margin-bottom:10px;margin-right:10px;padding:.2em 0;text-align:center;width:100%}@media screen and (min-width:46.8em){.activity-update-form #whats-new-avatar{display:block;float:left;margin:0 10px 0 0}.activity-update-form #whats-new-content,.activity-update-form #whats-new-post-in-box,.activity-update-form #whats-new-submit{margin-left:12%}.activity-update-form #whats-new-submit input{margin-bottom:0;margin-right:10px;width:8em}}.activity-list{padding:.5em}.activity-list .activity-item:after,.activity-list .activity-item:before{content:" ";display:table}.activity-list .activity-item:after{clear:both}.activity-list .activity-item{list-style:none;padding:1em}.activity-list .activity-item.has-comments{padding-bottom:1em}.activity-list .activity-item div.item-avatar{margin:0 auto;text-align:center;width:auto}.activity-list .activity-item div.item-avatar img{max-width:40%}@media screen and (min-width:46.8em){.activity-list .activity-item div.item-avatar{margin:0 2% 0 0;text-align:left;width:15%}.activity-list .activity-item div.item-avatar img{max-width:80%}}.activity-list .activity-item.mini{font-size:13px;position:relative}.activity-list .activity-item.mini .activity-avatar{margin-left:0 auto;text-align:center;width:auto}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:15%}@media screen and (min-width:46.8em){.activity-list .activity-item.mini .activity-avatar{margin-left:15px;text-align:left;width:15%}.activity-list .activity-item.mini .activity-avatar img.FB_profile_pic,.activity-list .activity-item.mini .activity-avatar img.avatar{max-width:60%}}.activity-list .activity-item.new_forum_post .activity-inner,.activity-list .activity-item.new_forum_topic .activity-inner{border-left:2px solid #eaeaea;margin-left:10px;padding-left:1em}.activity-list .activity-item.newest_blogs_activity,.activity-list .activity-item.newest_friends_activity,.activity-list .activity-item.newest_groups_activity,.activity-list .activity-item.newest_mentions_activity{background:rgba(31,179,221,.1)}.activity-list .activity-item .activity-inreplyto{color:#767676;font-size:13px}.activity-list .activity-item .activity-inreplyto>p{display:inline;margin:0}.activity-list .activity-item .activity-inreplyto .activity-inner,.activity-list .activity-item .activity-inreplyto blockquote{background:0 0;border:0;display:inline;margin:0;overflow:hidden;padding:0}.activity-list .activity-item .activity-header{margin:0 auto;width:80%}.activity-list .activity-item .activity-header a,.activity-list .activity-item .activity-header img{display:inline}.activity-list .activity-item .activity-header .avatar{display:inline-block;margin:0 5px;vertical-align:bottom}.activity-list .activity-item .activity-header .time-since{font-size:14px;color:#767676;text-decoration:none}.activity-list .activity-item .activity-header .time-since:hover{color:#767676;cursor:pointer;text-decoration:underline}.activity-list .activity-item .activity-content .activity-header,.activity-list .activity-item .activity-content .comment-header{color:#767676;margin-bottom:10px}.activity-list .activity-item .activity-content .activity-inner,.activity-list .activity-item .activity-content blockquote{background:#fafafa;margin:15px 0 10px;overflow:hidden;padding:1em}.activity-list .activity-item .activity-content p{margin:0}.activity-list .activity-item .activity-inner p{word-wrap:break-word}.activity-list .activity-item .activity-read-more{margin-left:1em;white-space:nowrap}.activity-list .activity-item ul.activity-meta{margin:0;padding-left:0}.activity-list .activity-item ul.activity-meta li{border:0;display:inline-block}.activity-list .activity-item .activity-meta.action{border:1px solid transparent;background:#fafafa;padding:2px;position:relative;text-align:left}.activity-list .activity-item .activity-meta.action div.generic-button{margin:0}.activity-list .activity-item .activity-meta.action .button{background:0 0}.activity-list .activity-item .activity-meta.action a{padding:4px 8px}.activity-list .activity-item .activity-meta.action .button:focus,.activity-list .activity-item .activity-meta.action .button:hover{background:0 0}.activity-list .activity-item .activity-meta.action .button:before,.activity-list .activity-item .activity-meta.action .icons:before{font-family:dashicons;font-size:18px;vertical-align:middle}.activity-list .activity-item .activity-meta.action .acomment-reply.button:before{content:"\f101"}.activity-list .activity-item .activity-meta.action .view:before{content:"\f125"}.activity-list .activity-item .activity-meta.action .fav:before{content:"\f154"}.activity-list .activity-item .activity-meta.action .unfav:before{content:"\f155"}.activity-list .activity-item .activity-meta.action .delete-activity:before{content:"\f153"}.activity-list .activity-item .activity-meta.action .delete-activity:hover{color:#800}.activity-list .activity-item .activity-meta.action .button{border:0;box-shadow:none}.activity-list .activity-item .activity-meta.action .button span{background:0 0;color:#555;font-weight:700}@media screen and (min-width:46.8em){.activity-list.bp-list{padding:30px}.activity-list .activity-item .activity-content{margin:0;position:relative}.activity-list .activity-item .activity-content:after{clear:both;content:"";display:table}.activity-list .activity-item .activity-header{margin:0 15px 0 0;width:auto}}.buddypress-wrap .activity-list .load-more,.buddypress-wrap .activity-list .load-newest{background:#fafafa;border:1px solid #eee;font-size:110%;margin:15px 0;padding:0;text-align:center}.buddypress-wrap .activity-list .load-more a,.buddypress-wrap .activity-list .load-newest a{color:#555;display:block;padding:.5em 0}.buddypress-wrap .activity-list .load-more a:focus,.buddypress-wrap .activity-list .load-more a:hover,.buddypress-wrap .activity-list .load-newest a:focus,.buddypress-wrap .activity-list .load-newest a:hover{background:#fff;color:#333}.buddypress-wrap .activity-list .load-more:focus,.buddypress-wrap .activity-list .load-more:hover,.buddypress-wrap .activity-list .load-newest:focus,.buddypress-wrap .activity-list .load-newest:hover{border-color:#e1e1e1;-webkit-box-shadow:0 0 6px 0 #eaeaea;-moz-box-shadow:0 0 6px 0 #eaeaea;box-shadow:0 0 6px 0 #eaeaea}body.activity-permalink .activity-list li{border-width:1px;padding:1em 0 0 0}body.activity-permalink .activity-list li:first-child{padding-top:0}body.activity-permalink .activity-list li.has-comments{padding-bottom:0}body.activity-permalink .activity-list .activity-avatar{width:auto}body.activity-permalink .activity-list .activity-avatar a{display:block}body.activity-permalink .activity-list .activity-avatar img{max-width:100%}body.activity-permalink .activity-list .activity-content{border:0;font-size:100%;line-height:1.5;padding:0}body.activity-permalink .activity-list .activity-content .activity-header{margin:0;padding:.5em 0 0 0;text-align:center;width:100%}body.activity-permalink .activity-list .activity-content .activity-inner,body.activity-permalink .activity-list .activity-content blockquote{margin-left:0;margin-top:10px}body.activity-permalink .activity-list .activity-meta{margin:10px 0 10px}body.activity-permalink .activity-list .activity-comments{margin-bottom:10px}@media screen and (min-width:46.8em){body.activity-permalink .activity-list .activity-avatar{left:-20px;margin-right:0;position:relative;top:-20px}body.activity-permalink .activity-list .activity-content{margin-right:10px}body.activity-permalink .activity-list .activity-content .activity-header p{text-align:left}}.buddypress-wrap .activity-comments{clear:both;margin:0 5%;overflow:hidden;position:relative;width:auto}.buddypress-wrap .activity-comments ul{clear:both;list-style:none;margin:15px 0 0;padding:0}.buddypress-wrap .activity-comments ul li{border-top:1px solid #eee;border-bottom:0;padding:1em 0 0}.buddypress-wrap .activity-comments ul li ul{margin-left:5%}.buddypress-wrap .activity-comments ul li:first-child{border-top:0}.buddypress-wrap .activity-comments ul li:last-child{margin-bottom:0}.buddypress-wrap .activity-comments div.acomment-avatar{width:auto}.buddypress-wrap .activity-comments div.acomment-avatar img{border-width:1px;float:left;height:25px;max-width:none;width:25px}.buddypress-wrap .activity-comments .acomment-content p,.buddypress-wrap .activity-comments .acomment-meta{font-size:14px}.buddypress-wrap .activity-comments .acomment-meta{color:#555;overflow:hidden;padding-left:2%}.buddypress-wrap .activity-comments .acomment-content{border-left:1px solid #ccc;margin:15px 0 0 10%;padding:.5em 1em}.buddypress-wrap .activity-comments .acomment-content p{margin-bottom:.5em}.buddypress-wrap .activity-comments .acomment-options{float:left;margin:10px 0 10px 20px}.buddypress-wrap .activity-comments .acomment-options a{color:#767676;font-size:14px}.buddypress-wrap .activity-comments .acomment-options a:focus,.buddypress-wrap .activity-comments .acomment-options a:hover{color:inherit}.buddypress-wrap .activity-comments .activity-meta.action{background:0 0;margin-top:10px}.buddypress-wrap .activity-comments .activity-meta.action button{font-size:14px;font-weight:400;text-transform:none}.buddypress-wrap .activity-comments .show-all button{font-size:14px;text-decoration:underline;padding-left:.5em}.buddypress-wrap .activity-comments .show-all button span{text-decoration:none}.buddypress-wrap .activity-comments .show-all button:focus span,.buddypress-wrap .activity-comments .show-all button:hover span{color:#5087e5}.buddypress-wrap .mini .activity-comments{clear:both;margin-top:0}body.activity-permalink .activity-comments{background:0 0;width:auto}body.activity-permalink .activity-comments>ul{padding:0 .5em 0 1em}body.activity-permalink .activity-comments ul li>ul{margin-top:10px}form.ac-form{display:none;padding:1em}form.ac-form .ac-reply-avatar{float:left}form.ac-form .ac-reply-avatar img{border:1px solid #eee}form.ac-form .ac-reply-content{color:#767676;padding-left:1em}form.ac-form .ac-reply-content a{text-decoration:none}form.ac-form .ac-reply-content .ac-textarea{margin-bottom:15px;padding:0 .5em;overflow:hidden}form.ac-form .ac-reply-content .ac-textarea textarea{background:0 0;box-shadow:none;color:#555;font-family:inherit;font-size:100%;height:60px;margin:0;outline:0;padding:.5em;width:100%}form.ac-form .ac-reply-content .ac-textarea textarea:focus{-webkit-box-shadow:0 0 6px #d6d6d6;-moz-box-shadow:0 0 6px #d6d6d6;box-shadow:0 0 6px #d6d6d6}form.ac-form .ac-reply-content input{margin-top:10px}.activity-comments li form.ac-form{clear:both;margin-right:15px}.activity-comments form.root{margin-left:0}@media screen and (min-width:46.8em){.buddypress-wrap .blogs-list li .item-block{float:none;width:auto}.buddypress-wrap .blogs-list li .item-meta{clear:left;float:none}}@media screen and (min-width:46.8em){.buddypress-wrap .bp-dir-vert-nav .blogs-list .list-title{width:auto}}.buddypress-wrap .groups-list li .list-title{text-align:center}.buddypress-wrap .groups-list li .group-details{clear:left}.buddypress-wrap .groups-list li .group-desc{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;font-size:13px;color:#737373;font-style:italic;margin:10px auto 0;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .group-desc{font-size:16px}}.buddypress-wrap .groups-list li p{margin:0 0 .5em}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list li .item{margin-right:0}.buddypress-wrap .groups-list li .item-meta,.buddypress-wrap .groups-list li .list-title{text-align:left;width:auto}.buddypress-wrap .groups-list li .item-meta{margin-bottom:20px}.buddypress-wrap .groups-list li .last-activity{clear:left;margin-top:-20px}}.buddypress-wrap .groups-list li.group-no-avatar div.group-desc{margin-left:0}.buddypress-wrap .mygroups .groups-list.grid .wrap{min-height:450px;padding-bottom:0}@media screen and (min-width:46.8em){.buddypress-wrap .groups-list.grid.four .group-desc,.buddypress-wrap .groups-list.grid.three .group-desc{font-size:14px}}@media screen and (min-width:46.8em){.buddypress .bp-vertical-navs .groups-list .item-avatar{margin-right:3%;width:15%}}.buddypress-wrap .members-list li .member-name{margin-bottom:10px}.buddypress-wrap .members-list li .user-update{border:1px solid #eaeaea;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;border-radius:10px;background-clip:padding-box;color:#737373;font-style:italic;font-size:13px;margin:15px auto;padding:1em}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .user-update{font-size:16px}}.buddypress-wrap .members-list li .user-update .activity-read-more{display:block;font-size:12px;font-style:normal;margin-top:10px;padding-left:2px}@media screen and (min-width:46.8em){.buddypress-wrap .members-list li .last-activity{clear:left;margin-top:-10px}}@media screen and (min-width:46.8em){.buddypress-wrap .members-group-list li .joined{clear:left;float:none}}@media screen and (min-width:32em){body:not(.logged-in) .members-list .user-update{width:96%}}.register-page .register-section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.register-page .signup-form{margin-top:20px}.register-page .signup-form .default-profile input{margin-bottom:20px}.register-page .signup-form label,.register-page .signup-form legend{margin:10px 0 0}.register-page .signup-form .editfield{margin:15px 0}.register-page .signup-form .editfield fieldset{border:0;padding:0}.register-page .signup-form .editfield fieldset legend{margin:0 0 5px;text-indent:0}.register-page .signup-form .editfield .field-visibility-settings{padding:.5em}.register-page .signup-form .editfield .field-visibility-settings fieldset{margin:0 0 10px}.register-page .signup-form #signup-avatar img{margin:0 15px 10px 0}.register-page .signup-form .password-entry,.register-page .signup-form .password-entry-confirm{border:1px solid #eee}@media screen and (min-width:46.8em){.buddypress-wrap .register-page .layout-wrap{display:flex;flex-flow:row wrap;justify-content:space-around}.buddypress-wrap .register-page .layout-wrap .default-profile{flex:1;padding-right:2em}.buddypress-wrap .register-page .layout-wrap .blog-details{flex:1;padding-left:2em}.buddypress-wrap .register-page .submit{clear:both}}@media screen and (min-width:46.8em){.buddypress-wrap.extended-default-reg .register-page .default-profile{flex:1;padding-right:1em}.buddypress-wrap.extended-default-reg .register-page .extended-profile{flex:2;padding-left:1em}.buddypress-wrap.extended-default-reg .register-page .blog-details{flex:1 100%}}#group-create-body{padding:.5em}#group-create-body .creation-step-name{text-align:center}#group-create-body .avatar-nav-items{margin-top:15px}.single-headers:after,.single-headers:before{content:" ";display:table}.single-headers:after{clear:both}.single-headers{margin-bottom:15px}.single-headers #item-header-avatar a{display:block;text-align:center}.single-headers #item-header-avatar a img{float:none}.single-headers div#item-header-content{float:none}@media screen and (min-width:46.8em){.single-headers #item-header-avatar a{text-align:left}.single-headers #item-header-avatar a img{float:left}}.single-headers .activity,.single-headers .group-status{display:inline}.single-headers .group-status{font-size:18px;color:#333;padding-right:1em}.single-headers .activity{display:inline-block;font-size:12px;padding:0}.single-headers #sitewide-notice p,.single-headers div#message p{background-color:#ffd;border:1px solid #cb2;color:#440;font-weight:400;margin-top:3px;text-decoration:none}.single-headers h2{line-height:1.2;margin:0 0 5px}.single-headers h2 a{color:#767676;text-decoration:none}.single-headers h2 span.highlight{display:inline-block;font-size:60%;font-weight:400;line-height:1.7;vertical-align:middle}.single-headers h2 span.highlight span{background:#a1dcfa;color:#fff;cursor:pointer;font-size:80%;font-weight:700;margin-bottom:2px;padding:1px 4px;position:relative;right:-2px;top:-2px;vertical-align:middle}.single-headers img.avatar{float:left;margin:0 15px 19px 0}.single-headers .item-meta{color:#767676;font-size:14px;margin:15px 0 5px;padding-bottom:.5em}.single-headers ul{margin-bottom:15px}.single-headers ul li{float:right;list-style:none}.single-headers div.generic-button{text-align:center}.single-headers li.generic-button{display:inline-block;text-align:center}@media screen and (min-width:46.8em){.single-headers a.button,.single-headers div.generic-button,.single-headers li.generic-button{float:left}}.single-headers a.button,.single-headers div.generic-button{margin:10px 10px 0 0}.single-headers li.generic-button{margin:2px 10px}.single-headers li.generic-button:first-child{margin-left:0}.single-headers div#message.info{line-height:.8}body.no-js .single-item-header .js-self-profile-button{display:none}#cover-image-container{position:relative}#header-cover-image{background-color:#c5c5c5;background-position:center top;background-repeat:no-repeat;background-size:cover;border:0;display:block;left:0;margin:0;padding:0;position:absolute;top:0;width:100%;z-index:1}#item-header-cover-image{position:relative;z-index:2}#item-header-cover-image #item-header-avatar{padding:0 1em}.groups-header .bp-group-type-list{margin:0}.groups-header .bp-feedback{clear:both}.groups-header .group-item-actions{float:left;margin:0 0 15px 15px;padding-top:0;width:100%}.groups-header .moderators-lists{margin-top:0}.groups-header .moderators-lists .moderators-title{font-size:14px}.groups-header .moderators-lists .user-list{margin:0 0 5px}.groups-header .moderators-lists .user-list ul:after{clear:both;content:"";display:table}.groups-header .moderators-lists .user-list li{display:inline-block;float:none;margin-left:4px;padding:4px}.groups-header .moderators-lists img.avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;float:none;height:30px;margin:0;max-width:100%;width:30px}@media screen and (min-width:46.8em){.groups-header div#item-header-content{float:left;margin-left:10%;text-align:left;padding-top:15px;width:42%}.groups-header .group-item-actions{float:right;margin:0 0 15px 15px;text-align:right;width:20%}.groups-header .groups-meta{clear:both}}.groups-header .desc-wrap{background:#eaeaea;border:1px solid #d6d6d6;margin:0 0 15px;padding:1em;text-align:center}.groups-header .desc-wrap .group-description{background:#fafafa;-webkit-box-shadow:inset 0 0 9px #ccc;-moz-box-shadow:inset 0 0 9px #ccc;box-shadow:inset 0 0 9px #ccc;padding:1em;text-align:left}.bp-user .users-header .user-nicename{margin-bottom:5px}.bp-user .member-header-actions{overflow:hidden}.bp-user .member-header-actions *>*{display:block}.buddypress-wrap .item-body{margin:20px 0}.buddypress-wrap .item-body .screen-heading{font-size:20px;font-weight:400}.buddypress-wrap .item-body .button-tabs{margin:30px 0 15px}.buddypress-wrap.bp-single-vert-nav .bp-list:not(.grid) .item-entry{padding-left:.5em}.single-item.group-members .item-body .filters:not(.no-subnav){border-top:5px solid #eaeaea;padding-top:1em}.single-item.group-members .item-body .filters{margin-top:0}.buddypress-wrap .group-status-type ul{margin:0 0 20px 20px}.groups-manage-members-list{padding:.5em 0}.groups-manage-members-list dd{margin:0;padding:1em 0}.groups-manage-members-list .section-title{background:#eaeaea;padding-left:.3em}.groups-manage-members-list ul{list-style:none;margin-bottom:0}.groups-manage-members-list ul li{border-bottom:1px solid #eee;margin-bottom:10px;padding:.5em .3em .3em}.groups-manage-members-list ul li:last-child,.groups-manage-members-list ul li:only-child{border-bottom:0}.groups-manage-members-list ul li:nth-child(even){background:#fafafa}.groups-manage-members-list ul li.banned-user{background:#fad3d3}.groups-manage-members-list ul .member-name{margin-bottom:0;text-align:center}.groups-manage-members-list ul img{display:block;margin:0 auto;width:20%}@media screen and (min-width:32em){.groups-manage-members-list ul .member-name{text-align:left}.groups-manage-members-list ul img{display:inline;width:50px}}.groups-manage-members-list ul .members-manage-buttons:after,.groups-manage-members-list ul .members-manage-buttons:before{content:" ";display:table}.groups-manage-members-list ul .members-manage-buttons:after{clear:both}.groups-manage-members-list ul .members-manage-buttons{margin:15px 0 5px}.groups-manage-members-list ul .members-manage-buttons a.button{color:#767676;display:block;font-size:13px}@media screen and (min-width:32em){.groups-manage-members-list ul .members-manage-buttons a.button{display:inline-block}}.groups-manage-members-list ul .members-manage-buttons.text-links-list{margin-bottom:0}@media screen and (max-width:32em){.groups-manage-members-list ul .members-manage-buttons.text-links-list a.button{background:#fafafa;border:1px solid #eee;display:block;margin-bottom:10px}}.groups-manage-members-list ul .action:not(.text-links-list) a.button{font-size:12px}@media screen and (min-width:46.8em){.groups-manage-members-list ul li .avatar,.groups-manage-members-list ul li .member-name{float:left}.groups-manage-members-list ul li .avatar{margin-right:15px}.groups-manage-members-list ul li .action{clear:both;float:left}}.buddypress .bp-invites-content ul.item-list{border-top:0}.buddypress .bp-invites-content ul.item-list li{border:1px solid #eaeaea;margin:0 0 1%;padding-left:5px;padding-right:5px;position:relative;width:auto}.buddypress .bp-invites-content ul.item-list li .list-title{text-align:center;width:auto}.buddypress .bp-invites-content ul.item-list li .action{position:absolute;top:10px;right:10px}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button{border:0}.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:focus,.buddypress .bp-invites-content ul.item-list li .action a.button.invite-button:hover{color:#1fb3dd}.buddypress .bp-invites-content ul.item-list li.selected{-webkit-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);-moz-box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2);box-shadow:inset 0 0 12px 0 rgba(237,187,52,.2)}.buddypress .bp-invites-content .group-inviters li,.buddypress .bp-invites-content .item-list .item-meta span{color:#767676}.buddypress .bp-invites-content li ul.group-inviters{clear:both;margin:0;overflow:hidden}.buddypress .bp-invites-content li ul.group-inviters li{border:0;float:left;font-size:20px;width:inherit}.buddypress .bp-invites-content li .status{font-size:20px;font-style:italic;clear:both;color:#555;margin:10px 0}.buddypress .bp-invites-content #send-invites-editor{overflow:hidden}.buddypress .bp-invites-content #send-invites-editor textarea{width:100%}.buddypress .bp-invites-content #send-invites-editor ul{clear:both;list-style:none;margin:10px 0;overflow:hidden}.buddypress .bp-invites-content #send-invites-editor ul li{float:left;margin:.5%;max-height:50px;max-width:50px}.buddypress .bp-invites-content #send-invites-editor .action{margin-top:10px;padding-top:10px}.buddypress .bp-invites-content #send-invites-editor.bp-hide{display:none}@media screen and (min-width:46.8em){.buddypress .bp-invites-content ul.item-list>li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #eaeaea;float:left;padding-left:.5em;padding-right:.5em;width:49.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(odd){margin-right:.5%}.buddypress .bp-invites-content ul.item-list>li:nth-child(even){margin-left:.5%}.buddypress .bp-invites-content ul.item-list ul.group-inviters{float:left;width:auto}}.buddypress.groups .activity-update-form{margin-top:0}.buddypress-wrap .profile{margin-top:30px}.buddypress-wrap .public .profile-fields td.label{width:30%}.buddypress-wrap .profile.edit .button-nav{list-style:none;margin:30px 0 10px}.buddypress-wrap .profile.edit .button-nav li{display:inline-block;margin-right:10px}.buddypress-wrap .profile.edit .button-nav li a{font-size:18px}.buddypress-wrap .profile.edit .editfield{background:#fafafa;border:1px solid #eee;margin:15px 0;padding:1em}.buddypress-wrap .profile.edit .editfield fieldset{border:0}.buddypress-wrap .profile.edit .editfield fieldset label{font-weight:400}.buddypress-wrap .profile.edit .editfield fieldset label.xprofile-field-label{display:inline}.buddypress-wrap .profile.edit .editfield{display:flex;flex-direction:column}.buddypress-wrap .profile.edit .editfield .description{margin-top:10px;order:2}.buddypress-wrap .profile.edit .editfield>fieldset{order:1}.buddypress-wrap .profile.edit .editfield .field-visibility-settings,.buddypress-wrap .profile.edit .editfield .field-visibility-settings-toggle{order:3}body.no-js .buddypress-wrap .field-visibility-settings-close,body.no-js .buddypress-wrap .field-visibility-settings-toggle{display:none}body.no-js .buddypress-wrap .field-visibility-settings{display:block}.buddypress-wrap .field-visibility-settings{margin:10px 0}.buddypress-wrap .current-visibility-level{font-style:normal;font-weight:700}.buddypress-wrap .field-visibility-settings,.buddypress-wrap .field-visibility-settings-header{color:#737373}.buddypress-wrap .field-visibility-settings fieldset{margin:5px 0}.buddypress-wrap .standard-form .editfield fieldset{margin:0}.buddypress-wrap .standard-form .field-visibility-settings label{font-weight:400;margin:0}.buddypress-wrap .standard-form .field-visibility-settings .radio{list-style:none;margin-bottom:0}.buddypress-wrap .standard-form .field-visibility-settings .field-visibility-settings-close{font-size:12px}.buddypress-wrap .standard-form .wp-editor-container{border:1px solid #dedede}.buddypress-wrap .standard-form .wp-editor-container textarea{background:#fff;width:100%}.buddypress-wrap .standard-form .description{background:#fafafa;font-size:inherit}.buddypress-wrap .standard-form .field-visibility-settings legend,.buddypress-wrap .standard-form .field-visibility-settings-header{font-style:italic}.buddypress-wrap .standard-form .field-visibility-settings-header{font-size:14px}.buddypress-wrap .standard-form .field-visibility-settings label,.buddypress-wrap .standard-form .field-visibility-settings legend{font-size:14px}.buddypress-wrap .standard-form .field-visibility select{margin:0}.buddypress-wrap .html-active button.switch-html{background:#f5f5f5;border-bottom-color:transparent;border-bottom-left-radius:0;border-bottom-right-radius:0}.buddypress-wrap .tmce-active button.switch-tmce{background:#f5f5f5;border-bottom-color:transparent;border-bottom-left-radius:0;border-bottom-right-radius:0}.buddypress-wrap .profile.public .profile-group-title{border-bottom:1px solid #ccc}body.register .buddypress-wrap .page ul{list-style:none}.buddypress-wrap .profile .bp-avatar-nav{margin-top:20px}.message-action-delete:before,.message-action-star:before,.message-action-unstar:before,.message-action-view:before{font-family:dashicons;font-size:18px}.message-action-star:before{color:#aaa;content:"\f154"}.message-action-unstar:before{color:#fcdd77;content:"\f155"}.message-action-view:before{content:"\f473"}.message-action-delete:before{content:"\f153"}.message-action-delete:hover:before{color:#a00}.preview-content .actions a{text-decoration:none}.bp-messages-content{margin:15px 0}.bp-messages-content .avatar{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.bp-messages-content .thread-participants{list-style:none}.bp-messages-content .thread-participants dd{margin-left:0}.bp-messages-content time{color:#737373;font-size:12px}#message-threads{border-top:1px solid #eaeaea;clear:both;list-style:none;margin:0;max-height:220px;overflow-x:hidden;overflow-y:auto;padding:0;width:100%}#message-threads li{border-bottom:1px solid #eaeaea;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;margin:0;overflow:hidden;padding:.5em 0}#message-threads li .thread-cb{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center;-webkit-flex:1 2 5%;-moz-flex:1 2 5%;-ms-flex:1 2 5%;-o-flex:1 2 5%;flex:1 2 5%}#message-threads li .thread-from{-webkit-flex:1 2 20%;-moz-flex:1 2 20%;-ms-flex:1 2 20%;-o-flex:1 2 20%;flex:1 2 20%}#message-threads li .thread-from img.avatar{float:left;margin:0 10px 0 0}#message-threads li .thread-from .user-name{display:inline-block;line-height:1.1}#message-threads li .thread-content{-webkit-flex:1 2 60%;-moz-flex:1 2 60%;-ms-flex:1 2 60%;-o-flex:1 2 60%;flex:1 2 60%}#message-threads li .thread-date{-webkit-flex:1 2 15%;-moz-flex:1 2 15%;-ms-flex:1 2 15%;-o-flex:1 2 15%;flex:1 2 15%}#message-threads li.selected{background-color:#fafafa}#message-threads li.selected .thread-subject .subject{color:#5087e5}#message-threads li .thread-content{cursor:pointer}#message-threads li .thread-content .excerpt{color:#737373;font-size:12px;margin:0}#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:13px}@media screen and (min-width:46.8em){#message-threads li .thread-content .thread-from,#message-threads li .thread-content .thread-subject{font-size:16px}}#message-threads li .thread-content .thread-subject{vertical-align:top}#message-threads li .thread-content .thread-subject .excerpt{font-weight:400}#message-threads li .thread-date{padding-right:5px;text-align:right}.bp-messages-content .actions{float:right;max-width:30%}.bp-messages-content .actions .bp-icons{display:inline-block;margin:0;padding:.3em .5em}.bp-messages-content .actions .bp-icons:before{font-size:26px}.bp-messages-content #thread-preview{border:1px solid #eaeaea;margin-top:20px}.bp-messages-content #thread-preview .preview-message{clear:both}.bp-messages-content #thread-preview .preview-content{margin:.5em}.bp-messages-content #thread-preview .preview-content .preview-message{background:#fafafa;margin:10px 0;padding:1em .3em .3em}.bp-messages-content #bp-message-thread-list{border-top:1px solid #eaeaea;clear:both;list-style:none;padding:1em 0 .3em}.bp-messages-content #bp-message-thread-list li{padding:.5em}.bp-messages-content #bp-message-thread-list li:nth-child(2n) .message-content{background:#fafafa}.bp-messages-content #bp-message-thread-list .message-metadata{border-bottom:1px solid #ccc;-webkit-box-shadow:-2px 1px 9px 0 #eee;-moz-box-shadow:-2px 1px 9px 0 #eee;box-shadow:-2px 1px 9px 0 #eee;overflow:hidden;padding:.2em}.bp-messages-content #bp-message-thread-list .message-metadata .avatar{width:30px}.bp-messages-content #bp-message-thread-list .message-metadata .user-link{display:block;font-size:13px;float:left}@media screen and (min-width:46.8em){.bp-messages-content #bp-message-thread-list .message-metadata .user-link{font-size:16px}}.bp-messages-content #bp-message-thread-list .message-metadata time{color:#737373;font-size:12px;padding:0 .5em}.bp-messages-content #bp-message-thread-list .message-metadata button{padding:0 .3em}.bp-messages-content #bp-message-thread-list .message-metadata button:before{font-size:20px}.bp-messages-content #bp-message-thread-list .message-content{clear:both;margin:1em auto 0;width:90%}.bp-messages-content #bp-message-thread-list img.avatar{float:left;margin:0 10px 0 0}.bp-messages-content #bp-message-thread-list .actions a:before{font-size:18px}.bp-messages-content form.send-reply .avatar-box{padding:.5em 0}.bp-messages-content .preview-pane-header,.bp-messages-content .single-message-thread-header{border-bottom:1px solid #eaeaea}.bp-messages-content .preview-pane-header:after,.bp-messages-content .single-message-thread-header:after{clear:both;content:"";display:table}.bp-messages-content .preview-thread-title,.bp-messages-content .single-thread-title{font-size:16px}.bp-messages-content .preview-thread-title .messages-title,.bp-messages-content .single-thread-title .messages-title{padding-left:2em}.bp-messages-content .thread-participants{float:left;margin:5px 0;width:70%}.bp-messages-content .thread-participants dd,.bp-messages-content .thread-participants ul{margin-bottom:10px}.bp-messages-content .thread-participants ul{list-style:none}.bp-messages-content .thread-participants ul:after{clear:both;content:"";display:table}.bp-messages-content .thread-participants li{float:left;margin-left:5px}.bp-messages-content .thread-participants img{width:30px}.bp-messages-content #bp-message-thread-list li .message-content blockquote,.bp-messages-content #bp-message-thread-list li .message-content ol,.bp-messages-content #bp-message-thread-list li .message-content ul,.bp-messages-content #thread-preview .preview-message blockquote,.bp-messages-content #thread-preview .preview-message ol,.bp-messages-content #thread-preview .preview-message ul{list-style-position:inside;margin-left:0}.bp-messages-content #thread-preview:empty,.bp-messages-content ul#message-threads:empty{display:none}.bp-messages-content #bp-message-thread-header h2:first-child,.bp-messages-content #thread-preview h2:first-child{background-color:#eaeaea;color:#555;font-weight:700;margin:0;padding:.5em}.bp-messages-content #bp-message-thread-list li a.user-link,.bp-messages-content #message-threads .thread-content a{border:0;text-decoration:none}.bp-messages-content .standard-form #subject{margin-bottom:20px}div.bp-navs#subsubnav.bp-messages-filters .user-messages-bulk-actions{margin-right:15px;max-width:42.5%}.buddypress.settings .profile-settings.bp-tables-user select{width:100%}.buddypress-wrap #whats-new-post-in-box select,.buddypress-wrap .filter select{border:1px solid #d6d6d6}.buddypress-wrap input.action[disabled]{cursor:pointer;opacity:.4}.buddypress-wrap #notification-bulk-manage[disabled]{display:none}.buddypress-wrap fieldset legend{font-size:inherit;font-weight:600}.buddypress-wrap input[type=email]:focus,.buddypress-wrap input[type=password]:focus,.buddypress-wrap input[type=tel]:focus,.buddypress-wrap input[type=text]:focus,.buddypress-wrap input[type=url]:focus,.buddypress-wrap textarea:focus{-webkit-box-shadow:0 0 8px #eaeaea;-moz-box-shadow:0 0 8px #eaeaea;box-shadow:0 0 8px #eaeaea}.buddypress-wrap select{height:auto}.buddypress-wrap textarea{resize:vertical}.buddypress-wrap .standard-form .bp-controls-wrap{margin:1em 0}.buddypress-wrap .standard-form .groups-members-search input[type=search],.buddypress-wrap .standard-form .groups-members-search input[type=text],.buddypress-wrap .standard-form [data-bp-search] input[type=search],.buddypress-wrap .standard-form [data-bp-search] input[type=text],.buddypress-wrap .standard-form input[type=color],.buddypress-wrap .standard-form input[type=date],.buddypress-wrap .standard-form input[type=datetime-local],.buddypress-wrap .standard-form input[type=datetime],.buddypress-wrap .standard-form input[type=email],.buddypress-wrap .standard-form input[type=month],.buddypress-wrap .standard-form input[type=number],.buddypress-wrap .standard-form input[type=password],.buddypress-wrap .standard-form input[type=range],.buddypress-wrap .standard-form input[type=search],.buddypress-wrap .standard-form input[type=tel],.buddypress-wrap .standard-form input[type=text],.buddypress-wrap .standard-form input[type=time],.buddypress-wrap .standard-form input[type=url],.buddypress-wrap .standard-form input[type=week],.buddypress-wrap .standard-form select,.buddypress-wrap .standard-form textarea{background:#fafafa;border:1px solid #d6d6d6;border-radius:0;font:inherit;font-size:100%;padding:.5em}.buddypress-wrap .standard-form input[required],.buddypress-wrap .standard-form select[required],.buddypress-wrap .standard-form textarea[required]{box-shadow:none;border-width:2px;outline:0}.buddypress-wrap .standard-form input[required]:invalid,.buddypress-wrap .standard-form select[required]:invalid,.buddypress-wrap .standard-form textarea[required]:invalid{border-color:#b71717}.buddypress-wrap .standard-form input[required]:valid,.buddypress-wrap .standard-form select[required]:valid,.buddypress-wrap .standard-form textarea[required]:valid{border-color:#91cc2c}.buddypress-wrap .standard-form input[required]:focus,.buddypress-wrap .standard-form select[required]:focus,.buddypress-wrap .standard-form textarea[required]:focus{border-color:#d6d6d6;border-width:1px}.buddypress-wrap .standard-form input.invalid[required],.buddypress-wrap .standard-form select.invalid[required],.buddypress-wrap .standard-form textarea.invalid[required]{border-color:#b71717}.buddypress-wrap .standard-form input:not(.button-small),.buddypress-wrap .standard-form textarea{width:100%}.buddypress-wrap .standard-form input[type=checkbox],.buddypress-wrap .standard-form input[type=radio]{margin-right:5px;width:auto}.buddypress-wrap .standard-form select{padding:3px}.buddypress-wrap .standard-form textarea{height:120px}.buddypress-wrap .standard-form textarea#message_content{height:200px}.buddypress-wrap .standard-form input[type=password]{margin-bottom:5px}.buddypress-wrap .standard-form input:focus,.buddypress-wrap .standard-form select:focus,.buddypress-wrap .standard-form textarea:focus{background:#fafafa;color:#555;outline:0}.buddypress-wrap .standard-form label,.buddypress-wrap .standard-form span.label{display:block;font-weight:600;margin:15px 0 5px;width:auto}.buddypress-wrap .standard-form a.clear-value{display:block;margin-top:5px;outline:0}.buddypress-wrap .standard-form .submit{clear:both;padding:15px 0 0}.buddypress-wrap .standard-form p.submit{margin-bottom:0}.buddypress-wrap .standard-form div.submit input{margin-right:15px}.buddypress-wrap .standard-form #invite-list label,.buddypress-wrap .standard-form p label{font-weight:400;margin:auto}.buddypress-wrap .standard-form p.description{color:#737373;margin:5px 0}.buddypress-wrap .standard-form div.checkbox label:nth-child(n+2),.buddypress-wrap .standard-form div.radio div label{color:#737373;font-size:100%;font-weight:400;margin:5px 0 0}.buddypress-wrap .standard-form#send-reply textarea{width:97.5%}.buddypress-wrap .standard-form#sidebar-login-form label{margin-top:5px}.buddypress-wrap .standard-form#sidebar-login-form input[type=password],.buddypress-wrap .standard-form#sidebar-login-form input[type=text]{padding:4px;width:95%}.buddypress-wrap .standard-form.profile-edit input:focus{background:#fff}@media screen and (min-width:46.8em){.buddypress-wrap .standard-form .left-menu{float:left}.buddypress-wrap .standard-form #invite-list ul{list-style:none;margin:1%}.buddypress-wrap .standard-form #invite-list ul li{margin:0 0 0 1%}.buddypress-wrap .standard-form .main-column{margin-left:190px}.buddypress-wrap .standard-form .main-column ul#friend-list{clear:none;float:left}.buddypress-wrap .standard-form .main-column ul#friend-list h4{clear:none}}.buddypress-wrap .standard-form .bp-tables-user label{margin:0}.buddypress-wrap .signup-form label,.buddypress-wrap .signup-form legend{font-weight:400}body.no-js .buddypress #delete_inbox_messages,body.no-js .buddypress #delete_sentbox_messages,body.no-js .buddypress #message-type-select,body.no-js .buddypress #messages-bulk-management #select-all-messages,body.no-js .buddypress #notifications-bulk-management #select-all-notifications,body.no-js .buddypress label[for=message-type-select]{display:none}.buddypress-wrap .wp-editor-wrap .wp-editor-wrap button,.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=button],.buddypress-wrap .wp-editor-wrap .wp-editor-wrap input[type=submit],.buddypress-wrap .wp-editor-wrap a.button,.buddypress-wrap .wp-editor-wrap input[type=reset]{padding:0 8px 1px}.buddypress-wrap .select-wrap{border:1px solid #eee}.buddypress-wrap .select-wrap label{display:inline}.buddypress-wrap .select-wrap select::-ms-expand{display:none}.buddypress-wrap .select-wrap select{-moz-appearance:none;-webkit-appearance:none;-o-appearance:none;appearance:none;border:0;cursor:pointer;margin-right:-25px;padding:6px 25px 6px 10px;position:relative;text-indent:-2px;z-index:1;width:100%}.buddypress-wrap .select-wrap select,.buddypress-wrap .select-wrap select:active,.buddypress-wrap .select-wrap select:focus{background:0 0}.buddypress-wrap .select-wrap span.select-arrow{display:inline-block;position:relative;z-index:0}.buddypress-wrap .select-wrap span.select-arrow:before{color:#ccc;content:"\25BC"}.buddypress-wrap .select-wrap:focus .select-arrow:before,.buddypress-wrap .select-wrap:hover .select-arrow:before{color:#a6a6a6}.buddypress-wrap .bp-search form:focus,.buddypress-wrap .bp-search form:hover,.buddypress-wrap .select-wrap:focus,.buddypress-wrap .select-wrap:hover{border:1px solid #d5d4d4;box-shadow:inset 0 0 3px #eee}@media screen and (min-width:32em){.buddypress-wrap .notifications-options-nav .select-wrap{float:left}}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after,.buddypress-wrap .bp-messages-search-form:before{content:" ";display:table}.buddypress-wrap .bp-dir-search-form,.buddypress-wrap .bp-messages-search-form:after{clear:both}.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{border:1px solid #eee;width:100%}@media screen and (min-width:55em){.buddypress-wrap form.bp-dir-search-form,.buddypress-wrap form.bp-invites-search-form,.buddypress-wrap form.bp-messages-search-form{width:15em}}.buddypress-wrap form.bp-dir-search-form label,.buddypress-wrap form.bp-invites-search-form label,.buddypress-wrap form.bp-messages-search-form label{margin:0}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{background:0 0;border:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;border-radius:0;background-clip:padding-box}.buddypress-wrap form.bp-dir-search-form input[type=search],.buddypress-wrap form.bp-dir-search-form input[type=text],.buddypress-wrap form.bp-invites-search-form input[type=search],.buddypress-wrap form.bp-invites-search-form input[type=text],.buddypress-wrap form.bp-messages-search-form input[type=search],.buddypress-wrap form.bp-messages-search-form input[type=text]{float:left;line-height:1.5;padding:3px 10px;width:80%}.buddypress-wrap form.bp-dir-search-form button[type=submit],.buddypress-wrap form.bp-invites-search-form button[type=submit],.buddypress-wrap form.bp-messages-search-form button[type=submit]{float:right;font-size:inherit;font-weight:400;line-height:1.5;padding:3px .7em;text-align:center;text-transform:none;width:20%}.buddypress-wrap form.bp-dir-search-form button[type=submit] span,.buddypress-wrap form.bp-invites-search-form button[type=submit] span,.buddypress-wrap form.bp-messages-search-form button[type=submit] span{font-family:dashicons;font-size:18px;line-height:1.6}.buddypress-wrap form.bp-dir-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-invites-search-form button[type=submit].bp-show,.buddypress-wrap form.bp-messages-search-form button[type=submit].bp-show{height:auto;left:0;overflow:visible;position:static;top:0}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-cancel-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-cancel-button{-webkit-appearance:searchfield-cancel-button}.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-dir-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-invites-search-form input[type=search]::-webkit-search-results-decoration,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-button,.buddypress-wrap form.bp-messages-search-form input[type=search]::-webkit-search-results-decoration{display:none}.buddypress-wrap ul.filters li form label input{line-height:1.4;padding:.1em .7em}.buddypress-wrap .current-member-type{font-style:italic}.buddypress-wrap .dir-form{clear:both}.budypress.no-js form.bp-dir-search-form button[type=submit]{height:auto;left:0;overflow:visible;position:static;top:0}.bp-user [data-bp-search] form input[type=search],.bp-user [data-bp-search] form input[type=text]{padding:6px 10px 7px}.buddypress-wrap .bp-tables-user,.buddypress-wrap table.forum,.buddypress-wrap table.wp-profile-fields{width:100%}.buddypress-wrap .bp-tables-user thead tr,.buddypress-wrap table.forum thead tr,.buddypress-wrap table.wp-profile-fields thead tr{background:0 0;border-bottom:2px solid #ccc}.buddypress-wrap .bp-tables-user tbody tr,.buddypress-wrap table.forum tbody tr,.buddypress-wrap table.wp-profile-fields tbody tr{background:#fafafa}.buddypress-wrap .bp-tables-user tr td,.buddypress-wrap .bp-tables-user tr th,.buddypress-wrap table.forum tr td,.buddypress-wrap table.forum tr th,.buddypress-wrap table.wp-profile-fields tr td,.buddypress-wrap table.wp-profile-fields tr th{padding:.5em;vertical-align:middle}.buddypress-wrap .bp-tables-user tr td.label,.buddypress-wrap table.forum tr td.label,.buddypress-wrap table.wp-profile-fields tr td.label{border-right:1px solid #eaeaea;font-weight:600;width:25%}.buddypress-wrap .bp-tables-user tr.alt td,.buddypress-wrap table.wp-profile-fields tr.alt td{background:#fafafa}.buddypress-wrap table.profile-fields .data{padding:.5em 1em}.buddypress-wrap table.profile-fields tr:last-child{border-bottom:none}.buddypress-wrap table.notifications td{padding:1em .5em}.buddypress-wrap table.notifications .bulk-select-all,.buddypress-wrap table.notifications .bulk-select-check{width:7%}.buddypress-wrap table.notifications .bulk-select-check{vertical-align:middle}.buddypress-wrap table.notifications .date,.buddypress-wrap table.notifications .notification-description,.buddypress-wrap table.notifications .notification-since,.buddypress-wrap table.notifications .title{width:39%}.buddypress-wrap table.notifications .actions,.buddypress-wrap table.notifications .notification-actions{width:15%}.buddypress-wrap table.notification-settings th.title,.buddypress-wrap table.profile-settings th.title{width:80%}.buddypress-wrap table.notifications .notification-actions a.delete,.buddypress-wrap table.notifications .notification-actions a.mark-read{display:inline-block}.buddypress-wrap table.notification-settings{margin-bottom:15px;text-align:left}.buddypress-wrap #groups-notification-settings{margin-bottom:0}.buddypress-wrap table.notification-settings td:first-child,.buddypress-wrap table.notification-settings th.icon,.buddypress-wrap table.notifications td:first-child,.buddypress-wrap table.notifications th.icon{display:none}.buddypress-wrap table.notification-settings .no,.buddypress-wrap table.notification-settings .yes{text-align:center;width:40px;vertical-align:middle}.buddypress-wrap table#message-threads{clear:both}.buddypress-wrap table#message-threads .thread-info{min-width:40%}.buddypress-wrap table#message-threads .thread-info p{margin:0}.buddypress-wrap table#message-threads .thread-info p.thread-excerpt{color:#737373;font-size:12px;margin-top:3px}.buddypress-wrap table.profile-fields{margin-bottom:20px}.buddypress-wrap table.profile-fields:last-child{margin-bottom:0}.buddypress-wrap table.profile-fields p{margin:0}.buddypress-wrap table.profile-fields p:last-child{margin-top:0}.bp-screen-reader-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}.center-vert{display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.bp-hide{display:none}.bp-show{height:auto;left:0;overflow:visible;position:static;top:0}.buddypress .buddypress-wrap .activity-read-more a,.buddypress .buddypress-wrap .comment-reply-link,.buddypress .buddypress-wrap .generic-button a,.buddypress .buddypress-wrap a.bp-title-button,.buddypress .buddypress-wrap a.button,.buddypress .buddypress-wrap button,.buddypress .buddypress-wrap input[type=button],.buddypress .buddypress-wrap input[type=reset],.buddypress .buddypress-wrap input[type=submit],.buddypress .buddypress-wrap ul.button-nav:not(.button-tabs) li a{background:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#555;cursor:pointer;font-size:inherit;font-weight:400;outline:0;padding:.3em .5em;text-align:center;text-decoration:none;width:auto}.buddypress .buddypress-wrap .button-small[type=button]{padding:0 8px 1px}.buddypress .buddypress-wrap .activity-read-more a:focus,.buddypress .buddypress-wrap .activity-read-more a:hover,.buddypress .buddypress-wrap .button-nav li a:focus,.buddypress .buddypress-wrap .button-nav li a:hover,.buddypress .buddypress-wrap .button-nav li.current a,.buddypress .buddypress-wrap .comment-reply-link:focus,.buddypress .buddypress-wrap .comment-reply-link:hover,.buddypress .buddypress-wrap .generic-button a:focus,.buddypress .buddypress-wrap .generic-button a:hover,.buddypress .buddypress-wrap a.button:focus,.buddypress .buddypress-wrap a.button:hover,.buddypress .buddypress-wrap button:focus,.buddypress .buddypress-wrap button:hover,.buddypress .buddypress-wrap input[type=button]:focus,.buddypress .buddypress-wrap input[type=button]:hover,.buddypress .buddypress-wrap input[type=reset]:focus,.buddypress .buddypress-wrap input[type=reset]:hover,.buddypress .buddypress-wrap input[type=submit]:focus,.buddypress .buddypress-wrap input[type=submit]:hover{background:#ededed;border-color:#999;color:#333;outline:0;text-decoration:none}.buddypress .buddypress-wrap a.disabled,.buddypress .buddypress-wrap button.disabled,.buddypress .buddypress-wrap button.pending,.buddypress .buddypress-wrap div.pending a,.buddypress .buddypress-wrap input[type=button].disabled,.buddypress .buddypress-wrap input[type=button].pending,.buddypress .buddypress-wrap input[type=reset].disabled,.buddypress .buddypress-wrap input[type=reset].pending,.buddypress .buddypress-wrap input[type=submit].pending,.buddypress .buddypress-wrap input[type=submit][disabled=disabled]{border-color:#eee;color:#767676;cursor:default}.buddypress .buddypress-wrap a.disabled:hover,.buddypress .buddypress-wrap button.disabled:hover,.buddypress .buddypress-wrap button.pending:hover,.buddypress .buddypress-wrap div.pending a:hover,.buddypress .buddypress-wrap input[type=button]:hover.disabled,.buddypress .buddypress-wrap input[type=button]:hover.pending,.buddypress .buddypress-wrap input[type=reset]:hover.disabled,.buddypress .buddypress-wrap input[type=reset]:hover.pending,.buddypress .buddypress-wrap input[type=submit]:hover.disabled,.buddypress .buddypress-wrap input[type=submit]:hover.pending{border-color:#eee;color:#767676}.buddypress .buddypress-wrap button.text-button,.buddypress .buddypress-wrap input.text-button{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#767676}.buddypress .buddypress-wrap button.text-button.small,.buddypress .buddypress-wrap input.text-button.small{font-size:13px}.buddypress .buddypress-wrap button.text-button:focus,.buddypress .buddypress-wrap button.text-button:hover,.buddypress .buddypress-wrap input.text-button:focus,.buddypress .buddypress-wrap input.text-button:hover{background:0 0;text-decoration:underline}.buddypress .buddypress-wrap .activity-list a.button{border:none}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover{color:#1fb3dd}.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li a.invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.group-remove-invite-button:hover,.buddypress .buddypress-wrap .bp-invites-content ul.bp-list li.selected a.invite-button:hover{color:#a00}.buddypress .buddypress-wrap #item-buttons:empty{display:none}.buddypress .buddypress-wrap input:disabled:focus,.buddypress .buddypress-wrap input:disabled:hover{background:0 0}.buddypress .buddypress-wrap .text-links-list a.button{background:0 0;border:none;border-right:1px solid #eee;color:#737373;display:inline-block;padding:.3em 1em}.buddypress .buddypress-wrap .text-links-list a.button:visited{color:#d6d6d6}.buddypress .buddypress-wrap .text-links-list a.button:focus,.buddypress .buddypress-wrap .text-links-list a.button:hover{color:#5087e5}.buddypress .buddypress-wrap .text-links-list a:first-child{padding-left:0}.buddypress .buddypress-wrap .text-links-list a:last-child{border-right:none}.buddypress .buddypress-wrap .bp-list.grid .action a,.buddypress .buddypress-wrap .bp-list.grid .action button{border:1px solid #ccc;display:block;margin:0}.buddypress .buddypress-wrap .bp-list.grid .action a:focus,.buddypress .buddypress-wrap .bp-list.grid .action a:hover,.buddypress .buddypress-wrap .bp-list.grid .action button:focus,.buddypress .buddypress-wrap .bp-list.grid .action button:hover{background:#ededed}.buddypress #buddypress .create-button{background:0 0;text-align:center}@media screen and (min-width:46.8em){.buddypress #buddypress .create-button{float:right}}.buddypress #buddypress .create-button a{border:1px solid #ccc;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;background-clip:padding-box;-webkit-box-shadow:inset 0 0 6px 0 #eaeaea;-moz-box-shadow:inset 0 0 6px 0 #eaeaea;box-shadow:inset 0 0 6px 0 #eaeaea;margin:.2em 0;width:auto}.buddypress #buddypress .create-button a:focus,.buddypress #buddypress .create-button a:hover{background:0 0;border-color:#ccc;-webkit-box-shadow:inset 0 0 12px 0 #eaeaea;-moz-box-shadow:inset 0 0 12px 0 #eaeaea;box-shadow:inset 0 0 12px 0 #eaeaea}@media screen and (min-width:46.8em){.buddypress #buddypress.bp-dir-vert-nav .create-button{float:none;padding-top:2em}.buddypress #buddypress.bp-dir-vert-nav .create-button a{margin-right:.5em}}.buddypress #buddypress.bp-dir-hori-nav .create-button{float:left}.buddypress #buddypress.bp-dir-hori-nav .create-button a,.buddypress #buddypress.bp-dir-hori-nav .create-button a:hover{background:0 0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;margin:0}.buddypress-wrap button.ac-reply-cancel,.buddypress-wrap button.bp-icons{background:0 0;border:0}.buddypress-wrap button.bp-icons:focus,.buddypress-wrap button.bp-icons:hover{background:0 0}.buddypress-wrap button.ac-reply-cancel:focus,.buddypress-wrap button.ac-reply-cancel:hover{background:0 0;text-decoration:underline}.buddypress-wrap .bp-invites-content li .invite-button span.icons:before,.buddypress-wrap .bp-invites-filters .invite-button span.icons:before,.buddypress-wrap .bp-messages-filters li a.messages-button:before,.buddypress-wrap .feed a:before,.buddypress-wrap .filter label:before{font-family:dashicons;font-size:18px}.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:27px}@media screen and (min-width:46.8em){.buddypress-wrap .bp-invites-content .item-list li .invite-button span.icons:before{font-size:32px}}.buddypress-wrap .bp-list a.button.invite-button:focus,.buddypress-wrap .bp-list a.button.invite-button:hover{background:0 0}.buddypress-wrap .filter label:before{content:"\f536"}.buddypress-wrap div.feed a:before,.buddypress-wrap li.feed a:before{content:"\f303"}.buddypress-wrap ul.item-list li .invite-button:not(.group-remove-invite-button) span.icons:before{content:"\f502"}.buddypress-wrap ul.item-list li .group-remove-invite-button span.icons:before,.buddypress-wrap ul.item-list li.selected .invite-button span.icons:before{content:"\f153"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-next-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-next-page:before{content:"\f345"}.buddypress-wrap .bp-invites-filters ul li #bp-invites-prev-page:before,.buddypress-wrap .bp-messages-filters ul li #bp-messages-prev-page:before{content:"\f341"}.buddypress-wrap .warn{color:#b71717}.buddypress-wrap .bp-messages{border:1px solid #ccc;margin:0 0 15px}.buddypress-wrap .bp-messages .sitewide-notices{display:block;margin:5px;padding:.5em}.buddypress-wrap .bp-messages.info{margin-bottom:0}.buddypress-wrap .bp-messages.updated{clear:both;display:block}.buddypress-wrap .bp-messages.bp-user-messages-feedback{border:0}.buddypress-wrap #group-create-body .bp-cover-image-status p.warning{background:#0b80a4;border:0;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.2);-moz-box-shadow:0 0 3px 0 rgba(0,0,0,.2);box-shadow:0 0 3px 0 rgba(0,0,0,.2);color:#fff}.buddypress-wrap .bp-feedback:not(.custom-homepage-info){display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row nowrap;-moz-flex-flow:row nowrap;-ms-flex-flow:row nowrap;-o-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch}.buddypress-wrap .bp-feedback{background:#fff;color:#807f7f;-webkit-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px 1px rgba(0,0,0,.1);color:#737373;margin:10px 0;position:relative}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback span.bp-icon{color:#fff;display:block;font-family:dashicons;left:0;margin-right:10px;position:relative;padding:0 .5em}.buddypress-wrap .bp-feedback .bp-help-text{font-style:italic}.buddypress-wrap .bp-feedback .text{font-size:14px;margin:0;padding:.5em 0}.buddypress-wrap .bp-feedback.no-icon{padding:.5em}.buddypress-wrap .bp-feedback.small:before{line-height:inherit}.buddypress-wrap a[data-bp-close] span:before,.buddypress-wrap button[data-bp-close] span:before{font-size:32px}.buddypress-wrap a[data-bp-close],.buddypress-wrap button[data-bp-close]{border:0;position:absolute;top:10px;right:10px;width:32px}.buddypress-wrap .bp-feedback.no-icon a[data-bp-close],.buddypress-wrap .bp-feedback.no-icon button[data-bp-close]{top:-6px;right:6px}.buddypress-wrap button[data-bp-close]:hover{background-color:transparent}.buddypress-wrap .bp-feedback p{margin:0}.buddypress-wrap .bp-feedback .bp-icon{font-size:20px;padding:0 2px}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon,.buddypress-wrap .bp-feedback.loading .bp-icon,.buddypress-wrap .bp-feedback.success .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{display:-webkit-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-align:center;-webkit-align-items:center;-webkit-box-align:center;align-items:center}.buddypress-wrap .bp-feedback.help .bp-icon,.buddypress-wrap .bp-feedback.info .bp-icon{background-color:#0b80a4}.buddypress-wrap .bp-feedback.help .bp-icon:before,.buddypress-wrap .bp-feedback.info .bp-icon:before{content:"\f348"}.buddypress-wrap .bp-feedback.error .bp-icon,.buddypress-wrap .bp-feedback.warning .bp-icon{background-color:#d33}.buddypress-wrap .bp-feedback.error .bp-icon:before,.buddypress-wrap .bp-feedback.warning .bp-icon:before{content:"\f534"}.buddypress-wrap .bp-feedback.loading .bp-icon{background-color:#ffd087}.buddypress-wrap .bp-feedback.loading .bp-icon:before{content:"\f469"}.buddypress-wrap .bp-feedback.success .bp-icon{background-color:#8a2}.buddypress-wrap .bp-feedback.success .bp-icon:before{content:"\f147"}.buddypress-wrap .bp-feedback.help .bp-icon:before{content:"\f468"}.buddypress-wrap #pass-strength-result{background-color:#eee;border-color:#ddd;border-style:solid;border-width:1px;display:none;font-weight:700;margin:10px 0 10px 0;padding:.5em;text-align:center;width:auto}.buddypress-wrap #pass-strength-result.show{display:block}.buddypress-wrap #pass-strength-result.mismatch{background-color:#333;border-color:transparent;color:#fff}.buddypress-wrap #pass-strength-result.bad,.buddypress-wrap #pass-strength-result.error{background-color:#ffb78c;border-color:#ff853c;color:#fff}.buddypress-wrap #pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040;color:#fff}.buddypress-wrap #pass-strength-result.strong{background-color:#66d66e;border-color:#438c48;color:#fff}.buddypress-wrap .standard-form#signup_form div div.error{background:#faa;color:#a00;margin:0 0 10px 0;padding:.5em;width:90%}.buddypress-wrap .accept,.buddypress-wrap .reject{float:left;margin-left:10px}.buddypress-wrap .members-list.grid .bp-ajax-message{background:rgba(255,255,255,.9);border:1px solid #eee;font-size:14px;left:2%;position:absolute;padding:.5em 1em;right:2%;top:30px}.buddypress.widget .item-options{font-size:14px}.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:column nowrap;-moz-flex-flow:column nowrap;-ms-flex-flow:column nowrap;-o-flex-flow:column nowrap;flex-flow:column nowrap;list-style:none;margin:10px -2%;overflow:hidden}@media screen and (min-width:32em){.buddypress.widget ul.item-list{display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:-o-flex;display:flex;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;-o-flex-flow:row wrap;flex-flow:row wrap}}.buddypress.widget ul.item-list li{border:1px solid #eee;-ms-flex-align:stretch;-webkit-align-items:stretch;-webkit-box-align:stretch;align-items:stretch;-webkit-flex:1 1 46%;-moz-flex:1 1 46%;-ms-flex:1 1 46%;-o-flex:1 1 46%;flex:1 1 46%;margin:2%}@media screen and (min-width:75em){.buddypress.widget ul.item-list li{-webkit-flex:0 1 20%;-moz-flex:0 1 20%;-ms-flex:0 1 20%;-o-flex:0 1 20%;flex:0 1 20%}}.buddypress.widget ul.item-list li .item-avatar{padding:.5em;text-align:center}.buddypress.widget ul.item-list li .item-avatar .avatar{width:60%}.buddypress.widget ul.item-list li .item{padding:0 .5em .5em}.buddypress.widget ul.item-list li .item .item-meta{font-size:12px;overflow-wrap:break-word}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 46%;-moz-flex:0 1 46%;-ms-flex:0 1 46%;-o-flex:0 1 46%;flex:0 1 46%;margin:2% 2% 10px}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list li .avatar{width:100%}}@media screen and (min-width:75em){.widget-area .buddypress.widget ul.item-list{margin:10px -2%;width:100%}.widget-area .buddypress.widget ul.item-list li{-webkit-flex:0 1 auto;-moz-flex:0 1 auto;-ms-flex:0 1 auto;-o-flex:0 1 auto;flex:0 1 auto;margin:10px 2% 1%;width:46%}}#buddypress-wrap *{transition:opacity .1s ease-in-out .1s}#buddypress-wrap a.button,#buddypress-wrap a.generic-button,#buddypress-wrap button,#buddypress-wrap input[type=reset],#buddypress-wrap input[type=submit]{transition:background .1s ease-in-out .1s,color .1s ease-in-out .1s,border-color .1s ease-in-out .1s}.buddypress-wrap a.loading,.buddypress-wrap input.loading{-moz-animation:loader-pulsate .5s infinite ease-in-out alternate;-webkit-animation:loader-pulsate .5s infinite ease-in-out alternate;animation:loader-pulsate .5s infinite ease-in-out alternate;border-color:#aaa}@-webkit-keyframes loader-pulsate{from{border-color:#aaa;-webkit-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-webkit-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@-moz-keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}@keyframes loader-pulsate{from{border-color:#aaa;-moz-box-shadow:0 0 6px #ccc;box-shadow:0 0 6px #ccc}to{border-color:#ccc;-moz-box-shadow:0 0 6px #f8f8f8;box-shadow:0 0 6px #f8f8f8}}.buddypress-wrap a.loading:hover,.buddypress-wrap input.loading:hover{color:#777}[data-bp-tooltip]{position:relative}[data-bp-tooltip]:after{background-color:#fff;display:none;opacity:0;position:absolute;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden}[data-bp-tooltip]:after{border:1px solid #737373;border-radius:1px;box-shadow:4px 4px 8px rgba(0,0,0,.2);color:#333;content:attr(data-bp-tooltip);font-family:"Helvetica Neue",helvetica,arial,san-serif;font-size:12px;font-weight:400;letter-spacing:normal;line-height:1.25;max-width:200px;padding:5px 8px;pointer-events:none;text-shadow:none;text-transform:none;-webkit-transition:all 1.5s ease;-ms-transition:all 1.5s ease;transition:all 1.5s ease;white-space:nowrap;word-wrap:break-word;z-index:100000}[data-bp-tooltip]:active:after,[data-bp-tooltip]:focus:after,[data-bp-tooltip]:hover:after{display:block;opacity:1;overflow:visible;visibility:visible}[data-bp-tooltip=""]{display:none;opacity:0;visibility:hidden}.bp-tooltip:after{left:50%;margin-top:7px;top:110%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}.user-list .bp-tooltip:after{left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}@media screen and (min-width:46.8em){.user-list .bp-tooltip:after{left:auto;right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}.activity-meta-action .bp-tooltip:after,.notification-actions .bp-tooltip:after,.participants-list .bp-tooltip:after{left:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.bp-invites-content .bp-tooltip:after{left:auto;right:0;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#item-body,.single-screen-navs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li,.grid>li .generic-button a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.grid>li{border-bottom:0;padding-bottom:10px;padding-top:0}.grid>li .list-wrap{background:#fafafa;border:1px solid #eee;padding-bottom:15px;position:relative;overflow:hidden;padding-top:14px}.grid>li .list-wrap .list-title{padding:.5em}.grid>li .list-wrap .update{color:#737373;padding:.5em 2em}.grid>li .item-avatar{text-align:center}.grid>li .item-avatar .avatar{border-radius:50%;display:inline-block;width:50%}@media screen and (min-width:24em){.grid.members-list .list-wrap{min-height:340px}.grid.members-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.members-group-list .list-wrap .item-block{margin:0 auto;min-height:7rem}.grid.groups-list .list-wrap{min-height:470px}.grid.groups-list .list-wrap .item-block{min-height:6rem}.grid.groups-list .list-wrap .group-desc{margin:15px auto 0;min-height:5em;overflow:hidden}.grid.groups-list .list-wrap .group-details,.grid.groups-list .list-wrap .item-desc,.grid.groups-list .list-wrap .last-activity{margin-bottom:0}.grid.groups-list .list-wrap .group-details p,.grid.groups-list .list-wrap .item-desc p,.grid.groups-list .list-wrap .last-activity p{margin-bottom:0}.grid.blogs-list .list-wrap{min-height:350px}.grid.blogs-list .list-wrap .item-block{margin:0 auto;min-height:7rem}}@media screen and (min-width:24em){.grid>li.item-entry{float:left;margin:0}.grid.two>li{padding-bottom:20px}}@media screen and (min-width:24em) and (min-width:75em){.grid.two>li .list-wrap{max-width:500px;margin:0 auto}}@media screen and (min-width:24em){.grid.three>li,.grid.two>li{width:50%}.grid.three>li:nth-child(odd),.grid.two>li:nth-child(odd){padding-right:10px}.grid.three>li:nth-child(even),.grid.two>li:nth-child(even){padding-left:10px}.grid.three>li .item,.grid.two>li .item{margin:1rem auto 0;width:80%}.grid.three>li .item .item-title,.grid.two>li .item .item-title{width:auto}}@media screen and (min-width:46.8em){.grid.three>li{padding-top:0;width:33.333333%;width:calc(100% / 3)}.grid.three>li:nth-child(1n+1){padding-left:5px;padding-right:5px}.grid.three>li:nth-child(3n+3){padding-left:5px;padding-right:0}.grid.three>li:nth-child(3n+1){padding-left:0;padding-right:5px}}@media screen and (min-width:46.8em){.grid.four>li{width:25%}.grid.four>li:nth-child(1n+1){padding-left:5px;padding-right:5px}.grid.four>li:nth-child(4n+4){padding-left:5px;padding-right:0}.grid.four>li:nth-child(4n+1){padding-left:0;padding-right:5px}}.buddypress-wrap .grid.bp-list{padding-top:1em}.buddypress-wrap .grid.bp-list>li{border-bottom:none}.buddypress-wrap .grid.bp-list>li .list-wrap{padding-bottom:3em}.buddypress-wrap .grid.bp-list>li .item-avatar{margin:0;text-align:center;width:auto}.buddypress-wrap .grid.bp-list>li .item-avatar img.avatar{display:inline-block;height:auto;width:50%}.buddypress-wrap .grid.bp-list>li .item-meta,.buddypress-wrap .grid.bp-list>li .list-title{float:none;text-align:center}.buddypress-wrap .grid.bp-list>li .list-title{font-size:inherit;line-height:1.1}.buddypress-wrap .grid.bp-list>li .item{font-size:18px;left:0;margin:0 auto;text-align:center;width:96%}@media screen and (min-width:46.8em){.buddypress-wrap .grid.bp-list>li .item{font-size:22px}}.buddypress-wrap .grid.bp-list>li .item .group-desc,.buddypress-wrap .grid.bp-list>li .item .item-block{float:none;width:96%}.buddypress-wrap .grid.bp-list>li .item .item-block{margin-bottom:10px}.buddypress-wrap .grid.bp-list>li .item .last-activity{margin-top:5px}.buddypress-wrap .grid.bp-list>li .item .group-desc{clear:none}.buddypress-wrap .grid.bp-list>li .item .user-update{clear:both;text-align:left}.buddypress-wrap .grid.bp-list>li .item .activity-read-more a{display:inline}.buddypress-wrap .grid.bp-list>li .action{bottom:5px;float:none;height:auto;left:0;margin:0;padding:0 5px;position:absolute;text-align:center;top:auto;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button{float:none;margin:5px 0 0;text-align:center;width:100%}.buddypress-wrap .grid.bp-list>li .action .generic-button a,.buddypress-wrap .grid.bp-list>li .action .generic-button button{width:100%}.buddypress-wrap .grid.bp-list>li .avatar,.buddypress-wrap .grid.bp-list>li .item,.buddypress-wrap .grid.bp-list>li .item-avatar{float:none}.buddypress-wrap .blogs-list.grid.two>li .blogs-title{min-height:5em}.buddypress-wrap .grid.four>li .group-desc,.buddypress-wrap .grid.three>li .group-desc{min-height:8em}.buddypress-wrap .blogs-list.grid.four>li,.buddypress-wrap .blogs-list.grid.three>li{min-height:350px}.buddypress-wrap .blogs-list.grid.four>li .last-activity,.buddypress-wrap .blogs-list.grid.three>li .last-activity{margin-bottom:0}.buddypress-wrap .blogs-list.grid.four>li .last-post,.buddypress-wrap .blogs-list.grid.three>li .last-post{margin-top:0}.buddypress:not(.logged-in) .grid.bp-list .list-wrap{padding-bottom:5px}.buddypress:not(.logged-in) .grid.groups-list .list-wrap{min-height:430px}.buddypress:not(.logged-in) .grid.members-list .list-wrap{min-height:300px}.buddypress:not(.logged-in) .grid.blogs-list .list-wrap{min-height:320px}@media screen and (min-width:46.8em){.bp-single-vert-nav .vertical{overflow:visible}.bp-single-vert-nav .vertical ul{border-right:1px solid #d6d6d6;float:left;margin-right:-1px;width:25%}.bp-single-vert-nav .vertical li{float:none}.bp-single-vert-nav .vertical li.selected a{background:#ccc;color:#333}.bp-single-vert-nav .vertical li:focus,.bp-single-vert-nav .vertical li:hover{background:#ccc}.bp-single-vert-nav .vertical li span{background:#d6d6d6;border-radius:10%;float:right;margin-right:2px}.bp-single-vert-nav .vertical li:hover span{border-color:#eaeaea}.bp-single-vert-nav .bp-wrap{margin-bottom:15px}.bp-single-vert-nav .bp-wrap .group-nav-tabs.groups-nav ul li,.bp-single-vert-nav .bp-wrap .user-nav-tabs.users-nav ul li{left:1px;position:relative}.bp-single-vert-nav .item-body:not(#group-create-body){background:#fff;border-left:1px solid #d6d6d6;float:right;margin:0;min-height:400px;padding:0 0 0 1em;width:calc(75% + 1px)}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links){background:#eaeaea;margin:0 0 0 -5px;width:auto}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li{font-size:16px;margin:10px 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a{border-right:1px solid #ccc;padding:0 .5em}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:focus,.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li a:hover{background:0 0}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li.current a{background:0 0;color:#333;text-decoration:underline}.bp-single-vert-nav .item-body:not(#group-create-body) #subnav:not(.tabbed-links) li:last-child a{border:none}.bp-dir-vert-nav .dir-navs{float:left;left:1px;position:relative;width:20%}.bp-dir-vert-nav .dir-navs ul li{float:none;overflow:hidden;width:auto}.bp-dir-vert-nav .dir-navs ul li.selected{border:1px solid #eee}.bp-dir-vert-nav .dir-navs ul li.selected a{background:#555;color:#fff}.bp-dir-vert-nav .dir-navs ul li.selected a span{background:#eaeaea;border-color:#ccc;color:#5087e5}.bp-dir-vert-nav .dir-navs ul li a:focus,.bp-dir-vert-nav .dir-navs ul li a:hover{background:#ccc;color:#333}.bp-dir-vert-nav .dir-navs ul li a:focus span,.bp-dir-vert-nav .dir-navs ul li a:hover span{border:1px solid #555}.bp-dir-vert-nav .screen-content{border-left:1px solid #d6d6d6;margin-left:20%;overflow:hidden;padding:0 0 2em 1em}.bp-dir-vert-nav .screen-content .subnav-filters{margin-top:0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li:not(.selected) a:hover,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:focus,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li:not(.selected) a:hover{background:0 0}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected{background:0 0;border:1px solid #d6d6d6;border-right-color:#fff}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a{background:0 0;color:#333;font-weight:600}.buddypress-wrap.bp-vertical-navs .dir-navs.activity-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.groups-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.members-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .dir-navs.sites-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.group-nav-tabs ul li.selected a span,.buddypress-wrap.bp-vertical-navs .main-navs.user-nav-tabs ul li.selected a span{background:#555;border:1px solid #d6d6d6;color:#fff}}
bp-templates/bp-nouveau/includes/customizer-controls.php CHANGED
@@ -36,7 +36,7 @@ class BP_Nouveau_Nav_Customize_Control extends WP_Customize_Control {
36
 
37
  // It's a group
38
  if ( 'group' === $this->type ) {
39
- $guide = __( 'Customizing the Groups navivation order needs you create at least one group first.', 'buddypress' );
40
 
41
  // Try to fetch any random group:
42
  $random = groups_get_groups(
36
 
37
  // It's a group
38
  if ( 'group' === $this->type ) {
39
+ $guide = __( 'Customizing the Groups navigation order needs you create at least one group first.', 'buddypress' );
40
 
41
  // Try to fetch any random group:
42
  $random = groups_get_groups(
bp-templates/bp-nouveau/includes/functions.php CHANGED
@@ -993,7 +993,7 @@ function bp_nouveau_get_user_feedback( $feedback_id = '' ) {
993
  ),
994
  'member-wp-profile-none' => array(
995
  'type' => 'info',
996
- 'message' => __( '%s did not save any profile informations yet.', 'buddypress' ),
997
  ),
998
  'member-delete-account' => array(
999
  'type' => 'warning',
993
  ),
994
  'member-wp-profile-none' => array(
995
  'type' => 'info',
996
+ 'message' => __( '%s did not save any profile information yet.', 'buddypress' ),
997
  ),
998
  'member-delete-account' => array(
999
  'type' => 'warning',
bp-templates/bp-nouveau/includes/groups/functions.php CHANGED
@@ -1102,7 +1102,7 @@ function bp_nouveau_groups_notification_filters() {
1102
  ),
1103
  array(
1104
  'id' => 'member_promoted_to_mod',
1105
- 'label' => __( 'Group Mod promotions', 'buddypress' ),
1106
  'position' => 95,
1107
  ),
1108
  array(
1102
  ),
1103
  array(
1104
  'id' => 'member_promoted_to_mod',
1105
+ 'label' => __( 'Group Moderator promotions', 'buddypress' ),
1106
  'position' => 95,
1107
  ),
1108
  array(
bp-templates/bp-nouveau/includes/groups/template-tags.php CHANGED
@@ -228,7 +228,7 @@ function bp_nouveau_group_creation_tabs() {
228
  <?php echo (int) $counter; ?> <?php echo esc_html( $step['name'] ); ?>
229
  </a>
230
  <?php else : ?>
231
- <a disabled="disabled"><?php echo (int) $counter; ?>. <?php echo esc_html( $step['name'] ); ?></a>
232
  <?php endif ?>
233
  </li>
234
  <?php
228
  <?php echo (int) $counter; ?> <?php echo esc_html( $step['name'] ); ?>
229
  </a>
230
  <?php else : ?>
231
+ <?php echo (int) $counter; ?>. <?php echo esc_html( $step['name'] ); ?>
232
  <?php endif ?>
233
  </li>
234
  <?php
buddypress.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the GPLv2 or later (license.txt).
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: BuddyPress 3.0.0-beta1\n"
6
  "Report-Msgid-Bugs-To: https://buddypress.trac.wordpress.org\n"
7
- "POT-Creation-Date: 2018-04-06 21:19:01+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -3508,7 +3508,7 @@ msgid "You already have a pending friendship request with this user"
3508
  msgstr ""
3509
 
3510
  #: bp-friends/actions/remove-friend.php:33
3511
- #: bp-templates/bp-legacy/buddypress-functions.php:1418
3512
  msgid "Friendship could not be canceled."
3513
  msgstr ""
3514
 
@@ -3603,7 +3603,7 @@ msgid "%d friends"
3603
  msgstr ""
3604
 
3605
  #: bp-friends/bp-friends-template.php:371
3606
- #: bp-templates/bp-legacy/buddypress-functions.php:1430
3607
  msgid "Cancel Friendship Request"
3608
  msgstr ""
3609
 
@@ -3616,8 +3616,8 @@ msgid "Cancel Friendship"
3616
  msgstr ""
3617
 
3618
  #: bp-friends/bp-friends-template.php:419
3619
- #: bp-templates/bp-legacy/buddypress-functions.php:1420
3620
- #: bp-templates/bp-legacy/buddypress-functions.php:1438
3621
  msgid "Add Friend"
3622
  msgstr ""
3623
 
@@ -4339,13 +4339,13 @@ msgid ""
4339
  msgstr ""
4340
 
4341
  #: bp-groups/bp-groups-template.php:3277
4342
- #: bp-templates/bp-legacy/buddypress-functions.php:1519
4343
- #: bp-templates/bp-legacy/buddypress-functions.php:1532
4344
  msgid "Leave Group"
4345
  msgstr ""
4346
 
4347
  #: bp-groups/bp-groups-template.php:3298
4348
- #: bp-templates/bp-legacy/buddypress-functions.php:1553
4349
  msgid "Join Group"
4350
  msgstr ""
4351
 
@@ -4354,12 +4354,12 @@ msgid "Accept Invitation"
4354
  msgstr ""
4355
 
4356
  #: bp-groups/bp-groups-template.php:3331
4357
- #: bp-templates/bp-legacy/buddypress-functions.php:1542
4358
  msgid "Request Sent"
4359
  msgstr ""
4360
 
4361
  #: bp-groups/bp-groups-template.php:3346
4362
- #: bp-templates/bp-legacy/buddypress-functions.php:1555
4363
  msgid "Request Membership"
4364
  msgstr ""
4365
 
@@ -6105,14 +6105,14 @@ msgstr ""
6105
  #: bp-templates/bp-legacy/buddypress/activity/index.php:155
6106
  #: bp-templates/bp-legacy/buddypress/groups/single/activity.php:12
6107
  #: bp-templates/bp-nouveau/buddypress/common/search-and-filters-bar.php:14
6108
- #: bp-templates/bp-nouveau/buddypress/groups/single/activity.php:16
6109
  msgid "RSS Feed"
6110
  msgstr ""
6111
 
6112
  #: bp-templates/bp-legacy/buddypress/activity/index.php:155
6113
  #: bp-templates/bp-legacy/buddypress/groups/single/activity.php:12
6114
  #: bp-templates/bp-nouveau/buddypress/common/search-and-filters-bar.php:14
6115
- #: bp-templates/bp-nouveau/buddypress/groups/single/activity.php:16
6116
  msgid "RSS"
6117
  msgstr ""
6118
 
@@ -6505,7 +6505,7 @@ msgstr ""
6505
 
6506
  #: bp-templates/bp-legacy/buddypress/groups/create.php:378
6507
  #: bp-templates/bp-legacy/buddypress/groups/single/invites-loop.php:74
6508
- #: bp-templates/bp-legacy/buddypress-functions.php:1364
6509
  msgid "Remove Invite"
6510
  msgstr ""
6511
 
@@ -7231,7 +7231,7 @@ msgstr ""
7231
  msgid "Visibility"
7232
  msgstr ""
7233
 
7234
- #: bp-templates/bp-legacy/buddypress-functions.php:60 class-buddypress.php:720
7235
  msgid "BuddyPress Legacy"
7236
  msgstr ""
7237
 
@@ -7294,59 +7294,59 @@ msgstr ""
7294
  msgid "There was a problem when deleting. Please try again."
7295
  msgstr ""
7296
 
7297
- #: bp-templates/bp-legacy/buddypress-functions.php:1368
7298
  msgid ""
7299
  "%s has previously requested to join this group. Sending an invitation will "
7300
  "automatically add the member to the group."
7301
  msgstr ""
7302
 
7303
- #: bp-templates/bp-legacy/buddypress-functions.php:1410
7304
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:104
7305
  msgid "No member found by that ID."
7306
  msgstr ""
7307
 
7308
- #: bp-templates/bp-legacy/buddypress-functions.php:1428
7309
  msgid " Friendship could not be requested."
7310
  msgstr ""
7311
 
7312
- #: bp-templates/bp-legacy/buddypress-functions.php:1440
7313
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:206
7314
  msgid "Friendship request could not be cancelled."
7315
  msgstr ""
7316
 
7317
- #: bp-templates/bp-legacy/buddypress-functions.php:1445
7318
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:216
7319
  msgid "Request Pending"
7320
  msgstr ""
7321
 
7322
- #: bp-templates/bp-legacy/buddypress-functions.php:1466
7323
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:117
7324
  msgid "There was a problem accepting that request. Please try again."
7325
  msgstr ""
7326
 
7327
- #: bp-templates/bp-legacy/buddypress-functions.php:1486
7328
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:141
7329
  msgid "There was a problem rejecting that request. Please try again."
7330
  msgstr ""
7331
 
7332
- #: bp-templates/bp-legacy/buddypress-functions.php:1517
7333
  msgid "Error joining group"
7334
  msgstr ""
7335
 
7336
- #: bp-templates/bp-legacy/buddypress-functions.php:1530
7337
- #: bp-templates/bp-legacy/buddypress-functions.php:1540
7338
  msgid "Error requesting membership"
7339
  msgstr ""
7340
 
7341
- #: bp-templates/bp-legacy/buddypress-functions.php:1551
7342
  msgid "Error leaving group"
7343
  msgstr ""
7344
 
7345
- #: bp-templates/bp-legacy/buddypress-functions.php:1577
7346
  msgid "There was a problem closing the notice."
7347
  msgstr ""
7348
 
7349
- #: bp-templates/bp-legacy/buddypress-functions.php:1644
7350
  msgid "There was a problem sending that reply. Please try again."
7351
  msgstr ""
7352
 
@@ -7552,7 +7552,7 @@ msgid "Messages menu"
7552
  msgstr ""
7553
 
7554
  #: bp-templates/bp-nouveau/buddypress/members/single/notifications.php:9
7555
- msgid "Notifcations menu"
7556
  msgstr ""
7557
 
7558
  #: bp-templates/bp-nouveau/buddypress/members/single/parts/item-nav.php:9
@@ -7747,7 +7747,7 @@ msgstr ""
7747
 
7748
  #: bp-templates/bp-nouveau/includes/customizer-controls.php:39
7749
  msgid ""
7750
- "Customizing the Groups navivation order needs you create at least one group "
7751
  "first."
7752
  msgstr ""
7753
 
@@ -7994,7 +7994,7 @@ msgid "Loading the members of your community, please wait."
7994
  msgstr ""
7995
 
7996
  #: bp-templates/bp-nouveau/includes/functions.php:996
7997
- msgid "%s did not save any profile informations yet."
7998
  msgstr ""
7999
 
8000
  #: bp-templates/bp-nouveau/includes/functions.php:1000
@@ -8256,7 +8256,7 @@ msgid "Group Admin promotions"
8256
  msgstr ""
8257
 
8258
  #: bp-templates/bp-nouveau/includes/groups/functions.php:1105
8259
- msgid "Group Mod promotions"
8260
  msgstr ""
8261
 
8262
  #: bp-templates/bp-nouveau/includes/groups/functions.php:1110
@@ -8821,7 +8821,7 @@ msgstr ""
8821
  msgid "Cheatin&#8217; huh?"
8822
  msgstr ""
8823
 
8824
- #: class-buddypress.php:728
8825
  msgid "BuddyPress Nouveau"
8826
  msgstr ""
8827
 
2
  # This file is distributed under the GPLv2 or later (license.txt).
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: BuddyPress 3.0.0-beta2\n"
6
  "Report-Msgid-Bugs-To: https://buddypress.trac.wordpress.org\n"
7
+ "POT-Creation-Date: 2018-04-17 15:57:46+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
3508
  msgstr ""
3509
 
3510
  #: bp-friends/actions/remove-friend.php:33
3511
+ #: bp-templates/bp-legacy/buddypress-functions.php:1419
3512
  msgid "Friendship could not be canceled."
3513
  msgstr ""
3514
 
3603
  msgstr ""
3604
 
3605
  #: bp-friends/bp-friends-template.php:371
3606
+ #: bp-templates/bp-legacy/buddypress-functions.php:1431
3607
  msgid "Cancel Friendship Request"
3608
  msgstr ""
3609
 
3616
  msgstr ""
3617
 
3618
  #: bp-friends/bp-friends-template.php:419
3619
+ #: bp-templates/bp-legacy/buddypress-functions.php:1421
3620
+ #: bp-templates/bp-legacy/buddypress-functions.php:1439
3621
  msgid "Add Friend"
3622
  msgstr ""
3623
 
4339
  msgstr ""
4340
 
4341
  #: bp-groups/bp-groups-template.php:3277
4342
+ #: bp-templates/bp-legacy/buddypress-functions.php:1520
4343
+ #: bp-templates/bp-legacy/buddypress-functions.php:1533
4344
  msgid "Leave Group"
4345
  msgstr ""
4346
 
4347
  #: bp-groups/bp-groups-template.php:3298
4348
+ #: bp-templates/bp-legacy/buddypress-functions.php:1554
4349
  msgid "Join Group"
4350
  msgstr ""
4351
 
4354
  msgstr ""
4355
 
4356
  #: bp-groups/bp-groups-template.php:3331
4357
+ #: bp-templates/bp-legacy/buddypress-functions.php:1543
4358
  msgid "Request Sent"
4359
  msgstr ""
4360
 
4361
  #: bp-groups/bp-groups-template.php:3346
4362
+ #: bp-templates/bp-legacy/buddypress-functions.php:1556
4363
  msgid "Request Membership"
4364
  msgstr ""
4365
 
6105
  #: bp-templates/bp-legacy/buddypress/activity/index.php:155
6106
  #: bp-templates/bp-legacy/buddypress/groups/single/activity.php:12
6107
  #: bp-templates/bp-nouveau/buddypress/common/search-and-filters-bar.php:14
6108
+ #: bp-templates/bp-nouveau/buddypress/groups/single/activity.php:17
6109
  msgid "RSS Feed"
6110
  msgstr ""
6111
 
6112
  #: bp-templates/bp-legacy/buddypress/activity/index.php:155
6113
  #: bp-templates/bp-legacy/buddypress/groups/single/activity.php:12
6114
  #: bp-templates/bp-nouveau/buddypress/common/search-and-filters-bar.php:14
6115
+ #: bp-templates/bp-nouveau/buddypress/groups/single/activity.php:17
6116
  msgid "RSS"
6117
  msgstr ""
6118
 
6505
 
6506
  #: bp-templates/bp-legacy/buddypress/groups/create.php:378
6507
  #: bp-templates/bp-legacy/buddypress/groups/single/invites-loop.php:74
6508
+ #: bp-templates/bp-legacy/buddypress-functions.php:1365
6509
  msgid "Remove Invite"
6510
  msgstr ""
6511
 
7231
  msgid "Visibility"
7232
  msgstr ""
7233
 
7234
+ #: bp-templates/bp-legacy/buddypress-functions.php:60 class-buddypress.php:724
7235
  msgid "BuddyPress Legacy"
7236
  msgstr ""
7237
 
7294
  msgid "There was a problem when deleting. Please try again."
7295
  msgstr ""
7296
 
7297
+ #: bp-templates/bp-legacy/buddypress-functions.php:1369
7298
  msgid ""
7299
  "%s has previously requested to join this group. Sending an invitation will "
7300
  "automatically add the member to the group."
7301
  msgstr ""
7302
 
7303
+ #: bp-templates/bp-legacy/buddypress-functions.php:1411
7304
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:104
7305
  msgid "No member found by that ID."
7306
  msgstr ""
7307
 
7308
+ #: bp-templates/bp-legacy/buddypress-functions.php:1429
7309
  msgid " Friendship could not be requested."
7310
  msgstr ""
7311
 
7312
+ #: bp-templates/bp-legacy/buddypress-functions.php:1441
7313
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:206
7314
  msgid "Friendship request could not be cancelled."
7315
  msgstr ""
7316
 
7317
+ #: bp-templates/bp-legacy/buddypress-functions.php:1446
7318
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:216
7319
  msgid "Request Pending"
7320
  msgstr ""
7321
 
7322
+ #: bp-templates/bp-legacy/buddypress-functions.php:1467
7323
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:117
7324
  msgid "There was a problem accepting that request. Please try again."
7325
  msgstr ""
7326
 
7327
+ #: bp-templates/bp-legacy/buddypress-functions.php:1487
7328
  #: bp-templates/bp-nouveau/includes/friends/ajax.php:141
7329
  msgid "There was a problem rejecting that request. Please try again."
7330
  msgstr ""
7331
 
7332
+ #: bp-templates/bp-legacy/buddypress-functions.php:1518
7333
  msgid "Error joining group"
7334
  msgstr ""
7335
 
7336
+ #: bp-templates/bp-legacy/buddypress-functions.php:1531
7337
+ #: bp-templates/bp-legacy/buddypress-functions.php:1541
7338
  msgid "Error requesting membership"
7339
  msgstr ""
7340
 
7341
+ #: bp-templates/bp-legacy/buddypress-functions.php:1552
7342
  msgid "Error leaving group"
7343
  msgstr ""
7344
 
7345
+ #: bp-templates/bp-legacy/buddypress-functions.php:1578
7346
  msgid "There was a problem closing the notice."
7347
  msgstr ""
7348
 
7349
+ #: bp-templates/bp-legacy/buddypress-functions.php:1645
7350
  msgid "There was a problem sending that reply. Please try again."
7351
  msgstr ""
7352
 
7552
  msgstr ""
7553
 
7554
  #: bp-templates/bp-nouveau/buddypress/members/single/notifications.php:9
7555
+ msgid "Notifications menu"
7556
  msgstr ""
7557
 
7558
  #: bp-templates/bp-nouveau/buddypress/members/single/parts/item-nav.php:9
7747
 
7748
  #: bp-templates/bp-nouveau/includes/customizer-controls.php:39
7749
  msgid ""
7750
+ "Customizing the Groups navigation order needs you create at least one group "
7751
  "first."
7752
  msgstr ""
7753
 
7994
  msgstr ""
7995
 
7996
  #: bp-templates/bp-nouveau/includes/functions.php:996
7997
+ msgid "%s did not save any profile information yet."
7998
  msgstr ""
7999
 
8000
  #: bp-templates/bp-nouveau/includes/functions.php:1000
8256
  msgstr ""
8257
 
8258
  #: bp-templates/bp-nouveau/includes/groups/functions.php:1105
8259
+ msgid "Group Moderator promotions"
8260
  msgstr ""
8261
 
8262
  #: bp-templates/bp-nouveau/includes/groups/functions.php:1110
8821
  msgid "Cheatin&#8217; huh?"
8822
  msgstr ""
8823
 
8824
+ #: class-buddypress.php:732
8825
  msgid "BuddyPress Nouveau"
8826
  msgstr ""
8827
 
class-buddypress.php CHANGED
@@ -303,7 +303,7 @@ class BuddyPress {
303
 
304
  /** Versions **********************************************************/
305
 
306
- $this->version = '3.0.0-beta1';
307
  $this->db_version = 11105;
308
 
309
  /** Loading ***********************************************************/
@@ -491,6 +491,10 @@ class BuddyPress {
491
  require( $this->plugin_dir . 'bp-core/deprecated/2.9.php' );
492
  require( $this->plugin_dir . 'bp-core/deprecated/3.0.php' );
493
  }
 
 
 
 
494
  }
495
 
496
  /**
303
 
304
  /** Versions **********************************************************/
305
 
306
+ $this->version = '3.0.0-beta2';
307
  $this->db_version = 11105;
308
 
309
  /** Loading ***********************************************************/
491
  require( $this->plugin_dir . 'bp-core/deprecated/2.9.php' );
492
  require( $this->plugin_dir . 'bp-core/deprecated/3.0.php' );
493
  }
494
+
495
+ if ( defined( 'WP_CLI' ) && file_exists( $this->plugin_dir . 'cli/wp-cli-bp.php' ) ) {
496
+ require( $this->plugin_dir . 'cli/wp-cli-bp.php' );
497
+ }
498
  }
499
 
500
  /**
cli/.distignore ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .DS_Store
2
+ .git
3
+ .gitignore
4
+ .gitlab-ci.yml
5
+ .editorconfig
6
+ .travis.yml
7
+ behat.yml
8
+ circle.yml
9
+ bin/
10
+ features/
11
+ utils/
12
+ *.zip
13
+ *.tar.gz
cli/.editorconfig ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file is for unifying the coding style for different editors and IDEs
2
+ # editorconfig.org
3
+
4
+ # WordPress Coding Standards
5
+ # https://make.wordpress.org/core/handbook/coding-standards/
6
+
7
+ root = true
8
+
9
+ [*]
10
+ charset = utf-8
11
+ end_of_line = lf
12
+ insert_final_newline = true
13
+ trim_trailing_whitespace = true
14
+ indent_style = tab
15
+
16
+ [{.jshintrc,*.json,*.yml,*.feature}]
17
+ indent_style = space
18
+ indent_size = 2
19
+
20
+ [{*.txt,wp-config-sample.php}]
21
+ end_of_line = crlf
22
+
23
+ [composer.json]
24
+ indent_style = space
25
+ indent_size = 4
cli/.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ .DS_Store
2
+ wp-cli.local.yml
3
+ node_modules/
4
+ vendor/
5
+ *.zip
6
+ *.tar.gz
cli/.travis.yml ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ sudo: false
2
+ dist: trusty
3
+
4
+ language: php
5
+
6
+ notifications:
7
+ email:
8
+ on_success: never
9
+ on_failure: change
10
+
11
+ branches:
12
+ only:
13
+ - master
14
+
15
+ cache:
16
+ directories:
17
+ - $HOME/.composer/cache
18
+
19
+ env:
20
+ global:
21
+ - PATH="$TRAVIS_BUILD_DIR/vendor/bin:$PATH"
22
+ - WP_CLI_BIN_DIR="$TRAVIS_BUILD_DIR/vendor/bin"
23
+
24
+ matrix:
25
+ include:
26
+ - php: 7.1
27
+ env: WP_VERSION=latest
28
+ - php: 7.0
29
+ env: WP_VERSION=latest
30
+ - php: 5.6
31
+ env: WP_VERSION=latest
32
+ - php: 5.6
33
+ env: WP_VERSION=4.4
34
+ - php: 5.6
35
+ env: WP_VERSION=trunk
36
+ - php: 5.3
37
+ dist: precise
38
+ env: WP_VERSION=latest
39
+
40
+ before_install:
41
+ - |
42
+ # Remove Xdebug for a huge performance increase:
43
+ if [ -f ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini ]; then
44
+ phpenv config-rm xdebug.ini
45
+ else
46
+ echo "xdebug.ini does not exist"
47
+ fi
48
+
49
+ install:
50
+ - composer install
51
+ - bash bin/install-package-tests.sh
52
+ - export BP_SRC_DIR=/tmp/bp-src/
53
+ - svn co --ignore-externals https://buddypress.svn.wordpress.org/trunk/src $BP_SRC_DIR
54
+
55
+ before_script:
56
+ - composer validate
57
+
58
+ script:
59
+ - bash bin/test.sh
cli/bin/install-package-tests.sh ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env bash
2
+
3
+ set -ex
4
+
5
+ install_db() {
6
+ mysql -e 'CREATE DATABASE IF NOT EXISTS wp_cli_test;' -uroot
7
+ mysql -e 'GRANT ALL PRIVILEGES ON wp_cli_test.* TO "wp_cli_test"@"localhost" IDENTIFIED BY "password1"' -uroot
8
+ }
9
+
10
+ install_db
cli/bin/test.sh ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ set -ex
4
+
5
+ # Run the unit tests, if they exist
6
+ if [ -f "phpunit.xml" ] || [ -f "phpunit.xml.dist" ]
7
+ then
8
+ phpunit
9
+ fi
10
+
11
+ # Run the functional tests
12
+ BEHAT_TAGS=$(php utils/behat-tags.php)
13
+ vendor/behat/behat/bin/behat --format progress $BEHAT_TAGS --strict
cli/component.php ADDED
@@ -0,0 +1,112 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+ use WP_CLI\CommandWithDBObject;
6
+
7
+ /**
8
+ * Base component class.
9
+ *
10
+ * @since 1.0
11
+ */
12
+ abstract class BuddypressCommand extends CommandWithDBObject {
13
+
14
+ /**
15
+ * Get a random user id.
16
+ *
17
+ * @since 1.1
18
+ *
19
+ * @return int
20
+ */
21
+ protected function get_random_user_id() {
22
+ global $wpdb;
23
+ return $wpdb->get_var( "SELECT ID FROM $wpdb->users ORDER BY RAND() LIMIT 1" );
24
+ }
25
+
26
+ /**
27
+ * Get a group ID from its identifier (ID or slug).
28
+ *
29
+ * @since 1.5.0
30
+ *
31
+ * @param int|string $group_id Group ID or slug.
32
+ * @return int|bool
33
+ */
34
+ protected function get_group_id_from_identifier( $group_id ) {
35
+ // Group ID or slug.
36
+ if ( ! is_numeric( $group_id ) ) {
37
+ $group_id = groups_get_id( $group_id );
38
+ }
39
+
40
+ // Get group object.
41
+ $group_obj = groups_get_group( array(
42
+ 'group_id' => $group_id,
43
+ ) );
44
+
45
+ if ( empty( $group_obj->id ) ) {
46
+ WP_CLI::error( 'No group found by that slug or ID.' );
47
+ }
48
+
49
+ return intval( $group_obj->id );
50
+ }
51
+
52
+ /**
53
+ * Verify a user ID by the passed identifier.
54
+ *
55
+ * @since 1.2.0
56
+ *
57
+ * @param mixed $i User ID, email or login.
58
+ * @return WP_User|false
59
+ */
60
+ protected function get_user_id_from_identifier( $i ) {
61
+ if ( is_numeric( $i ) ) {
62
+ $user = get_user_by( 'id', $i );
63
+ } elseif ( is_email( $i ) ) {
64
+ $user = get_user_by( 'email', $i );
65
+ } else {
66
+ $user = get_user_by( 'login', $i );
67
+ }
68
+
69
+ if ( ! $user ) {
70
+ WP_CLI::error( sprintf( 'No user found by that username or ID (%s).', $i ) );
71
+ }
72
+
73
+ return $user;
74
+ }
75
+
76
+ /**
77
+ * Generate random text
78
+ *
79
+ * @since 1.1
80
+ */
81
+ protected function generate_random_text() {
82
+ return 'Here is some random text';
83
+ }
84
+
85
+ /**
86
+ * Get field ID.
87
+ *
88
+ * @since 1.5.0
89
+ *
90
+ * @param int $field_id Field ID.
91
+ * @return int
92
+ */
93
+ protected function get_field_id( $field_id ) {
94
+ if ( ! is_numeric( $field_id ) ) {
95
+ return xprofile_get_field_id_from_name( $field_id );
96
+ }
97
+
98
+ return absint( $field_id );
99
+ }
100
+
101
+ /**
102
+ * String Sanitization.
103
+ *
104
+ * @since 1.5.0
105
+ *
106
+ * @param string $type String to sanitize.
107
+ * @return string Sanitized string.
108
+ */
109
+ protected function sanitize_string( $type ) {
110
+ return strtolower( str_replace( '-', '_', $type ) );
111
+ }
112
+ }
cli/components/activity-favorite.php ADDED
@@ -0,0 +1,172 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress activity favorite.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class Activity_Favorite extends BuddypressCommand {
12
+
13
+ /**
14
+ * Object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'id',
20
+ 'user_id',
21
+ 'component',
22
+ 'type',
23
+ 'action',
24
+ 'item_id',
25
+ 'primary_link',
26
+ 'secondary_item_id',
27
+ 'date_recorded',
28
+ 'hide_sitewide',
29
+ 'is_spam',
30
+ );
31
+
32
+ /**
33
+ * Add an activity item as a favorite for a user.
34
+ *
35
+ * ## OPTIONS
36
+ *
37
+ * <activity-id>
38
+ * : ID of the activity to add an item to.
39
+ *
40
+ * <user>
41
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
42
+ *
43
+ * ## EXAMPLE
44
+ *
45
+ * $ wp bp activity favorite add 100 500
46
+ * Success: Activity item added as a favorite for the user.
47
+ *
48
+ * $ wp bp activity favorite create 100 user_test
49
+ * Success: Activity item added as a favorite for the user.
50
+ *
51
+ * @alias add
52
+ */
53
+ public function create( $args, $assoc_args ) {
54
+ $activity_id = $args[0];
55
+ $activity = new \BP_Activity_Activity( $activity_id );
56
+
57
+ if ( empty( $activity->id ) ) {
58
+ WP_CLI::error( 'No activity found by that ID.' );
59
+ }
60
+
61
+ $user = $this->get_user_id_from_identifier( $args[1] );
62
+
63
+ if ( bp_activity_add_user_favorite( $activity_id, $user->ID ) ) {
64
+ WP_CLI::success( 'Activity item added as a favorite for the user.' );
65
+ } else {
66
+ WP_CLI::error( 'Could not add the activity item.' );
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Remove an activity item as a favorite for a user.
72
+ *
73
+ * ## OPTIONS
74
+ *
75
+ * <activity-id>
76
+ * : ID of the activity to remove a item to.
77
+ *
78
+ * <user>
79
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
80
+ *
81
+ * [--yes]
82
+ * : Answer yes to the confirmation message.
83
+ *
84
+ * ## EXAMPLES
85
+ *
86
+ * $ wp bp activity favorite remove 100 500
87
+ * Success: Activity item removed as a favorite for the user.
88
+ *
89
+ * $ wp bp activity favorite delete 100 user_test --yes
90
+ * Success: Activity item removed as a favorite for the user.
91
+ *
92
+ * @alias delete
93
+ */
94
+ public function remove( $args, $assoc_args ) {
95
+ $activity_id = $args[0];
96
+ $activity = new \BP_Activity_Activity( $activity_id );
97
+
98
+ if ( empty( $activity->id ) ) {
99
+ WP_CLI::error( 'No activity found by that ID.' );
100
+ }
101
+
102
+ $user = $this->get_user_id_from_identifier( $args[1] );
103
+
104
+ WP_CLI::confirm( 'Are you sure you want to remove this activity item?', $assoc_args );
105
+
106
+ if ( bp_activity_remove_user_favorite( $activity_id, $user->ID ) ) {
107
+ WP_CLI::success( 'Activity item removed as a favorite for the user.' );
108
+ } else {
109
+ WP_CLI::error( 'Could not remove the activity item.' );
110
+ }
111
+ }
112
+
113
+ /**
114
+ * Get a user's favorite activity items.
115
+ *
116
+ * ## OPTIONS
117
+ *
118
+ * <user>
119
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
120
+ *
121
+ * [--<field>=<value>]
122
+ * : One or more parameters to pass to \BP_Activity_Activity::get()
123
+ *
124
+ * [--format=<format>]
125
+ * : Render output in a particular format.
126
+ * ---
127
+ * default: table
128
+ * options:
129
+ * - table
130
+ * - csv
131
+ * - ids
132
+ * - json
133
+ * - count
134
+ * - yaml
135
+ * ---
136
+ *
137
+ * [--count=<number>]
138
+ * : How many activity favorites to list.
139
+ * ---
140
+ * default: 50
141
+ * ---
142
+ *
143
+ * ## EXAMPLES
144
+ *
145
+ * $ wp bp activity favorite list 315
146
+ *
147
+ * @subcommand list
148
+ * @alias items
149
+ * @alias user_items
150
+ */
151
+ public function _list( $args, $assoc_args ) {
152
+ $user = $this->get_user_id_from_identifier( $args[0] );
153
+ $favorites = bp_activity_get_user_favorites( $user->ID );
154
+
155
+ if ( ! $favorites ) {
156
+ WP_CLI::error( 'No favorite found for this user.' );
157
+ }
158
+
159
+ $activities = bp_activity_get_specific( array(
160
+ 'activity_ids' => $favorites,
161
+ 'per_page' => $assoc_args['count'],
162
+ ) );
163
+
164
+ // Sanity check.
165
+ if ( empty( $activities['activities'] ) ) {
166
+ WP_CLI::error( 'No favorite found for this user.' );
167
+ }
168
+
169
+ $formatter = $this->get_formatter( $assoc_args );
170
+ $formatter->display_items( $activities['activities'] );
171
+ }
172
+ }
cli/components/activity.php ADDED
@@ -0,0 +1,976 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress Activities.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class Activity extends BuddypressCommand {
12
+
13
+ /**
14
+ * Object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'id',
20
+ 'user_id',
21
+ 'component',
22
+ 'type',
23
+ 'action',
24
+ 'item_id',
25
+ 'primary_link',
26
+ 'secondary_item_id',
27
+ 'date_recorded',
28
+ 'hide_sitewide',
29
+ 'is_spam',
30
+ );
31
+
32
+ /**
33
+ * Create an activity item.
34
+ *
35
+ * ## OPTIONS
36
+ *
37
+ * [--component=<component>]
38
+ * : The component for the activity item (groups, activity, etc). If
39
+ * none is provided, a component will be randomly selected from the
40
+ * active components.
41
+ *
42
+ * [--type=<type>]
43
+ * : Activity type (activity_update, group_created, etc). If none is
44
+ * provided, a type will be randomly chose from those natively
45
+ * associated with your <component>.
46
+ *
47
+ * [--action=<action>]
48
+ * : Action text (eg "Joe created a new group Foo"). If none is
49
+ * provided, one will be generated automatically based on other params.
50
+ *
51
+ * [--content=<content>]
52
+ * : Activity content text. If none is provided, default text will be
53
+ * generated.
54
+ *
55
+ * [--primary-link=<primary-link>]
56
+ * : URL of the item, as used in RSS feeds. If none is provided, a URL
57
+ * will be generated based on passed parameters.
58
+ *
59
+ * [--user-id=<user>]
60
+ * : ID of the user associated with the new item. If none is provided,
61
+ * a user will be randomly selected.
62
+ *
63
+ * [--item-id=<item-id>]
64
+ * : ID of the associated item. If none is provided, one will be
65
+ * generated automatically, if your activity type requires it.
66
+ *
67
+ * [--secondary-item-id=<secondary-item-id>]
68
+ * : ID of the secondary associated item. If none is provided, one will
69
+ * be generated automatically, if your activity type requires it.
70
+ *
71
+ * [--date-recorded=<date-recorded>]
72
+ * : GMT timestamp, in Y-m-d h:i:s format.
73
+ * ---
74
+ * Default: Current time
75
+ * ---
76
+ *
77
+ * [--hide-sitewide=<hide-sitewide>]
78
+ * : Whether to hide in sitewide streams.
79
+ * ---
80
+ * Default: 0
81
+ * ---
82
+ *
83
+ * [--is-spam=<is-spam>]
84
+ * : Whether the item should be marked as spam.
85
+ * ---
86
+ * Default: 0
87
+ * ---
88
+ *
89
+ * [--silent]
90
+ * : Whether to silent the activity creation.
91
+ *
92
+ * [--porcelain]
93
+ * : Output only the new activity id.
94
+ *
95
+ * ## EXAMPLES
96
+ *
97
+ * $ wp bp activity create --is-spam=1
98
+ * Success: Successfully created new activity item (ID #5464)
99
+ *
100
+ * $ wp bp activity add --component=groups --user-id=10
101
+ * Success: Successfully created new activity item (ID #48949)
102
+ *
103
+ * @alias add
104
+ */
105
+ public function create( $args, $assoc_args ) {
106
+ $r = wp_parse_args( $assoc_args, array(
107
+ 'component' => '',
108
+ 'type' => '',
109
+ 'action' => '',
110
+ 'content' => '',
111
+ 'primary-link' => '',
112
+ 'user-id' => '',
113
+ 'item-id' => '',
114
+ 'secondary-item-id' => '',
115
+ 'date-recorded' => bp_core_current_time(),
116
+ 'hide-sitewide' => 0,
117
+ 'is-spam' => 0,
118
+ ) );
119
+
120
+ // Fill in any missing information.
121
+ if ( empty( $r['component'] ) ) {
122
+ $r['component'] = $this->get_random_component();
123
+ }
124
+
125
+ if ( empty( $r['type'] ) ) {
126
+ $r['type'] = $this->get_random_type_from_component( $r['component'] );
127
+ }
128
+
129
+ if ( 'groups' === $r['component'] ) {
130
+ $group_id = $r['component'];
131
+
132
+ if ( ! is_numeric( $group_id ) ) {
133
+ $group_id = groups_get_id( $group_id );
134
+ }
135
+
136
+ // Get group object.
137
+ $group_obj = groups_get_group( array(
138
+ 'group_id' => $group_id,
139
+ ) );
140
+
141
+ $r['item-id'] = intval( $group_obj->id );
142
+ }
143
+
144
+ // If some data is not set, we have to generate it.
145
+ if ( empty( $r['item-id'] ) || empty( $r['secondary-item-id'] ) ) {
146
+ $r = $this->generate_item_details( $r );
147
+ }
148
+
149
+ $id = bp_activity_add( array(
150
+ 'action' => $r['action'],
151
+ 'content' => $r['content'],
152
+ 'component' => $r['component'],
153
+ 'type' => $r['type'],
154
+ 'primary_link' => $r['primary-link'],
155
+ 'user_id' => $r['user-id'],
156
+ 'item_id' => $r['item-id'],
157
+ 'secondary_item_id' => $r['secondary-item-id'],
158
+ 'date_recorded' => $r['date-recorded'],
159
+ 'hide_sitewide' => (bool) $r['hide-sitewide'],
160
+ 'is_spam' => (bool) $r['is-spam'],
161
+ ) );
162
+
163
+ // Silent it before it errors.
164
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
165
+ return;
166
+ }
167
+
168
+ if ( ! is_numeric( $id ) ) {
169
+ WP_CLI::error( 'Could not create activity item.' );
170
+ }
171
+
172
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
173
+ WP_CLI::line( $id );
174
+ } else {
175
+ WP_CLI::success( sprintf( 'Successfully created new activity item (ID #%d)', $id ) );
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Retrieve a list of activities.
181
+ *
182
+ * ## OPTIONS
183
+ *
184
+ * [--<field>=<value>]
185
+ * : One or more parameters to pass to \BP_Activity_Activity::get()
186
+ *
187
+ * [--user-id=<user>]
188
+ * : Limit activities to a specific user id. Accepts a numeric ID.
189
+ *
190
+ * [--component=<component>]
191
+ * : Limit activities to a specific or certain components.
192
+ *
193
+ * [--type=<type>]
194
+ * : Type of the activity. Ex.: activity_update, profile_updated.
195
+ *
196
+ * [--primary-id=<primary-id>]
197
+ * : Object ID to filter the activities. Ex.: group_id or forum_id or blog_id, etc.
198
+ *
199
+ * [--secondary-id=<secondary-id>]
200
+ * : Secondary object ID to filter the activities. Ex.: a post_id.
201
+ *
202
+ * [--count=<number>]
203
+ * : How many activities to list.
204
+ * ---
205
+ * default: 50
206
+ * ---
207
+ *
208
+ * [--format=<format>]
209
+ * : Render output in a particular format.
210
+ * ---
211
+ * default: table
212
+ * options:
213
+ * - table
214
+ * - csv
215
+ * - ids
216
+ * - json
217
+ * - count
218
+ * - yaml
219
+ * ---
220
+ *
221
+ * ## AVAILABLE FIELDS
222
+ *
223
+ * These fields will be displayed by default for each activity:
224
+ *
225
+ * * ID
226
+ * * user_id
227
+ * * component
228
+ * * type
229
+ * * action
230
+ * * content
231
+ * * item_id
232
+ * * secondary_item_id
233
+ * * primary_link
234
+ * * date_recorded
235
+ * * is_spam
236
+ * * user_email
237
+ * * user_nicename
238
+ * * user_login
239
+ * * display_name
240
+ * * user_fullname
241
+ *
242
+ * ## EXAMPLES
243
+ *
244
+ * $ wp bp activity list --format=ids
245
+ * $ wp bp activity list --format=count
246
+ * $ wp bp activity list --per_page=5
247
+ * $ wp bp activity list --search_terms="Activity Comment"
248
+ * $ wp bp activity list --user-id=10
249
+ * $ wp bp activity list --user-id=123 --component=groups
250
+ *
251
+ * @subcommand list
252
+ */
253
+ public function _list( $_, $assoc_args ) {
254
+ $formatter = $this->get_formatter( $assoc_args );
255
+
256
+ $r = wp_parse_args( $assoc_args, array(
257
+ 'page' => 1,
258
+ 'count' => 50,
259
+ 'count_total' => false,
260
+ 'show_hidden' => true,
261
+ 'filter' => false,
262
+ ) );
263
+
264
+ // Activities to list.
265
+ $r['per_page'] = $r['count'];
266
+
267
+ if ( isset( $assoc_args['user-id'] ) && is_numeric( $assoc_args['user-id'] ) ) {
268
+ $r['filter']['user_id'] = $assoc_args['user-id'];
269
+ }
270
+
271
+ if ( isset( $assoc_args['component'] ) ) {
272
+ $r['filter']['object'] = $assoc_args['component'];
273
+ }
274
+
275
+ if ( isset( $assoc_args['type'] ) ) {
276
+ $r['filter']['action'] = $assoc_args['type'];
277
+ }
278
+
279
+ if ( isset( $assoc_args['primary-id'] ) ) {
280
+ $r['filter']['primary_id'] = $assoc_args['primary-id'];
281
+ }
282
+
283
+ if ( isset( $assoc_args['secondary-id'] ) ) {
284
+ $r['filter']['secondary_id'] = $assoc_args['secondary-id'];
285
+ }
286
+
287
+ $r = self::process_csv_arguments_to_arrays( $r );
288
+
289
+ // If count or ids, no need for activity objects.
290
+ if ( in_array( $formatter->format, array( 'ids', 'count' ), true ) ) {
291
+ $r['fields'] = 'ids';
292
+ }
293
+
294
+ $activities = bp_activity_get( $r );
295
+ if ( empty( $activities['activities'] ) ) {
296
+ WP_CLI::error( 'No activities found.' );
297
+ }
298
+
299
+ if ( 'ids' === $formatter->format ) {
300
+ echo implode( ' ', $activities['activities'] ); // WPCS: XSS ok.
301
+ } elseif ( 'count' === $formatter->format ) {
302
+ $formatter->display_items( $activities['total'] );
303
+ } else {
304
+ $formatter->display_items( $activities['activities'] );
305
+ }
306
+ }
307
+
308
+ /**
309
+ * Generate random activity items.
310
+ *
311
+ * ## OPTIONS
312
+ *
313
+ * [--count=<number>]
314
+ * : How many activity items to generate.
315
+ * ---
316
+ * default: 100
317
+ * ---
318
+ *
319
+ * [--skip-activity-comments=<skip-activity-comments>]
320
+ * : Whether to skip activity comments. Recording activity_comment
321
+ * items requires a resource-intensive tree rebuild.
322
+ * ---
323
+ * default: 1
324
+ * ---
325
+ *
326
+ * ## EXAMPLE
327
+ *
328
+ * $ wp bp activity generate --count=50
329
+ */
330
+ public function generate( $args, $assoc_args ) {
331
+ $component = $this->get_random_component();
332
+ $type = $this->get_random_type_from_component( $component );
333
+
334
+ if ( (bool) $assoc_args['skip-activity-comments'] && 'activity_comment' === $type ) {
335
+ $type = 'activity_update';
336
+ }
337
+
338
+ $notify = WP_CLI\Utils\make_progress_bar( 'Generating activity items', $assoc_args['count'] );
339
+
340
+ for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
341
+ $this->create( array(), array(
342
+ 'component' => $component,
343
+ 'type' => $type,
344
+ 'content' => $this->generate_random_text(),
345
+ 'silent',
346
+ ) );
347
+
348
+ $notify->tick();
349
+ }
350
+
351
+ $notify->finish();
352
+ }
353
+
354
+ /**
355
+ * Fetch specific activity.
356
+ *
357
+ * ## OPTIONS
358
+ *
359
+ * <activity-id>
360
+ * : Identifier for the activity.
361
+ *
362
+ * [--fields=<fields>]
363
+ * : Limit the output to specific fields.
364
+ *
365
+ * [--format=<format>]
366
+ * : Render output in a particular format.
367
+ * ---
368
+ * default: table
369
+ * options:
370
+ * - table
371
+ * - json
372
+ * - haml
373
+ * ---
374
+ *
375
+ * ## EXAMPLES
376
+ *
377
+ * $ wp bp activity get 500
378
+ * $ wp bp activity get 56 --format=json
379
+ */
380
+ public function get( $args, $assoc_args ) {
381
+ $activity_id = $args[0];
382
+
383
+ $activity = new \BP_Activity_Activity( $activity_id );
384
+
385
+ if ( empty( $activity->id ) ) {
386
+ WP_CLI::error( 'No activity found by that ID.' );
387
+ }
388
+
389
+ $activity = bp_activity_get_specific( array(
390
+ 'activity_ids' => $activity_id,
391
+ 'spam' => null,
392
+ 'display_comments' => true,
393
+ ) );
394
+
395
+ $activity = $activity['activities'][0];
396
+
397
+ if ( ! is_object( $activity ) ) {
398
+ WP_CLI::error( 'Could not find the activity.' );
399
+ }
400
+
401
+ $activity_arr = get_object_vars( $activity );
402
+ $activity_arr['url'] = bp_activity_get_permalink( $activity_id );
403
+
404
+ if ( empty( $assoc_args['fields'] ) ) {
405
+ $assoc_args['fields'] = array_keys( $activity_arr );
406
+ }
407
+
408
+ $formatter = $this->get_formatter( $assoc_args );
409
+ $formatter->display_item( $activity_arr );
410
+ }
411
+
412
+ /**
413
+ * Delete an activity.
414
+ *
415
+ * ## OPTIONS
416
+ *
417
+ * <activity-id>...
418
+ * : ID or IDs of activities to delete.
419
+ *
420
+ * [--yes]
421
+ * : Answer yes to the confirmation message.
422
+ *
423
+ * ## EXAMPLES
424
+ *
425
+ * $ wp bp activity delete 958695
426
+ * Success: Activity deleted.
427
+ *
428
+ * $ wp bp activity delete 500 --yes
429
+ * Success: Activity deleted.
430
+ *
431
+ * @alias remove
432
+ */
433
+ public function delete( $args, $assoc_args ) {
434
+ $activity_id = $args[0];
435
+
436
+ WP_CLI::confirm( 'Are you sure you want to delete this activity?', $assoc_args );
437
+
438
+ parent::_delete( array( $activity_id ), $assoc_args, function( $activity_id ) {
439
+ $activity = new \BP_Activity_Activity( $activity_id );
440
+
441
+ if ( empty( $activity->id ) ) {
442
+ WP_CLI::error( 'No activity found by that ID.' );
443
+ }
444
+
445
+ $retval = bp_activity_delete( array(
446
+ 'id' => $activity_id,
447
+ ) );
448
+
449
+ if ( $retval ) {
450
+ return array( 'success', 'Activity deleted.' );
451
+ } else {
452
+ return array( 'error', 'Could not delete the activity.' );
453
+ }
454
+ } );
455
+ }
456
+
457
+ /**
458
+ * Spam an activity.
459
+ *
460
+ * ## OPTIONS
461
+ *
462
+ * <activity-id>
463
+ * : Identifier for the activity.
464
+ *
465
+ * ## EXAMPLES
466
+ *
467
+ * $ wp bp activity spam 500
468
+ * Success: Activity marked as spam.
469
+ *
470
+ * $ wp bp activity unham 165165
471
+ * Success: Activity marked as spam.
472
+ *
473
+ * @alias unham
474
+ */
475
+ public function spam( $args, $assoc_args ) {
476
+ $activity = new \BP_Activity_Activity( $args[0] );
477
+
478
+ if ( empty( $activity->id ) ) {
479
+ WP_CLI::error( 'No activity found by that ID.' );
480
+ }
481
+
482
+ // Mark as spam.
483
+ bp_activity_mark_as_spam( $activity );
484
+
485
+ if ( $activity->save() ) {
486
+ WP_CLI::success( 'Activity marked as spam.' );
487
+ } else {
488
+ WP_CLI::error( 'Could not mark the activity as spam.' );
489
+ }
490
+ }
491
+
492
+ /**
493
+ * Ham an activity.
494
+ *
495
+ * ## OPTIONS
496
+ *
497
+ * <activity-id>
498
+ * : Identifier for the activity.
499
+ *
500
+ * ## EXAMPLES
501
+ *
502
+ * $ wp bp activity ham 500
503
+ * Success: Activity marked as ham.
504
+ *
505
+ * $ wp bp activity unspam 4679
506
+ * Success: Activity marked as ham.
507
+ *
508
+ * @alias unspam
509
+ */
510
+ public function ham( $args, $assoc_args ) {
511
+ $activity = new \BP_Activity_Activity( $args[0] );
512
+
513
+ if ( empty( $activity->id ) ) {
514
+ WP_CLI::error( 'No activity found by that ID.' );
515
+ }
516
+
517
+ // Mark as ham.
518
+ bp_activity_mark_as_ham( $activity );
519
+
520
+ if ( $activity->save() ) {
521
+ WP_CLI::success( 'Activity marked as ham.' );
522
+ } else {
523
+ WP_CLI::error( 'Could not mark the activity as ham.' );
524
+ }
525
+ }
526
+
527
+ /**
528
+ * Post an activity update.
529
+ *
530
+ * ## OPTIONS
531
+ *
532
+ * --user-id=<user>
533
+ * : ID of the user. If none is provided, a user will be randomly selected.
534
+ *
535
+ * --content=<content>
536
+ * : Activity content text. If none is provided, default text will be generated.
537
+ *
538
+ * [--porcelain]
539
+ * : Output only the new activity id.
540
+ *
541
+ * ## EXAMPLES
542
+ *
543
+ * $ wp bp activity post_update --user-id=50 --content="Content to update"
544
+ * Success: Successfully updated with a new activity item (ID #13165)
545
+ *
546
+ * $ wp bp activity post_update --user-id=140
547
+ * Success: Successfully updated with a new activity item (ID #4548)
548
+ *
549
+ * @alias post-update
550
+ */
551
+ public function post_update( $args, $assoc_args ) {
552
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
553
+
554
+ // Post the activity update.
555
+ $id = bp_activity_post_update( array(
556
+ 'content' => $assoc_args['content'],
557
+ 'user_id' => $user->ID,
558
+ ) );
559
+
560
+ // Activity ID returned on success update.
561
+ if ( ! is_numeric( $id ) ) {
562
+ WP_CLI::error( 'Could not post the activity update.' );
563
+ }
564
+
565
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
566
+ WP_CLI::line( $id );
567
+ } else {
568
+ WP_CLI::success( sprintf( 'Successfully updated with a new activity item (ID #%d)', $id ) );
569
+ }
570
+ }
571
+
572
+ /**
573
+ * Add an activity comment.
574
+ *
575
+ * ## OPTIONS
576
+ *
577
+ * <activity-id>
578
+ * : ID of the activity to add the comment.
579
+ *
580
+ * --user-id=<user>
581
+ * : ID of the user. If none is provided, a user will be randomly selected.
582
+ *
583
+ * --content=<content>
584
+ * : Activity content text. If none is provided, default text will be generated.
585
+ *
586
+ * [--skip-notification]
587
+ * : Whether to skip notification.
588
+ *
589
+ * [--porcelain]
590
+ * : Output only the new activity comment id.
591
+ *
592
+ * ## EXAMPLES
593
+ *
594
+ * $ wp bp activity comment 560 --user-id=50 --content="New activity comment"
595
+ * Success: Successfully added a new activity comment (ID #4645)
596
+ *
597
+ * $ wp bp activity comment 459 --user-id=140 --skip-notification=1
598
+ * Success: Successfully added a new activity comment (ID #494)
599
+ */
600
+ public function comment( $args, $assoc_args ) {
601
+ $activity = new \BP_Activity_Activity( $args[0] );
602
+
603
+ if ( empty( $activity->id ) ) {
604
+ WP_CLI::error( 'No activity found by that ID.' );
605
+ }
606
+
607
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
608
+ $skip_notification = WP_CLI\Utils\get_flag_value( $assoc_args, 'skip-notification' );
609
+
610
+ // Add activity comment.
611
+ $id = bp_activity_new_comment( array(
612
+ 'content' => $assoc_args['content'],
613
+ 'user_id' => $user->ID,
614
+ 'activity_id' => $activity->id,
615
+ 'skip_notification' => $skip_notification,
616
+ ) );
617
+
618
+ // Activity Comment ID returned on success.
619
+ if ( ! is_numeric( $id ) ) {
620
+ WP_CLI::error( 'Could not post a new activity comment.' );
621
+ }
622
+
623
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
624
+ WP_CLI::line( $id );
625
+ } else {
626
+ WP_CLI::success( sprintf( 'Successfully added a new activity comment (ID #%d)', $id ) );
627
+ }
628
+ }
629
+
630
+ /**
631
+ * Delete an activity comment.
632
+ *
633
+ * ## OPTIONS
634
+ *
635
+ * <activity-id>
636
+ * : Identifier for the activity.
637
+ *
638
+ * --comment-id=<comment-id>
639
+ * : ID of the comment to delete.
640
+ *
641
+ * [--yes]
642
+ * : Answer yes to the confirmation message.
643
+ *
644
+ * ## EXAMPLES
645
+ *
646
+ * $ wp bp activity delete_comment 100 --comment-id=500
647
+ * Success: Activity comment deleted.
648
+ *
649
+ * $ wp bp activity delete_comment 165 --comment-id=35435 --yes
650
+ * Success: Activity comment deleted.
651
+ *
652
+ * @alias remove_comment
653
+ */
654
+ public function delete_comment( $args, $assoc_args ) {
655
+ $activity_id = $args[0];
656
+ $activity = new \BP_Activity_Activity( $activity_id );
657
+
658
+ if ( empty( $activity->id ) ) {
659
+ WP_CLI::error( 'No activity found by that ID.' );
660
+ }
661
+
662
+ WP_CLI::confirm( 'Are you sure you want to delete this activity comment?', $assoc_args );
663
+
664
+ // Delete Comment. True if deleted.
665
+ if ( bp_activity_delete_comment( $activity_id, $assoc_args['comment-id'] ) ) {
666
+ WP_CLI::success( 'Activity comment deleted.' );
667
+ } else {
668
+ WP_CLI::error( 'Could not delete the activity comment.' );
669
+ }
670
+ }
671
+
672
+ /**
673
+ * Pull up a random active component for use in activity items.
674
+ *
675
+ * @since 1.1
676
+ *
677
+ * @return string
678
+ */
679
+ protected function get_random_component() {
680
+ $c = buddypress()->active_components;
681
+
682
+ // Core components that accept activity items.
683
+ $ca = $this->get_components_and_actions();
684
+
685
+ return array_rand( array_flip( array_intersect( array_keys( $c ), array_keys( $ca ) ) ) );
686
+ }
687
+
688
+ /**
689
+ * Get a random type from a component.
690
+ *
691
+ * @since 1.1
692
+ *
693
+ * @param string $component Component name.
694
+ * @return string
695
+ */
696
+ protected function get_random_type_from_component( $component ) {
697
+ $ca = $this->get_components_and_actions();
698
+ return array_rand( array_flip( $ca[ $component ] ) );
699
+ }
700
+
701
+ /**
702
+ * Get a list of activity components and actions.
703
+ *
704
+ * @since 1.1
705
+ *
706
+ * @return array
707
+ */
708
+ protected function get_components_and_actions() {
709
+ $actions = array_map(
710
+ function( $component ) {
711
+ return array_keys( (array) $component );
712
+ },
713
+ (array) bp_activity_get_actions()
714
+ );
715
+
716
+ return $actions;
717
+ }
718
+
719
+ /**
720
+ * Generate item details.
721
+ *
722
+ * @since 1.1
723
+ */
724
+ protected function generate_item_details( $r ) {
725
+ global $wpdb, $bp;
726
+
727
+ switch ( $r['type'] ) {
728
+ case 'activity_update':
729
+ if ( empty( $r['user-id'] ) ) {
730
+ $r['user-id'] = $this->get_random_user_id();
731
+ }
732
+
733
+ // Make group updates look more like actual group updates.
734
+ // i.e. give them links to their groups.
735
+ if ( 'groups' === $r['component'] ) {
736
+
737
+ if ( empty( $r['item-id'] ) ) {
738
+ WP_CLI::error( 'No group found by that ID.' );
739
+ }
740
+
741
+ // get the group.
742
+ $group_obj = groups_get_group( array(
743
+ 'group_id' => $r['item-id'],
744
+ ) );
745
+
746
+ // make sure such a group exists.
747
+ if ( empty( $group_obj->id ) ) {
748
+ WP_CLI::error( 'No group found by that slug or id.' );
749
+ }
750
+
751
+ // stolen from groups_join_group.
752
+ $r['action'] = sprintf( __( '%1$s posted an update in the group %2$s', 'buddypress'), bp_core_get_userlink( $r['user-id'] ), '<a href="' . bp_get_group_permalink( $group_obj ) . '">' . esc_attr( $group_obj->name ) . '</a>' );
753
+ } else {
754
+ // old way, for some other kind of update.
755
+ $r['action'] = sprintf( __( '%s posted an update', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ) );
756
+ }
757
+ if ( empty( $r['content'] ) ) {
758
+ $r['content'] = $this->generate_random_text();
759
+ }
760
+
761
+ $r['primary-link'] = bp_core_get_userlink( $r['user-id'] );
762
+
763
+ break;
764
+
765
+ case 'activity_comment':
766
+ if ( empty( $r['user-id'] ) ) {
767
+ $r['user-id'] = $this->get_random_user_id();
768
+ }
769
+
770
+ $parent_item = $wpdb->get_row( "SELECT * FROM {$bp->activity->table_name} ORDER BY RAND() LIMIT 1" );
771
+
772
+ if ( 'activity_comment' === $parent_item->type ) {
773
+ $r['item-id'] = $parent_item->id;
774
+ $r['secondary-item-id'] = $parent_item->secondary_item_id;
775
+ } else {
776
+ $r['item-id'] = $parent_item->id;
777
+ }
778
+
779
+ $r['action'] = sprintf( __( '%s posted a new activity comment', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ) );
780
+ $r['content'] = $this->generate_random_text();
781
+ $r['primary-link'] = bp_core_get_userlink( $r['user-id'] );
782
+
783
+ break;
784
+
785
+ case 'new_blog':
786
+ case 'new_blog_post':
787
+ case 'new_blog_comment':
788
+ if ( ! bp_is_active( 'blogs' ) ) {
789
+ return $r;
790
+ }
791
+
792
+ if ( is_multisite() ) {
793
+ $r['item-id'] = $wpdb->get_var( "SELECT blog_id FROM {$wpdb->blogs} ORDER BY RAND() LIMIT 1" );
794
+ } else {
795
+ $r['item-id'] = 1;
796
+ }
797
+
798
+ // Need blog content for posts/comments.
799
+ if ( 'new_blog_post' === $r['type'] || 'new_blog_comment' === $r['type'] ) {
800
+
801
+ if ( is_multisite() ) {
802
+ switch_to_blog( $r['item-id'] );
803
+ }
804
+
805
+ $comment_info = $wpdb->get_results( "SELECT comment_id, comment_post_id FROM {$wpdb->comments} ORDER BY RAND() LIMIT 1" );
806
+ $comment_id = $comment_info[0]->comment_id;
807
+ $comment = get_comment( $comment_id );
808
+
809
+ $post_id = $comment_info[0]->comment_post_id;
810
+ $post = get_post( $post_id );
811
+
812
+ if ( is_multisite() ) {
813
+ restore_current_blog();
814
+ }
815
+ }
816
+
817
+ // new_blog.
818
+ if ( 'new_blog' === $r['type'] ) {
819
+ if ( '' === $r['user-id'] ) {
820
+ $r['user-id'] = $this->get_random_user_id();
821
+ }
822
+
823
+ if ( ! $r['action'] ) {
824
+ $r['action'] = sprintf( __( '%s created the site %s', 'buddypress'), bp_core_get_userlink( $r['user-id'] ), '<a href="' . get_home_url( $r['item-id'] ) . '">' . esc_attr( get_blog_option( $r['item-id'], 'blogname' ) ) . '</a>' );
825
+ }
826
+
827
+ if ( ! $r['primary-link'] ) {
828
+ $r['primary-link'] = get_home_url( $r['item-id'] );
829
+ }
830
+
831
+ // new_blog_post.
832
+ } elseif ( 'new_blog_post' === $r['type'] ) {
833
+ if ( '' === $r['user-id'] ) {
834
+ $r['user-id'] = $post->post_author;
835
+ }
836
+
837
+ if ( '' === $r['primary-link'] ) {
838
+ $r['primary-link'] = add_query_arg( 'p', $post->ID, trailingslashit( get_home_url( $r['item-id'] ) ) );
839
+ }
840
+
841
+ if ( '' === $r['action'] ) {
842
+ $r['action'] = sprintf( __( '%1$s wrote a new post, %2$s', 'buddypress' ), bp_core_get_userlink( (int) $post->post_author ), '<a href="' . $r['primary-link'] . '">' . $post->post_title . '</a>' );
843
+ }
844
+
845
+ if ( '' === $r['content'] ) {
846
+ $r['content'] = $post->post_content;
847
+ }
848
+
849
+ if ( '' === $r['secondary-item-id'] ) {
850
+ $r['secondary-item-id'] = $post->ID;
851
+ }
852
+
853
+ // new_blog_comment.
854
+ } else {
855
+ // groan - have to fake this.
856
+ if ( '' === $r['user-id'] ) {
857
+ $user = get_user_by( 'email', $comment->comment_author_email );
858
+ $r['user-id'] = ( empty( $user ) )
859
+ ? $this->get_random_user_id()
860
+ : $user->ID;
861
+ }
862
+
863
+ $post_permalink = get_permalink( $comment->comment_post_ID );
864
+ $comment_link = get_comment_link( $comment->comment_ID );
865
+
866
+ if ( '' === $r['primary-link'] ) {
867
+ $r['primary-link'] = $comment_link;
868
+ }
869
+
870
+ if ( '' === $r['action'] ) {
871
+ $r['action'] = sprintf( __( '%1$s commented on the post, %2$s', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ), '<a href="' . $post_permalink . '">' . apply_filters( 'the_title', $post->post_title ) . '</a>' );
872
+ }
873
+
874
+ if ( '' === $r['content'] ) {
875
+ $r['content'] = $comment->comment_content;
876
+ }
877
+
878
+ if ( '' === $r['secondary-item-id'] ) {
879
+ $r['secondary-item-id'] = $comment->ID;
880
+ }
881
+ }
882
+
883
+ $r['content'] = '';
884
+
885
+ break;
886
+
887
+ case 'friendship_created':
888
+ if ( empty( $r['user-id'] ) ) {
889
+ $r['user-id'] = $this->get_random_user_id();
890
+ }
891
+
892
+ if ( empty( $r['item-id'] ) ) {
893
+ $r['item-id'] = $this->get_random_user_id();
894
+ }
895
+
896
+ $r['action'] = sprintf( __( '%1$s and %2$s are now friends', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ), bp_core_get_userlink( $r['item-id'] ) );
897
+
898
+ break;
899
+
900
+ case 'created_group':
901
+ if ( empty( $r['item-id'] ) ) {
902
+ $r['item-id'] = \BP_Groups_Group::get_random( 1, 1 )['groups'][0]->slug;
903
+ }
904
+
905
+ $group = groups_get_group( array(
906
+ 'group_id' => $r['item-id'],
907
+ ) );
908
+
909
+ // @todo what if it's not a group? ugh
910
+ if ( empty( $r['user-id'] ) ) {
911
+ $r['user-id'] = $group->creator_id;
912
+ }
913
+
914
+ $group_permalink = bp_get_group_permalink( $group );
915
+
916
+ if ( empty( $r['action'] ) ) {
917
+ $r['action'] = sprintf( __( '%1$s created the group %2$s', 'buddypress'), bp_core_get_userlink( $r['user-id'] ), '<a href="' . $group_permalink . '">' . esc_attr( $group->name ) . '</a>' );
918
+ }
919
+
920
+ if ( empty( $r['primary-link'] ) ) {
921
+ $r['primary-link'] = $group_permalink;
922
+ }
923
+
924
+ break;
925
+
926
+ case 'joined_group':
927
+ if ( empty( $r['item-id'] ) ) {
928
+ $r['item-id'] = \BP_Groups_Group::get_random( 1, 1 )['groups'][0]->slug;
929
+ }
930
+
931
+ $group = groups_get_group( array(
932
+ 'group_id' => $r['item-id'],
933
+ ) );
934
+
935
+ if ( empty( $r['user-id'] ) ) {
936
+ $r['user-id'] = $this->get_random_user_id();
937
+ }
938
+
939
+ if ( empty( $r['action'] ) ) {
940
+ $r['action'] = sprintf( __( '%1$s joined the group %2$s', 'buddypress' ), bp_core_get_userlink( $r['user-id'] ), '<a href="' . bp_get_group_permalink( $group ) . '">' . esc_attr( $group->name ) . '</a>' );
941
+ }
942
+
943
+ if ( empty( $r['primary-link'] ) ) {
944
+ $r['primary-link'] = bp_get_group_permalink( $group );
945
+ }
946
+
947
+ break;
948
+
949
+ case 'new_avatar':
950
+ case 'new_member':
951
+ case 'updated_profile':
952
+ if ( empty( $r['user-id'] ) ) {
953
+ $r['user-id'] = $this->get_random_user_id();
954
+ }
955
+
956
+ $userlink = bp_core_get_userlink( $r['user-id'] );
957
+
958
+ // new_avatar.
959
+ if ( 'new_avatar' === $r['type'] ) {
960
+ $r['action'] = sprintf( __( '%s changed their profile picture', 'buddypress' ), $userlink );
961
+
962
+ // new_member.
963
+ } elseif ( 'new_member' === $r['type'] ) {
964
+ $r['action'] = sprintf( __( '%s became a registered member', 'buddypress' ), $userlink );
965
+
966
+ // updated_profile.
967
+ } else {
968
+ $r['action'] = sprintf( __( '%s updated their profile', 'buddypress' ), $userlink );
969
+ }
970
+
971
+ break;
972
+ }
973
+
974
+ return $r;
975
+ }
976
+ }
cli/components/component.php ADDED
@@ -0,0 +1,226 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress Components.
8
+ *
9
+ * @since 1.6.0
10
+ */
11
+ class Components extends BuddypressCommand {
12
+
13
+ /**
14
+ * Object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'id',
20
+ 'title',
21
+ 'description',
22
+ );
23
+
24
+ /**
25
+ * Activate a component.
26
+ *
27
+ * ## OPTIONS
28
+ *
29
+ * <component>
30
+ * : Name of the component to activate.
31
+ *
32
+ * ## EXAMPLE
33
+ *
34
+ * $ wp bp component activate groups
35
+ * Success: The Groups component has been activated.
36
+ */
37
+ public function activate( $args, $assoc_args ) {
38
+ $component = $args[0];
39
+
40
+ if ( bp_is_active( $component ) ) {
41
+ WP_CLI::error( sprintf( 'The %s component is already active.', ucfirst( $component ) ) );
42
+ }
43
+
44
+ $active_components =& buddypress()->active_components;
45
+
46
+ // Set for the rest of the page load.
47
+ $active_components[ $component ] = 1;
48
+
49
+ // Save in the db.
50
+ bp_update_option( 'bp-active-components', $active_components );
51
+
52
+ // Ensure that dbDelta() is defined.
53
+ if ( ! function_exists( 'dbDelta' ) ) {
54
+ require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
55
+ }
56
+
57
+ // Run the setup, in case tables have to be created.
58
+ require_once( \BP_PLUGIN_DIR . 'bp-core/admin/bp-core-admin-schema.php' );
59
+ bp_core_install( $active_components );
60
+ bp_core_add_page_mappings( $active_components );
61
+
62
+ WP_CLI::success( sprintf( 'The %s component has been activated.', ucfirst( $component ) ) );
63
+ }
64
+
65
+ /**
66
+ * Deactivate a component.
67
+ *
68
+ * ## OPTIONS
69
+ *
70
+ * <component>
71
+ * : Name of the component to deactivate.
72
+ *
73
+ * ## EXAMPLE
74
+ *
75
+ * $ wp bp component deactivate groups
76
+ * Success: The Groups component has been deactivated.
77
+ */
78
+ public function deactivate( $args, $assoc_args ) {
79
+ $component = $args[0];
80
+
81
+ if ( ! bp_is_active( $component ) ) {
82
+ WP_CLI::error( sprintf( 'The %s component is not active.', ucfirst( $component ) ) );
83
+ }
84
+
85
+ if ( array_key_exists( $component, bp_core_get_components( 'required' ) ) ) {
86
+ WP_CLI::error( 'You cannot deactivate a required component.' );
87
+ }
88
+
89
+ $active_components =& buddypress()->active_components;
90
+
91
+ // Set for the rest of the page load.
92
+ unset( $active_components[ $component ] );
93
+
94
+ // Save in the db.
95
+ bp_update_option( 'bp-active-components', $active_components );
96
+
97
+ WP_CLI::success( sprintf( 'The %s component has been deactivated.', ucfirst( $component ) ) );
98
+ }
99
+
100
+ /**
101
+ * Get a list of components.
102
+ *
103
+ * ## OPTIONS
104
+ *
105
+ * [--type=<type>]
106
+ * : Type of the component (all, optional, retired, required).
107
+ * ---
108
+ * default: all
109
+ * ---
110
+ *
111
+ * [--status=<status>]
112
+ * : Status of the component (all, active, inactive).
113
+ * ---
114
+ * default: all
115
+ * ---
116
+ *
117
+ * [--fields=<fields>]
118
+ * : Fields to display (id, title, description).
119
+ *
120
+ * [--format=<format>]
121
+ * : Render output in a particular format.
122
+ * ---
123
+ * default: table
124
+ * options:
125
+ * - table
126
+ * - count
127
+ * - csv
128
+ * - haml
129
+ * ---
130
+ *
131
+ * ## EXAMPLES
132
+ *
133
+ * $ wp bp component list --format=count
134
+ * 10
135
+ *
136
+ * $ wp bp component list --status=inactive --format=count
137
+ * 4
138
+ *
139
+ * @subcommand list
140
+ */
141
+ public function _list( $args, $assoc_args ) {
142
+ $formatter = $this->get_formatter( $assoc_args );
143
+
144
+ // Sanitize type.
145
+ $type = $assoc_args['type'];
146
+ if ( empty( $type ) || ! in_array( $type, $this->component_types(), true ) ) {
147
+ $type = 'all';
148
+ }
149
+
150
+ // Sanitize status.
151
+ $status = $assoc_args['status'];
152
+ if ( empty( $status ) || ! in_array( $status, $this->component_status(), true ) ) {
153
+ $status = 'all';
154
+ }
155
+
156
+ $components = bp_core_get_components( $type );
157
+ $active_components = apply_filters( 'bp_active_components', bp_get_option( 'bp-active-components' ) );
158
+ $inactive_components = array_diff( array_keys( $components ), array_keys( $active_components ) );
159
+ $current_components = array();
160
+
161
+ switch ( $status ) {
162
+ case 'all':
163
+ foreach ( $components as $name => $labels ) {
164
+ $current_components[] = array(
165
+ 'id' => $name,
166
+ 'title' => $labels['title'],
167
+ 'description' => $labels['description'],
168
+ );
169
+ }
170
+ break;
171
+
172
+ case 'active':
173
+ foreach ( $active_components as $name => $labels ) {
174
+ $current_components[] = array(
175
+ 'id' => $name,
176
+ 'title' => '',
177
+ 'description' => '',
178
+ );
179
+ }
180
+ break;
181
+
182
+ case 'inactive':
183
+ foreach ( $inactive_components as $name => $labels ) {
184
+ $current_components[] = array(
185
+ 'id' => $labels,
186
+ 'title' => '',
187
+ 'description' => '',
188
+ );
189
+ }
190
+ break;
191
+ }
192
+
193
+ // Bail early.
194
+ if ( empty( $current_components ) ) {
195
+ WP_CLI::error( 'There is no component available.' );
196
+ }
197
+
198
+ if ( 'count' === $formatter->format ) {
199
+ $formatter->display_items( $current_components );
200
+ } else {
201
+ $formatter->display_items( $current_components );
202
+ }
203
+ }
204
+
205
+ /**
206
+ * Component Types.
207
+ *
208
+ * @since 1.6.0
209
+ *
210
+ * @return array An array of valid component types.
211
+ */
212
+ protected function component_types() {
213
+ return array( 'all', 'optional', 'retired', 'required' );
214
+ }
215
+
216
+ /**
217
+ * Component Status.
218
+ *
219
+ * @since 1.6.0
220
+ *
221
+ * @return array An array of valid component status.
222
+ */
223
+ protected function component_status() {
224
+ return array( 'all', 'active', 'inactive' );
225
+ }
226
+ }
cli/components/email.php ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress Email Post Types.
8
+ *
9
+ * @since 1.6.0
10
+ */
11
+ class Email extends BuddypressCommand {
12
+
13
+ /**
14
+ * Create a new email post connected to an email type.
15
+ *
16
+ * ## OPTIONS
17
+ *
18
+ * --type=<type>
19
+ * : Email type for the email (should be unique identifier, sanitized like a post slug).
20
+ *
21
+ * --type-description=<type-description>
22
+ * : Email type description.
23
+ *
24
+ * --subject=<subject>
25
+ * : Email subject line. Email tokens allowed. View https://codex.buddypress.org/emails/email-tokens/ for more info.
26
+ *
27
+ * [--content=<content>]
28
+ * : Email content. Email tokens allowed. View https://codex.buddypress.org/emails/email-tokens/ for more info.
29
+ *
30
+ * [--plain-text-content=<plain-text-content>]
31
+ * : Plain-text email content. Email tokens allowed. View https://codex.buddypress.org/emails/email-tokens/ for more info.
32
+ *
33
+ * [<file>]
34
+ * : Read content from <file>. If this value is present, the
35
+ * `--content` argument will be ignored.
36
+ *
37
+ * Passing `-` as the filename will cause post content to
38
+ * be read from STDIN.
39
+ *
40
+ * [--edit]
41
+ * : Immediately open system's editor to write or edit email content.
42
+ *
43
+ * If content is read from a file, from STDIN, or from the `--content`
44
+ * argument, that text will be loaded into the editor.
45
+ *
46
+ * ## EXAMPLES
47
+ *
48
+ * # Create email post
49
+ * $ wp bp email create --type=new-event --type-description="Send an email when a new event is created" --subject="[{{{site.name}}}] A new event was created" --content="<a href='{{{some.custom-token-url}}}'></a>A new event</a> was created" --plain-text-content="A new event was created"
50
+ * Success: Email post created for type "new-event".
51
+ *
52
+ * # Create email post with content from given file
53
+ * $ wp bp email create ./email-content.txt --type=new-event --type-description="Send an email when a new event is created" --subject="[{{{site.name}}}] A new event was created" --plain-text-content="A new event was created"
54
+ * Success: Email post created for type "new-event".
55
+ *
56
+ * @alias add
57
+ */
58
+ public function create( $args, $assoc_args ) {
59
+ $switched = false;
60
+
61
+ if ( false === bp_is_root_blog() ) {
62
+ $switched = true;
63
+ switch_to_blog( bp_get_root_blog_id() );
64
+ }
65
+
66
+ $term = term_exists( $assoc_args['type'], bp_get_email_tax_type() );
67
+
68
+ // Term already exists so don't do anything.
69
+ if ( 0 !== $term && null !== $term ) {
70
+ if ( true === $switched ) {
71
+ restore_current_blog();
72
+ }
73
+
74
+ WP_CLI::error( "Email type '{$assoc_args['type']}' already exists." );
75
+ }
76
+
77
+ if ( ! empty( $args[0] ) ) {
78
+ $assoc_args['content'] = $this->read_from_file_or_stdin( $args[0] );
79
+ }
80
+
81
+ if ( \WP_CLI\Utils\get_flag_value( $assoc_args, 'edit' ) ) {
82
+ $input = \WP_CLI\Utils\get_flag_value( $assoc_args, 'content', '' );
83
+ $output = $this->_edit( $input, 'WP-CLI: New BP Email Content' );
84
+
85
+ if ( $output ) {
86
+ $assoc_args['content'] = $output;
87
+ } else {
88
+ $assoc_args['content'] = $input;
89
+ }
90
+ }
91
+
92
+ $id = $assoc_args['type'];
93
+
94
+ $defaults = array(
95
+ 'post_status' => 'publish',
96
+ 'post_type' => bp_get_email_post_type(),
97
+ );
98
+
99
+ $email = array(
100
+ 'post_title' => $assoc_args['subject'],
101
+ 'post_content' => $assoc_args['content'],
102
+ 'post_excerpt' => ! empty( $assoc_args['plain-text-content'] ) ? $assoc_args['plain-text-content'] : '',
103
+ );
104
+
105
+ // Email post content.
106
+ $post_id = wp_insert_post( bp_parse_args( $email, $defaults, 'install_email_' . $id ), true );
107
+
108
+ // Save the situation.
109
+ if ( ! is_wp_error( $post_id ) ) {
110
+ $tt_ids = wp_set_object_terms( $post_id, $id, bp_get_email_tax_type() );
111
+
112
+ // Situation description.
113
+ if ( ! is_wp_error( $tt_ids ) && ! empty( $assoc_args['type-description'] ) ) {
114
+ $term = get_term_by( 'term_taxonomy_id', (int) $tt_ids[0], bp_get_email_tax_type() );
115
+ wp_update_term( (int) $term->term_id, bp_get_email_tax_type(), array(
116
+ 'description' => $assoc_args['type-description'],
117
+ ) );
118
+ }
119
+
120
+ if ( true === $switched ) {
121
+ restore_current_blog();
122
+ }
123
+
124
+ WP_CLI::success( "Email post created for type '{$assoc_args['type']}'." );
125
+ } else {
126
+ if ( true === $switched ) {
127
+ restore_current_blog();
128
+ }
129
+
130
+ WP_CLI::error( "There was a problem creating the email post for type '{$assoc_args['type']}' - " . $post_id->get_error_message() );
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Get details for a post connected to an email type.
136
+ *
137
+ * ## OPTIONS
138
+ *
139
+ * <type>
140
+ * : The email type to fetch the post details for.
141
+ *
142
+ * [--field=<field>]
143
+ * : Instead of returning the whole post, returns the value of a single field.
144
+ *
145
+ * [--fields=<fields>]
146
+ * : Limit the output to specific fields. Defaults to all fields.
147
+ *
148
+ * [--format=<format>]
149
+ * : Render output in a particular format.
150
+ * ---
151
+ * default: table
152
+ * options:
153
+ * - table
154
+ * - csv
155
+ * - json
156
+ * - yaml
157
+ * ---
158
+ *
159
+ * ## EXAMPLE
160
+ *
161
+ * # Output the post ID for the 'activity-at-message' email type
162
+ * $ wp bp email get-post activity-at-message --fields=ID
163
+ *
164
+ * @alias get-post
165
+ * @alias see
166
+ */
167
+ public function get_post( $args, $assoc_args ) {
168
+ $email = bp_get_email( $args[0] );
169
+
170
+ if ( is_wp_error( $email ) ) {
171
+ WP_CLI::error( "Email post for type '{$args[0]}' does not exist." );
172
+ }
173
+
174
+ $post_arr = get_object_vars( $email->get_post_object() );
175
+ unset( $post_arr['filter'] );
176
+ if ( empty( $assoc_args['fields'] ) ) {
177
+ $assoc_args['fields'] = array_keys( $post_arr );
178
+ }
179
+
180
+ $formatter = $this->get_formatter( $assoc_args );
181
+ $formatter->display_item( $email->get_post_object() );
182
+ }
183
+
184
+ /**
185
+ * Reinstall BuddyPress default emails.
186
+ *
187
+ * ## OPTIONS
188
+ *
189
+ * [--yes]
190
+ * : Answer yes to the confirmation message.
191
+ *
192
+ * ## EXAMPLE
193
+ *
194
+ * $ wp bp email reinstall --yes
195
+ * Success: Emails have been successfully reinstalled.
196
+ */
197
+ public function reinstall( $args, $assoc_args ) {
198
+ WP_CLI::confirm( 'Are you sure you want to reinstall BuddyPress emails?', $assoc_args );
199
+
200
+ require_once buddypress()->plugin_dir . 'bp-core/admin/bp-core-admin-tools.php';
201
+
202
+ $result = bp_admin_reinstall_emails();
203
+
204
+ if ( 0 === $result[0] ) {
205
+ WP_CLI::success( $result[1] );
206
+ } else {
207
+ WP_CLI::error( $result[1] );
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Helper method to use the '--edit' flag.
213
+ *
214
+ * Copied from Post_Command::_edit().
215
+ *
216
+ * @param string $content Post content.
217
+ * @param string $title Post title.
218
+ * @return mixed
219
+ */
220
+ protected function _edit( $content, $title ) {
221
+ $content = apply_filters( 'the_editor_content', $content );
222
+ $output = \WP_CLI\Utils\launch_editor_for_input( $content, $title );
223
+
224
+ return ( is_string( $output ) ) ?
225
+ apply_filters( 'content_save_pre', $output )
226
+ : $output;
227
+ }
228
+ }
cli/components/friend.php ADDED
@@ -0,0 +1,314 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress Friends.
8
+ *
9
+ * @since 1.6.0
10
+ */
11
+ class Friend extends BuddypressCommand {
12
+
13
+ /**
14
+ * Object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'id',
20
+ 'initiator_user_id',
21
+ 'friend_user_id',
22
+ 'is_confirmed',
23
+ 'is_limited',
24
+ );
25
+
26
+ /**
27
+ * Create a new friendship.
28
+ *
29
+ * ## OPTIONS
30
+ *
31
+ * <initiator>
32
+ * : ID of the user who is sending the friendship request. Accepts either a user_login or a numeric ID.
33
+ *
34
+ * <friend>
35
+ * : ID of the user whose friendship is being requested. Accepts either a user_login or a numeric ID.
36
+ *
37
+ * [--force-accept]
38
+ * : Whether to force acceptance.
39
+ *
40
+ * [--silent]
41
+ * : Whether to silent the message creation.
42
+ *
43
+ * [--porcelain]
44
+ * : Return only the friendship id.
45
+ *
46
+ * ## EXAMPLES
47
+ *
48
+ * $ wp bp friend create user1 another_use
49
+ * Success: Friendship successfully created.
50
+ *
51
+ * $ wp bp friend create user1 another_use --force-accept
52
+ * Success: Friendship successfully created.
53
+ *
54
+ * @alias add
55
+ */
56
+ public function create( $args, $assoc_args ) {
57
+ // Members.
58
+ $initiator = $this->get_user_id_from_identifier( $args[0] );
59
+ $friend = $this->get_user_id_from_identifier( $args[1] );
60
+
61
+ // Silent it before it errors.
62
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
63
+ return;
64
+ }
65
+
66
+ // Check if users are already friends, and bail if they do.
67
+ if ( friends_check_friendship( $initiator->ID, $friend->ID ) ) {
68
+ WP_CLI::error( 'These users are already friends.' );
69
+ }
70
+
71
+ $force = WP_CLI\Utils\get_flag_value( $assoc_args, 'force-accept' );
72
+
73
+ if ( ! friends_add_friend( $initiator->ID, $friend->ID, $force ) ) {
74
+ WP_CLI::error( 'There was a problem while creating the friendship.' );
75
+ }
76
+
77
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
78
+ WP_CLI::line( \BP_Friends_Friendship::get_friendship_id( $initiator->ID, $friend->ID ) );
79
+ } else {
80
+ if ( $force ) {
81
+ WP_CLI::success( 'Friendship successfully created.' );
82
+ } else {
83
+ WP_CLI::success( 'Friendship successfully created but not accepted.' );
84
+ }
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Remove a friendship.
90
+ *
91
+ * ## OPTIONS
92
+ *
93
+ * <initiator>
94
+ * : ID of the friendship initiator. Accepts either a user_login or a numeric ID.
95
+ *
96
+ * <friend>
97
+ * : ID of the friend user. Accepts either a user_login or a numeric ID.
98
+ *
99
+ * ## EXAMPLE
100
+ *
101
+ * $ wp bp friend remove user1 another_user
102
+ * Success: Friendship successfully removed.
103
+ *
104
+ * @alias delete
105
+ */
106
+ public function remove( $args, $assoc_args ) {
107
+ // Members.
108
+ $initiator = $this->get_user_id_from_identifier( $args[0] );
109
+ $friend = $this->get_user_id_from_identifier( $args[1] );
110
+
111
+ // Check if users are already friends, if not, bail.
112
+ if ( ! friends_check_friendship( $initiator->ID, $friend->ID ) ) {
113
+ WP_CLI::error( 'These users are not friends.' );
114
+ }
115
+
116
+ if ( friends_remove_friend( $initiator->ID, $friend->ID ) ) {
117
+ WP_CLI::success( 'Friendship successfully removed.' );
118
+ } else {
119
+ WP_CLI::error( 'There was a problem while removing the friendship.' );
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Mark a friendship request as accepted.
125
+ *
126
+ * ## OPTIONS
127
+ *
128
+ * <friendship>...
129
+ * : ID(s) of the friendship(s).
130
+ *
131
+ * ## EXAMPLES
132
+ *
133
+ * $ wp bp friend accept_invitation 2161
134
+ * Success: Friendship successfully accepted.
135
+ *
136
+ * $ wp bp friend accept 2161
137
+ * Success: Friendship successfully accepted.
138
+ *
139
+ * @alias accept_invitation
140
+ */
141
+ public function accept( $args, $assoc_args ) {
142
+ foreach ( $args as $friendship_id ) {
143
+ if ( friends_accept_friendship( (int) $friendship_id ) ) {
144
+ WP_CLI::success( 'Friendship successfully accepted.' );
145
+ } else {
146
+ WP_CLI::error( 'There was a problem accepting the friendship.' );
147
+ }
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Mark a friendship request as rejected.
153
+ *
154
+ * ## OPTIONS
155
+ *
156
+ * <friendship>...
157
+ * : ID(s) of the friendship(s).
158
+ *
159
+ * ## EXAMPLES
160
+ *
161
+ * $ wp bp friend reject_invitation 2161
162
+ * Success: Friendship successfully accepted.
163
+ *
164
+ * $ wp bp friend reject 2161 151 2121
165
+ * Success: Friendship successfully accepted.
166
+ *
167
+ * @alias reject_invitation
168
+ */
169
+ public function reject( $args, $assoc_args ) {
170
+ foreach ( $args as $friendship_id ) {
171
+ if ( friends_reject_friendship( (int) $friendship_id ) ) {
172
+ WP_CLI::success( 'Friendship successfully rejected.' );
173
+ } else {
174
+ WP_CLI::error( 'There was a problem rejecting the friendship.' );
175
+ }
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Check whether two users are friends.
181
+ *
182
+ * ## OPTIONS
183
+ *
184
+ * <user>
185
+ * : ID of the first user. Accepts either a user_login or a numeric ID.
186
+ *
187
+ * <friend>
188
+ * : ID of the other user. Accepts either a user_login or a numeric ID.
189
+ *
190
+ * ## EXAMPLES
191
+ *
192
+ * $ wp bp friend check 2161 65465
193
+ * Success: Yes, they are friends.
194
+ *
195
+ * $ wp bp friend see 2121 65456
196
+ * Success: Yes, they are friends.
197
+ *
198
+ * @alias see
199
+ */
200
+ public function check( $args, $assoc_args ) {
201
+ // Members.
202
+ $user = $this->get_user_id_from_identifier( $args[0] );
203
+ $friend = $this->get_user_id_from_identifier( $args[1] );
204
+
205
+ if ( friends_check_friendship( $user->ID, $friend->ID ) ) {
206
+ WP_CLI::success( 'Yes, they are friends.' );
207
+ } else {
208
+ WP_CLI::error( 'No, they are not friends.' );
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Get a list of user's friends.
214
+ *
215
+ * ## OPTIONS
216
+ *
217
+ * <user>
218
+ * : ID of the user. Accepts either a user_login or a numeric ID.
219
+ *
220
+ * [--fields=<fields>]
221
+ * : Fields to display.
222
+ *
223
+ * [--format=<format>]
224
+ * : Render output in a particular format.
225
+ * ---
226
+ * default: table
227
+ * options:
228
+ * - table
229
+ * - ids
230
+ * - csv
231
+ * - count
232
+ * - haml
233
+ * ---
234
+ *
235
+ * ## EXAMPLES
236
+ *
237
+ * $ wp bp friend list 65465 --format=ids
238
+ * $ wp bp friend list 2422 --format=count
239
+ *
240
+ * @subcommand list
241
+ */
242
+ public function _list( $args, $assoc_args ) {
243
+ $formatter = $this->get_formatter( $assoc_args );
244
+ $user = $this->get_user_id_from_identifier( $args[0] );
245
+ $friends = \BP_Friends_Friendship::get_friendships( $user->ID );
246
+
247
+ if ( empty( $friends ) ) {
248
+ WP_CLI::error( 'This member has no friends.' );
249
+ }
250
+
251
+ if ( 'ids' === $formatter->format ) {
252
+ echo implode( ' ', wp_list_pluck( $friends, 'friend_user_id' ) ); // WPCS: XSS ok.
253
+ } elseif ( 'count' === $formatter->format ) {
254
+ $formatter->display_items( $friends );
255
+ } else {
256
+ $formatter->display_items( $friends );
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Generate random friendships.
262
+ *
263
+ * ## OPTIONS
264
+ *
265
+ * [--count=<number>]
266
+ * : How many friendships to generate.
267
+ * ---
268
+ * default: 100
269
+ * ---
270
+ *
271
+ * [--initiator=<user>]
272
+ * : ID of the first user. Accepts either a user_login or a numeric ID.
273
+ *
274
+ * [--friend=<user>]
275
+ * : ID of the second user. Accepts either a user_login or a numeric ID.
276
+ *
277
+ * [--force-accept]
278
+ * : Whether to force acceptance.
279
+ *
280
+ * ## EXAMPLES
281
+ *
282
+ * $ wp bp friend generate --count=50
283
+ * $ wp bp friend generate --initiator=121 --count=50
284
+ */
285
+ public function generate( $args, $assoc_args ) {
286
+ $notify = WP_CLI\Utils\make_progress_bar( 'Generating friendships', $assoc_args['count'] );
287
+
288
+ for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
289
+
290
+ if ( isset( $assoc_args['initiator'] ) ) {
291
+ $user = $this->get_user_id_from_identifier( $assoc_args['initiator'] );
292
+ $member = $user->ID;
293
+ } else {
294
+ $member = $this->get_random_user_id();
295
+ }
296
+
297
+ if ( isset( $assoc_args['friend'] ) ) {
298
+ $user_2 = $this->get_user_id_from_identifier( $assoc_args['friend'] );
299
+ $friend = $user_2->ID;
300
+ } else {
301
+ $friend = $this->get_random_user_id();
302
+ }
303
+
304
+ $this->create( array( $member, $friend ), array(
305
+ 'silent',
306
+ 'force-accept',
307
+ ) );
308
+
309
+ $notify->tick();
310
+ }
311
+
312
+ $notify->finish();
313
+ }
314
+ }
cli/components/group-invite.php ADDED
@@ -0,0 +1,340 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress group invites.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class Group_Invite extends BuddypressCommand {
12
+
13
+ /**
14
+ * Group ID Object Key
15
+ *
16
+ * @var string
17
+ */
18
+ protected $obj_id_key = 'group_id';
19
+
20
+ /**
21
+ * Group Object Type
22
+ *
23
+ * @var string
24
+ */
25
+ protected $obj_type = 'group';
26
+
27
+ /**
28
+ * Invite a member to a group.
29
+ *
30
+ * ## OPTIONS
31
+ *
32
+ * [--group-id=<group>]
33
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
34
+ *
35
+ * [--user-id=<user>]
36
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
37
+ *
38
+ * [--inviter-id=<user>]
39
+ * : Identifier for the inviter. Accepts either a user_login or a numeric ID.
40
+ *
41
+ * [--<field>=<value>]
42
+ * : One or more parameters to pass. See groups_invite_user()
43
+ *
44
+ * [--silent]
45
+ * : Whether to silent the invite creation.
46
+ *
47
+ * ## EXAMPLES
48
+ *
49
+ * $ wp bp group invite add --group-id=40 --user-id=10 --inviter-id=1331
50
+ * Success: Member invited to the group.
51
+ *
52
+ * $ wp bp group invite create --group-id=40 --user-id=admin --inviter-id=804
53
+ * Success: Member invited to the group.
54
+ *
55
+ * @alias add
56
+ */
57
+ public function create( $args, $assoc_args ) {
58
+ $r = wp_parse_args( $assoc_args, array(
59
+ 'user-id' => '',
60
+ 'group-id' => '',
61
+ 'inviter-id' => '',
62
+ 'date-modified' => bp_core_current_time(),
63
+ 'is-confirmed' => 0,
64
+ ) );
65
+
66
+ $group_id = $this->get_group_id_from_identifier( $r['group-id'] );
67
+ $user = $this->get_user_id_from_identifier( $r['user-id'] );
68
+ $inviter = $this->get_user_id_from_identifier( $r['inviter-id'] );
69
+
70
+ $invite = groups_invite_user( array(
71
+ 'user_id' => $user->ID,
72
+ 'group_id' => $group_id,
73
+ 'inviter_id' => $inviter->ID,
74
+ 'date_modified' => $assoc_args['date-modified'],
75
+ 'is_confirmed' => $assoc_args['is-confirmed'],
76
+ ) );
77
+
78
+ groups_send_invites( $inviter->ID, $group_id );
79
+
80
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
81
+ return;
82
+ }
83
+
84
+ if ( $invite ) {
85
+ WP_CLI::success( 'Member invited to the group.' );
86
+ } else {
87
+ WP_CLI::error( 'Could not invite the member.' );
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Uninvite a user from a group.
93
+ *
94
+ * ## OPTIONS
95
+ *
96
+ * --group-id=<group>
97
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
98
+ *
99
+ * --user-id=<user>
100
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
101
+ *
102
+ * ## EXAMPLES
103
+ *
104
+ * $ wp bp group invite remove --group-id=3 --user-id=10
105
+ * Success: User uninvited from the group.
106
+ *
107
+ * $ wp bp group invite remove --group-id=foo --user-id=admin
108
+ * Success: User uninvited from the group.
109
+ *
110
+ * @alias uninvite
111
+ */
112
+ public function remove( $args, $assoc_args ) {
113
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
114
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
115
+
116
+ if ( groups_uninvite_user( $user->ID, $group_id ) ) {
117
+ WP_CLI::success( 'User uninvited from the group.' );
118
+ } else {
119
+ WP_CLI::error( 'Could not remove the user.' );
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Get a list of invitations from a group.
125
+ *
126
+ * ## OPTIONS
127
+ *
128
+ * --group-id=<group>
129
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
130
+ *
131
+ * --user-id=<user>
132
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
133
+ *
134
+ * [--format=<format>]
135
+ * : Render output in a particular format.
136
+ * ---
137
+ * default: table
138
+ * options:
139
+ * - table
140
+ * - ids
141
+ * - csv
142
+ * - count
143
+ * - haml
144
+ * ---
145
+ *
146
+ * ## EXAMPLES
147
+ *
148
+ * $ wp bp group invite list --user-id=30 --group-id=56
149
+ *
150
+ * @subcommand list
151
+ */
152
+ public function _list( $args, $assoc_args ) {
153
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
154
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
155
+ $user_id = $user->ID;
156
+
157
+ if ( $group_id ) {
158
+ $invite_query = new \BP_Group_Member_Query( array(
159
+ 'is_confirmed' => false,
160
+ 'group_id' => $group_id,
161
+ ) );
162
+
163
+ $invites = $invite_query->results;
164
+
165
+ // Manually filter out user ID - this is not supported by the API.
166
+ if ( $user_id ) {
167
+ $user_invites = array();
168
+
169
+ foreach ( $invites as $invite ) {
170
+ if ( $user_id === $invite->user_id ) {
171
+ $user_invites[] = $invite;
172
+ }
173
+ }
174
+
175
+ $invites = $user_invites;
176
+ }
177
+
178
+ if ( empty( $invites ) ) {
179
+ WP_CLI::error( 'No invitations found.' );
180
+ }
181
+
182
+ if ( empty( $assoc_args['fields'] ) ) {
183
+ $fields = array();
184
+
185
+ if ( ! $user_id ) {
186
+ $fields[] = 'user_id';
187
+ }
188
+
189
+ $fields[] = 'inviter_id';
190
+ $fields[] = 'invite_sent';
191
+ $fields[] = 'date_modified';
192
+
193
+ $assoc_args['fields'] = $fields;
194
+ }
195
+
196
+ $formatter = $this->get_formatter( $assoc_args );
197
+ $formatter->display_items( $invites );
198
+ } else {
199
+ $invite_query = groups_get_invites_for_user( $user_id );
200
+ $invites = $invite_query['groups'];
201
+
202
+ if ( empty( $assoc_args['fields'] ) ) {
203
+ $fields = array(
204
+ 'id',
205
+ 'name',
206
+ 'slug',
207
+ );
208
+
209
+ $assoc_args['fields'] = $fields;
210
+ }
211
+
212
+ $formatter = $this->get_formatter( $assoc_args );
213
+ $formatter->display_items( $invites );
214
+ }
215
+ }
216
+
217
+ /**
218
+ * Generate random group invitations.
219
+ *
220
+ * ## OPTIONS
221
+ *
222
+ * [--count=<number>]
223
+ * : How many groups invitations to generate.
224
+ * ---
225
+ * default: 100
226
+ * ---
227
+ *
228
+ * ## EXAMPLE
229
+ *
230
+ * $ wp bp group invite generate --count=50
231
+ */
232
+ public function generate( $args, $assoc_args ) {
233
+ $notify = WP_CLI\Utils\make_progress_bar( 'Generating random group invitations', $assoc_args['count'] );
234
+
235
+ for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
236
+ $this->add( array(), array(
237
+ 'user-id' => $this->get_random_user_id(),
238
+ 'group-id' => \BP_Groups_Group::get_random( 1, 1 )['groups'][0]->slug,
239
+ 'inviter-id' => $this->get_random_user_id(),
240
+ 'silent',
241
+ ) );
242
+
243
+ $notify->tick();
244
+ }
245
+
246
+ $notify->finish();
247
+ }
248
+
249
+ /**
250
+ * Accept a group invitation.
251
+ *
252
+ * ## OPTIONS
253
+ *
254
+ * --group-id=<group>
255
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
256
+ *
257
+ * --user-id=<user>
258
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
259
+ *
260
+ * ## EXAMPLES
261
+ *
262
+ * $ wp bp group invite accept --group-id=3 --user-id=10
263
+ * Success: User is now a "member" of the group.
264
+ *
265
+ * $ wp bp group invite accept --group-id=foo --user-id=admin
266
+ * Success: User is now a "member" of the group.
267
+ */
268
+ public function accept( $args, $assoc_args ) {
269
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
270
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
271
+
272
+ if ( groups_accept_invite( $user->ID, $group_id ) ) {
273
+ WP_CLI::success( 'User is now a "member" of the group.' );
274
+ } else {
275
+ WP_CLI::error( 'Could not accept user invitation to the group.' );
276
+ }
277
+ }
278
+
279
+ /**
280
+ * Reject a group invitation.
281
+ *
282
+ * ## OPTIONS
283
+ *
284
+ * --group-id=<group>
285
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
286
+ *
287
+ * --user-id=<user>
288
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
289
+ *
290
+ * ## EXAMPLES
291
+ *
292
+ * $ wp bp group invite reject --group-id=3 --user-id=10
293
+ * Success: Member invitation rejected.
294
+ *
295
+ * $ wp bp group invite reject --group-id=foo --user-id=admin
296
+ * Success: Member invitation rejected.
297
+ */
298
+ public function reject( $args, $assoc_args ) {
299
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
300
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
301
+
302
+ if ( groups_reject_invite( $user->ID, $group_id ) ) {
303
+ WP_CLI::success( 'Member invitation rejected.' );
304
+ } else {
305
+ WP_CLI::error( 'Could not reject member invitation.' );
306
+ }
307
+ }
308
+
309
+ /**
310
+ * Delete a group invitation.
311
+ *
312
+ * ## OPTIONS
313
+ *
314
+ * --group-id=<group>
315
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
316
+ *
317
+ * --user-id=<user>
318
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
319
+ *
320
+ * ## EXAMPLES
321
+ *
322
+ * $ wp bp group invite delete --group-id=3 --user-id=10
323
+ * Success: Member invitation deleted from the group.
324
+ *
325
+ * $ wp bp group invite delete --group-id=foo --user-id=admin
326
+ * Success: Member invitation deleted from the group.
327
+ *
328
+ * @alias remove
329
+ */
330
+ public function delete( $args, $assoc_args ) {
331
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
332
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
333
+
334
+ if ( groups_delete_invite( $user->ID, $group_id ) ) {
335
+ WP_CLI::success( 'Member invitation deleted from the group.' );
336
+ } else {
337
+ WP_CLI::error( 'Could not delete member invitation from the group.' );
338
+ }
339
+ }
340
+ }
cli/components/group-member.php ADDED
@@ -0,0 +1,358 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress group members.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class Group_Member extends BuddypressCommand {
12
+
13
+ /**
14
+ * Group ID Object Key
15
+ *
16
+ * @var string
17
+ */
18
+ protected $obj_id_key = 'group_id';
19
+
20
+ /**
21
+ * Group Object Type
22
+ *
23
+ * @var string
24
+ */
25
+ protected $obj_type = 'group';
26
+
27
+ /**
28
+ * Add a member to a group.
29
+ *
30
+ * ## OPTIONS
31
+ *
32
+ * ## OPTIONS
33
+ *
34
+ * --group-id=<group>
35
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
36
+ *
37
+ * --user-id=<user>
38
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
39
+ *
40
+ * [--role=<role>]
41
+ * : Group member role (member, mod, admin).
42
+ * ---
43
+ * Default: member
44
+ * ---
45
+ *
46
+ * [--porcelain]
47
+ * : Return only the added group member id.
48
+ *
49
+ * ## EXAMPLES
50
+ *
51
+ * $ wp bp group member add --group-id=3 --user-id=10
52
+ * Success: Added user #3 to group #3 as member.
53
+ *
54
+ * $ wp bp group member create --group-id=bar --user-id=20 --role=mod
55
+ * Success: Added user #20 to group #45 as mod.
56
+ *
57
+ * @alias add
58
+ */
59
+ public function create( $args, $assoc_args ) {
60
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
61
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
62
+
63
+ // Sanitize role.
64
+ $role = $assoc_args['role'];
65
+ if ( empty( $role ) || ! in_array( $role, $this->group_roles(), true ) ) {
66
+ $role = 'member';
67
+ }
68
+
69
+ $joined = groups_join_group( $group_id, $user->ID );
70
+
71
+ if ( ! $joined ) {
72
+ WP_CLI::error( 'Could not add user to the group.' );
73
+ }
74
+
75
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
76
+ WP_CLI::line( $user->ID );
77
+ } else {
78
+ if ( 'member' !== $role ) {
79
+ groups_promote_member( $user->ID, $group_id, $role );
80
+ }
81
+
82
+ $success = sprintf(
83
+ 'Added user #%d to group #%d as %s.',
84
+ $user->ID,
85
+ $group_id,
86
+ $role
87
+ );
88
+ WP_CLI::success( $success );
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Remove a member from a group.
94
+ *
95
+ * ## OPTIONS
96
+ *
97
+ * --group-id=<group>
98
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
99
+ *
100
+ * --user-id=<user>
101
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
102
+ *
103
+ * ## EXAMPLES
104
+ *
105
+ * $ wp bp group member remove --group-id=3 --user-id=10
106
+ * Success: Member #10 removed from the group #3.
107
+ *
108
+ * $ wp bp group member delete --group-id=foo --user-id=admin
109
+ * Success: Member #545 removed from the group #12.
110
+ *
111
+ * @alias delete
112
+ */
113
+ public function remove( $args, $assoc_args ) {
114
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
115
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
116
+ $member = new \BP_Groups_Member( $user->ID, $group_id );
117
+
118
+ // True on success.
119
+ if ( $member->remove() ) {
120
+ WP_CLI::success( sprintf( 'Member #%d removed from the group #%d.', $user->ID, $group_id ) );
121
+ } else {
122
+ WP_CLI::error( 'Could not remove member from the group.' );
123
+ }
124
+ }
125
+
126
+ /**
127
+ * Get a list of group memberships.
128
+ *
129
+ * This command can be used to fetch a list of a user's groups (using the --user-id
130
+ * parameter) or a group's members (using the --group-id flag).
131
+ *
132
+ * ## OPTIONS
133
+ *
134
+ * <group-id>
135
+ * : Identifier for the group. Can be a numeric ID or the group slug.
136
+ *
137
+ * [--fields=<fields>]
138
+ * : Limit the output to specific signup fields.
139
+ *
140
+ * [--format=<format>]
141
+ * : Render output in a particular format.
142
+ * ---
143
+ * default: table
144
+ * options:
145
+ * - table
146
+ * - csv
147
+ * - ids
148
+ * - json
149
+ * - count
150
+ * - yaml
151
+ * ---
152
+ *
153
+ * [--<field>=<value>]
154
+ * : One or more parameters to pass. See groups_get_group_members()
155
+ *
156
+ * ## EXAMPLES
157
+ *
158
+ * $ wp bp group member list 3
159
+ * $ wp bp group member list my-group
160
+ *
161
+ * @subcommand list
162
+ */
163
+ public function _list( $args, $assoc_args ) {
164
+ $group_id = $this->get_group_id_from_identifier( $args[0] );
165
+
166
+ $roles = array( 'members' );
167
+ if ( isset( $assoc_args['role'] ) ) {
168
+ if ( is_string( $assoc_args['role'] ) ) {
169
+ $roles = explode( ',', $assoc_args['role'] );
170
+ } else {
171
+ $roles = $assoc_args['role'];
172
+ }
173
+ }
174
+
175
+ // Get our members.
176
+ $members_query = groups_get_group_members( array(
177
+ 'group_id' => $group_id,
178
+ 'exclude_admins_mods' => false,
179
+ 'group_role' => $roles,
180
+ ) );
181
+ $members = $members_query['members'];
182
+
183
+ // Make 'role' human-readable.
184
+ foreach ( $members as &$member ) {
185
+ $role = 'member';
186
+ if ( $member->is_mod ) {
187
+ $role = 'mod';
188
+ } elseif ( $member->is_admin ) {
189
+ $role = 'admin';
190
+ }
191
+
192
+ $member->role = $role;
193
+ }
194
+
195
+ if ( empty( $members ) ) {
196
+ WP_CLI::error( 'No group members found.' );
197
+ }
198
+
199
+ if ( empty( $assoc_args['fields'] ) ) {
200
+ $fields = array(
201
+ 'user_id',
202
+ 'user_login',
203
+ 'fullname',
204
+ 'date_modified',
205
+ 'role',
206
+ );
207
+
208
+ $assoc_args['fields'] = $fields;
209
+ }
210
+
211
+ $formatter = $this->get_formatter( $assoc_args );
212
+ $formatter->display_items( $members );
213
+ }
214
+
215
+ /**
216
+ * Promote a member to a new status within a group.
217
+ *
218
+ * ## OPTIONS
219
+ *
220
+ * --group-id=<group>
221
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
222
+ *
223
+ * --user-id=<user>
224
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
225
+ *
226
+ * --role=<role>
227
+ * : Group role to promote the member (mod, admin).
228
+ *
229
+ * ## EXAMPLES
230
+ *
231
+ * $ wp bp group member promote --group-id=3 --user-id=10 --role=admin
232
+ * Success: Member promoted to new role successfully.
233
+ *
234
+ * $ wp bp group member promote --group-id=foo --user-id=admin --role=mod
235
+ * Success: Member promoted to new role successfully.
236
+ */
237
+ public function promote( $args, $assoc_args ) {
238
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
239
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
240
+ $role = $assoc_args['role'];
241
+
242
+ if ( ! in_array( $role, $this->group_roles(), true ) ) {
243
+ WP_CLI::error( 'You need a valid role to promote the member.' );
244
+ }
245
+
246
+ $member = new \BP_Groups_Member( $user->ID, $group_id );
247
+
248
+ if ( $member->promote( $role ) ) {
249
+ WP_CLI::success( 'Member promoted to new role successfully.' );
250
+ } else {
251
+ WP_CLI::error( 'Could not promote the member.' );
252
+ }
253
+ }
254
+
255
+ /**
256
+ * Demote user to the 'member' status.
257
+ *
258
+ * ## OPTIONS
259
+ *
260
+ * --group-id=<group>
261
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
262
+ *
263
+ * --user-id=<user>
264
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
265
+ *
266
+ * ## EXAMPLES
267
+ *
268
+ * $ wp bp group member demote --group-id=3 --user-id=10
269
+ * Success: User demoted to the "member" status.
270
+ *
271
+ * $ wp bp group member demote --group-id=foo --user-id=admin
272
+ * Success: User demoted to the "member" status.
273
+ */
274
+ public function demote( $args, $assoc_args ) {
275
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
276
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
277
+ $member = new \BP_Groups_Member( $user->ID, $group_id );
278
+
279
+ if ( $member->demote() ) {
280
+ WP_CLI::success( 'User demoted to the "member" status.' );
281
+ } else {
282
+ WP_CLI::error( 'Could not demote the member.' );
283
+ }
284
+ }
285
+
286
+ /**
287
+ * Ban a member from a group.
288
+ *
289
+ * ## OPTIONS
290
+ *
291
+ * --group-id=<group>
292
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
293
+ *
294
+ * --user-id=<user>
295
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
296
+ *
297
+ * ## EXAMPLES
298
+ *
299
+ * $ wp bp group member ban --group-id=3 --user-id=10
300
+ * Success: Member banned from the group.
301
+ *
302
+ * $ wp bp group member ban --group-id=foo --user-id=admin
303
+ * Success: Member banned from the group.
304
+ */
305
+ public function ban( $args, $assoc_args ) {
306
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
307
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
308
+ $member = new \BP_Groups_Member( $user->ID, $group_id );
309
+
310
+ if ( $member->ban() ) {
311
+ WP_CLI::success( 'Member banned from the group.' );
312
+ } else {
313
+ WP_CLI::error( 'Could not ban the member.' );
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Unban a member from a group.
319
+ *
320
+ * ## OPTIONS
321
+ *
322
+ * --group-id=<group>
323
+ * : Identifier for the group. Accepts either a slug or a numeric ID.
324
+ *
325
+ * --user-id=<user>
326
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
327
+ *
328
+ * ## EXAMPLES
329
+ *
330
+ * $ wp bp group member unban --group-id=3 --user-id=10
331
+ * Success: Member unbanned from the group.
332
+ *
333
+ * $ wp bp group member unban --group-id=foo --user-id=admin
334
+ * Success: Member unbanned from the group.
335
+ */
336
+ public function unban( $args, $assoc_args ) {
337
+ $group_id = $this->get_group_id_from_identifier( $assoc_args['group-id'] );
338
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
339
+ $member = new \BP_Groups_Member( $user->ID, $group_id );
340
+
341
+ if ( $member->unban() ) {
342
+ WP_CLI::success( 'Member unbanned from the group.' );
343
+ } else {
344
+ WP_CLI::error( 'Could not unban the member.' );
345
+ }
346
+ }
347
+
348
+ /**
349
+ * Group Roles.
350
+ *
351
+ * @since 1.5.0
352
+ *
353
+ * @return array An array of group roles.
354
+ */
355
+ protected function group_roles() {
356
+ return array( 'member', 'mod', 'admin' );
357
+ }
358
+ }
cli/components/group.php ADDED
@@ -0,0 +1,437 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress Groups.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class Group extends BuddypressCommand {
12
+
13
+ /**
14
+ * Object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'id',
20
+ 'name',
21
+ 'slug',
22
+ 'status',
23
+ 'date_created',
24
+ );
25
+
26
+ /**
27
+ * Group ID Object Key
28
+ *
29
+ * @var string
30
+ */
31
+ protected $obj_id_key = 'group_id';
32
+
33
+ /**
34
+ * Group Object Type
35
+ *
36
+ * @var string
37
+ */
38
+ protected $obj_type = 'group';
39
+
40
+ /**
41
+ * Create a group.
42
+ *
43
+ * ## OPTIONS
44
+ *
45
+ * --name=<name>
46
+ * : Name of the group.
47
+ *
48
+ * [--slug=<slug>]
49
+ * : URL-safe slug for the group. If not provided, one will be generated automatically.
50
+ *
51
+ * [--description=<description>]
52
+ * : Group description.
53
+ * ---
54
+ * Default: 'Description for group "[name]"'
55
+ * ---
56
+ *
57
+ * [--creator-id=<creator-id>]
58
+ * : ID of the group creator.
59
+ * ---
60
+ * Default: 1
61
+ * ---
62
+ *
63
+ * [--slug=<slug>]
64
+ * : URL-safe slug for the group.
65
+ *
66
+ * [--status=<status>]
67
+ * : Group status (public, private, hidden).
68
+ * ---
69
+ * Default: public
70
+ * ---
71
+ *
72
+ * [--enable-forum=<enable-forum>]
73
+ * : Whether to enable legacy bbPress forums.
74
+ * ---
75
+ * Default: 0
76
+ * ---
77
+ *
78
+ * [--date-created=<date-created>]
79
+ * : MySQL-formatted date.
80
+ * ---
81
+ * Default: current date.
82
+ * ---
83
+ *
84
+ * [--silent]
85
+ * : Whether to silent the group creation.
86
+ *
87
+ * [--porcelain]
88
+ * : Return only the new group id.
89
+ *
90
+ * ## EXAMPLES
91
+ *
92
+ * $ wp bp group create --name="Totally Cool Group"
93
+ * Success: Group (ID 5465) created: http://example.com/groups/totally-cool-group/
94
+ *
95
+ * $ wp bp group create --name="Another Cool Group" --description="Cool Group" --creator-id=54 --status=private
96
+ * Success: Group (ID 6454)6 created: http://example.com/groups/another-cool-group/
97
+ *
98
+ * @alias add
99
+ */
100
+ public function create( $args, $assoc_args ) {
101
+ $r = wp_parse_args( $assoc_args, array(
102
+ 'name' => '',
103
+ 'slug' => '',
104
+ 'description' => '',
105
+ 'creator-id' => 1,
106
+ 'status' => 'public',
107
+ 'enable-forum' => 0,
108
+ 'date-created' => bp_core_current_time(),
109
+ ) );
110
+
111
+ // Auto-generate some stuff.
112
+ if ( empty( $r['slug'] ) ) {
113
+ $r['slug'] = groups_check_slug( sanitize_title( $r['name'] ) );
114
+ }
115
+
116
+ if ( empty( $r['description'] ) ) {
117
+ $r['description'] = sprintf( 'Description for group "%s"', $r['name'] );
118
+ }
119
+
120
+ // Fallback for group status.
121
+ if ( ! in_array( $r['status'], $this->group_status(), true ) ) {
122
+ $r['status'] = 'public';
123
+ }
124
+
125
+ $group_id = groups_create_group( array(
126
+ 'name' => $r['name'],
127
+ 'slug' => $r['slug'],
128
+ 'description' => $r['description'],
129
+ 'creator_id' => $r['creator-id'],
130
+ 'status' => $r['status'],
131
+ 'enable_forum' => $r['enable-forum'],
132
+ 'date_created' => $r['date-created'],
133
+ ) );
134
+
135
+ // Silent it before it errors.
136
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
137
+ return;
138
+ }
139
+
140
+ if ( ! is_numeric( $group_id ) ) {
141
+ WP_CLI::error( 'Could not create group.' );
142
+ }
143
+
144
+ groups_update_groupmeta( $group_id, 'total_member_count', 1 );
145
+
146
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
147
+ WP_CLI::line( $group_id );
148
+ } else {
149
+ $group = groups_get_group( array(
150
+ 'group_id' => $group_id,
151
+ ) );
152
+ $permalink = bp_get_group_permalink( $group );
153
+ WP_CLI::success( sprintf( 'Group (ID %d) created: %s', $group_id, $permalink ) );
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Generate random groups.
159
+ *
160
+ * ## OPTIONS
161
+ *
162
+ * [--count=<number>]
163
+ * : How many groups to generate.
164
+ * ---
165
+ * default: 100
166
+ * ---
167
+ *
168
+ * [--status=<status>]
169
+ * : The status of the generated groups. Specify public, private, hidden, or mixed.
170
+ * ---
171
+ * default: public
172
+ * ---
173
+ *
174
+ * [--creator-id=<creator-id>]
175
+ * : ID of the group creator.
176
+ * ---
177
+ * default: 1
178
+ * ---
179
+ *
180
+ * [--enable-forum=<enable-forum>]
181
+ * : Whether to enable legacy bbPress forums.
182
+ * ---
183
+ * default: 0
184
+ * ---
185
+ *
186
+ * ## EXAMPLES
187
+ *
188
+ * $ wp bp group generate --count=50
189
+ * $ wp bp group generate --count=5 --status=mixed
190
+ * $ wp bp group generate --count=10 --status=hidden --creator-id=30
191
+ */
192
+ public function generate( $args, $assoc_args ) {
193
+ $notify = WP_CLI\Utils\make_progress_bar( 'Generating groups', $assoc_args['count'] );
194
+
195
+ for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
196
+ $this->create( array(), array(
197
+ 'name' => sprintf( 'Group - #%d', $i ),
198
+ 'creator-id' => $assoc_args['creator-id'],
199
+ 'status' => $this->random_group_status( $assoc_args['status'] ),
200
+ 'enable-forum' => $assoc_args['enable-forum'],
201
+ 'silent',
202
+ ) );
203
+
204
+ $notify->tick();
205
+ }
206
+
207
+ $notify->finish();
208
+ }
209
+
210
+ /**
211
+ * Get a group.
212
+ *
213
+ * ## OPTIONS
214
+ *
215
+ * <group-id>
216
+ * : Identifier for the group. Can be a numeric ID or the group slug.
217
+ *
218
+ * [--fields=<fields>]
219
+ * : Limit the output to specific fields. Defaults to all fields.
220
+ *
221
+ * [--format=<format>]
222
+ * : Render output in a particular format.
223
+ * ---
224
+ * default: table
225
+ * options:
226
+ * - table
227
+ * - json
228
+ * - haml
229
+ * ---
230
+ *
231
+ * ## EXAMPLES
232
+ *
233
+ * $ wp bp group get 500
234
+ * $ wp bp group get group-slug
235
+ *
236
+ * @alias see
237
+ */
238
+ public function get( $args, $assoc_args ) {
239
+ $group_id = $this->get_group_id_from_identifier( $args[0] );
240
+ $group = groups_get_group( $group_id );
241
+ $group_arr = get_object_vars( $group );
242
+ $group_arr['url'] = bp_get_group_permalink( $group );
243
+
244
+ if ( empty( $assoc_args['fields'] ) ) {
245
+ $assoc_args['fields'] = array_keys( $group_arr );
246
+ }
247
+
248
+ $formatter = $this->get_formatter( $assoc_args );
249
+ $formatter->display_item( $group_arr );
250
+ }
251
+
252
+ /**
253
+ * Delete a group.
254
+ *
255
+ * ## OPTIONS
256
+ *
257
+ * <group-id>...
258
+ * : Identifier(s) for the group(s). Can be a numeric ID or the group slug.
259
+ *
260
+ * [--yes]
261
+ * : Answer yes to the confirmation message.
262
+ *
263
+ * ## EXAMPLES
264
+ *
265
+ * $ wp bp group delete 500
266
+ * Success: Group successfully deleted.
267
+ *
268
+ * $ wp bp group delete group-slug --yes
269
+ * Success: Group successfully deleted.
270
+ */
271
+ public function delete( $args, $assoc_args ) {
272
+ $group_id = $this->get_group_id_from_identifier( $args[0] );
273
+
274
+ WP_CLI::confirm( 'Are you sure you want to delete this group and its metadata?', $assoc_args );
275
+
276
+ parent::_delete( array( $group_id ), $assoc_args, function( $group_id ) {
277
+ if ( groups_delete_group( $group_id ) ) {
278
+ return array( 'success', 'Group successfully deleted.' );
279
+ } else {
280
+ return array( 'error', 'Could not delete the group.' );
281
+ }
282
+ } );
283
+ }
284
+
285
+ /**
286
+ * Update a group.
287
+ *
288
+ * ## OPTIONS
289
+ *
290
+ * <group-id>...
291
+ * : Identifier(s) for the group(s). Can be a numeric ID or the group slug.
292
+ *
293
+ * [--<field>=<value>]
294
+ * : One or more fields to update. See groups_create_group()
295
+ *
296
+ * ## EXAMPLE
297
+ *
298
+ * $ wp bp group update 35 --description="What a cool group!" --name="Group of Cool People"
299
+ */
300
+ public function update( $args, $assoc_args ) {
301
+ $clean_group_ids = array();
302
+
303
+ foreach ( $args as $group_id ) {
304
+ $clean_group_ids[] = $this->get_group_id_from_identifier( $group_id );
305
+ }
306
+
307
+ parent::_update( $clean_group_ids, $assoc_args, function( $params ) {
308
+ return groups_create_group( $params );
309
+ } );
310
+ }
311
+
312
+ /**
313
+ * Get a list of groups.
314
+ *
315
+ * ## OPTIONS
316
+ *
317
+ * [--<field>=<value>]
318
+ * : One or more parameters to pass. See groups_get_groups()
319
+ *
320
+ * [--fields=<fields>]
321
+ * : Fields to display.
322
+ *
323
+ * [--user-id=<user>]
324
+ * : Limit results to groups of which a specific user is a member. Accepts either a user_login or a numeric ID.
325
+ *
326
+ * [--orderby=<orderby>]
327
+ * : Sort order for results.
328
+ * ---
329
+ * default: name
330
+ * options:
331
+ * - date_created
332
+ * - last_activity
333
+ * - total_member_count
334
+ * - name
335
+ *
336
+ * [--order=<order>]
337
+ * : Whether to sort results ascending or descending.
338
+ * ---
339
+ * default: ASC
340
+ * options:
341
+ * - ASC
342
+ * - DESC
343
+ *
344
+ * [--format=<format>]
345
+ * : Render output in a particular format.
346
+ * ---
347
+ * default: table
348
+ * options:
349
+ * - table
350
+ * - ids
351
+ * - csv
352
+ * - count
353
+ * - haml
354
+ * ---
355
+ *
356
+ * [--count=<number>]
357
+ * : How many group items to list.
358
+ * ---
359
+ * default: 50
360
+ * ---
361
+
362
+ * ## EXAMPLES
363
+ *
364
+ * $ wp bp group list --format=ids
365
+ * $ wp bp group list --format=count
366
+ * $ wp bp group list --user-id=123
367
+ * $ wp bp group list --user-id=user_login --format=ids
368
+ *
369
+ * @subcommand list
370
+ */
371
+ public function _list( $args, $assoc_args ) {
372
+ $formatter = $this->get_formatter( $assoc_args );
373
+ $query_args = wp_parse_args( $assoc_args, array(
374
+ 'count' => 50,
375
+ 'show_hidden' => true,
376
+ 'orderby' => $assoc_args['orderby'],
377
+ 'order' => $assoc_args['order'],
378
+ ) );
379
+
380
+ // Groups to list.
381
+ $r['per_page'] = $r['count'];
382
+
383
+ if ( isset( $assoc_args['user-id'] ) ) {
384
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
385
+ $query_args['user_id'] = $user->ID;
386
+ }
387
+
388
+ $query_args = self::process_csv_arguments_to_arrays( $query_args );
389
+
390
+ // If count or ids, no need for group objects.
391
+ if ( in_array( $formatter->format, array( 'ids', 'count' ), true ) ) {
392
+ $query_args['fields'] = 'ids';
393
+ }
394
+
395
+ $groups = groups_get_groups( $query_args );
396
+ if ( empty( $groups['groups'] ) ) {
397
+ WP_CLI::error( 'No groups found.' );
398
+ }
399
+
400
+ if ( 'ids' === $formatter->format ) {
401
+ echo implode( ' ', $groups['groups'] ); // WPCS: XSS ok.
402
+ } elseif ( 'count' === $formatter->format ) {
403
+ $formatter->display_items( $groups['total'] );
404
+ } else {
405
+ $formatter->display_items( $groups['groups'] );
406
+ }
407
+ }
408
+
409
+ /**
410
+ * Group Status
411
+ *
412
+ * @since 1.5.0
413
+ *
414
+ * @return array An array of gruop status.
415
+ */
416
+ protected function group_status() {
417
+ return array( 'public', 'private', 'hidden' );
418
+ }
419
+
420
+ /**
421
+ * Gets a randon group status.
422
+ *
423
+ * @since 1.5.0
424
+ *
425
+ * @param string $status Group status.
426
+ * @return string Group Status.
427
+ */
428
+ protected function random_group_status( $status ) {
429
+ $core_status = $this->group_status();
430
+
431
+ if ( 'mixed' === $status ) {
432
+ $status = $core_status[ array_rand( $core_status ) ];
433
+ }
434
+
435
+ return $status;
436
+ }
437
+ }
cli/components/member.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ if ( ! class_exists( 'User_Command' ) ) {
5
+ require_once( WP_CLI_ROOT . '/php/commands/user.php' );
6
+ }
7
+
8
+ /**
9
+ * Manage BuddyPress Members
10
+ *
11
+ * @since 1.0.0
12
+ */
13
+ class Member extends BuddypressCommand {
14
+
15
+ /**
16
+ * Generate BuddyPress members. See documentation for `wp_user_generate`.
17
+ *
18
+ * This is a kludge workaround for setting last activity. Should fix.
19
+ *
20
+ * ## OPTIONS
21
+ *
22
+ * [--count=<number>]
23
+ * : How many members to generate.
24
+ * ---
25
+ * default: 100
26
+ * ---
27
+ *
28
+ * ## EXAMPLE
29
+ *
30
+ * $ wp bp member generate --count=50
31
+ */
32
+ public function generate( $args, $assoc_args ) {
33
+ add_action( 'user_register', array( __CLASS__, 'update_user_last_activity_random' ) );
34
+ User_Command::generate( $args, $assoc_args );
35
+ }
36
+
37
+ /**
38
+ * Update the last user activity with a random date.
39
+ *
40
+ * @since 1.0
41
+ *
42
+ * @param int $user_id User ID.
43
+ */
44
+ public static function update_user_last_activity_random( $user_id ) {
45
+ $time = date( 'Y-m-d H:i:s', rand( 0, time() ) );
46
+ bp_update_user_last_activity( $user_id, $time );
47
+ }
48
+ }
cli/components/message.php ADDED
@@ -0,0 +1,552 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress Messages.
8
+ *
9
+ * @since 1.6.0
10
+ */
11
+ class Message extends BuddypressCommand {
12
+
13
+ /**
14
+ * Object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'id',
20
+ 'subject',
21
+ 'message',
22
+ 'thread_id',
23
+ 'sender_id',
24
+ 'date_sent',
25
+ );
26
+
27
+ /**
28
+ * Add a message.
29
+ *
30
+ * ## OPTIONS
31
+ *
32
+ * --from=<user>
33
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
34
+ *
35
+ * [--to=<user>]
36
+ * : Identifier for the recipient. To is not required when thread id is set.
37
+ * Accepts either a user_login or a numeric ID.
38
+ * ---
39
+ * Default: Empty.
40
+ * ---
41
+ *
42
+ * --subject=<subject>
43
+ * : Subject of the message.
44
+ *
45
+ * --content=<content>
46
+ * : Content of the message.
47
+ *
48
+ * [--thread-id=<thread-id>]
49
+ * : Thread ID.
50
+ * ---
51
+ * Default: false
52
+ * ---
53
+ *
54
+ * [--date-sent=<date-sent>]
55
+ * : MySQL-formatted date.
56
+ * ---
57
+ * Default: current date.
58
+ * ---
59
+ *
60
+ * [--silent]
61
+ * : Whether to silent the message creation.
62
+ *
63
+ * [--porcelain]
64
+ * : Return the thread id of the message.
65
+ *
66
+ * ## EXAMPLES
67
+ *
68
+ * $ wp bp message create --from=user1 --to=user2 --subject="Message Title" --content="We are ready"
69
+ * Success: Message successfully created.
70
+ *
71
+ * $ wp bp message create --from=545 --to=313 --subject="Another Message Title" --content="Message OK"
72
+ * Success: Message successfully created.
73
+ *
74
+ * @alias add
75
+ */
76
+ public function create( $args, $assoc_args ) {
77
+ $r = wp_parse_args( $assoc_args, array(
78
+ 'to' => '',
79
+ 'thread-id' => false,
80
+ 'date-sent' => bp_core_current_time(),
81
+ ) );
82
+
83
+ $user = $this->get_user_id_from_identifier( $assoc_args['from'] );
84
+
85
+ // To is not required when thread id is set.
86
+ if ( ! empty( $r['to'] ) ) {
87
+ $recipient = $this->get_user_id_from_identifier( $r['to'] );
88
+ }
89
+
90
+ // Existing thread recipients will be assumed.
91
+ $recipient = ( ! empty( $r['thread_id'] ) ) ? array() : array( $recipient->ID );
92
+
93
+ $thread_id = messages_new_message( array(
94
+ 'sender_id' => $user->ID,
95
+ 'thread_id' => $r['thread-id'],
96
+ 'recipients' => $recipient,
97
+ 'subject' => $assoc_args['subject'],
98
+ 'content' => $assoc_args['content'],
99
+ 'date_sent' => $r['date-sent'],
100
+ ) );
101
+
102
+ // Silent it before it errors.
103
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
104
+ return;
105
+ }
106
+
107
+ if ( ! is_numeric( $thread_id ) ) {
108
+ WP_CLI::error( 'Could not add a message.' );
109
+ }
110
+
111
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
112
+ WP_CLI::line( $thread_id );
113
+ } else {
114
+ WP_CLI::success( 'Message successfully created.' );
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Delete thread(s) for a given user.
120
+ *
121
+ * ## OPTIONS
122
+ *
123
+ * <thread-id>...
124
+ * : Thread ID(s).
125
+ *
126
+ * --user-id=<user>
127
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
128
+ *
129
+ * [--yes]
130
+ * : Answer yes to the confirmation message.
131
+ *
132
+ * ## EXAMPLES
133
+ *
134
+ * $ wp bp message delete-thread 500 687867 --user-id=40
135
+ * Success: Thread successfully deleted.
136
+ *
137
+ * $ wp bp message delete-thread 564 5465465 456456 --user-id=user_logon --yes
138
+ * Success: Thread successfully deleted.
139
+ *
140
+ * @alias delete-thread
141
+ * @alias remove-thread
142
+ */
143
+ public function delete_thread( $args, $assoc_args ) {
144
+ $thread_id = $args[0];
145
+
146
+ // Check if we have a valid user.
147
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
148
+
149
+ WP_CLI::confirm( 'Are you sure you want to delete this thread(s)?', $assoc_args );
150
+
151
+ parent::_delete( array( $thread_id ), $assoc_args, function( $thread_id ) {
152
+
153
+ // Check if it is a valid thread before deleting.
154
+ if ( ! messages_is_valid_thread( $thread_id ) ) {
155
+ WP_CLI::error( 'This is not a valid thread ID.' );
156
+ }
157
+
158
+ // Actually, delete it.
159
+ if ( messages_delete_thread( $thread_id, $user->ID ) ) {
160
+ return array( 'success', 'Thread successfully deleted.' );
161
+ } else {
162
+ return array( 'error', 'Could not delete the thread.' );
163
+ }
164
+ } );
165
+ }
166
+
167
+ /**
168
+ * Get a message.
169
+ *
170
+ * ## OPTIONS
171
+ *
172
+ * <message-id>
173
+ * : Identifier for the message.
174
+ *
175
+ * [--fields=<fields>]
176
+ * : Limit the output to specific fields.
177
+ *
178
+ * [--format=<format>]
179
+ * : Render output in a particular format.
180
+ * ---
181
+ * default: table
182
+ * options:
183
+ * - table
184
+ * - json
185
+ * - haml
186
+ * ---
187
+ *
188
+ * ## EXAMPLES
189
+ *
190
+ * $ wp bp message get 5465
191
+ * $ wp bp message see 5454
192
+ *
193
+ * @alias see
194
+ */
195
+ public function get( $args, $assoc_args ) {
196
+ $message = new \BP_Messages_Message( $args[0] );
197
+ $message_arr = get_object_vars( $message );
198
+
199
+ if ( empty( $assoc_args['fields'] ) ) {
200
+ $assoc_args['fields'] = array_keys( $message_arr );
201
+ }
202
+
203
+ $formatter = $this->get_formatter( $assoc_args );
204
+ $formatter->display_item( $message_arr );
205
+ }
206
+
207
+ /**
208
+ * Get a list of messages for a specific user.
209
+ *
210
+ * ## OPTIONS
211
+ *
212
+ * --user-id=<user>
213
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
214
+ *
215
+ * [--<field>=<value>]
216
+ * : One or more parameters to pass. See \BP_Messages_Box_Template()
217
+ *
218
+ * [--fields=<fields>]
219
+ * : Fields to display.
220
+ *
221
+ * [--count=<number>]
222
+ * : How many messages to list.
223
+ * ---
224
+ * default: 10
225
+ * ---
226
+ *
227
+ * [--format=<format>]
228
+ * : Render output in a particular format.
229
+ * ---
230
+ * default: table
231
+ * options:
232
+ * - table
233
+ * - ids
234
+ * - count
235
+ * - csv
236
+ * - json
237
+ * - haml
238
+ * ---
239
+ *
240
+ * ## EXAMPLES
241
+ *
242
+ * $ wp bp message list --user-id=544 --format=count
243
+ * 10
244
+ *
245
+ * $ wp bp message list --user-id=user_login --count=3 --format=ids
246
+ * 5454 45454 4545 465465
247
+ *
248
+ * @subcommand list
249
+ */
250
+ public function _list( $_, $assoc_args ) {
251
+ $formatter = $this->get_formatter( $assoc_args );
252
+
253
+ $r = wp_parse_args( $assoc_args, array(
254
+ 'box' => 'sentbox',
255
+ 'type' => 'all',
256
+ 'search' => '',
257
+ 'count' => 10,
258
+ ) );
259
+
260
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
261
+ $type = ( ! in_array( $r['type'], $this->message_types(), true ) ) ? 'all' : $r['type'];
262
+ $box = ( ! in_array( $r['box'], $this->message_boxes(), true ) ) ? 'sentbox' : $r['box'];
263
+
264
+ $inbox = new \BP_Messages_Box_Template( array(
265
+ 'user_id' => $user->ID,
266
+ 'box' => $box,
267
+ 'type' => $type,
268
+ 'max' => $r['count'],
269
+ 'search_terms' => $r['search'],
270
+ ) );
271
+
272
+ if ( ! $inbox->has_threads() ) {
273
+ WP_CLI::error( 'No messages found.' );
274
+ }
275
+
276
+ $messages = $inbox->threads[0]->messages;
277
+
278
+ if ( 'ids' === $formatter->format ) {
279
+ echo implode( ' ', wp_list_pluck( $messages, 'id' ) ); // WPCS: XSS ok.
280
+ } elseif ( 'count' === $formatter->format ) {
281
+ $formatter->display_items( $messages );
282
+ } else {
283
+ $formatter->display_items( $messages );
284
+ }
285
+ }
286
+
287
+ /**
288
+ * Generate random messages.
289
+ *
290
+ * ## OPTIONS
291
+ *
292
+ * [--thread-id=<thread-id>]
293
+ * : Thread ID to generate messages against.
294
+ * ---
295
+ * default: false
296
+ * ---
297
+ *
298
+ * [--count=<number>]
299
+ * : How many messages to generate.
300
+ * ---
301
+ * default: 20
302
+ * ---
303
+ *
304
+ * ## EXAMPLES
305
+ *
306
+ * $ wp bp message generate --thread-id=6465 --count=10
307
+ * $ wp bp message generate --count=100
308
+ */
309
+ public function generate( $args, $assoc_args ) {
310
+ $notify = WP_CLI\Utils\make_progress_bar( 'Generating messages', $assoc_args['count'] );
311
+
312
+ for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
313
+ $this->create( array(), array(
314
+ 'from' => $this->get_random_user_id(),
315
+ 'to' => $this->get_random_user_id(),
316
+ 'subject' => sprintf( 'Message Subject - #%d', $i ),
317
+ 'thread-id' => $assoc_args['thread-id'],
318
+ 'silent',
319
+ ) );
320
+
321
+ $notify->tick();
322
+ }
323
+
324
+ $notify->finish();
325
+ }
326
+
327
+ /**
328
+ * Star a message.
329
+ *
330
+ * ## OPTIONS
331
+ *
332
+ * <message-id>
333
+ * : Message ID to star.
334
+ *
335
+ * --user-id=<user>
336
+ * : User that is starring the message. Accepts either a user_login or a numeric ID.
337
+ *
338
+ * ## EXAMPLE
339
+ *
340
+ * $ wp bp message star 3543 --user-id=user_login
341
+ * Success: Message was successfully starred.
342
+ */
343
+ public function star( $args, $assoc_args ) {
344
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
345
+ $user_id = $user->ID;
346
+ $msg_id = (int) $args[0];
347
+
348
+ if ( bp_messages_is_message_starred( $msg_id, $user_id ) ) {
349
+ WP_CLI::error( 'The message is already starred.' );
350
+ }
351
+
352
+ $star_args = array(
353
+ 'action' => 'star',
354
+ 'message_id' => $msg_id,
355
+ 'user_id' => $user_id,
356
+ );
357
+
358
+ if ( bp_messages_star_set_action( $star_args ) ) {
359
+ WP_CLI::success( 'Message was successfully starred.' );
360
+ } else {
361
+ WP_CLI::error( 'Message was not starred.' );
362
+ }
363
+ }
364
+
365
+ /**
366
+ * Unstar a message.
367
+ *
368
+ * ## OPTIONS
369
+ *
370
+ * <message-id>
371
+ * : Message ID to unstar.
372
+ *
373
+ * --user-id=<user>
374
+ * : User that is unstarring the message. Accepts either a user_login or a numeric ID.
375
+ *
376
+ * ## EXAMPLE
377
+ *
378
+ * $ wp bp message unstar 212 --user-id=another_user_login
379
+ * Success: Message was successfully unstarred.
380
+ */
381
+ public function unstar( $args, $assoc_args ) {
382
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
383
+ $user_id = $user->ID;
384
+ $msg_id = (int) $args[0];
385
+
386
+ // Check if the message is starred first.
387
+ if ( ! bp_messages_is_message_starred( $msg_id, $user_id ) ) {
388
+ WP_CLI::error( 'You need to star a message first before unstarring it.' );
389
+ }
390
+
391
+ $star_args = array(
392
+ 'action' => 'unstar',
393
+ 'message_id' => $msg_id,
394
+ 'user_id' => $user_id,
395
+ );
396
+
397
+ if ( bp_messages_star_set_action( $star_args ) ) {
398
+ WP_CLI::success( 'Message was successfully unstarred.' );
399
+ } else {
400
+ WP_CLI::error( 'Message was not unstarred.' );
401
+ }
402
+ }
403
+
404
+ /**
405
+ * Star a thread.
406
+ *
407
+ * ## OPTIONS
408
+ *
409
+ * <thread-id>
410
+ * : Thread ID to star.
411
+ *
412
+ * --user-id=<user>
413
+ * : User that is starring the thread. Accepts either a user_login or a numeric ID.
414
+ *
415
+ * ## EXAMPLE
416
+ *
417
+ * $ wp bp message star-thread 212 --user-id=another_user_login
418
+ * Success: Thread was successfully starred.
419
+ *
420
+ * @alias star-thread
421
+ */
422
+ public function star_thread( $args, $assoc_args ) {
423
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
424
+ $thread_id = (int) $args[0];
425
+
426
+ // Check if it is a valid thread.
427
+ if ( ! messages_is_valid_thread( $thread_id ) ) {
428
+ WP_CLI::error( 'This is not a valid thread ID.' );
429
+ }
430
+
431
+ // Check if the user has access to this thread.
432
+ $id = messages_check_thread_access( $thread_id, $user->ID );
433
+ if ( ! is_numeric( $id ) ) {
434
+ WP_CLI::error( 'User has no access to this thread.' );
435
+ }
436
+
437
+ $star_args = array(
438
+ 'action' => 'star',
439
+ 'thread_id' => $thread_id,
440
+ 'user_id' => $user->ID,
441
+ 'bulk' => true,
442
+ );
443
+
444
+ if ( bp_messages_star_set_action( $star_args ) ) {
445
+ WP_CLI::success( 'Thread was successfully starred.' );
446
+ } else {
447
+ WP_CLI::error( 'Something wrong while trying to star the thread.' );
448
+ }
449
+ }
450
+
451
+ /**
452
+ * Unstar a thread.
453
+ *
454
+ * ## OPTIONS
455
+ *
456
+ * <thread-id>
457
+ * : Thread ID to unstar.
458
+ *
459
+ * --user-id=<user>
460
+ * : User that is unstarring the thread. Accepts either a user_login or a numeric ID.
461
+ *
462
+ * ## EXAMPLE
463
+ *
464
+ * $ wp bp message unstar-thread 212 --user-id=another_user_login
465
+ * Success: Thread was successfully unstarred.
466
+ *
467
+ * @alias unstar-thread
468
+ */
469
+ public function unstar_thread( $args, $assoc_args ) {
470
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
471
+ $thread_id = (int) $args[0];
472
+
473
+ // Check if it is a valid thread.
474
+ if ( ! messages_is_valid_thread( $thread_id ) ) {
475
+ WP_CLI::error( 'This is not a valid thread ID.' );
476
+ }
477
+
478
+ // Check if the user has access to this thread.
479
+ $id = messages_check_thread_access( $thread_id, $user->ID );
480
+ if ( ! is_numeric( $id ) ) {
481
+ WP_CLI::error( 'User has no access to this thread.' );
482
+ }
483
+
484
+ $star_args = array(
485
+ 'action' => 'unstar',
486
+ 'thread_id' => $thread_id,
487
+ 'user_id' => $user->ID,
488
+ 'bulk' => true,
489
+ );
490
+
491
+ if ( bp_messages_star_set_action( $star_args ) ) {
492
+ WP_CLI::success( 'Thread was successfully unstarred.' );
493
+ } else {
494
+ WP_CLI::error( 'Something wrong while trying to unstar the thread.' );
495
+ }
496
+ }
497
+
498
+ /**
499
+ * Send a notice.
500
+ *
501
+ * ## OPTIONS
502
+ *
503
+ * --subject=<subject>
504
+ * : Subject of the notice/message.
505
+ *
506
+ * --content=<content>
507
+ * : Content of the notice.
508
+ *
509
+ * ## EXAMPLE
510
+ *
511
+ * $ wp bp message send-notice --subject="Important notice" --content="We need to improve"
512
+ * Success: Notice was successfully sent.
513
+ *
514
+ * @alias send-notice
515
+ */
516
+ public function send_notice( $args, $assoc_args ) {
517
+ $notice = new \BP_Messages_Notice();
518
+ $notice->subject = $assoc_args['subject'];
519
+ $notice->message = $assoc_args['content'];
520
+ $notice->date_sent = bp_core_current_time();
521
+ $notice->is_active = 1;
522
+
523
+ // Send it.
524
+ if ( $notice->save() ) {
525
+ WP_CLI::success( 'Notice was successfully sent.' );
526
+ } else {
527
+ WP_CLI::error( 'Notice was not sent.' );
528
+ }
529
+ }
530
+
531
+ /**
532
+ * Message Types.
533
+ *
534
+ * @since 1.6.0
535
+ *
536
+ * @return array An array of message types.
537
+ */
538
+ protected function message_types() {
539
+ return array( 'all', 'read', 'unread' );
540
+ }
541
+
542
+ /**
543
+ * Message Boxes.
544
+ *
545
+ * @since 1.6.0
546
+ *
547
+ * @return array An array of message boxes.
548
+ */
549
+ protected function message_boxes() {
550
+ return array( 'notices', 'sentbox', 'inbox' );
551
+ }
552
+ }
cli/components/signup.php ADDED
@@ -0,0 +1,371 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress Signups.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class Signup extends BuddypressCommand {
12
+
13
+ /**
14
+ * Signup object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'signup_id',
20
+ 'user_login',
21
+ 'user_name',
22
+ 'meta',
23
+ 'activation_key',
24
+ 'registered',
25
+ );
26
+
27
+ /**
28
+ * Add a signup.
29
+ *
30
+ * ## OPTIONS
31
+ *
32
+ * [--user-login=<user-login>]
33
+ * : User login for the signup.
34
+ *
35
+ * [--user-email=<user-email>]
36
+ * : User email for the signup.
37
+ *
38
+ * [--activation-key=<activation-key>]
39
+ * : Activation key for the signup. If none is provided, a random one will be used.
40
+ *
41
+ * [--silent]
42
+ * : Whether to silent the signup creation.
43
+ *
44
+ * [--porcelain]
45
+ * : Output only the new signup id.
46
+ *
47
+ * ## EXAMPLE
48
+ *
49
+ * $ wp bp signup create --user-login=test_user --user-email=teste@site.com
50
+ * Success: Successfully added new user signup (ID #345).
51
+ *
52
+ * @alias add
53
+ */
54
+ public function create( $args, $assoc_args ) {
55
+ $r = wp_parse_args( $assoc_args, array(
56
+ 'user-login' => '',
57
+ 'user-email' => '',
58
+ 'activation-key' => wp_generate_password( 32, false ),
59
+ ) );
60
+
61
+ $signup_args = array(
62
+ 'meta' => '',
63
+ );
64
+
65
+ $user_login = $r['user-login'];
66
+ if ( ! empty( $user_login ) ) {
67
+ $user_login = preg_replace( '/\s+/', '', sanitize_user( $user_login, true ) );
68
+ }
69
+
70
+ $user_email = $r['user-email'];
71
+ if ( ! empty( $user_email ) ) {
72
+ $user_email = sanitize_email( $user_email );
73
+ }
74
+
75
+ $signup_args['user_login'] = $user_login;
76
+ $signup_args['user_email'] = $user_email;
77
+ $signup_args['activation_key'] = $r['activation-key'];
78
+
79
+ $id = \BP_Signup::add( $signup_args );
80
+
81
+ // Silent it before it errors.
82
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'silent' ) ) {
83
+ return;
84
+ }
85
+
86
+ if ( ! $id ) {
87
+ WP_CLI::error( 'Could not add user signup.' );
88
+ }
89
+
90
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
91
+ WP_CLI::line( $id );
92
+ } else {
93
+ WP_CLI::success( sprintf( 'Successfully added new user signup (ID #%d).', $id ) );
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Get a signup.
99
+ *
100
+ * ## OPTIONS
101
+ *
102
+ * <signup-id>
103
+ * : Identifier for the signup. Can be a signup ID, an email address, or a user_login.
104
+ *
105
+ * [--match-field=<match-field>]
106
+ * : Field to match the signup-id to. Use if there is ambiguity between, eg, signup ID and user_login.
107
+ * ---
108
+ * options:
109
+ * - signup_id
110
+ * - user_email
111
+ * - user_login
112
+ * ---
113
+ *
114
+ * [--fields=<fields>]
115
+ * : Limit the output to specific signup fields.
116
+ *
117
+ * [--format=<format>]
118
+ * : Render output in a particular format.
119
+ * ---
120
+ * default: table
121
+ * options:
122
+ * - table
123
+ * - csv
124
+ * - ids
125
+ * - json
126
+ * - count
127
+ * - yaml
128
+ * ---
129
+ *
130
+ * ## EXAMPLES
131
+ *
132
+ * $ wp bp signup get 123
133
+ * $ wp bp signup get foo@example.com
134
+ * $ wp bp signup get 123 --match-field=id
135
+ */
136
+ public function get( $args, $assoc_args ) {
137
+ $id = $args[0];
138
+ $signup_args = array(
139
+ 'number' => 1,
140
+ );
141
+
142
+ $signup = $this->get_signup_by_identifier( $id, $assoc_args );
143
+
144
+ $formatter = $this->get_formatter( $assoc_args );
145
+ $formatter->display_item( $signup );
146
+ }
147
+
148
+ /**
149
+ * Delete a signup.
150
+ *
151
+ * ## OPTIONS
152
+ *
153
+ * <signup-id>...
154
+ * : ID or IDs of signup.
155
+ *
156
+ * [--yes]
157
+ * : Answer yes to the confirmation message.
158
+ *
159
+ * ## EXAMPLES
160
+ *
161
+ * $ wp bp signup delete 520
162
+ * Success: Signup deleted.
163
+ *
164
+ * $ wp bp signup delete 55654 54564 --yes
165
+ * Success: Signup deleted.
166
+ */
167
+ public function delete( $args, $assoc_args ) {
168
+ $signup_id = $args[0];
169
+
170
+ WP_CLI::confirm( 'Are you sure you want to delete this signup?', $assoc_args );
171
+
172
+ parent::_delete( array( $signup_id ), $assoc_args, function( $signup_id ) {
173
+ if ( \BP_Signup::delete( array( $signup_id ) ) ) {
174
+ return array( 'success', 'Signup deleted.' );
175
+ } else {
176
+ return array( 'error', 'Could not delete signup.' );
177
+ }
178
+ } );
179
+ }
180
+
181
+ /**
182
+ * Activate a signup.
183
+ *
184
+ * ## OPTIONS
185
+ *
186
+ * <signup-id>
187
+ * : Identifier for the signup. Can be a signup ID, an email address, or a user_login.
188
+ *
189
+ * ## EXAMPLE
190
+ *
191
+ * $ wp bp signup activate ee48ec319fef3nn4
192
+ * Success: Signup activated, new user (ID #545).
193
+ */
194
+ public function activate( $args, $assoc_args ) {
195
+ $signup = $this->get_signup_by_identifier( $args[0], $assoc_args );
196
+ $user_id = bp_core_activate_signup( $signup->activation_key );
197
+
198
+ if ( $user_id ) {
199
+ WP_CLI::success( sprintf( 'Signup activated, new user (ID #%d).', $user_id ) );
200
+ } else {
201
+ WP_CLI::error( 'Signup not activated.' );
202
+ }
203
+ }
204
+
205
+ /**
206
+ * Generate random signups.
207
+ *
208
+ * ## OPTIONS
209
+ *
210
+ * [--count=<number>]
211
+ * : How many signups to generate.
212
+ * ---
213
+ * default: 100
214
+ * ---
215
+ *
216
+ * ## EXAMPLE
217
+ *
218
+ * $ wp bp signup generate --count=50
219
+ */
220
+ public function generate( $args, $assoc_args ) {
221
+ $notify = WP_CLI\Utils\make_progress_bar( 'Generating signups', $assoc_args['count'] );
222
+
223
+ // Use the email API to get a valid "from" domain.
224
+ $email_domain = new \BP_Email( '' );
225
+ $email_domain = $email_domain->get_from()->get_address();
226
+ $random_login = wp_generate_password( 12, false ); // Generate random user login.
227
+
228
+ for ( $i = 0; $i < $assoc_args['count']; $i++ ) {
229
+ $this->create( array(), array(
230
+ 'user-login' => $random_login,
231
+ 'user-email' => $random_login . substr( $email_domain, strpos( $email_domain, '@' ) ),
232
+ 'silent',
233
+ ) );
234
+
235
+ $notify->tick();
236
+ }
237
+
238
+ $notify->finish();
239
+ }
240
+
241
+ /**
242
+ * Resend activation e-mail to a newly registered user.
243
+ *
244
+ * ## OPTIONS
245
+ *
246
+ * <signup-id>
247
+ * : Identifier for the signup. Can be a signup ID, an email address, or a user_login.
248
+ *
249
+ * ## EXAMPLE
250
+ *
251
+ * $ wp bp signup resend test@example.com
252
+ * Success: Email sent successfully.
253
+ *
254
+ * @alias send
255
+ */
256
+ public function resend( $args, $assoc_args ) {
257
+ $signup = $this->get_signup_by_identifier( $args[0], $assoc_args );
258
+ $send = \BP_Signup::resend( array( $signup->signup_id ) );
259
+
260
+ // Add feedback message.
261
+ if ( empty( $send['errors'] ) ) {
262
+ WP_CLI::success( 'Email sent successfully.' );
263
+ } else {
264
+ WP_CLI::error( 'This account is already activated.' );
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Get a list of signups.
270
+ *
271
+ * ## OPTIONS
272
+ *
273
+ * [--<field>=<value>]
274
+ * : One or more parameters to pass. See \BP_Signup::get()
275
+ *
276
+ * [--<number>=<number>]
277
+ * : How many signups to list.
278
+ * ---
279
+ * default: 20
280
+ * ---
281
+ *
282
+ * [--format=<format>]
283
+ * : Render output in a particular format.
284
+ * ---
285
+ * default: table
286
+ * options:
287
+ * - table
288
+ * - ids
289
+ * - count
290
+ * - csv
291
+ * ---
292
+ *
293
+ * ## EXAMPLES
294
+ *
295
+ * $ wp bp signup list --format=ids
296
+ * $ wp bp signup list --number=100 --format=count
297
+ * $ wp bp signup list --number=5 --activation_key=ee48ec319fef3nn4
298
+ *
299
+ * @subcommand list
300
+ */
301
+ public function _list( $_, $assoc_args ) {
302
+ $formatter = $this->get_formatter( $assoc_args );
303
+ $assoc_args = wp_parse_args( $assoc_args, array(
304
+ 'number' => 20,
305
+ 'fields' => 'all',
306
+ ) );
307
+
308
+ if ( 'ids' === $formatter->format ) {
309
+ $assoc_args['fields'] = 'ids';
310
+ }
311
+
312
+ $signups = \BP_Signup::get( $assoc_args );
313
+
314
+ if ( empty( $signups['signups'] ) ) {
315
+ WP_CLI::error( 'No signups found.' );
316
+ }
317
+
318
+ if ( 'ids' === $formatter->format ) {
319
+ echo implode( ' ', $signups['signups'] ); // WPCS: XSS ok.
320
+ } elseif ( 'count' === $formatter->format ) {
321
+ WP_CLI::line( $signups['total'] );
322
+ } else {
323
+ $formatter->display_items( $signups['signups'] );
324
+ }
325
+ }
326
+
327
+ /**
328
+ * Look up a signup by the provided identifier.
329
+ *
330
+ * @since 1.5.0
331
+ */
332
+ protected function get_signup_by_identifier( $identifier, $assoc_args ) {
333
+ if ( isset( $assoc_args['match-field'] ) ) {
334
+ switch ( $assoc_args['match-field'] ) {
335
+ case 'signup_id':
336
+ $signup_args['include'] = array( $identifier );
337
+ break;
338
+
339
+ case 'user_login':
340
+ $signup_args['user_login'] = $identifier;
341
+ break;
342
+
343
+ case 'user_email':
344
+ default:
345
+ $signup_args['usersearch'] = $identifier;
346
+ break;
347
+ }
348
+ } else {
349
+ if ( is_numeric( $identifier ) ) {
350
+ $signup_args['include'] = array( intval( $identifier ) );
351
+ } elseif ( is_email( $identifier ) ) {
352
+ $signup_args['usersearch'] = $identifier;
353
+ } else {
354
+ $signup_args['user_login'] = $identifier;
355
+ }
356
+ }
357
+
358
+ $signups = \BP_Signup::get( $signup_args );
359
+ $signup = null;
360
+
361
+ if ( ! empty( $signups['signups'] ) ) {
362
+ $signup = reset( $signups['signups'] );
363
+ }
364
+
365
+ if ( ! $signup ) {
366
+ WP_CLI::error( 'No signup found by that identifier.' );
367
+ }
368
+
369
+ return $signup;
370
+ }
371
+ }
cli/components/tool.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage BuddyPress Tools.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class Tool extends BuddypressCommand {
12
+
13
+ /**
14
+ * Repair.
15
+ *
16
+ * ## OPTIONS
17
+ *
18
+ * <type>
19
+ * : Name of the repair tool.
20
+ * ---
21
+ * options:
22
+ * - friend-count
23
+ * - group-count
24
+ * - blog-records
25
+ * - count-members
26
+ * - last-activity
27
+ * ---
28
+ *
29
+ * ## EXAMPLES
30
+ *
31
+ * $ wp bp tool repair friend-count
32
+ * $ wp bp tool fix friend-count
33
+ * Success: Counting the number of friends for each user. Complete!
34
+ *
35
+ * @alias fix
36
+ */
37
+ public function repair( $args, $assoc_args ) {
38
+ $repair = 'bp_admin_repair_' . $this->sanitize_string( $args[0] );
39
+
40
+ if ( ! function_exists( $repair ) ) {
41
+ WP_CLI::error( 'There is no repair tool with that name.' );
42
+ }
43
+
44
+ $result = $repair();
45
+
46
+ if ( 0 === $result[0] ) {
47
+ WP_CLI::success( $result[1] );
48
+ } else {
49
+ WP_CLI::error( $result[1] );
50
+ }
51
+ }
52
+ }
cli/components/xprofile-data.php ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage XProfile Data.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class XProfile_Data extends BuddypressCommand {
12
+
13
+ /**
14
+ * XProfile object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'id',
20
+ 'field_id',
21
+ 'user_id',
22
+ 'value',
23
+ 'last_updated',
24
+ );
25
+
26
+ /**
27
+ * Set profile data for a user.
28
+ *
29
+ * ## OPTIONS
30
+ *
31
+ * --user-id=<user>
32
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
33
+ *
34
+ * --field-id=<field>
35
+ * : Identifier for the field. Accepts either the name of the field or a numeric ID.
36
+ *
37
+ * --value=<value>
38
+ * : Value to set.
39
+ *
40
+ * ## EXAMPLE
41
+ *
42
+ * $ wp bp xprofile data set --user-id=45 --field-id=120 --value=teste
43
+ * Success: Updated XProfile field "Field Name" (ID 120) with value "teste" for user user_login (ID 45).
44
+ */
45
+ public function set( $args, $assoc_args ) {
46
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
47
+ $field_id = $this->get_field_id( $assoc_args['field-id'] );
48
+ $field = new \BP_XProfile_Field( $field_id );
49
+
50
+ if ( empty( $field->name ) ) {
51
+ WP_CLI::error( 'XProfile field not found.' );
52
+ }
53
+
54
+ $value = $assoc_args['value'];
55
+
56
+ if ( 'checkbox' === $field->type ) {
57
+ $value = explode( ',', $assoc_args['value'] );
58
+ }
59
+
60
+ $updated = xprofile_set_field_data( $field->id, $user->ID, $value );
61
+
62
+ if ( ! $updated ) {
63
+ WP_CLI::error( 'Could not set profile data.' );
64
+ }
65
+
66
+ $success = sprintf(
67
+ 'Updated XProfile field "%s" (ID %d) with value "%s" for user %s (ID %d).',
68
+ $field->name,
69
+ $field->id,
70
+ $assoc_args['value'],
71
+ $user->user_nicename,
72
+ $user->ID
73
+ );
74
+ WP_CLI::success( $success );
75
+ }
76
+
77
+ /**
78
+ * Get profile data for a user.
79
+ *
80
+ * ## OPTIONS
81
+ *
82
+ * --user-id=<user>
83
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
84
+ *
85
+ * [--field-id=<field>]
86
+ * : Identifier for the field. Accepts either the name of the field or a numeric ID.
87
+ *
88
+ * [--format=<format>]
89
+ * : Render output in a particular format.
90
+ * ---
91
+ * default: table
92
+ * options:
93
+ * - table
94
+ * - json
95
+ * - haml
96
+ * ---
97
+ *
98
+ * [--multi-format=<multi-format>]
99
+ * : The format for array data.
100
+ * ---
101
+ * default: array
102
+ * options:
103
+ * - array
104
+ * - comma
105
+ * ---
106
+ *
107
+ * ## EXAMPLES
108
+ *
109
+ * $ wp bp xprofile data get --user-id=45 --field-id=120
110
+ * $ wp bp xprofile data see --user-id=user_test --field-id=Hometown --multi-format=comma
111
+ *
112
+ * @alias see
113
+ */
114
+ public function get( $args, $assoc_args ) {
115
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
116
+
117
+ if ( isset( $assoc_args['field-id'] ) ) {
118
+ $data = xprofile_get_field_data( $assoc_args['field-id'], $user->ID, $assoc_args['multi-format'] );
119
+ WP_CLI::print_value( $data, $assoc_args );
120
+ } else {
121
+ $data = \BP_XProfile_ProfileData::get_all_for_user( $user->ID );
122
+ $formatted_data = array();
123
+
124
+ foreach ( $data as $field_name => $field_data ) {
125
+ // Omit WP core fields.
126
+ if ( ! is_array( $field_data ) ) {
127
+ continue;
128
+ }
129
+
130
+ $_field_data = maybe_unserialize( $field_data['field_data'] );
131
+ $_field_data = wp_json_encode( $_field_data );
132
+
133
+ $formatted_data[] = array(
134
+ 'field_id' => $field_data['field_id'],
135
+ 'field_name' => $field_name,
136
+ 'value' => $_field_data,
137
+ );
138
+ }
139
+
140
+ $format_args = $assoc_args;
141
+ $format_args['fields'] = array(
142
+ 'field_id',
143
+ 'field_name',
144
+ 'value',
145
+ );
146
+ $formatter = $this->get_formatter( $format_args );
147
+ $formatter->display_items( $formatted_data );
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Delete XProfile data for a user.
153
+ *
154
+ * ## OPTIONS
155
+ *
156
+ * --user-id=<user>
157
+ * : Identifier for the user. Accepts either a user_login or a numeric ID.
158
+ *
159
+ * [--field-id=<field>]
160
+ * : Identifier for the field. Accepts either the name of the field or a numeric ID.
161
+ *
162
+ * [--delete-all]
163
+ * : Delete all data for the user.
164
+ *
165
+ * [--yes]
166
+ * : Answer yes to the confirmation message.
167
+ *
168
+ * ## EXAMPLES
169
+ *
170
+ * $ wp bp xprofile data delete --user-id=45 --field-id=120 --yes
171
+ * Success: XProfile data removed.
172
+ *
173
+ * $ wp bp xprofile data remove --user-id=user_test --delete-all --yes
174
+ * Success: XProfile data removed.
175
+ *
176
+ * @alias remove
177
+ */
178
+ public function delete( $args, $assoc_args ) {
179
+ $user = $this->get_user_id_from_identifier( $assoc_args['user-id'] );
180
+
181
+ if ( ! isset( $assoc_args['field-id'] ) && ! isset( $assoc_args['delete-all'] ) ) {
182
+ WP_CLI::error( 'Either --field-id or --delete-all must be provided.' );
183
+ }
184
+
185
+ if ( isset( $assoc_args['delete-all'] ) ) {
186
+ WP_CLI::confirm( sprintf( 'Are you sure you want to delete all XProfile data for the user %s (#%d)?', $user->user_login, $user->ID ), $assoc_args );
187
+
188
+ xprofile_remove_data( $user->ID );
189
+ WP_CLI::success( 'XProfile data removed.' );
190
+ } else {
191
+ WP_CLI::confirm( 'Are you sure you want to delete that?', $assoc_args );
192
+
193
+ if ( xprofile_delete_field_data( $assoc_args['field-id'], $user->ID ) ) {
194
+ WP_CLI::success( 'XProfile data removed.' );
195
+ } else {
196
+ WP_CLI::error( 'Could not delete XProfile data.' );
197
+ }
198
+ }
199
+ }
200
+ }
cli/components/xprofile-field.php ADDED
@@ -0,0 +1,217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage XProfile Fields.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class XProfile_Field extends BuddypressCommand {
12
+
13
+ /**
14
+ * XProfile object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'id',
20
+ 'name',
21
+ 'description',
22
+ 'type',
23
+ 'group_id',
24
+ 'is_required',
25
+ );
26
+
27
+ /**
28
+ * Get a list of XProfile fields.
29
+ *
30
+ * ## OPTIONS
31
+ *
32
+ * [--<field>=<value>]
33
+ * : One or more parameters to pass. See bp_xprofile_get_groups()
34
+ *
35
+ * ## EXAMPLE
36
+ *
37
+ * $ wp bp xprofile field list
38
+ *
39
+ * @subcommand list
40
+ */
41
+ public function _list( $_, $assoc_args ) {
42
+ $args = array_merge( $assoc_args, array(
43
+ 'fields' => 'id,name',
44
+ 'fetch_fields' => true,
45
+ ) );
46
+
47
+ $fields = array();
48
+ $formatter = $this->get_formatter( $assoc_args );
49
+ $groups = bp_xprofile_get_groups( $args );
50
+
51
+ // Reformat so that field_group_id is a property of fields.
52
+ foreach ( $groups as $group ) {
53
+ foreach ( $group->fields as $field ) {
54
+ $fields[ $field->id ] = $field;
55
+ }
56
+ }
57
+
58
+ ksort( $fields );
59
+
60
+ $formatter->display_items( $fields );
61
+ }
62
+
63
+ /**
64
+ * Create an XProfile field.
65
+ *
66
+ * ## OPTIONS
67
+ *
68
+ * --type=<type>
69
+ * : Field type.
70
+ * ---
71
+ * default: textbox
72
+ * ---
73
+ *
74
+ * --field-group-id=<field-group-id>
75
+ * : ID of the field group where the new field will be created.
76
+ *
77
+ * --name=<name>
78
+ * : Name of the new field.
79
+ *
80
+ * [--porcelain]
81
+ * : Output just the new field id.
82
+ *
83
+ * ## EXAMPLES
84
+ *
85
+ * $ wp bp xprofile field create --type=checkbox --field-group-id=508 --name="Field Name"
86
+ * Success: Created XProfile field "Field Name" (ID 24564).
87
+ *
88
+ * $ wp bp xprofile field add --type=checkbox --field-group-id=165 --name="Another Field"
89
+ * Success: Created XProfile field "Another Field" (ID 5465).
90
+ *
91
+ * @alias add
92
+ */
93
+ public function create( $args, $assoc_args ) {
94
+ // Check this is a non-empty, valid field type.
95
+ if ( ! in_array( $assoc_args['type'], (array) buddypress()->profile->field_types, true ) ) {
96
+ WP_CLI::error( 'Not a valid field type.' );
97
+ }
98
+
99
+ $create_args = array(
100
+ 'type' => $assoc_args['type'],
101
+ 'name' => $assoc_args['name'],
102
+ 'field_group_id' => $assoc_args['field-group-id'],
103
+ );
104
+
105
+ $field_id = xprofile_insert_field( $create_args );
106
+ if ( ! $field_id ) {
107
+ WP_CLI::error( 'Could not create XProfile field.' );
108
+ }
109
+
110
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
111
+ WP_CLI::line( $field_id );
112
+ } else {
113
+ $field = new \BP_XProfile_Field( $field_id );
114
+ $success = sprintf(
115
+ 'Created XProfile field "%s" (ID %d).',
116
+ $field->name,
117
+ $field->id
118
+ );
119
+ WP_CLI::success( $success );
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Get an XProfile field.
125
+ *
126
+ * ## OPTIONS
127
+ *
128
+ * <field-id>
129
+ * : Identifier for the field. Accepts either the name of the field or a numeric ID.
130
+ *
131
+ * [--fields=<fields>]
132
+ * : Limit the output to specific fields.
133
+ * ---
134
+ * Default: All fields.
135
+ * ---
136
+ *
137
+ * [--format=<format>]
138
+ * : Render output in a particular format.
139
+ * ---
140
+ * default: table
141
+ * options:
142
+ * - table
143
+ * - json
144
+ * - haml
145
+ * ---
146
+ *
147
+ * ## EXAMPLES
148
+ *
149
+ * $ wp bp xprofile field get 500
150
+ * $ wp bp xprofile field see 56 --format=json
151
+ *
152
+ * @alias see
153
+ */
154
+ public function get( $args, $assoc_args ) {
155
+ $field_id = $this->get_field_id( $args[0] );
156
+ $object = xprofile_get_field( $field_id );
157
+
158
+ if ( ! is_object( $object ) && empty( $object->id ) ) {
159
+ WP_CLI::error( 'No XProfile field found.' );
160
+ }
161
+
162
+ $object_arr = get_object_vars( $object );
163
+
164
+ if ( empty( $assoc_args['fields'] ) ) {
165
+ $assoc_args['fields'] = array_keys( $object_arr );
166
+ }
167
+
168
+ $formatter = $this->get_formatter( $assoc_args );
169
+ $formatter->display_item( $object_arr );
170
+ }
171
+
172
+ /**
173
+ * Delete an XProfile field.
174
+ *
175
+ * ## OPTIONS
176
+ *
177
+ * <field-id>...
178
+ * : ID or IDs for the field. Accepts either the name of the field or a numeric ID.
179
+ *
180
+ * [--delete-data]
181
+ * : Delete user data for the field as well.
182
+ * ---
183
+ * default: false
184
+ * ---
185
+ *
186
+ * [--yes]
187
+ * : Answer yes to the confirmation message.
188
+ *
189
+ * ## EXAMPLES
190
+ *
191
+ * $ wp bp xprofile field delete 500 --yes
192
+ * Success: Deleted XProfile field "Field Name" (ID 500).
193
+ *
194
+ * $ wp bp xprofile field remove 458 --delete-data --yes
195
+ * Success: Deleted XProfile field "Another Field Name" (ID 458).
196
+ *
197
+ * @alias remove
198
+ */
199
+ public function delete( $args, $assoc_args ) {
200
+ $field_id = $this->get_field_id( $args[0] );
201
+
202
+ WP_CLI::confirm( 'Are you sure you want to delete this field?', $assoc_args );
203
+
204
+ parent::_delete( array( $field_id ), $assoc_args, function( $field_id ) use ( $r ) {
205
+ $field = new \BP_XProfile_Field( $field_id );
206
+ $name = $field->name;
207
+ $id = $field->id;
208
+ $deleted = $field->delete( $r['delete_data'] );
209
+
210
+ if ( $deleted ) {
211
+ return array( 'success', sprintf( 'Deleted XProfile field "%s" (ID %d).', $name, $id ) );
212
+ } else {
213
+ return array( 'error', sprintf( 'Failed deleting XProfile field (ID %d).', $field_id ) );
214
+ }
215
+ } );
216
+ }
217
+ }
cli/components/xprofile-group.php ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI\Command;
3
+
4
+ use WP_CLI;
5
+
6
+ /**
7
+ * Manage XProfile Groups.
8
+ *
9
+ * @since 1.5.0
10
+ */
11
+ class XProfile_Group extends BuddypressCommand {
12
+
13
+ /**
14
+ * XProfile object fields.
15
+ *
16
+ * @var array
17
+ */
18
+ protected $obj_fields = array(
19
+ 'id',
20
+ 'name',
21
+ 'description',
22
+ 'group_order',
23
+ 'can_delete',
24
+ );
25
+
26
+ /**
27
+ * Object ID key.
28
+ *
29
+ * @var int
30
+ */
31
+ protected $obj_id_key = 'id';
32
+
33
+ /**
34
+ * Create an XProfile group.
35
+ *
36
+ * ## OPTIONS
37
+ *
38
+ * --name=<name>
39
+ * : The name for this field group.
40
+ *
41
+ * [--description=<description>]
42
+ * : The description for this field group.
43
+ *
44
+ * [--can-delete=<can-delete>]
45
+ * : Whether the group can be deleted.
46
+ * ---
47
+ * Default: true.
48
+ * ---
49
+ *
50
+ * [--porcelain]
51
+ * : Output just the new group id.
52
+ *
53
+ * ## EXAMPLES
54
+ *
55
+ * $ wp bp xprofile group create --name="Group Name" --description="Xprofile Group Description"
56
+ * Success: Created XProfile field group "Group Name" (ID 123).
57
+ *
58
+ * $ wp bp xprofile group add --name="Another Group" --can-delete=false
59
+ * Success: Created XProfile field group "Another Group" (ID 21212).
60
+ *
61
+ * @alias add
62
+ */
63
+ public function create( $args, $assoc_args ) {
64
+ $r = wp_parse_args( $assoc_args, array(
65
+ 'name' => '',
66
+ 'description' => '',
67
+ 'can_delete' => true,
68
+ ) );
69
+
70
+ $group_id = xprofile_insert_field_group( $r );
71
+
72
+ if ( ! $group_id ) {
73
+ WP_CLI::error( 'Could not create field group.' );
74
+ }
75
+
76
+ if ( WP_CLI\Utils\get_flag_value( $assoc_args, 'porcelain' ) ) {
77
+ WP_CLI::line( $group_id );
78
+ } else {
79
+ $group = new \BP_XProfile_Group( $group_id );
80
+ $success = sprintf(
81
+ 'Created XProfile field group "%s" (ID %d).',
82
+ $group->name,
83
+ $group->id
84
+ );
85
+ WP_CLI::success( $success );
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Fetch specific XProfile field group.
91
+ *
92
+ * ## OPTIONS
93
+ *
94
+ * <field-group-id>
95
+ * : Identifier for the field group.
96
+ *
97
+ * [--fields=<fields>]
98
+ * : Limit the output to specific fields.
99
+ * ---
100
+ * Default: All fields.
101
+ * ---
102
+ *
103
+ * [--format=<format>]
104
+ * : Render output in a particular format.
105
+ * ---
106
+ * default: table
107
+ * options:
108
+ * - table
109
+ * - json
110
+ * - haml
111
+ * ---
112
+ *
113
+ * ## EXAMPLES
114
+ *
115
+ * $ wp bp xprofile group get 500
116
+ * $ wp bp xprofile group see 56 --format=json
117
+ *
118
+ * @alias see
119
+ */
120
+ public function get( $args, $assoc_args ) {
121
+ $field_group_id = $args[0];
122
+
123
+ if ( ! is_numeric( $field_group_id ) ) {
124
+ WP_CLI::error( 'Please provide a numeric field group ID.' );
125
+ }
126
+
127
+ $object = xprofile_get_field_group( $field_group_id );
128
+ if ( ! is_object( $object ) && empty( $object->id ) ) {
129
+ WP_CLI::error( 'No XProfile field group found.' );
130
+ }
131
+
132
+ $object_arr = get_object_vars( $object );
133
+ if ( empty( $assoc_args['fields'] ) ) {
134
+ $assoc_args['fields'] = array_keys( $object_arr );
135
+ }
136
+
137
+ $formatter = $this->get_formatter( $assoc_args );
138
+ $formatter->display_item( $object_arr );
139
+ }
140
+
141
+ /**
142
+ * Delete a specific XProfile field group.
143
+ *
144
+ * ## OPTIONS
145
+ *
146
+ * <field-group-id>...
147
+ * : ID or IDs for the field group.
148
+ *
149
+ * [--yes]
150
+ * : Answer yes to the confirmation message.
151
+ *
152
+ * ## EXAMPLE
153
+ *
154
+ * $ wp bp xprofile group delete 500 --yes
155
+ *
156
+ * @alias remove
157
+ */
158
+ public function delete( $args, $assoc_args ) {
159
+ $field_group_id = $args[0];
160
+ WP_CLI::confirm( 'Are you sure you want to delete this field group?', $assoc_args );
161
+
162
+ parent::_delete( array( $field_group_id ), $assoc_args, function( $field_group_id ) {
163
+ if ( ! is_numeric( $field_group_id ) ) {
164
+ WP_CLI::error( 'This is not a valid field group ID.' );
165
+ }
166
+
167
+ if ( xprofile_delete_field_group( $field_group_id ) ) {
168
+ return array( 'success', 'Field group deleted.' );
169
+ } else {
170
+ return array( 'error', 'Could not delete the field group.' );
171
+ }
172
+ } );
173
+ }
174
+ }
cli/composer.json ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "buddypress/wp-cli-buddypress",
3
+ "type": "wp-cli-package",
4
+ "description": "WP-CLI Community Package of BuddyPress commands",
5
+ "keywords": [ "wp-cli", "buddypress", "community", "wordpress", "bp" ],
6
+ "homepage": "https://github.com/buddypress/wp-cli-buddypress",
7
+ "license": "MIT",
8
+ "authors": [
9
+ {
10
+ "name": "The BuddPress Contributors",
11
+ "homepage": "https://buddypress.org/"
12
+ }
13
+ ],
14
+ "support": {
15
+ "issues": "https://github.com/buddypress/wp-cli-buddypress/issues",
16
+ "source": "https://github.com/buddypress/wp-cli-buddypress"
17
+ },
18
+ "minimum-stability": "dev",
19
+ "prefer-stable": true,
20
+ "autoload": {
21
+ "files": [ "wp-cli-bp.php" ]
22
+ },
23
+ "require": {
24
+ "php": ">=5.3",
25
+ "wp-cli/wp-cli": ">=0.23.0"
26
+ },
27
+ "require-dev": {
28
+ "behat/behat": "~2.5"
29
+ },
30
+ "extra": {
31
+ "branch-alias": {
32
+ "dev-master": "1.x-dev"
33
+ },
34
+ "bundled": true,
35
+ "commands": [
36
+ "bp"
37
+ ]
38
+ }
39
+ }
cli/features/activity-favorite.feature ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Activity Favorites
2
+
3
+ Scenario: Activity Favorite CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp user create testuser2 testuser2@example.com --porcelain`
7
+ And save STDOUT as {MEMBER_ID}
8
+
9
+ When I run `wp bp activity create --component=groups --user-id={MEMBER_ID} --porcelain`
10
+ Then STDOUT should be a number
11
+ And save STDOUT as {ACTIVITY_ID}
12
+
13
+ When I run `wp bp activity list --fields=id,user_id,component`
14
+ Then STDOUT should be a table containing rows:
15
+ | id | user_id | component |
16
+ | {ACTIVITY_ID} | {MEMBER_ID} | groups |
17
+
18
+ When I run `wp user create testuser3 testuser3@example.com --porcelain`
19
+ And save STDOUT as {SEC_MEMBER_ID}
20
+
21
+ When I run `wp bp activity favorite create {ACTIVITY_ID} {SEC_MEMBER_ID}`
22
+ Then STDOUT should contain:
23
+ """
24
+ Success: Activity item added as a favorite for the user.
25
+ """
26
+
27
+ When I run `wp bp activity favorite list {SEC_MEMBER_ID} --fields=id`
28
+ Then STDOUT should be a table containing rows:
29
+ | id |
30
+ | {ACTIVITY_ID} |
31
+
32
+ When I run `wp bp activity favorite remove {ACTIVITY_ID} {SEC_MEMBER_ID} --yes`
33
+ Then STDOUT should contain:
34
+ """
35
+ Success: Activity item removed as a favorite for the user.
36
+ """
37
+
38
+ When I try `wp bp activity favorite list {SEC_MEMBER_ID} --fields=id`
39
+ Then the return code should be 1
cli/features/activity.feature ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Activities
2
+
3
+ Scenario: Activity CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp user create testuser2 testuser2@example.com --first_name=test --last_name=user --role=subscriber --porcelain`
7
+ Then STDOUT should be a number
8
+ And save STDOUT as {MEMBER_ID}
9
+
10
+ When I run `wp bp activity create --component=groups --user-id={MEMBER_ID} --porcelain`
11
+ Then STDOUT should be a number
12
+ And save STDOUT as {ACTIVITY_ID}
13
+
14
+ When I run `wp bp activity get {ACTIVITY_ID} --fields=id,user_id,component`
15
+ Then STDOUT should be a table containing rows:
16
+ | Field | Value |
17
+ | id | {ACTIVITY_ID} |
18
+ | user_id | {MEMBER_ID} |
19
+ | component | groups |
20
+
21
+ When I run `wp bp activity list --fields=id,user_id,component`
22
+ Then STDOUT should be a table containing rows:
23
+ | id | user_id | component |
24
+ | {ACTIVITY_ID} | {MEMBER_ID} | groups |
25
+
26
+ When I run `wp bp activity spam {ACTIVITY_ID}`
27
+ Then STDOUT should contain:
28
+ """
29
+ Success: Activity marked as spam.
30
+ """
31
+
32
+ When I run `wp bp activity get {ACTIVITY_ID} --fields=id,is_spam`
33
+ Then STDOUT should be a table containing rows:
34
+ | Field | Value |
35
+ | id | {ACTIVITY_ID} |
36
+ | is_spam | 1 |
37
+
38
+ When I run `wp bp activity ham {ACTIVITY_ID}`
39
+ Then STDOUT should contain:
40
+ """
41
+ Success: Activity marked as ham.
42
+ """
43
+
44
+ When I run `wp bp activity get {ACTIVITY_ID} --fields=id,is_spam`
45
+ Then STDOUT should be a table containing rows:
46
+ | Field | Value |
47
+ | id | {ACTIVITY_ID} |
48
+ | is_spam | 0 |
49
+
50
+ When I run `wp bp activity delete {ACTIVITY_ID} --yes`
51
+ Then STDOUT should contain:
52
+ """
53
+ Success: Activity deleted.
54
+ """
55
+
56
+ When I try `wp bp activity get {ACTIVITY_ID}`
57
+ Then the return code should be 1
58
+
59
+ Scenario: Activity Comment Operations
60
+ Given a BP install
61
+
62
+ When I run `wp user create testuser2 testuser2@example.com --first_name=test --last_name=user --role=subscriber --porcelain`
63
+ Then STDOUT should be a number
64
+ And save STDOUT as {MEMBER_ID}
65
+
66
+ When I run `wp bp activity post-update --user-id={MEMBER_ID} --content="Random Content" --porcelain`
67
+ Then STDOUT should be a number
68
+ And save STDOUT as {ACTIVITY_ID}
69
+
70
+ When I run `wp bp activity list --fields=id,user_id,component`
71
+ Then STDOUT should be a table containing rows:
72
+ | id | user_id | component |
73
+ | {ACTIVITY_ID} | {MEMBER_ID} | activity |
74
+
75
+ When I run `wp bp activity comment {ACTIVITY_ID} --user-id={MEMBER_ID} --content="Activity Comment" --skip-notification --porcelain`
76
+ Then STDOUT should be a number
77
+ And save STDOUT as {COMMENT_ID}
78
+
79
+ When I run `wp bp activity get {COMMENT_ID} --fields=id,type`
80
+ Then STDOUT should be a table containing rows:
81
+ | Field | Value |
82
+ | id | {COMMENT_ID} |
83
+ | type | activity_comment |
84
+
85
+ When I run `wp bp activity delete_comment {ACTIVITY_ID} --comment-id={COMMENT_ID} --yes`
86
+ Then STDOUT should contain:
87
+ """
88
+ Success: Activity comment deleted.
89
+ """
90
+
91
+ When I try `wp bp activity get {COMMENT_ID} --fields=id,type`
92
+ Then the return code should be 1
cli/features/bootstrap/FeatureContext.php ADDED
@@ -0,0 +1,903 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Behat\Behat\Context\ClosuredContextInterface,
4
+ Behat\Behat\Context\TranslatedContextInterface,
5
+ Behat\Behat\Context\BehatContext,
6
+ Behat\Behat\Event\SuiteEvent;
7
+
8
+ use \WP_CLI\Process;
9
+ use \WP_CLI\Utils;
10
+
11
+ // Inside a community package
12
+ if ( file_exists( __DIR__ . '/utils.php' ) ) {
13
+ require_once __DIR__ . '/utils.php';
14
+ require_once __DIR__ . '/Process.php';
15
+ require_once __DIR__ . '/ProcessRun.php';
16
+ $project_composer = dirname( dirname( dirname( __FILE__ ) ) ) . '/composer.json';
17
+ if ( file_exists( $project_composer ) ) {
18
+ $composer = json_decode( file_get_contents( $project_composer ) );
19
+ if ( ! empty( $composer->autoload->files ) ) {
20
+ $contents = 'require:' . PHP_EOL;
21
+ foreach( $composer->autoload->files as $file ) {
22
+ $contents .= ' - ' . dirname( dirname( dirname( __FILE__ ) ) ) . '/' . $file . PHP_EOL;
23
+ }
24
+ @mkdir( sys_get_temp_dir() . '/wp-cli-package-test/' );
25
+ $project_config = sys_get_temp_dir() . '/wp-cli-package-test/config.yml';
26
+ file_put_contents( $project_config, $contents );
27
+ putenv( 'WP_CLI_CONFIG_PATH=' . $project_config );
28
+ }
29
+ }
30
+ // Inside WP-CLI
31
+ } else {
32
+ require_once __DIR__ . '/../../php/utils.php';
33
+ require_once __DIR__ . '/../../php/WP_CLI/Process.php';
34
+ require_once __DIR__ . '/../../php/WP_CLI/ProcessRun.php';
35
+ if ( file_exists( __DIR__ . '/../../vendor/autoload.php' ) ) {
36
+ require_once __DIR__ . '/../../vendor/autoload.php';
37
+ } else if ( file_exists( __DIR__ . '/../../../../autoload.php' ) ) {
38
+ require_once __DIR__ . '/../../../../autoload.php';
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Features context.
44
+ */
45
+ class FeatureContext extends BehatContext implements ClosuredContextInterface {
46
+
47
+ /**
48
+ * The current working directory for scenarios that have a "Given a WP install" or "Given an empty directory" step. Variable RUN_DIR. Lives until the end of the scenario.
49
+ */
50
+ private static $run_dir;
51
+
52
+ /**
53
+ * Where WordPress core is downloaded to for caching, and which is copied to RUN_DIR during a "Given a WP install" step. Lives until manually deleted.
54
+ */
55
+ private static $cache_dir;
56
+
57
+ /**
58
+ * The directory that holds the install cache, and which is copied to RUN_DIR during a "Given a WP install" step. Recreated on each suite run.
59
+ */
60
+ private static $install_cache_dir;
61
+
62
+ /**
63
+ * The directory that the WP-CLI cache (WP_CLI_CACHE_DIR, normally "$HOME/.wp-cli/cache") is set to on a "Given an empty cache" step.
64
+ * Variable SUITE_CACHE_DIR. Lives until the end of the scenario (or until another "Given an empty cache" step within the scenario).
65
+ */
66
+ private static $suite_cache_dir;
67
+
68
+ /**
69
+ * Where the current WP-CLI source repository is copied to for Composer-based tests with a "Given a dependency on current wp-cli" step.
70
+ * Variable COMPOSER_LOCAL_REPOSITORY. Lives until the end of the suite.
71
+ */
72
+ private static $composer_local_repository;
73
+
74
+ /**
75
+ * The test database settings. All but `dbname` can be set via environment variables. The database is dropped at the start of each scenario and created on a "Given a WP install" step.
76
+ */
77
+ private static $db_settings = array(
78
+ 'dbname' => 'wp_cli_test',
79
+ 'dbuser' => 'wp_cli_test',
80
+ 'dbpass' => 'password1',
81
+ 'dbhost' => '127.0.0.1',
82
+ );
83
+
84
+ /**
85
+ * Array of background process ids started by the current scenario. Used to terminate them at the end of the scenario.
86
+ */
87
+ private $running_procs = array();
88
+
89
+ /**
90
+ * Array of variables available as {VARIABLE_NAME}. Some are always set: CORE_CONFIG_SETTINGS, SRC_DIR, CACHE_DIR, WP_VERSION-version-latest. Some are step-dependent:
91
+ * RUN_DIR, SUITE_CACHE_DIR, COMPOSER_LOCAL_REPOSITORY, PHAR_PATH. Scenarios can define their own variables using "Given save" steps. Variables are reset for each scenario.
92
+ */
93
+ public $variables = array();
94
+
95
+ /**
96
+ * The current feature file and scenario line number as '<file>.<line>'. Used in RUN_DIR and SUITE_CACHE_DIR directory names. Set at the start of each scenario.
97
+ */
98
+ private static $temp_dir_infix;
99
+
100
+ /**
101
+ * Settings and variables for WP_CLI_TEST_LOG_RUN_TIMES run time logging.
102
+ */
103
+ private static $log_run_times; // Whether to log run times - WP_CLI_TEST_LOG_RUN_TIMES env var. Set on `@BeforeScenario'.
104
+ private static $suite_start_time; // When the suite started, set on `@BeforeScenario'.
105
+ private static $output_to; // Where to output log - stdout|error_log. Set on `@BeforeSuite`.
106
+ private static $num_top_processes; // Number of processes/methods to output by longest run times. Set on `@BeforeSuite`.
107
+ private static $num_top_scenarios; // Number of scenarios to output by longest run times. Set on `@BeforeSuite`.
108
+
109
+ private static $scenario_run_times = array(); // Scenario run times (top `self::$num_top_scenarios` only).
110
+ private static $scenario_count = 0; // Scenario count, incremented on `@AfterScenario`.
111
+ private static $proc_method_run_times = array(); // Array of run time info for proc methods, keyed by method name and arg, each a 2-element array containing run time and run count.
112
+
113
+ /**
114
+ * Get the environment variables required for launched `wp` processes
115
+ */
116
+ private static function get_process_env_variables() {
117
+ // Ensure we're using the expected `wp` binary
118
+ $bin_dir = getenv( 'WP_CLI_BIN_DIR' ) ?: realpath( __DIR__ . '/../../bin' );
119
+ $vendor_dir = realpath( __DIR__ . '/../../vendor/bin' );
120
+ $env = array(
121
+ 'PATH' => $bin_dir . ':' . $vendor_dir . ':' . getenv( 'PATH' ),
122
+ 'BEHAT_RUN' => 1,
123
+ 'HOME' => sys_get_temp_dir() . '/wp-cli-home',
124
+ );
125
+ if ( $config_path = getenv( 'WP_CLI_CONFIG_PATH' ) ) {
126
+ $env['WP_CLI_CONFIG_PATH'] = $config_path;
127
+ }
128
+ if ( $term = getenv( 'TERM' ) ) {
129
+ $env['TERM'] = $term;
130
+ }
131
+ if ( $php_args = getenv( 'WP_CLI_PHP_ARGS' ) ) {
132
+ $env['WP_CLI_PHP_ARGS'] = $php_args;
133
+ }
134
+ if ( $travis_build_dir = getenv( 'TRAVIS_BUILD_DIR' ) ) {
135
+ $env['TRAVIS_BUILD_DIR'] = $travis_build_dir;
136
+ }
137
+ if ( $github_token = getenv( 'GITHUB_TOKEN' ) ) {
138
+ $env['GITHUB_TOKEN'] = $github_token;
139
+ }
140
+ return $env;
141
+ }
142
+
143
+ /**
144
+ * We cache the results of `wp core download` to improve test performance.
145
+ * Ideally, we'd cache at the HTTP layer for more reliable tests.
146
+ */
147
+ private static function cache_wp_files() {
148
+ $wp_version_suffix = ( $wp_version = getenv( 'WP_VERSION' ) ) ? "-$wp_version" : '';
149
+ self::$cache_dir = sys_get_temp_dir() . '/wp-cli-test-core-download-cache' . $wp_version_suffix;
150
+
151
+ if ( is_readable( self::$cache_dir . '/wp-config-sample.php' ) )
152
+ return;
153
+
154
+ $cmd = Utils\esc_cmd( 'wp core download --force --path=%s', self::$cache_dir );
155
+ if ( $wp_version ) {
156
+ $cmd .= Utils\esc_cmd( ' --version=%s', $wp_version );
157
+ }
158
+ Process::create( $cmd, null, self::get_process_env_variables() )->run_check();
159
+ }
160
+
161
+ /**
162
+ * @BeforeSuite
163
+ */
164
+ public static function prepare( SuiteEvent $event ) {
165
+ // Test performance statistics - useful for detecting slow tests.
166
+ if ( self::$log_run_times = getenv( 'WP_CLI_TEST_LOG_RUN_TIMES' ) ) {
167
+ self::log_run_times_before_suite( $event );
168
+ }
169
+
170
+ $result = Process::create( 'wp cli info', null, self::get_process_env_variables() )->run_check();
171
+ echo PHP_EOL;
172
+ echo $result->stdout;
173
+ echo PHP_EOL;
174
+ self::cache_wp_files();
175
+ $result = Process::create( Utils\esc_cmd( 'wp core version --path=%s', self::$cache_dir ) , null, self::get_process_env_variables() )->run_check();
176
+ echo 'WordPress ' . $result->stdout;
177
+ echo PHP_EOL;
178
+
179
+ // Remove install cache if any (not setting the static var).
180
+ $wp_version_suffix = ( $wp_version = getenv( 'WP_VERSION' ) ) ? "-$wp_version" : '';
181
+ $install_cache_dir = sys_get_temp_dir() . '/wp-cli-test-core-install-cache' . $wp_version_suffix;
182
+ if ( file_exists( $install_cache_dir ) ) {
183
+ self::remove_dir( $install_cache_dir );
184
+ }
185
+ }
186
+
187
+ /**
188
+ * @AfterSuite
189
+ */
190
+ public static function afterSuite( SuiteEvent $event ) {
191
+ if ( self::$composer_local_repository ) {
192
+ self::remove_dir( self::$composer_local_repository );
193
+ self::$composer_local_repository = null;
194
+ }
195
+
196
+ if ( self::$log_run_times ) {
197
+ self::log_run_times_after_suite( $event );
198
+ }
199
+ }
200
+
201
+ /**
202
+ * @BeforeScenario
203
+ */
204
+ public function beforeScenario( $event ) {
205
+ if ( self::$log_run_times ) {
206
+ self::log_run_times_before_scenario( $event );
207
+ }
208
+
209
+ $this->variables['SRC_DIR'] = realpath( __DIR__ . '/../..' );
210
+
211
+ // Used in the names of the RUN_DIR and SUITE_CACHE_DIR directories.
212
+ self::$temp_dir_infix = null;
213
+ if ( $file = self::get_event_file( $event, $line ) ) {
214
+ self::$temp_dir_infix = basename( $file ) . '.' . $line;
215
+ }
216
+ }
217
+
218
+ /**
219
+ * @AfterScenario
220
+ */
221
+ public function afterScenario( $event ) {
222
+
223
+ if ( self::$run_dir ) {
224
+ // remove altered WP install, unless there's an error
225
+ if ( $event->getResult() < 4 ) {
226
+ self::remove_dir( self::$run_dir );
227
+ }
228
+ self::$run_dir = null;
229
+ }
230
+
231
+ // Remove WP-CLI package directory if any. Set to `wp package path` by package-command and scaffold-package-command features, and by cli-info.feature.
232
+ if ( isset( $this->variables['PACKAGE_PATH'] ) ) {
233
+ self::remove_dir( $this->variables['PACKAGE_PATH'] );
234
+ }
235
+
236
+ // Remove SUITE_CACHE_DIR if any.
237
+ if ( self::$suite_cache_dir ) {
238
+ self::remove_dir( self::$suite_cache_dir );
239
+ self::$suite_cache_dir = null;
240
+ }
241
+
242
+ // Remove any background processes.
243
+ foreach ( $this->running_procs as $proc ) {
244
+ $status = proc_get_status( $proc );
245
+ self::terminate_proc( $status['pid'] );
246
+ }
247
+
248
+ if ( self::$log_run_times ) {
249
+ self::log_run_times_after_scenario( $event );
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Terminate a process and any of its children.
255
+ */
256
+ private static function terminate_proc( $master_pid ) {
257
+
258
+ $output = `ps -o ppid,pid,command | grep $master_pid`;
259
+
260
+ foreach ( explode( PHP_EOL, $output ) as $line ) {
261
+ if ( preg_match( '/^\s*(\d+)\s+(\d+)/', $line, $matches ) ) {
262
+ $parent = $matches[1];
263
+ $child = $matches[2];
264
+
265
+ if ( $parent == $master_pid ) {
266
+ self::terminate_proc( $child );
267
+ }
268
+ }
269
+ }
270
+
271
+ if ( ! posix_kill( (int) $master_pid, 9 ) ) {
272
+ $errno = posix_get_last_error();
273
+ // Ignore "No such process" error as that's what we want.
274
+ if ( 3 /*ESRCH*/ !== $errno ) {
275
+ throw new RuntimeException( posix_strerror( $errno ) );
276
+ }
277
+ }
278
+ }
279
+
280
+ /**
281
+ * Create a temporary WP_CLI_CACHE_DIR. Exposed as SUITE_CACHE_DIR in "Given an empty cache" step.
282
+ */
283
+ public static function create_cache_dir() {
284
+ if ( self::$suite_cache_dir ) {
285
+ self::remove_dir( self::$suite_cache_dir );
286
+ }
287
+ self::$suite_cache_dir = sys_get_temp_dir() . '/' . uniqid( 'wp-cli-test-suite-cache-' . self::$temp_dir_infix . '-', TRUE );
288
+ mkdir( self::$suite_cache_dir );
289
+ return self::$suite_cache_dir;
290
+ }
291
+
292
+ /**
293
+ * Initializes context.
294
+ * Every scenario gets its own context object.
295
+ *
296
+ * @param array $parameters context parameters (set them up through behat.yml)
297
+ */
298
+ public function __construct( array $parameters ) {
299
+ if ( getenv( 'WP_CLI_TEST_DBUSER' ) ) {
300
+ self::$db_settings['dbuser'] = getenv( 'WP_CLI_TEST_DBUSER' );
301
+ }
302
+
303
+ if ( false !== getenv( 'WP_CLI_TEST_DBPASS' ) ) {
304
+ self::$db_settings['dbpass'] = getenv( 'WP_CLI_TEST_DBPASS' );
305
+ }
306
+
307
+ if ( getenv( 'WP_CLI_TEST_DBHOST' ) ) {
308
+ self::$db_settings['dbhost'] = getenv( 'WP_CLI_TEST_DBHOST' );
309
+ }
310
+
311
+ $this->drop_db();
312
+ $this->set_cache_dir();
313
+ $this->variables['CORE_CONFIG_SETTINGS'] = Utils\assoc_args_to_str( self::$db_settings );
314
+ }
315
+
316
+ public function getStepDefinitionResources() {
317
+ return glob( __DIR__ . '/../steps/*.php' );
318
+ }
319
+
320
+ public function getHookDefinitionResources() {
321
+ return array();
322
+ }
323
+
324
+ /**
325
+ * Replace {VARIABLE_NAME}. Note that variable names can only contain uppercase letters and underscores (no numbers).
326
+ */
327
+ public function replace_variables( $str ) {
328
+ $ret = preg_replace_callback( '/\{([A-Z_]+)\}/', array( $this, '_replace_var' ), $str );
329
+ if ( false !== strpos( $str, '{WP_VERSION-' ) ) {
330
+ $ret = $this->_replace_wp_versions( $ret );
331
+ }
332
+ return $ret;
333
+ }
334
+
335
+ /**
336
+ * Replace variables callback.
337
+ */
338
+ private function _replace_var( $matches ) {
339
+ $cmd = $matches[0];
340
+
341
+ foreach ( array_slice( $matches, 1 ) as $key ) {
342
+ $cmd = str_replace( '{' . $key . '}', $this->variables[ $key ], $cmd );
343
+ }
344
+
345
+ return $cmd;
346
+ }
347
+
348
+ /**
349
+ * Substitute "{WP_VERSION-version-latest}" variables.
350
+ */
351
+ private function _replace_wp_versions( $str ) {
352
+ static $wp_versions = null;
353
+ if ( null === $wp_versions ) {
354
+ $wp_versions = array();
355
+
356
+ $response = Requests::get( 'https://api.wordpress.org/core/version-check/1.7/', null, array( 'timeout' => 30 ) );
357
+ if ( 200 === $response->status_code && ( $body = json_decode( $response->body ) ) && is_object( $body ) && isset( $body->offers ) && is_array( $body->offers ) ) {
358
+ // Latest version alias.
359
+ $wp_versions["{WP_VERSION-latest}"] = count( $body->offers ) ? $body->offers[0]->version : '';
360
+ foreach ( $body->offers as $offer ) {
361
+ $sub_ver = preg_replace( '/(^[0-9]+\.[0-9]+)\.[0-9]+$/', '$1', $offer->version );
362
+ $sub_ver_key = "{WP_VERSION-{$sub_ver}-latest}";
363
+
364
+ $main_ver = preg_replace( '/(^[0-9]+)\.[0-9]+$/', '$1', $sub_ver );
365
+ $main_ver_key = "{WP_VERSION-{$main_ver}-latest}";
366
+
367
+ if ( ! isset( $wp_versions[ $main_ver_key ] ) ) {
368
+ $wp_versions[ $main_ver_key ] = $offer->version;
369
+ }
370
+ if ( ! isset( $wp_versions[ $sub_ver_key ] ) ) {
371
+ $wp_versions[ $sub_ver_key ] = $offer->version;
372
+ }
373
+ }
374
+ }
375
+ }
376
+ return strtr( $str, $wp_versions );
377
+ }
378
+
379
+ /**
380
+ * Get the file and line number for the current behat event.
381
+ */
382
+ private static function get_event_file( $event, &$line ) {
383
+ if ( method_exists( $event, 'getScenario' ) ) {
384
+ $scenario_feature = $event->getScenario();
385
+ } elseif ( method_exists( $event, 'getFeature' ) ) {
386
+ $scenario_feature = $event->getFeature();
387
+ } elseif ( method_exists( $event, 'getOutline' ) ) {
388
+ $scenario_feature = $event->getOutline();
389
+ } else {
390
+ return null;
391
+ }
392
+ $line = $scenario_feature->getLine();
393
+ return $scenario_feature->getFile();
394
+ }
395
+
396
+ /**
397
+ * Create the RUN_DIR directory, unless already set for this scenario.
398
+ */
399
+ public function create_run_dir() {
400
+ if ( !isset( $this->variables['RUN_DIR'] ) ) {
401
+ self::$run_dir = $this->variables['RUN_DIR'] = sys_get_temp_dir() . '/' . uniqid( 'wp-cli-test-run-' . self::$temp_dir_infix . '-', TRUE );
402
+ mkdir( $this->variables['RUN_DIR'] );
403
+ }
404
+ }
405
+
406
+ public function build_phar( $version = 'same' ) {
407
+ $this->variables['PHAR_PATH'] = $this->variables['RUN_DIR'] . '/' . uniqid( "wp-cli-build-", TRUE ) . '.phar';
408
+
409
+ // Test running against a package installed as a WP-CLI dependency
410
+ // WP-CLI installed as a project dependency
411
+ $make_phar_path = __DIR__ . '/../../../../../utils/make-phar.php';
412
+ if ( ! file_exists( $make_phar_path ) ) {
413
+ // Test running against WP-CLI proper
414
+ $make_phar_path = __DIR__ . '/../../utils/make-phar.php';
415
+ if ( ! file_exists( $make_phar_path ) ) {
416
+ // WP-CLI as a dependency of this project
417
+ $make_phar_path = __DIR__ . '/../../vendor/wp-cli/wp-cli/utils/make-phar.php';
418
+ }
419
+ }
420
+
421
+ $this->proc( Utils\esc_cmd(
422
+ 'php -dphar.readonly=0 %1$s %2$s --version=%3$s && chmod +x %2$s',
423
+ $make_phar_path,
424
+ $this->variables['PHAR_PATH'],
425
+ $version
426
+ ) )->run_check();
427
+ }
428
+
429
+ public function download_phar( $version = 'same' ) {
430
+ if ( 'same' === $version ) {
431
+ $version = WP_CLI_VERSION;
432
+ }
433
+
434
+ $download_url = sprintf(
435
+ 'https://github.com/wp-cli/wp-cli/releases/download/v%1$s/wp-cli-%1$s.phar',
436
+ $version
437
+ );
438
+
439
+ $this->variables['PHAR_PATH'] = $this->variables['RUN_DIR'] . '/'
440
+ . uniqid( 'wp-cli-download-', true )
441
+ . '.phar';
442
+
443
+ Process::create( Utils\esc_cmd(
444
+ 'curl -sSfL %1$s > %2$s && chmod +x %2$s',
445
+ $download_url,
446
+ $this->variables['PHAR_PATH']
447
+ ) )->run_check();
448
+ }
449
+
450
+ /**
451
+ * CACHE_DIR is a cache for downloaded test data such as images. Lives until manually deleted.
452
+ */
453
+ private function set_cache_dir() {
454
+ $path = sys_get_temp_dir() . '/wp-cli-test-cache';
455
+ if ( ! file_exists( $path ) ) {
456
+ mkdir( $path );
457
+ }
458
+ $this->variables['CACHE_DIR'] = $path;
459
+ }
460
+
461
+ /**
462
+ * Run a MySQL command with `$db_settings`.
463
+ *
464
+ * @param string $sql_cmd Command to run.
465
+ * @param array $assoc_args Optional. Associative array of options. Default empty.
466
+ * @param bool $add_database Optional. Whether to add dbname to the $sql_cmd. Default false.
467
+ */
468
+ private static function run_sql( $sql_cmd, $assoc_args = array(), $add_database = false ) {
469
+ $default_assoc_args = array(
470
+ 'host' => self::$db_settings['dbhost'],
471
+ 'user' => self::$db_settings['dbuser'],
472
+ 'pass' => self::$db_settings['dbpass'],
473
+ );
474
+ if ( $add_database ) {
475
+ $sql_cmd .= ' ' . escapeshellarg( self::$db_settings['dbname'] );
476
+ }
477
+ $start_time = microtime( true );
478
+ Utils\run_mysql_command( $sql_cmd, array_merge( $assoc_args, $default_assoc_args ) );
479
+ if ( self::$log_run_times ) {
480
+ self::log_proc_method_run_time( 'run_sql ' . $sql_cmd, $start_time );
481
+ }
482
+ }
483
+
484
+ public function create_db() {
485
+ $dbname = self::$db_settings['dbname'];
486
+ self::run_sql( 'mysql --no-defaults', array( 'execute' => "CREATE DATABASE IF NOT EXISTS $dbname" ) );
487
+ }
488
+
489
+ public function drop_db() {
490
+ $dbname = self::$db_settings['dbname'];
491
+ self::run_sql( 'mysql --no-defaults', array( 'execute' => "DROP DATABASE IF EXISTS $dbname" ) );
492
+ }
493
+
494
+ public function proc( $command, $assoc_args = array(), $path = '' ) {
495
+ if ( !empty( $assoc_args ) )
496
+ $command .= Utils\assoc_args_to_str( $assoc_args );
497
+
498
+ $env = self::get_process_env_variables();
499
+ if ( isset( $this->variables['SUITE_CACHE_DIR'] ) ) {
500
+ $env['WP_CLI_CACHE_DIR'] = $this->variables['SUITE_CACHE_DIR'];
501
+ }
502
+
503
+ if ( isset( $this->variables['RUN_DIR'] ) ) {
504
+ $cwd = "{$this->variables['RUN_DIR']}/{$path}";
505
+ } else {
506
+ $cwd = null;
507
+ }
508
+
509
+ return Process::create( $command, $cwd, $env );
510
+ }
511
+
512
+ /**
513
+ * Start a background process. Will automatically be closed when the tests finish.
514
+ */
515
+ public function background_proc( $cmd ) {
516
+ $descriptors = array(
517
+ 0 => STDIN,
518
+ 1 => array( 'pipe', 'w' ),
519
+ 2 => array( 'pipe', 'w' ),
520
+ );
521
+
522
+ $proc = proc_open( $cmd, $descriptors, $pipes, $this->variables['RUN_DIR'], self::get_process_env_variables() );
523
+
524
+ sleep(1);
525
+
526
+ $status = proc_get_status( $proc );
527
+
528
+ if ( !$status['running'] ) {
529
+ throw new RuntimeException( stream_get_contents( $pipes[2] ) );
530
+ } else {
531
+ $this->running_procs[] = $proc;
532
+ }
533
+ }
534
+
535
+ public function move_files( $src, $dest ) {
536
+ rename( $this->variables['RUN_DIR'] . "/$src", $this->variables['RUN_DIR'] . "/$dest" );
537
+ }
538
+
539
+ /**
540
+ * Remove a directory (recursive).
541
+ */
542
+ public static function remove_dir( $dir ) {
543
+ Process::create( Utils\esc_cmd( 'rm -rf %s', $dir ) )->run_check();
544
+ }
545
+
546
+ /**
547
+ * Copy a directory (recursive). Destination directory must exist.
548
+ */
549
+ public static function copy_dir( $src_dir, $dest_dir ) {
550
+ Process::create( Utils\esc_cmd( "cp -r %s/* %s", $src_dir, $dest_dir ) )->run_check();
551
+ }
552
+
553
+ public function add_line_to_wp_config( &$wp_config_code, $line ) {
554
+ $token = "/* That's all, stop editing!";
555
+
556
+ $wp_config_code = str_replace( $token, "$line\n\n$token", $wp_config_code );
557
+ }
558
+
559
+ public function download_wp( $subdir = '' ) {
560
+ $dest_dir = $this->variables['RUN_DIR'] . "/$subdir";
561
+
562
+ if ( $subdir ) {
563
+ mkdir( $dest_dir );
564
+ }
565
+
566
+ self::copy_dir( self::$cache_dir, $dest_dir );
567
+
568
+ // disable emailing
569
+ mkdir( $dest_dir . '/wp-content/mu-plugins' );
570
+ copy( __DIR__ . '/../extra/no-mail.php', $dest_dir . '/wp-content/mu-plugins/no-mail.php' );
571
+ }
572
+
573
+ public function create_config( $subdir = '', $extra_php = false ) {
574
+ $params = self::$db_settings;
575
+
576
+ // Replaces all characters that are not alphanumeric or an underscore into an underscore.
577
+ $params['dbprefix'] = $subdir ? preg_replace( '#[^a-zA-Z\_0-9]#', '_', $subdir ) : 'wp_';
578
+
579
+ $params['skip-salts'] = true;
580
+
581
+ if( false !== $extra_php ) {
582
+ $params['extra-php'] = $extra_php;
583
+ }
584
+
585
+ $config_cache_path = '';
586
+ if ( self::$install_cache_dir ) {
587
+ $config_cache_path = self::$install_cache_dir . '/config_' . md5( implode( ':', $params ) . ':subdir=' . $subdir );
588
+ $run_dir = '' !== $subdir ? ( $this->variables['RUN_DIR'] . "/$subdir" ) : $this->variables['RUN_DIR'];
589
+ }
590
+
591
+ if ( $config_cache_path && file_exists( $config_cache_path ) ) {
592
+ copy( $config_cache_path, $run_dir . '/wp-config.php' );
593
+ } else {
594
+ $this->proc( 'wp config create', $params, $subdir )->run_check();
595
+ if ( $config_cache_path && file_exists( $run_dir . '/wp-config.php' ) ) {
596
+ copy( $run_dir . '/wp-config.php', $config_cache_path );
597
+ }
598
+ }
599
+ }
600
+
601
+ public function install_wp( $subdir = '' ) {
602
+ $wp_version_suffix = ( $wp_version = getenv( 'WP_VERSION' ) ) ? "-$wp_version" : '';
603
+ self::$install_cache_dir = sys_get_temp_dir() . '/wp-cli-test-core-install-cache' . $wp_version_suffix;
604
+ if ( ! file_exists( self::$install_cache_dir ) ) {
605
+ mkdir( self::$install_cache_dir );
606
+ }
607
+
608
+ $subdir = $this->replace_variables( $subdir );
609
+
610
+ $this->create_db();
611
+ $this->create_run_dir();
612
+ $this->download_wp( $subdir );
613
+ $this->create_config( $subdir );
614
+
615
+ $install_args = array(
616
+ 'url' => 'http://example.com',
617
+ 'title' => 'WP CLI Site',
618
+ 'admin_user' => 'admin',
619
+ 'admin_email' => 'admin@example.com',
620
+ 'admin_password' => 'password1'
621
+ );
622
+
623
+ $install_cache_path = '';
624
+ if ( self::$install_cache_dir ) {
625
+ $install_cache_path = self::$install_cache_dir . '/install_' . md5( implode( ':', $install_args ) . ':subdir=' . $subdir );
626
+ $run_dir = '' !== $subdir ? ( $this->variables['RUN_DIR'] . "/$subdir" ) : $this->variables['RUN_DIR'];
627
+ }
628
+
629
+ if ( $install_cache_path && file_exists( $install_cache_path ) ) {
630
+ self::copy_dir( $install_cache_path, $run_dir );
631
+ self::run_sql( 'mysql --no-defaults', array( 'execute' => "source {$install_cache_path}.sql" ), true /*add_database*/ );
632
+ } else {
633
+ $this->proc( 'wp core install', $install_args, $subdir )->run_check();
634
+ if ( $install_cache_path ) {
635
+ mkdir( $install_cache_path );
636
+ self::dir_diff_copy( $run_dir, self::$cache_dir, $install_cache_path );
637
+ self::run_sql( 'mysqldump --no-defaults', array( 'result-file' => "{$install_cache_path}.sql" ), true /*add_database*/ );
638
+ }
639
+ }
640
+ }
641
+
642
+ public function install_wp_with_composer( $vendor_directory = 'vendor' ) {
643
+ $this->create_run_dir();
644
+ $this->create_db();
645
+
646
+ $yml_path = $this->variables['RUN_DIR'] . "/wp-cli.yml";
647
+ file_put_contents( $yml_path, 'path: wordpress' );
648
+
649
+ $this->composer_command( 'init --name="wp-cli/composer-test" --type="project" --no-interaction' );
650
+ $this->composer_command( 'config vendor-dir ' . $vendor_directory );
651
+ $this->composer_command( 'require johnpbloch/wordpress --optimize-autoloader --no-interaction' );
652
+
653
+ $config_extra_php = "require_once dirname(__DIR__) . '/" . $vendor_directory . "/autoload.php';";
654
+ $this->create_config( 'wordpress', $config_extra_php );
655
+
656
+ $install_args = array(
657
+ 'url' => 'http://localhost:8080',
658
+ 'title' => 'WP CLI Site with both WordPress and wp-cli as Composer dependencies',
659
+ 'admin_user' => 'admin',
660
+ 'admin_email' => 'admin@example.com',
661
+ 'admin_password' => 'password1'
662
+ );
663
+
664
+ $this->proc( 'wp core install', $install_args )->run_check();
665
+ }
666
+
667
+ public function composer_add_wp_cli_local_repository() {
668
+ if ( ! self::$composer_local_repository ) {
669
+ self::$composer_local_repository = sys_get_temp_dir() . '/' . uniqid( "wp-cli-composer-local-", TRUE );
670
+ mkdir( self::$composer_local_repository );
671
+
672
+ $env = self::get_process_env_variables();
673
+ $src = isset( $env['TRAVIS_BUILD_DIR'] ) ? $env['TRAVIS_BUILD_DIR'] : realpath( __DIR__ . '/../../' );
674
+
675
+ self::copy_dir( $src, self::$composer_local_repository . '/' );
676
+ self::remove_dir( self::$composer_local_repository . '/.git' );
677
+ self::remove_dir( self::$composer_local_repository . '/vendor' );
678
+ }
679
+ $dest = self::$composer_local_repository . '/';
680
+ $this->composer_command( "config repositories.wp-cli '{\"type\": \"path\", \"url\": \"$dest\", \"options\": {\"symlink\": false}}'" );
681
+ $this->variables['COMPOSER_LOCAL_REPOSITORY'] = self::$composer_local_repository;
682
+ }
683
+
684
+ public function composer_require_current_wp_cli() {
685
+ $this->composer_add_wp_cli_local_repository();
686
+ $this->composer_command( 'require wp-cli/wp-cli:dev-master --optimize-autoloader --no-interaction' );
687
+ }
688
+
689
+ public function get_php_binary() {
690
+ if ( getenv( 'WP_CLI_PHP_USED' ) )
691
+ return getenv( 'WP_CLI_PHP_USED' );
692
+
693
+ if ( getenv( 'WP_CLI_PHP' ) )
694
+ return getenv( 'WP_CLI_PHP' );
695
+
696
+ if ( defined( 'PHP_BINARY' ) )
697
+ return PHP_BINARY;
698
+
699
+ return 'php';
700
+ }
701
+
702
+ public function start_php_server() {
703
+ $cmd = Utils\esc_cmd( '%s -S %s -t %s -c %s %s',
704
+ $this->get_php_binary(),
705
+ 'localhost:8080',
706
+ $this->variables['RUN_DIR'] . '/wordpress/',
707
+ get_cfg_var( 'cfg_file_path' ),
708
+ $this->variables['RUN_DIR'] . '/vendor/wp-cli/server-command/router.php'
709
+ );
710
+ $this->background_proc( $cmd );
711
+ }
712
+
713
+ private function composer_command($cmd) {
714
+ if ( !isset( $this->variables['COMPOSER_PATH'] ) ) {
715
+ $this->variables['COMPOSER_PATH'] = exec('which composer');
716
+ }
717
+ $this->proc( $this->variables['COMPOSER_PATH'] . ' ' . $cmd )->run_check();
718
+ }
719
+
720
+ /**
721
+ * Initialize run time logging.
722
+ */
723
+ private static function log_run_times_before_suite( $event ) {
724
+ self::$suite_start_time = microtime( true );
725
+
726
+ Process::$log_run_times = true;
727
+
728
+ $travis = getenv( 'TRAVIS' );
729
+
730
+ // Default output settings.
731
+ self::$output_to = 'stdout';
732
+ self::$num_top_processes = $travis ? 10 : 40;
733
+ self::$num_top_scenarios = $travis ? 10 : 20;
734
+
735
+ // Allow setting of above with "WP_CLI_TEST_LOG_RUN_TIMES=<output_to>[,<num_top_processes>][,<num_top_scenarios>]" formatted env var.
736
+ if ( preg_match( '/^(stdout|error_log)?(,[0-9]+)?(,[0-9]+)?$/i', self::$log_run_times, $matches ) ) {
737
+ if ( isset( $matches[1] ) ) {
738
+ self::$output_to = strtolower( $matches[1] );
739
+ }
740
+ if ( isset( $matches[2] ) ) {
741
+ self::$num_top_processes = max( (int) substr( $matches[2], 1 ), 1 );
742
+ }
743
+ if ( isset( $matches[3] ) ) {
744
+ self::$num_top_scenarios = max( (int) substr( $matches[3], 1 ), 1 );
745
+ }
746
+ }
747
+ }
748
+
749
+ /**
750
+ * Record the start time of the scenario into the `$scenario_run_times` array.
751
+ */
752
+ private static function log_run_times_before_scenario( $event ) {
753
+ if ( $scenario_key = self::get_scenario_key( $event ) ) {
754
+ self::$scenario_run_times[ $scenario_key ] = -microtime( true );
755
+ }
756
+ }
757
+
758
+ /**
759
+ * Save the run time of the scenario into the `$scenario_run_times` array. Only the top `self::$num_top_scenarios` are kept.
760
+ */
761
+ private static function log_run_times_after_scenario( $event ) {
762
+ if ( $scenario_key = self::get_scenario_key( $event ) ) {
763
+ self::$scenario_run_times[ $scenario_key ] += microtime( true );
764
+ self::$scenario_count++;
765
+ if ( count( self::$scenario_run_times ) > self::$num_top_scenarios ) {
766
+ arsort( self::$scenario_run_times );
767
+ array_pop( self::$scenario_run_times );
768
+ }
769
+ }
770
+ }
771
+
772
+ /**
773
+ * Copy files in updated directory that are not in source directory to copy directory. ("Incremental backup".)
774
+ * Note: does not deal with changed files (ie does not compare file contents for changes), for speed reasons.
775
+ *
776
+ * @param string $upd_dir The directory to search looking for files/directories not in `$src_dir`.
777
+ * @param string $src_dir The directory to be compared to `$upd_dir`.
778
+ * @param string $cop_dir Where to copy any files/directories in `$upd_dir` but not in `$src_dir` to.
779
+ */
780
+ private static function dir_diff_copy( $upd_dir, $src_dir, $cop_dir ) {
781
+ if ( false === ( $files = scandir( $upd_dir ) ) ) {
782
+ $error = error_get_last();
783
+ throw new \RuntimeException( sprintf( "Failed to open updated directory '%s': %s. " . __FILE__ . ':' . __LINE__, $upd_dir, $error['message'] ) );
784
+ }
785
+ foreach ( array_diff( $files, array( '.', '..' ) ) as $file ) {
786
+ $upd_file = $upd_dir . '/' . $file;
787
+ $src_file = $src_dir . '/' . $file;
788
+ $cop_file = $cop_dir . '/' . $file;
789
+ if ( ! file_exists( $src_file ) ) {
790
+ if ( is_dir( $upd_file ) ) {
791
+ if ( ! file_exists( $cop_file ) && ! mkdir( $cop_file, 0777, true /*recursive*/ ) ) {
792
+ $error = error_get_last();
793
+ throw new \RuntimeException( sprintf( "Failed to create copy directory '%s': %s. " . __FILE__ . ':' . __LINE__, $cop_file, $error['message'] ) );
794
+ }
795
+ self::copy_dir( $upd_file, $cop_file );
796
+ } else {
797
+ if ( ! copy( $upd_file, $cop_file ) ) {
798
+ $error = error_get_last();
799
+ throw new \RuntimeException( sprintf( "Failed to copy '%s' to '%s': %s. " . __FILE__ . ':' . __LINE__, $upd_file, $cop_file, $error['message'] ) );
800
+ }
801
+ }
802
+ } elseif ( is_dir( $upd_file ) ) {
803
+ self::dir_diff_copy( $upd_file, $src_file, $cop_file );
804
+ }
805
+ }
806
+ }
807
+
808
+ /**
809
+ * Get the scenario key used for `$scenario_run_times` array.
810
+ * Format "<grandparent-dir> <feature-file>:<line-number>", eg "core-command core-update.feature:221".
811
+ */
812
+ private static function get_scenario_key( $event ) {
813
+ $scenario_key = '';
814
+ if ( $file = self::get_event_file( $event, $line ) ) {
815
+ $scenario_grandparent = Utils\basename( dirname( dirname( $file ) ) );
816
+ $scenario_key = $scenario_grandparent . ' ' . Utils\basename( $file ) . ':' . $line;
817
+ }
818
+ return $scenario_key;
819
+ }
820
+
821
+ /**
822
+ * Print out stats on the run times of processes and scenarios.
823
+ */
824
+ private static function log_run_times_after_suite( $event ) {
825
+
826
+ $suite = '';
827
+ if ( self::$scenario_run_times ) {
828
+ // Grandparent directory is first part of key.
829
+ $keys = array_keys( self::$scenario_run_times );
830
+ $suite = substr( $keys[0], 0, strpos( $keys[0], ' ' ) );
831
+ }
832
+
833
+ $run_from = Utils\basename( dirname( dirname( __DIR__ ) ) );
834
+
835
+ // Format same as Behat, if have minutes.
836
+ $fmt = function ( $time ) {
837
+ $mins = floor( $time / 60 );
838
+ return round( $time, 3 ) . ( $mins ? ( ' (' . $mins . 'm' . round( $time - ( $mins * 60 ), 3 ) . 's)' ) : '' );
839
+ };
840
+
841
+ $time = microtime( true ) - self::$suite_start_time;
842
+
843
+ $log = PHP_EOL . str_repeat( '(', 80 ) . PHP_EOL;
844
+
845
+ // Process and proc method run times.
846
+ $run_times = array_merge( Process::$run_times, self::$proc_method_run_times );
847
+
848
+ list( $ptime, $calls ) = array_reduce( $run_times, function ( $carry, $item ) {
849
+ return array( $carry[0] + $item[0], $carry[1] + $item[1] );
850
+ }, array( 0, 0 ) );
851
+
852
+ $overhead = $time - $ptime;
853
+ $pct = round( ( $overhead / $time ) * 100 );
854
+ $unique = count( $run_times );
855
+
856
+ $log .= sprintf(
857
+ PHP_EOL . "Total process run time %s (tests %s, overhead %.3f %d%%), calls %d (%d unique) for '%s' run from '%s'" . PHP_EOL,
858
+ $fmt( $ptime ), $fmt( $time ), $overhead, $pct, $calls, $unique, $suite, $run_from
859
+ );
860
+
861
+ uasort( $run_times, function ( $a, $b ) {
862
+ return $a[0] === $b[0] ? 0 : ( $a[0] < $b[0] ? 1 : -1 ); // Reverse sort.
863
+ } );
864
+
865
+ $tops = array_slice( $run_times, 0, self::$num_top_processes, true );
866
+
867
+ $log .= PHP_EOL . "Top " . self::$num_top_processes . " process run times for '$suite'";
868
+ $log .= PHP_EOL . implode( PHP_EOL, array_map( function ( $k, $v, $i ) {
869
+ return sprintf( ' %3d. %7.3f %3d %s', $i + 1, round( $v[0], 3 ), $v[1], $k );
870
+ }, array_keys( $tops ), $tops, array_keys( array_keys( $tops ) ) ) ) . PHP_EOL;
871
+
872
+ // Scenario run times.
873
+ arsort( self::$scenario_run_times );
874
+
875
+ $tops = array_slice( self::$scenario_run_times, 0, self::$num_top_scenarios, true );
876
+
877
+ $log .= PHP_EOL . "Top " . self::$num_top_scenarios . " (of " . self::$scenario_count . ") scenario run times for '$suite'";
878
+ $log .= PHP_EOL . implode( PHP_EOL, array_map( function ( $k, $v, $i ) {
879
+ return sprintf( ' %3d. %7.3f %s', $i + 1, round( $v, 3 ), substr( $k, strpos( $k, ' ' ) + 1 ) );
880
+ }, array_keys( $tops ), $tops, array_keys( array_keys( $tops ) ) ) ) . PHP_EOL;
881
+
882
+ $log .= PHP_EOL . str_repeat( ')', 80 );
883
+
884
+ if ( 'error_log' === self::$output_to ) {
885
+ error_log( $log );
886
+ } else {
887
+ echo PHP_EOL . $log;
888
+ }
889
+ }
890
+
891
+ /**
892
+ * Log the run time of a proc method (one that doesn't use Process but does (use a function that does) a `proc_open()`).
893
+ */
894
+ private static function log_proc_method_run_time( $key, $start_time ) {
895
+ $run_time = microtime( true ) - $start_time;
896
+ if ( ! isset( self::$proc_method_run_times[ $key ] ) ) {
897
+ self::$proc_method_run_times[ $key ] = array( 0, 0 );
898
+ }
899
+ self::$proc_method_run_times[ $key ][0] += $run_time;
900
+ self::$proc_method_run_times[ $key ][1]++;
901
+ }
902
+
903
+ }
cli/features/bootstrap/Process.php ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WP_CLI;
4
+
5
+ /**
6
+ * Run a system process, and learn what happened.
7
+ */
8
+ class Process {
9
+ /**
10
+ * @var string The full command to execute by the system.
11
+ */
12
+ private $command;
13
+
14
+ /**
15
+ * @var string|null The path of the working directory for the process or NULL if not specified (defaults to current working directory).
16
+ */
17
+ private $cwd;
18
+
19
+ /**
20
+ * @var array Environment variables to set when running the command.
21
+ */
22
+ private $env;
23
+
24
+ /**
25
+ * @var array Descriptor spec for `proc_open()`.
26
+ */
27
+ private static $descriptors = array(
28
+ 0 => STDIN,
29
+ 1 => array( 'pipe', 'w' ),
30
+ 2 => array( 'pipe', 'w' ),
31
+ );
32
+
33
+ /**
34
+ * @var bool Whether to log run time info or not.
35
+ */
36
+ public static $log_run_times = false;
37
+
38
+ /**
39
+ * @var array Array of process run time info, keyed by process command, each a 2-element array containing run time and run count.
40
+ */
41
+ public static $run_times = array();
42
+
43
+ /**
44
+ * @param string $command Command to execute.
45
+ * @param string $cwd Directory to execute the command in.
46
+ * @param array $env Environment variables to set when running the command.
47
+ *
48
+ * @return Process
49
+ */
50
+ public static function create( $command, $cwd = null, $env = array() ) {
51
+ $proc = new self;
52
+
53
+ $proc->command = $command;
54
+ $proc->cwd = $cwd;
55
+ $proc->env = $env;
56
+
57
+ return $proc;
58
+ }
59
+
60
+ private function __construct() {}
61
+
62
+ /**
63
+ * Run the command.
64
+ *
65
+ * @return ProcessRun
66
+ */
67
+ public function run() {
68
+ $start_time = microtime( true );
69
+
70
+ $proc = proc_open( $this->command, self::$descriptors, $pipes, $this->cwd, $this->env );
71
+
72
+ $stdout = stream_get_contents( $pipes[1] );
73
+ fclose( $pipes[1] );
74
+
75
+ $stderr = stream_get_contents( $pipes[2] );
76
+ fclose( $pipes[2] );
77
+
78
+ $return_code = proc_close( $proc );
79
+
80
+ $run_time = microtime( true ) - $start_time;
81
+
82
+ if ( self::$log_run_times ) {
83
+ if ( ! isset( self::$run_times[ $this->command ] ) ) {
84
+ self::$run_times[ $this->command ] = array( 0, 0 );
85
+ }
86
+ self::$run_times[ $this->command ][0] += $run_time;
87
+ self::$run_times[ $this->command ][1]++;
88
+ }
89
+
90
+ return new ProcessRun( array(
91
+ 'stdout' => $stdout,
92
+ 'stderr' => $stderr,
93
+ 'return_code' => $return_code,
94
+ 'command' => $this->command,
95
+ 'cwd' => $this->cwd,
96
+ 'env' => $this->env,
97
+ 'run_time' => $run_time,
98
+ ) );
99
+ }
100
+
101
+ /**
102
+ * Run the command, but throw an Exception on error.
103
+ *
104
+ * @return ProcessRun
105
+ */
106
+ public function run_check() {
107
+ $r = $this->run();
108
+
109
+ // $r->STDERR is incorrect, but kept incorrect for backwards-compat
110
+ if ( $r->return_code || !empty( $r->STDERR ) ) {
111
+ throw new \RuntimeException( $r );
112
+ }
113
+
114
+ return $r;
115
+ }
116
+ }
cli/features/bootstrap/ProcessRun.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WP_CLI;
4
+
5
+ /**
6
+ * Results of an executed command.
7
+ */
8
+ class ProcessRun {
9
+ /**
10
+ * @var string The full command executed by the system.
11
+ */
12
+ public $command;
13
+
14
+ /**
15
+ * @var string Captured output from the process' STDOUT.
16
+ */
17
+ public $stdout;
18
+
19
+ /**
20
+ * @var string Captured output from the process' STDERR.
21
+ */
22
+ public $stderr;
23
+
24
+ /**
25
+ * @var string|null The path of the working directory for the process or NULL if not specified (defaults to current working directory).
26
+ */
27
+ public $cwd;
28
+
29
+ /**
30
+ * @var array Environment variables set for this process.
31
+ */
32
+ public $env;
33
+
34
+ /**
35
+ * @var int Exit code of the process.
36
+ */
37
+ public $return_code;
38
+
39
+ /**
40
+ * @var float The run time of the process.
41
+ */
42
+ public $run_time;
43
+
44
+ /**
45
+ * @var array $props Properties of executed command.
46
+ */
47
+ public function __construct( $props ) {
48
+ foreach ( $props as $key => $value ) {
49
+ $this->$key = $value;
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Return properties of executed command as a string.
55
+ *
56
+ * @return string
57
+ */
58
+ public function __toString() {
59
+ $out = "$ $this->command\n";
60
+ $out .= "$this->stdout\n$this->stderr";
61
+ $out .= "cwd: $this->cwd\n";
62
+ $out .= "run time: $this->run_time\n";
63
+ $out .= "exit status: $this->return_code";
64
+
65
+ return $out;
66
+ }
67
+
68
+ }
cli/features/bootstrap/support.php ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Utility functions used by Behat steps
4
+
5
+ function assertEquals( $expected, $actual ) {
6
+ if ( $expected != $actual ) {
7
+ throw new Exception( "Actual value: " . var_export( $actual, true ) );
8
+ }
9
+ }
10
+
11
+ function assertNotEquals( $expected, $actual ) {
12
+ if ( $expected == $actual ) {
13
+ throw new Exception( "Actual value: " . var_export( $actual, true ) );
14
+ }
15
+ }
16
+
17
+ function assertNumeric( $actual ) {
18
+ if ( !is_numeric( $actual ) ) {
19
+ throw new Exception( "Actual value: " . var_export( $actual, true ) );
20
+ }
21
+ }
22
+
23
+ function assertNotNumeric( $actual ) {
24
+ if ( is_numeric( $actual ) ) {
25
+ throw new Exception( "Actual value: " . var_export( $actual, true ) );
26
+ }
27
+ }
28
+
29
+ function checkString( $output, $expected, $action, $message = false ) {
30
+ switch ( $action ) {
31
+
32
+ case 'be':
33
+ $r = $expected === rtrim( $output, "\n" );
34
+ break;
35
+
36
+ case 'contain':
37
+ $r = false !== strpos( $output, $expected );
38
+ break;
39
+
40
+ case 'not contain':
41
+ $r = false === strpos( $output, $expected );
42
+ break;
43
+
44
+ default:
45
+ throw new Behat\Behat\Exception\PendingException();
46
+ }
47
+
48
+ if ( !$r ) {
49
+ if ( false === $message )
50
+ $message = $output;
51
+ throw new Exception( $message );
52
+ }
53
+ }
54
+
55
+ function compareTables( $expected_rows, $actual_rows, $output ) {
56
+ // the first row is the header and must be present
57
+ if ( $expected_rows[0] != $actual_rows[0] ) {
58
+ throw new \Exception( $output );
59
+ }
60
+
61
+ unset( $actual_rows[0] );
62
+ unset( $expected_rows[0] );
63
+
64
+ $missing_rows = array_diff( $expected_rows, $actual_rows );
65
+ if ( !empty( $missing_rows ) ) {
66
+ throw new \Exception( $output );
67
+ }
68
+ }
69
+
70
+ function compareContents( $expected, $actual ) {
71
+ if ( gettype( $expected ) != gettype( $actual ) ) {
72
+ return false;
73
+ }
74
+
75
+ if ( is_object( $expected ) ) {
76
+ foreach ( get_object_vars( $expected ) as $name => $value ) {
77
+ if ( ! compareContents( $value, $actual->$name ) )
78
+ return false;
79
+ }
80
+ } else if ( is_array( $expected ) ) {
81
+ foreach ( $expected as $key => $value ) {
82
+ if ( ! compareContents( $value, $actual[$key] ) )
83
+ return false;
84
+ }
85
+ } else {
86
+ return $expected === $actual;
87
+ }
88
+
89
+ return true;
90
+ }
91
+
92
+ /**
93
+ * Compare two strings containing JSON to ensure that @a $actualJson contains at
94
+ * least what the JSON string @a $expectedJson contains.
95
+ *
96
+ * @return whether or not @a $actualJson contains @a $expectedJson
97
+ * @retval true @a $actualJson contains @a $expectedJson
98
+ * @retval false @a $actualJson does not contain @a $expectedJson
99
+ *
100
+ * @param[in] $actualJson the JSON string to be tested
101
+ * @param[in] $expectedJson the expected JSON string
102
+ *
103
+ * Examples:
104
+ * expected: {'a':1,'array':[1,3,5]}
105
+ *
106
+ * 1 )
107
+ * actual: {'a':1,'b':2,'c':3,'array':[1,2,3,4,5]}
108
+ * return: true
109
+ *
110
+ * 2 )
111
+ * actual: {'b':2,'c':3,'array':[1,2,3,4,5]}
112
+ * return: false
113
+ * element 'a' is missing from the root object
114
+ *
115
+ * 3 )
116
+ * actual: {'a':0,'b':2,'c':3,'array':[1,2,3,4,5]}
117
+ * return: false
118
+ * the value of element 'a' is not 1
119
+ *
120
+ * 4 )
121
+ * actual: {'a':1,'b':2,'c':3,'array':[1,2,4,5]}
122
+ * return: false
123
+ * the contents of 'array' does not include 3
124
+ */
125
+ function checkThatJsonStringContainsJsonString( $actualJson, $expectedJson ) {
126
+ $actualValue = json_decode( $actualJson );
127
+ $expectedValue = json_decode( $expectedJson );
128
+
129
+ if ( !$actualValue ) {
130
+ return false;
131
+ }
132
+
133
+ return compareContents( $expectedValue, $actualValue );
134
+ }
135
+
136
+ /**
137
+ * Compare two strings to confirm $actualCSV contains $expectedCSV
138
+ * Both strings are expected to have headers for their CSVs.
139
+ * $actualCSV must match all data rows in $expectedCSV
140
+ *
141
+ * @param string A CSV string
142
+ * @param array A nested array of values
143
+ * @return bool Whether $actualCSV contains $expectedCSV
144
+ */
145
+ function checkThatCsvStringContainsValues( $actualCSV, $expectedCSV ) {
146
+ $actualCSV = array_map( 'str_getcsv', explode( PHP_EOL, $actualCSV ) );
147
+
148
+ if ( empty( $actualCSV ) )
149
+ return false;
150
+
151
+ // Each sample must have headers
152
+ $actualHeaders = array_values( array_shift( $actualCSV ) );
153
+ $expectedHeaders = array_values( array_shift( $expectedCSV ) );
154
+
155
+ // Each expectedCSV must exist somewhere in actualCSV in the proper column
156
+ $expectedResult = 0;
157
+ foreach ( $expectedCSV as $expected_row ) {
158
+ $expected_row = array_combine( $expectedHeaders, $expected_row );
159
+ foreach ( $actualCSV as $actual_row ) {
160
+
161
+ if ( count( $actualHeaders ) != count( $actual_row ) )
162
+ continue;
163
+
164
+ $actual_row = array_intersect_key( array_combine( $actualHeaders, $actual_row ), $expected_row );
165
+ if ( $actual_row == $expected_row )
166
+ $expectedResult++;
167
+ }
168
+ }
169
+
170
+ return $expectedResult >= count( $expectedCSV );
171
+ }
172
+
173
+ /**
174
+ * Compare two strings containing YAML to ensure that @a $actualYaml contains at
175
+ * least what the YAML string @a $expectedYaml contains.
176
+ *
177
+ * @return whether or not @a $actualYaml contains @a $expectedJson
178
+ * @retval true @a $actualYaml contains @a $expectedJson
179
+ * @retval false @a $actualYaml does not contain @a $expectedJson
180
+ *
181
+ * @param[in] $actualYaml the YAML string to be tested
182
+ * @param[in] $expectedYaml the expected YAML string
183
+ */
184
+ function checkThatYamlStringContainsYamlString( $actualYaml, $expectedYaml ) {
185
+ $actualValue = Mustangostang\Spyc::YAMLLoad( $actualYaml );
186
+ $expectedValue = Mustangostang\Spyc::YAMLLoad( $expectedYaml );
187
+
188
+ if ( !$actualValue ) {
189
+ return false;
190
+ }
191
+
192
+ return compareContents( $expectedValue, $actualValue );
193
+ }
194
+
cli/features/bootstrap/utils.php ADDED
@@ -0,0 +1,1194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // Utilities that do NOT depend on WordPress code.
4
+
5
+ namespace WP_CLI\Utils;
6
+
7
+ use \Composer\Semver\Comparator;
8
+ use \Composer\Semver\Semver;
9
+ use \WP_CLI;
10
+ use \WP_CLI\Dispatcher;
11
+ use \WP_CLI\Iterators\Transform;
12
+
13
+ const PHAR_STREAM_PREFIX = 'phar://';
14
+
15
+ function inside_phar() {
16
+ return 0 === strpos( WP_CLI_ROOT, PHAR_STREAM_PREFIX );
17
+ }
18
+
19
+ // Files that need to be read by external programs have to be extracted from the Phar archive.
20
+ function extract_from_phar( $path ) {
21
+ if ( ! inside_phar() ) {
22
+ return $path;
23
+ }
24
+
25
+ $fname = basename( $path );
26
+
27
+ $tmp_path = get_temp_dir() . "wp-cli-$fname";
28
+
29
+ copy( $path, $tmp_path );
30
+
31
+ register_shutdown_function( function() use ( $tmp_path ) {
32
+ @unlink( $tmp_path );
33
+ } );
34
+
35
+ return $tmp_path;
36
+ }
37
+
38
+ function load_dependencies() {
39
+ if ( inside_phar() ) {
40
+ if ( file_exists( WP_CLI_ROOT . '/vendor/autoload.php' ) ) {
41
+ require WP_CLI_ROOT . '/vendor/autoload.php';
42
+ } elseif ( file_exists( dirname( dirname( WP_CLI_ROOT ) ) . '/autoload.php' ) ) {
43
+ require dirname( dirname( WP_CLI_ROOT ) ) . '/autoload.php';
44
+ }
45
+ return;
46
+ }
47
+
48
+ $has_autoload = false;
49
+
50
+ foreach ( get_vendor_paths() as $vendor_path ) {
51
+ if ( file_exists( $vendor_path . '/autoload.php' ) ) {
52
+ require $vendor_path . '/autoload.php';
53
+ $has_autoload = true;
54
+ break;
55
+ }
56
+ }
57
+
58
+ if ( !$has_autoload ) {
59
+ fputs( STDERR, "Internal error: Can't find Composer autoloader.\nTry running: composer install\n" );
60
+ exit(3);
61
+ }
62
+ }
63
+
64
+ function get_vendor_paths() {
65
+ $vendor_paths = array(
66
+ WP_CLI_ROOT . '/../../../vendor', // part of a larger project / installed via Composer (preferred)
67
+ WP_CLI_ROOT . '/vendor', // top-level project / installed as Git clone
68
+ );
69
+ $maybe_composer_json = WP_CLI_ROOT . '/../../../composer.json';
70
+ if ( file_exists( $maybe_composer_json ) && is_readable( $maybe_composer_json ) ) {
71
+ $composer = json_decode( file_get_contents( $maybe_composer_json ) );
72
+ if ( ! empty( $composer->config ) && ! empty( $composer->config->{'vendor-dir'} ) ) {
73
+ array_unshift( $vendor_paths, WP_CLI_ROOT . '/../../../' . $composer->config->{'vendor-dir'} );
74
+ }
75
+ }
76
+ return $vendor_paths;
77
+ }
78
+
79
+ // Using require() directly inside a class grants access to private methods to the loaded code
80
+ function load_file( $path ) {
81
+ require_once $path;
82
+ }
83
+
84
+ function load_command( $name ) {
85
+ $path = WP_CLI_ROOT . "/php/commands/$name.php";
86
+
87
+ if ( is_readable( $path ) ) {
88
+ include_once $path;
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Like array_map(), except it returns a new iterator, instead of a modified array.
94
+ *
95
+ * Example:
96
+ *
97
+ * $arr = array('Football', 'Socker');
98
+ *
99
+ * $it = iterator_map($arr, 'strtolower', function($val) {
100
+ * return str_replace('foo', 'bar', $val);
101
+ * });
102
+ *
103
+ * foreach ( $it as $val ) {
104
+ * var_dump($val);
105
+ * }
106
+ *
107
+ * @param array|object Either a plain array or another iterator
108
+ * @param callback The function to apply to an element
109
+ * @return object An iterator that applies the given callback(s)
110
+ */
111
+ function iterator_map( $it, $fn ) {
112
+ if ( is_array( $it ) ) {
113
+ $it = new \ArrayIterator( $it );
114
+ }
115
+
116
+ if ( !method_exists( $it, 'add_transform' ) ) {
117
+ $it = new Transform( $it );
118
+ }
119
+
120
+ foreach ( array_slice( func_get_args(), 1 ) as $fn ) {
121
+ $it->add_transform( $fn );
122
+ }
123
+
124
+ return $it;
125
+ }
126
+
127
+ /**
128
+ * Search for file by walking up the directory tree until the first file is found or until $stop_check($dir) returns true
129
+ * @param string|array The files (or file) to search for
130
+ * @param string|null The directory to start searching from; defaults to CWD
131
+ * @param callable Function which is passed the current dir each time a directory level is traversed
132
+ * @return null|string Null if the file was not found
133
+ */
134
+ function find_file_upward( $files, $dir = null, $stop_check = null ) {
135
+ $files = (array) $files;
136
+ if ( is_null( $dir ) ) {
137
+ $dir = getcwd();
138
+ }
139
+ while ( @is_readable( $dir ) ) {
140
+ // Stop walking up when the supplied callable returns true being passed the $dir
141
+ if ( is_callable( $stop_check ) && call_user_func( $stop_check, $dir ) ) {
142
+ return null;
143
+ }
144
+
145
+ foreach ( $files as $file ) {
146
+ $path = $dir . DIRECTORY_SEPARATOR . $file;
147
+ if ( file_exists( $path ) ) {
148
+ return $path;
149
+ }
150
+ }
151
+
152
+ $parent_dir = dirname( $dir );
153
+ if ( empty($parent_dir) || $parent_dir === $dir ) {
154
+ break;
155
+ }
156
+ $dir = $parent_dir;
157
+ }
158
+ return null;
159
+ }
160
+
161
+ function is_path_absolute( $path ) {
162
+ // Windows
163
+ if ( isset($path[1]) && ':' === $path[1] )
164
+ return true;
165
+
166
+ return $path[0] === '/';
167
+ }
168
+
169
+ /**
170
+ * Composes positional arguments into a command string.
171
+ *
172
+ * @param array
173
+ * @return string
174
+ */
175
+ function args_to_str( $args ) {
176
+ return ' ' . implode( ' ', array_map( 'escapeshellarg', $args ) );
177
+ }
178
+
179
+ /**
180
+ * Composes associative arguments into a command string.
181
+ *
182
+ * @param array
183
+ * @return string
184
+ */
185
+ function assoc_args_to_str( $assoc_args ) {
186
+ $str = '';
187
+
188
+ foreach ( $assoc_args as $key => $value ) {
189
+ if ( true === $value ) {
190
+ $str .= " --$key";
191
+ } elseif( is_array( $value ) ) {
192
+ foreach( $value as $_ => $v ) {
193
+ $str .= assoc_args_to_str( array( $key => $v ) );
194
+ }
195
+ } else {
196
+ $str .= " --$key=" . escapeshellarg( $value );
197
+ }
198
+ }
199
+
200
+ return $str;
201
+ }
202
+
203
+ /**
204
+ * Given a template string and an arbitrary number of arguments,
205
+ * returns the final command, with the parameters escaped.
206
+ */
207
+ function esc_cmd( $cmd ) {
208
+ if ( func_num_args() < 2 )
209
+ trigger_error( 'esc_cmd() requires at least two arguments.', E_USER_WARNING );
210
+
211
+ $args = func_get_args();
212
+
213
+ $cmd = array_shift( $args );
214
+
215
+ return vsprintf( $cmd, array_map( 'escapeshellarg', $args ) );
216
+ }
217
+
218
+ function locate_wp_config() {
219
+ static $path;
220
+
221
+ if ( null === $path ) {
222
+ if ( file_exists( ABSPATH . 'wp-config.php' ) )
223
+ $path = ABSPATH . 'wp-config.php';
224
+ elseif ( file_exists( ABSPATH . '../wp-config.php' ) && ! file_exists( ABSPATH . '/../wp-settings.php' ) )
225
+ $path = ABSPATH . '../wp-config.php';
226
+ else
227
+ $path = false;
228
+
229
+ if ( $path )
230
+ $path = realpath( $path );
231
+ }
232
+
233
+ return $path;
234
+ }
235
+
236
+ function wp_version_compare( $since, $operator ) {
237
+ return version_compare( str_replace( array( '-src' ), '', $GLOBALS['wp_version'] ), $since, $operator );
238
+ }
239
+
240
+ /**
241
+ * Render a collection of items as an ASCII table, JSON, CSV, YAML, list of ids, or count.
242
+ *
243
+ * Given a collection of items with a consistent data structure:
244
+ *
245
+ * ```
246
+ * $items = array(
247
+ * array(
248
+ * 'key' => 'foo',
249
+ * 'value' => 'bar',
250
+ * )
251
+ * );
252
+ * ```
253
+ *
254
+ * Render `$items` as an ASCII table:
255
+ *
256
+ * ```
257
+ * WP_CLI\Utils\format_items( 'table', $items, array( 'key', 'value' ) );
258
+ *
259
+ * # +-----+-------+
260
+ * # | key | value |
261
+ * # +-----+-------+
262
+ * # | foo | bar |
263
+ * # +-----+-------+
264
+ * ```
265
+ *
266
+ * Or render `$items` as YAML:
267
+ *
268
+ * ```
269
+ * WP_CLI\Utils\format_items( 'yaml', $items, array( 'key', 'value' ) );
270
+ *
271
+ * # ---
272
+ * # -
273
+ * # key: foo
274
+ * # value: bar
275
+ * ```
276
+ *
277
+ * @access public
278
+ * @category Output
279
+ *
280
+ * @param string $format Format to use: 'table', 'json', 'csv', 'yaml', 'ids', 'count'
281
+ * @param array $items An array of items to output.
282
+ * @param array|string $fields Named fields for each item of data. Can be array or comma-separated list.
283
+ * @return null
284
+ */
285
+ function format_items( $format, $items, $fields ) {
286
+ $assoc_args = compact( 'format', 'fields' );
287
+ $formatter = new \WP_CLI\Formatter( $assoc_args );
288
+ $formatter->display_items( $items );
289
+ }
290
+
291
+ /**
292
+ * Write data as CSV to a given file.
293
+ *
294
+ * @access public
295
+ *
296
+ * @param resource $fd File descriptor
297
+ * @param array $rows Array of rows to output
298
+ * @param array $headers List of CSV columns (optional)
299
+ */
300
+ function write_csv( $fd, $rows, $headers = array() ) {
301
+ if ( ! empty( $headers ) ) {
302
+ fputcsv( $fd, $headers );
303
+ }
304
+
305
+ foreach ( $rows as $row ) {
306
+ if ( ! empty( $headers ) ) {
307
+ $row = pick_fields( $row, $headers );
308
+ }
309
+
310
+ fputcsv( $fd, array_values( $row ) );
311
+ }
312
+ }
313
+
314
+ /**
315
+ * Pick fields from an associative array or object.
316
+ *
317
+ * @param array|object Associative array or object to pick fields from
318
+ * @param array List of fields to pick
319
+ * @return array
320
+ */
321
+ function pick_fields( $item, $fields ) {
322
+ $item = (object) $item;
323
+
324
+ $values = array();
325
+
326
+ foreach ( $fields as $field ) {
327
+ $values[ $field ] = isset( $item->$field ) ? $item->$field : null;
328
+ }
329
+
330
+ return $values;
331
+ }
332
+
333
+ /**
334
+ * Launch system's $EDITOR for the user to edit some text.
335
+ *
336
+ * @access public
337
+ * @category Input
338
+ *
339
+ * @param string $content Some form of text to edit (e.g. post content)
340
+ * @return string|bool Edited text, if file is saved from editor; false, if no change to file.
341
+ */
342
+ function launch_editor_for_input( $input, $filename = 'WP-CLI' ) {
343
+
344
+ check_proc_available( 'launch_editor_for_input' );
345
+
346
+ $tmpdir = get_temp_dir();
347
+
348
+ do {
349
+ $tmpfile = basename( $filename );
350
+ $tmpfile = preg_replace( '|\.[^.]*$|', '', $tmpfile );
351
+ $tmpfile .= '-' . substr( md5( rand() ), 0, 6 );
352
+ $tmpfile = $tmpdir . $tmpfile . '.tmp';
353
+ $fp = @fopen( $tmpfile, 'x' );
354
+ if ( ! $fp && is_writable( $tmpdir ) && file_exists( $tmpfile ) ) {
355
+ $tmpfile = '';
356
+ continue;
357
+ }
358
+ if ( $fp ) {
359
+ fclose( $fp );
360
+ }
361
+ } while( ! $tmpfile );
362
+
363
+ if ( ! $tmpfile ) {
364
+ \WP_CLI::error( 'Error creating temporary file.' );
365
+ }
366
+
367
+ $output = '';
368
+ file_put_contents( $tmpfile, $input );
369
+
370
+ $editor = getenv( 'EDITOR' );
371
+ if ( !$editor ) {
372
+ if ( isset( $_SERVER['OS'] ) && false !== strpos( $_SERVER['OS'], 'indows' ) )
373
+ $editor = 'notepad';
374
+ else
375
+ $editor = 'vi';
376
+ }
377
+
378
+ $descriptorspec = array( STDIN, STDOUT, STDERR );
379
+ $process = proc_open( "$editor " . escapeshellarg( $tmpfile ), $descriptorspec, $pipes );
380
+ $r = proc_close( $process );
381
+ if ( $r ) {
382
+ exit( $r );
383
+ }
384
+
385
+ $output = file_get_contents( $tmpfile );
386
+
387
+ unlink( $tmpfile );
388
+
389
+ if ( $output === $input )
390
+ return false;
391
+
392
+ return $output;
393
+ }
394
+
395
+ /**
396
+ * @param string MySQL host string, as defined in wp-config.php
397
+ * @return array
398
+ */
399
+ function mysql_host_to_cli_args( $raw_host ) {
400
+ $assoc_args = array();
401
+
402
+ $host_parts = explode( ':', $raw_host );
403
+ if ( count( $host_parts ) == 2 ) {
404
+ list( $assoc_args['host'], $extra ) = $host_parts;
405
+ $extra = trim( $extra );
406
+ if ( is_numeric( $extra ) ) {
407
+ $assoc_args['port'] = intval( $extra );
408
+ $assoc_args['protocol'] = 'tcp';
409
+ } else if ( $extra !== '' ) {
410
+ $assoc_args['socket'] = $extra;
411
+ }
412
+ } else {
413
+ $assoc_args['host'] = $raw_host;
414
+ }
415
+
416
+ return $assoc_args;
417
+ }
418
+
419
+ function run_mysql_command( $cmd, $assoc_args, $descriptors = null ) {
420
+ check_proc_available( 'run_mysql_command' );
421
+
422
+ if ( !$descriptors )
423
+ $descriptors = array( STDIN, STDOUT, STDERR );
424
+
425
+ if ( isset( $assoc_args['host'] ) ) {
426
+ $assoc_args = array_merge( $assoc_args, mysql_host_to_cli_args( $assoc_args['host'] ) );
427
+ }
428
+
429
+ $pass = $assoc_args['pass'];
430
+ unset( $assoc_args['pass'] );
431
+
432
+ $old_pass = getenv( 'MYSQL_PWD' );
433
+ putenv( 'MYSQL_PWD=' . $pass );
434
+
435
+ $final_cmd = force_env_on_nix_systems( $cmd ) . assoc_args_to_str( $assoc_args );
436
+
437
+ $proc = proc_open( $final_cmd, $descriptors, $pipes );
438
+ if ( !$proc )
439
+ exit(1);
440
+
441
+ $r = proc_close( $proc );
442
+
443
+ putenv( 'MYSQL_PWD=' . $old_pass );
444
+
445
+ if ( $r ) exit( $r );
446
+ }
447
+
448
+ /**
449
+ * Render PHP or other types of files using Mustache templates.
450
+ *
451
+ * IMPORTANT: Automatic HTML escaping is disabled!
452
+ */
453
+ function mustache_render( $template_name, $data = array() ) {
454
+ if ( ! file_exists( $template_name ) )
455
+ $template_name = WP_CLI_ROOT . "/templates/$template_name";
456
+
457
+ $template = file_get_contents( $template_name );
458
+
459
+ $m = new \Mustache_Engine( array(
460
+ 'escape' => function ( $val ) { return $val; },
461
+ ) );
462
+
463
+ return $m->render( $template, $data );
464
+ }
465
+
466
+ /**
467
+ * Create a progress bar to display percent completion of a given operation.
468
+ *
469
+ * Progress bar is written to STDOUT, and disabled when command is piped. Progress
470
+ * advances with `$progress->tick()`, and completes with `$progress->finish()`.
471
+ * Process bar also indicates elapsed time and expected total time.
472
+ *
473
+ * ```
474
+ * # `wp user generate` ticks progress bar each time a new user is created.
475
+ * #
476
+ * # $ wp user generate --count=500
477
+ * # Generating users 22 % [=======> ] 0:05 / 0:23
478
+ *
479
+ * $progress = \WP_CLI\Utils\make_progress_bar( 'Generating users', $count );
480
+ * for ( $i = 0; $i < $count; $i++ ) {
481
+ * // uses wp_insert_user() to insert the user
482
+ * $progress->tick();
483
+ * }
484
+ * $progress->finish();
485
+ * ```
486
+ *
487
+ * @access public
488
+ * @category Output
489
+ *
490
+ * @param string $message Text to display before the progress bar.
491
+ * @param integer $count Total number of ticks to be performed.
492
+ * @return cli\progress\Bar|WP_CLI\NoOp
493
+ */
494
+ function make_progress_bar( $message, $count ) {
495
+ if ( \cli\Shell::isPiped() )
496
+ return new \WP_CLI\NoOp;
497
+
498
+ return new \cli\progress\Bar( $message, $count );
499
+ }
500
+
501
+ function parse_url( $url ) {
502
+ $url_parts = \parse_url( $url );
503
+
504
+ if ( !isset( $url_parts['scheme'] ) ) {
505
+ $url_parts = parse_url( 'http://' . $url );
506
+ }
507
+
508
+ return $url_parts;
509
+ }
510
+
511
+ /**
512
+ * Check if we're running in a Windows environment (cmd.exe).
513
+ *
514
+ * @return bool
515
+ */
516
+ function is_windows() {
517
+ return false !== ( $test_is_windows = getenv( 'WP_CLI_TEST_IS_WINDOWS' ) ) ? (bool) $test_is_windows : strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
518
+ }
519
+
520
+ /**
521
+ * Replace magic constants in some PHP source code.
522
+ *
523
+ * @param string $source The PHP code to manipulate.
524
+ * @param string $path The path to use instead of the magic constants
525
+ */
526
+ function replace_path_consts( $source, $path ) {
527
+ $replacements = array(
528
+ '__FILE__' => "'$path'",
529
+ '__DIR__' => "'" . dirname( $path ) . "'",
530
+ );
531
+
532
+ $old = array_keys( $replacements );
533
+ $new = array_values( $replacements );
534
+
535
+ return str_replace( $old, $new, $source );
536
+ }
537
+
538
+ /**
539
+ * Make a HTTP request to a remote URL.
540
+ *
541
+ * Wraps the Requests HTTP library to ensure every request includes a cert.
542
+ *
543
+ * ```
544
+ * # `wp core download` verifies the hash for a downloaded WordPress archive
545
+ *
546
+ * $md5_response = Utils\http_request( 'GET', $download_url . '.md5' );
547
+ * if ( 20 != substr( $md5_response->status_code, 0, 2 ) ) {
548
+ * WP_CLI::error( "Couldn't access md5 hash for release (HTTP code {$response->status_code})" );
549
+ * }
550
+ * ```
551
+ *
552
+ * @access public
553
+ *
554
+ * @param string $method HTTP method (GET, POST, DELETE, etc.)
555
+ * @param string $url URL to make the HTTP request to.
556
+ * @param array $headers Add specific headers to the request.
557
+ * @param array $options
558
+ * @return object
559
+ */
560
+ function http_request( $method, $url, $data = null, $headers = array(), $options = array() ) {
561
+
562
+ $cert_path = '/rmccue/requests/library/Requests/Transport/cacert.pem';
563
+ if ( inside_phar() ) {
564
+ // cURL can't read Phar archives
565
+ $options['verify'] = extract_from_phar(
566
+ WP_CLI_VENDOR_DIR . $cert_path );
567
+ } else {
568
+ foreach( get_vendor_paths() as $vendor_path ) {
569
+ if ( file_exists( $vendor_path . $cert_path ) ) {
570
+ $options['verify'] = $vendor_path . $cert_path;
571
+ break;
572
+ }
573
+ }
574
+ if ( empty( $options['verify'] ) ){
575
+ WP_CLI::error( "Cannot find SSL certificate." );
576
+ }
577
+ }
578
+
579
+ try {
580
+ $request = \Requests::request( $url, $headers, $data, $method, $options );
581
+ return $request;
582
+ } catch( \Requests_Exception $ex ) {
583
+ // CURLE_SSL_CACERT_BADFILE only defined for PHP >= 7.
584
+ if ( 'curlerror' !== $ex->getType() || ! in_array( curl_errno( $ex->getData() ), array( CURLE_SSL_CONNECT_ERROR, CURLE_SSL_CERTPROBLEM, 77 /*CURLE_SSL_CACERT_BADFILE*/ ), true ) ) {
585
+ \WP_CLI::error( sprintf( "Failed to get url '%s': %s.", $url, $ex->getMessage() ) );
586
+ }
587
+ // Handle SSL certificate issues gracefully
588
+ \WP_CLI::warning( sprintf( "Re-trying without verify after failing to get verified url '%s' %s.", $url, $ex->getMessage() ) );
589
+ $options['verify'] = false;
590
+ try {
591
+ return \Requests::request( $url, $headers, $data, $method, $options );
592
+ } catch( \Requests_Exception $ex ) {
593
+ \WP_CLI::error( sprintf( "Failed to get non-verified url '%s' %s.", $url, $ex->getMessage() ) );
594
+ }
595
+ }
596
+ }
597
+
598
+ /**
599
+ * Increments a version string using the "x.y.z-pre" format
600
+ *
601
+ * Can increment the major, minor or patch number by one
602
+ * If $new_version == "same" the version string is not changed
603
+ * If $new_version is not a known keyword, it will be used as the new version string directly
604
+ *
605
+ * @param string $current_version
606
+ * @param string $new_version
607
+ * @return string
608
+ */
609
+ function increment_version( $current_version, $new_version ) {
610
+ // split version assuming the format is x.y.z-pre
611
+ $current_version = explode( '-', $current_version, 2 );
612
+ $current_version[0] = explode( '.', $current_version[0] );
613
+
614
+ switch ( $new_version ) {
615
+ case 'same':
616
+ // do nothing
617
+ break;
618
+
619
+ case 'patch':
620
+ $current_version[0][2]++;
621
+
622
+ $current_version = array( $current_version[0] ); // drop possible pre-release info
623
+ break;
624
+
625
+ case 'minor':
626
+ $current_version[0][1]++;
627
+ $current_version[0][2] = 0;
628
+
629
+ $current_version = array( $current_version[0] ); // drop possible pre-release info
630
+ break;
631
+
632
+ case 'major':
633
+ $current_version[0][0]++;
634
+ $current_version[0][1] = 0;
635
+ $current_version[0][2] = 0;
636
+
637
+ $current_version = array( $current_version[0] ); // drop possible pre-release info
638
+ break;
639
+
640
+ default: // not a keyword
641
+ $current_version = array( array( $new_version ) );
642
+ break;
643
+ }
644
+
645
+ // reconstruct version string
646
+ $current_version[0] = implode( '.', $current_version[0] );
647
+ $current_version = implode( '-', $current_version );
648
+
649
+ return $current_version;
650
+ }
651
+
652
+ /**
653
+ * Compare two version strings to get the named semantic version.
654
+ *
655
+ * @access public
656
+ *
657
+ * @param string $new_version
658
+ * @param string $original_version
659
+ * @return string $name 'major', 'minor', 'patch'
660
+ */
661
+ function get_named_sem_ver( $new_version, $original_version ) {
662
+
663
+ if ( ! Comparator::greaterThan( $new_version, $original_version ) ) {
664
+ return '';
665
+ }
666
+
667
+ $parts = explode( '-', $original_version );
668
+ $bits = explode( '.', $parts[0] );
669
+ $major = $bits[0];
670
+ if ( isset( $bits[1] ) ) {
671
+ $minor = $bits[1];
672
+ }
673
+ if ( isset( $bits[2] ) ) {
674
+ $patch = $bits[2];
675
+ }
676
+
677
+ if ( ! is_null( $minor ) && Semver::satisfies( $new_version, "{$major}.{$minor}.x" ) ) {
678
+ return 'patch';
679
+ } else if ( Semver::satisfies( $new_version, "{$major}.x.x" ) ) {
680
+ return 'minor';
681
+ } else {
682
+ return 'major';
683
+ }
684
+ }
685
+
686
+ /**
687
+ * Return the flag value or, if it's not set, the $default value.
688
+ *
689
+ * Because flags can be negated (e.g. --no-quiet to negate --quiet), this
690
+ * function provides a safer alternative to using
691
+ * `isset( $assoc_args['quiet'] )` or similar.
692
+ *
693
+ * @access public
694
+ * @category Input
695
+ *
696
+ * @param array $assoc_args Arguments array.
697
+ * @param string $flag Flag to get the value.
698
+ * @param mixed $default Default value for the flag. Default: NULL
699
+ * @return mixed
700
+ */
701
+ function get_flag_value( $assoc_args, $flag, $default = null ) {
702
+ return isset( $assoc_args[ $flag ] ) ? $assoc_args[ $flag ] : $default;
703
+ }
704
+
705
+ /**
706
+ * Get the home directory.
707
+ *
708
+ * @access public
709
+ * @category System
710
+ *
711
+ * @return string
712
+ */
713
+ function get_home_dir() {
714
+ $home = getenv( 'HOME' );
715
+ if ( ! $home ) {
716
+ // In Windows $HOME may not be defined
717
+ $home = getenv( 'HOMEDRIVE' ) . getenv( 'HOMEPATH' );
718
+ }
719
+
720
+ return rtrim( $home, '/\\' );
721
+ }
722
+
723
+ /**
724
+ * Appends a trailing slash.
725
+ *
726
+ * @access public
727
+ * @category System
728
+ *
729
+ * @param string $string What to add the trailing slash to.
730
+ * @return string String with trailing slash added.
731
+ */
732
+ function trailingslashit( $string ) {
733
+ return rtrim( $string, '/\\' ) . '/';
734
+ }
735
+
736
+ /**
737
+ * Get the system's temp directory. Warns user if it isn't writable.
738
+ *
739
+ * @access public
740
+ * @category System
741
+ *
742
+ * @return string
743
+ */
744
+ function get_temp_dir() {
745
+ static $temp = '';
746
+
747
+ if ( $temp ) {
748
+ return $temp;
749
+ }
750
+
751
+ // `sys_get_temp_dir()` introduced PHP 5.2.1.
752
+ if ( $try = sys_get_temp_dir() ) {
753
+ $temp = trailingslashit( $try );
754
+ } elseif ( $try = ini_get( 'upload_tmp_dir' ) ) {
755
+ $temp = trailingslashit( $try );
756
+ } else {
757
+ $temp = '/tmp/';
758
+ }
759
+
760
+ if ( ! @is_writable( $temp ) ) {
761
+ \WP_CLI::warning( "Temp directory isn't writable: {$temp}" );
762
+ }
763
+
764
+ return $temp;
765
+ }
766
+
767
+ /**
768
+ * Parse a SSH url for its host, port, and path.
769
+ *
770
+ * Similar to parse_url(), but adds support for defined SSH aliases.
771
+ *
772
+ * ```
773
+ * host OR host/path/to/wordpress OR host:port/path/to/wordpress
774
+ * ```
775
+ *
776
+ * @access public
777
+ *
778
+ * @return mixed
779
+ */
780
+ function parse_ssh_url( $url, $component = -1 ) {
781
+ preg_match( '#^((docker|docker\-compose|ssh|vagrant):)?(([^@:]+)@)?([^:/~]+)(:([\d]*))?((/|~)(.+))?$#', $url, $matches );
782
+ $bits = array();
783
+ foreach( array(
784
+ 2 => 'scheme',
785
+ 4 => 'user',
786
+ 5 => 'host',
787
+ 7 => 'port',
788
+ 8 => 'path',
789
+ ) as $i => $key ) {
790
+ if ( ! empty( $matches[ $i ] ) ) {
791
+ $bits[ $key ] = $matches[ $i ];
792
+ }
793
+ }
794
+ switch ( $component ) {
795
+ case PHP_URL_SCHEME:
796
+ return isset( $bits['scheme'] ) ? $bits['scheme'] : null;
797
+ case PHP_URL_USER:
798
+ return isset( $bits['user'] ) ? $bits['user'] : null;
799
+ case PHP_URL_HOST:
800
+ return isset( $bits['host'] ) ? $bits['host'] : null;
801
+ case PHP_URL_PATH:
802
+ return isset( $bits['path'] ) ? $bits['path'] : null;
803
+ case PHP_URL_PORT:
804
+ return isset( $bits['port'] ) ? $bits['port'] : null;
805
+ default:
806
+ return $bits;
807
+ }
808
+ }
809
+
810
+ /**
811
+ * Report the results of the same operation against multiple resources.
812
+ *
813
+ * @access public
814
+ * @category Input
815
+ *
816
+ * @param string $noun Resource being affected (e.g. plugin)
817
+ * @param string $verb Type of action happening to the noun (e.g. activate)
818
+ * @param integer $total Total number of resource being affected.
819
+ * @param integer $successes Number of successful operations.
820
+ * @param integer $failures Number of failures.
821
+ */
822
+ function report_batch_operation_results( $noun, $verb, $total, $successes, $failures ) {
823
+ $plural_noun = $noun . 's';
824
+ $past_tense_verb = past_tense_verb( $verb );
825
+ $past_tense_verb_upper = ucfirst( $past_tense_verb );
826
+ if ( $failures ) {
827
+ if ( $successes ) {
828
+ WP_CLI::error( "Only {$past_tense_verb} {$successes} of {$total} {$plural_noun}." );
829
+ } else {
830
+ WP_CLI::error( "No {$plural_noun} {$past_tense_verb}." );
831
+ }
832
+ } else {
833
+ if ( $successes ) {
834
+ WP_CLI::success( "{$past_tense_verb_upper} {$successes} of {$total} {$plural_noun}." );
835
+ } else {
836
+ $message = $total > 1 ? ucfirst( $plural_noun ) : ucfirst( $noun );
837
+ WP_CLI::success( "{$message} already {$past_tense_verb}." );
838
+ }
839
+ }
840
+ }
841
+
842
+ /**
843
+ * Parse a string of command line arguments into an $argv-esqe variable.
844
+ *
845
+ * @access public
846
+ * @category Input
847
+ *
848
+ * @param string $arguments
849
+ * @return array
850
+ */
851
+ function parse_str_to_argv( $arguments ) {
852
+ preg_match_all ('/(?<=^|\s)([\'"]?)(.+?)(?<!\\\\)\1(?=$|\s)/', $arguments, $matches );
853
+ $argv = isset( $matches[0] ) ? $matches[0] : array();
854
+ $argv = array_map( function( $arg ){
855
+ foreach( array( '"', "'" ) as $char ) {
856
+ if ( $char === substr( $arg, 0, 1 ) && $char === substr( $arg, -1 ) ) {
857
+ $arg = substr( $arg, 1, -1 );
858
+ break;
859
+ }
860
+ }
861
+ return $arg;
862
+ }, $argv );
863
+ return $argv;
864
+ }
865
+
866
+ /**
867
+ * Locale-independent version of basename()
868
+ *
869
+ * @access public
870
+ *
871
+ * @param string $path
872
+ * @param string $suffix
873
+ * @return string
874
+ */
875
+ function basename( $path, $suffix = '' ) {
876
+ return urldecode( \basename( str_replace( array( '%2F', '%5C' ), '/', urlencode( $path ) ), $suffix ) );
877
+ }
878
+
879
+ /**
880
+ * Checks whether the output of the current script is a TTY or a pipe / redirect
881
+ *
882
+ * Returns true if STDOUT output is being redirected to a pipe or a file; false is
883
+ * output is being sent directly to the terminal.
884
+ *
885
+ * If an env variable SHELL_PIPE exists, returned result depends it's
886
+ * value. Strings like 1, 0, yes, no, that validate to booleans are accepted.
887
+ *
888
+ * To enable ASCII formatting even when shell is piped, use the
889
+ * ENV variable SHELL_PIPE=0
890
+ *
891
+ * @access public
892
+ *
893
+ * @return bool
894
+ */
895
+ function isPiped() {
896
+ $shellPipe = getenv('SHELL_PIPE');
897
+
898
+ if ($shellPipe !== false) {
899
+ return filter_var($shellPipe, FILTER_VALIDATE_BOOLEAN);
900
+ } else {
901
+ return (function_exists('posix_isatty') && !posix_isatty(STDOUT));
902
+ }
903
+ }
904
+
905
+ /**
906
+ * Expand within paths to their matching paths.
907
+ *
908
+ * Has no effect on paths which do not use glob patterns.
909
+ *
910
+ * @param string|array $paths Single path as a string, or an array of paths.
911
+ * @param int $flags Optional. Flags to pass to glob. Defaults to GLOB_BRACE.
912
+ *
913
+ * @return array Expanded paths.
914
+ */
915
+ function expand_globs( $paths, $flags = 'default' ) {
916
+ // Compatibility for systems without GLOB_BRACE.
917
+ $glob_func = 'glob';
918
+ if ( 'default' === $flags ) {
919
+ if ( ! defined( 'GLOB_BRACE' ) || getenv( 'WP_CLI_TEST_EXPAND_GLOBS_NO_GLOB_BRACE' ) ) {
920
+ $glob_func = 'WP_CLI\Utils\glob_brace';
921
+ } else {
922
+ $flags = GLOB_BRACE;
923
+ }
924
+ }
925
+
926
+ $expanded = array();
927
+
928
+ foreach ( (array) $paths as $path ) {
929
+ $matching = array( $path );
930
+
931
+ if ( preg_match( '/[' . preg_quote( '*?[]{}!', '/' ) . ']/', $path ) ) {
932
+ $matching = $glob_func( $path, $flags ) ?: array();
933
+ }
934
+ $expanded = array_merge( $expanded, $matching );
935
+ }
936
+
937
+ return array_values( array_unique( $expanded ) );
938
+ }
939
+
940
+ /**
941
+ * Simulate a `glob()` with the `GLOB_BRACE` flag set. For systems (eg Alpine Linux) built against a libc library (eg https://www.musl-libc.org/) that lacks it.
942
+ * Copied and adapted from Zend Framework's `Glob::fallbackGlob()` and Glob::nextBraceSub()`.
943
+ *
944
+ * Zend Framework (http://framework.zend.com/)
945
+ *
946
+ * @link http://github.com/zendframework/zf2 for the canonical source repository
947
+ * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
948
+ * @license http://framework.zend.com/license/new-bsd New BSD License
949
+ *
950
+ * @param string $pattern Filename pattern.
951
+ * @param void $dummy_flags Not used.
952
+ *
953
+ * @return array Array of paths.
954
+ */
955
+ function glob_brace( $pattern, $dummy_flags = null ) {
956
+
957
+ static $next_brace_sub;
958
+ if ( ! $next_brace_sub ) {
959
+ // Find the end of the subpattern in a brace expression.
960
+ $next_brace_sub = function ( $pattern, $current ) {
961
+ $length = strlen( $pattern );
962
+ $depth = 0;
963
+
964
+ while ( $current < $length ) {
965
+ if ( '\\' === $pattern[ $current ] ) {
966
+ if ( ++$current === $length ) {
967
+ break;
968
+ }
969
+ $current++;
970
+ } else {
971
+ if ( ( '}' === $pattern[ $current ] && $depth-- === 0 ) || ( ',' === $pattern[ $current ] && 0 === $depth ) ) {
972
+ break;
973
+ } elseif ( '{' === $pattern[ $current++ ] ) {
974
+ $depth++;
975
+ }
976
+ }
977
+ }
978
+
979
+ return $current < $length ? $current : null;
980
+ };
981
+ }
982
+
983
+ $length = strlen( $pattern );
984
+
985
+ // Find first opening brace.
986
+ for ( $begin = 0; $begin < $length; $begin++ ) {
987
+ if ( '\\' === $pattern[ $begin ] ) {
988
+ $begin++;
989
+ } elseif ( '{' === $pattern[ $begin ] ) {
990
+ break;
991
+ }
992
+ }
993
+
994
+ // Find comma or matching closing brace.
995
+ if ( null === ( $next = $next_brace_sub( $pattern, $begin + 1 ) ) ) {
996
+ return glob( $pattern );
997
+ }
998
+
999
+ $rest = $next;
1000
+
1001
+ // Point `$rest` to matching closing brace.
1002
+ while ( '}' !== $pattern[ $rest ] ) {
1003
+ if ( null === ( $rest = $next_brace_sub( $pattern, $rest + 1 ) ) ) {
1004
+ return glob( $pattern );
1005
+ }
1006
+ }
1007
+
1008
+ $paths = array();
1009
+ $p = $begin + 1;
1010
+
1011
+ // For each comma-separated subpattern.
1012
+ do {
1013
+ $subpattern = substr( $pattern, 0, $begin )
1014
+ . substr( $pattern, $p, $next - $p )
1015
+ . substr( $pattern, $rest + 1 );
1016
+
1017
+ if ( ( $result = glob_brace( $subpattern ) ) ) {
1018
+ $paths = array_merge( $paths, $result );
1019
+ }
1020
+
1021
+ if ( '}' === $pattern[ $next ] ) {
1022
+ break;
1023
+ }
1024
+
1025
+ $p = $next + 1;
1026
+ $next = $next_brace_sub( $pattern, $p );
1027
+ } while ( null !== $next );
1028
+
1029
+ return array_values( array_unique( $paths ) );
1030
+ }
1031
+
1032
+ /**
1033
+ * Get the closest suggestion for a mis-typed target term amongst a list of
1034
+ * options.
1035
+ *
1036
+ * Uses the Levenshtein algorithm to calculate the relative "distance" between
1037
+ * terms.
1038
+ *
1039
+ * If the "distance" to the closest term is higher than the threshold, an empty
1040
+ * string is returned.
1041
+ *
1042
+ * @param string $target Target term to get a suggestion for.
1043
+ * @param array $options Array with possible options.
1044
+ * @param int $threshold Threshold above which to return an empty string.
1045
+ *
1046
+ * @return string
1047
+ */
1048
+ function get_suggestion( $target, array $options, $threshold = 2 ) {
1049
+ if ( empty( $options ) ) {
1050
+ return '';
1051
+ }
1052
+ foreach ( $options as $option ) {
1053
+ $distance = levenshtein( $option, $target );
1054
+ $levenshtein[ $option ] = $distance;
1055
+ }
1056
+
1057
+ // Sort known command strings by distance to user entry.
1058
+ asort( $levenshtein );
1059
+
1060
+ // Fetch the closest command string.
1061
+ reset( $levenshtein );
1062
+ $suggestion = key( $levenshtein );
1063
+
1064
+ // Only return a suggestion if below a given threshold.
1065
+ return $levenshtein[ $suggestion ] <= $threshold && $suggestion !== $target
1066
+ ? (string) $suggestion
1067
+ : '';
1068
+ }
1069
+
1070
+ /**
1071
+ * Get a Phar-safe version of a path.
1072
+ *
1073
+ * For paths inside a Phar, this strips the outer filesystem's location to
1074
+ * reduce the path to what it needs to be within the Phar archive.
1075
+ *
1076
+ * Use the __FILE__ or __DIR__ constants as a starting point.
1077
+ *
1078
+ * @param string $path An absolute path that might be within a Phar.
1079
+ *
1080
+ * @return string A Phar-safe version of the path.
1081
+ */
1082
+ function phar_safe_path( $path ) {
1083
+
1084
+ if ( ! inside_phar() ) {
1085
+ return $path;
1086
+ }
1087
+
1088
+ return str_replace(
1089
+ PHAR_STREAM_PREFIX . WP_CLI_PHAR_PATH . '/',
1090
+ PHAR_STREAM_PREFIX,
1091
+ $path
1092
+ );
1093
+ }
1094
+
1095
+ /**
1096
+ * Check whether a given Command object is part of the bundled set of
1097
+ * commands.
1098
+ *
1099
+ * This function accepts both a fully qualified class name as a string as
1100
+ * well as an object that extends `WP_CLI\Dispatcher\CompositeCommand`.
1101
+ *
1102
+ * @param \WP_CLI\Dispatcher\CompositeCommand|string $command
1103
+ *
1104
+ * @return bool
1105
+ */
1106
+ function is_bundled_command( $command ) {
1107
+ static $classes;
1108
+
1109
+ if ( null === $classes ) {
1110
+ $classes = array();
1111
+ $class_map = WP_CLI_VENDOR_DIR . '/composer/autoload_commands_classmap.php';
1112
+ if ( file_exists( WP_CLI_VENDOR_DIR . '/composer/') ) {
1113
+ $classes = include $class_map;
1114
+ }
1115
+ }
1116
+
1117
+ if ( is_object( $command ) ) {
1118
+ $command = get_class( $command );
1119
+ }
1120
+
1121
+ return is_string( $command )
1122
+ ? array_key_exists( $command, $classes )
1123
+ : false;
1124
+ }
1125
+
1126
+ /**
1127
+ * Maybe prefix command string with "/usr/bin/env".
1128
+ * Removes (if there) if Windows, adds (if not there) if not.
1129
+ *
1130
+ * @param string $command
1131
+ *
1132
+ * @return string
1133
+ */
1134
+ function force_env_on_nix_systems( $command ) {
1135
+ $env_prefix = '/usr/bin/env ';
1136
+ $env_prefix_len = strlen( $env_prefix );
1137
+ if ( is_windows() ) {
1138
+ if ( 0 === strncmp( $command, $env_prefix, $env_prefix_len ) ) {
1139
+ $command = substr( $command, $env_prefix_len );
1140
+ }
1141
+ } else {
1142
+ if ( 0 !== strncmp( $command, $env_prefix, $env_prefix_len ) ) {
1143
+ $command = $env_prefix . $command;
1144
+ }
1145
+ }
1146
+ return $command;
1147
+ }
1148
+
1149
+ /**
1150
+ * Check that `proc_open()` and `proc_close()` haven't been disabled.
1151
+ *
1152
+ * @param string $context Optional. If set will appear in error message. Default null.
1153
+ * @param bool $return Optional. If set will return false rather than error out. Default false.
1154
+ *
1155
+ * @return bool
1156
+ */
1157
+ function check_proc_available( $context = null, $return = false ) {
1158
+ if ( ! function_exists( 'proc_open' ) || ! function_exists( 'proc_close' ) ) {
1159
+ if ( $return ) {
1160
+ return false;
1161
+ }
1162
+ $msg = 'The PHP functions `proc_open()` and/or `proc_close()` are disabled. Please check your PHP ini directive `disable_functions` or suhosin settings.';
1163
+ if ( $context ) {
1164
+ WP_CLI::error( sprintf( "Cannot do '%s': %s", $context, $msg ) );
1165
+ } else {
1166
+ WP_CLI::error( $msg );
1167
+ }
1168
+ }
1169
+ return true;
1170
+ }
1171
+
1172
+ /**
1173
+ * Returns past tense of verb, with limited accuracy. Only regular verbs catered for, apart from "reset".
1174
+ *
1175
+ * @param string $verb Verb to return past tense of.
1176
+ *
1177
+ * @return string
1178
+ */
1179
+ function past_tense_verb( $verb ) {
1180
+ static $irregular = array( 'reset' => 'reset' );
1181
+ if ( isset( $irregular[ $verb ] ) ) {
1182
+ return $irregular[ $verb ];
1183
+ }
1184
+ $last = substr( $verb, -1 );
1185
+ if ( 'e' === $last ) {
1186
+ $verb = substr( $verb, 0, -1 );
1187
+ } elseif ( 'y' === $last && ! preg_match( '/[aeiou]y$/', $verb ) ) {
1188
+ $verb = substr( $verb, 0, -1 ) . 'i';
1189
+ } elseif ( preg_match( '/^[^aeiou]*[aeiou][^aeiouhwxy]$/', $verb ) ) {
1190
+ // Rule of thumb that most (all?) one-voweled regular verbs ending in vowel + consonant (excluding "h", "w", "x", "y") double their final consonant - misses many cases (eg "submit").
1191
+ $verb .= $last;
1192
+ }
1193
+ return $verb . 'ed';
1194
+ }
cli/features/component.feature ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Components
2
+
3
+ Scenario: Component CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp bp component list --format=count`
7
+ Then STDOUT should be:
8
+ """
9
+ 10
10
+ """
11
+
12
+ When I run `wp bp component list --type=required --format=count`
13
+ Then STDOUT should be:
14
+ """
15
+ 2
16
+ """
17
+
18
+ When I run `wp bp component list --type=required`
19
+ Then STDOUT should be a table containing rows:
20
+ | id | title | description |
21
+ | core | BuddyPress Core | It&#8216;s what makes <del>time travel</del> BuddyPress possible! |
22
+ | members | Community Members | Everything in a BuddyPress community revolves around its members. |
23
+
24
+ When I run `wp bp component list --fields=id --type=required`
25
+ Then STDOUT should be a table containing rows:
26
+ | id |
27
+ | core |
28
+ | members |
29
+
30
+ When I run `wp bp component deactivate groups`
31
+ Then STDOUT should contain:
32
+ """
33
+ Success: The Groups component has been deactivated.
34
+ """
35
+
36
+ When I try `wp bp component deactivate groups`
37
+ Then the return code should be 1
38
+
39
+ When I run `wp bp component activate groups`
40
+ Then STDOUT should contain:
41
+ """
42
+ Success: The Groups component has been activated.
43
+ """
44
+
45
+ When I try `wp bp component activate groups`
46
+ Then the return code should be 1
cli/features/email.feature ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Emails
2
+
3
+ Scenario: BuddyPress reinstall emails
4
+ Given a BP install
5
+
6
+ When I run `wp bp email reinstall --yes`
7
+ Then STDOUT should contain:
8
+ """
9
+ Success: Emails have been successfully reinstalled.
10
+ """
cli/features/extra/no-mail.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ function wp_mail( $to ) {
4
+ // Log for testing purposes
5
+ WP_CLI::log( "WP-CLI test suite: Sent email to {$to}." );
6
+ }
7
+
cli/features/friend.feature ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Friends
2
+
3
+ Scenario: Friends CRUD Operations
4
+ Given a BP install
5
+
6
+ When I try `wp user get bogus-user`
7
+ Then the return code should be 1
8
+ And STDOUT should be empty
9
+
10
+ When I run `wp user create testuser1 testuser1@example.com --porcelain`
11
+ Then STDOUT should be a number
12
+ And save STDOUT as {BOB_ID}
13
+
14
+ When I run `wp user create testuser2 testuser2@example.com --porcelain`
15
+ Then STDOUT should be a number
16
+ And save STDOUT as {SALLY_ID}
17
+
18
+ When I run `wp user create testuser3 testuser3@example.com --porcelain`
19
+ Then STDOUT should be a number
20
+ And save STDOUT as {JOHN_ID}
21
+
22
+ When I run `wp bp friend create {BOB_ID} {SALLY_ID} --force-accept`
23
+ Then STDOUT should contain:
24
+ """
25
+ Success: Friendship successfully created.
26
+ """
27
+
28
+ When I run `wp bp friend check {BOB_ID} {SALLY_ID}`
29
+ Then STDOUT should contain:
30
+ """
31
+ Success: Yes, they are friends.
32
+ """
33
+
34
+ When I run `wp bp friend create {BOB_ID} {JOHN_ID} --force-accept`
35
+ Then STDOUT should contain:
36
+ """
37
+ Success: Friendship successfully created.
38
+ """
39
+
40
+ When I run `wp bp friend list {BOB_ID} --fields=friend_user_id,is_confirmed`
41
+ Then STDOUT should be a table containing rows:
42
+ | friend_user_id | is_confirmed |
43
+ | {SALLY_ID} | 1 |
44
+ | {JOHN_ID} | 1 |
45
+
46
+ When I run `wp bp friend remove {BOB_ID} {SALLY_ID}`
47
+ Then STDOUT should contain:
48
+ """
49
+ Success: Friendship successfully removed.
50
+ """
51
+
52
+ When I run `wp bp friend remove {BOB_ID} {JOHN_ID}`
53
+ Then STDOUT should contain:
54
+ """
55
+ Success: Friendship successfully removed.
56
+ """
cli/features/group-invite.feature ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Group Invites
2
+
3
+ Scenario: Group Invite CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp user create testuser1 testuser1@example.com --porcelain`
7
+ Then STDOUT should be a number
8
+ And save STDOUT as {MEMBER_ID}
9
+
10
+ When I run `wp user create inviter inviter@example.com --porcelain`
11
+ Then STDOUT should be a number
12
+ And save STDOUT as {INVITER_ID}
13
+
14
+ When I run `wp bp group create --name="Cool Group" --porcelain`
15
+ Then STDOUT should be a number
16
+ And save STDOUT as {GROUP_ID}
17
+
18
+ When I run `wp bp group invite create --group-id={GROUP_ID} --user-id={MEMBER_ID} --inviter-id={INVITER_ID}`
19
+ Then STDOUT should contain:
20
+ """
21
+ Success: Member invited to the group.
22
+ """
23
+
24
+ When I run `wp bp group invite remove --group-id={GROUP_ID} --user-id={MEMBER_ID}`
25
+ Then STDOUT should contain:
26
+ """
27
+ Success: User uninvited from the group.
28
+ """
29
+
30
+ When I run `wp bp group invite accept --group-id={GROUP_ID} --user-id={MEMBER_ID}`
31
+ Then STDOUT should contain:
32
+ """
33
+ Success: User is now a "member" of the group.
34
+ """
35
+
36
+ Scenario: Group Invite list
37
+ Given a BP install
38
+
39
+ When I run `wp user create testuser1 testuser1@example.com --porcelain`
40
+ Then STDOUT should be a number
41
+ And save STDOUT as {MEMBER_ONE_ID}
42
+
43
+ When I run `wp user create testuser2 testuser2@example.com --porcelain`
44
+ Then STDOUT should be a number
45
+ And save STDOUT as {MEMBER_TWO_ID}
46
+
47
+ When I run `wp bp group create --name="Group 1" --slug=group1 --porcelain`
48
+ Then STDOUT should be a number
49
+ And save STDOUT as {GROUP_ONE_ID}
50
+
51
+ When I run `wp bp group create --name="Group 2" --slug=group2 --porcelain`
52
+ Then STDOUT should be a number
53
+ And save STDOUT as {GROUP_TWO_ID}
54
+
55
+ When I run `wp bp group invite create --group-id={GROUP_ONE_ID} --user-id={MEMBER_ONE_ID} --inviter-id={MEMBER_TWO_ID}`
56
+ Then the return code should be 0
57
+
58
+ When I run `wp bp group invite create --group-id={GROUP_TWO_ID} --user-id={MEMBER_TWO_ID} --inviter-id={MEMBER_ONE_ID}`
59
+ Then the return code should be 0
60
+
61
+ When I try `wp bp group invite list`
62
+ Then the return code should be 1
cli/features/group-member.feature ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Group Members
2
+
3
+ Scenario: Group Member CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp user create testuser1 testuser1@example.com --porcelain`
7
+ Then STDOUT should be a number
8
+ And save STDOUT as {CREATOR_ID}
9
+
10
+ When I run `wp user create mod mod@example.com --porcelain`
11
+ Then STDOUT should be a number
12
+ And save STDOUT as {MEMBER_ID}
13
+
14
+ When I run `wp bp group create --name="Totally Cool Group" --creator-id={CREATOR_ID} --porcelain`
15
+ Then STDOUT should be a number
16
+ And save STDOUT as {GROUP_ID}
17
+
18
+ When I run `wp bp group member create --group-id={GROUP_ID} --user-id={MEMBER_ID}`
19
+ Then STDOUT should contain:
20
+ """
21
+ Success: Added user #{MEMBER_ID} to group #{GROUP_ID} as member.
22
+ """
23
+
24
+ When I run `wp bp group member list {GROUP_ID} --fields=user_id`
25
+ Then STDOUT should be a table containing rows:
26
+ | user_id |
27
+ | {CREATOR_ID} |
28
+ | {MEMBER_ID} |
29
+
30
+ When I run `wp bp group member promote --group-id={GROUP_ID} --user-id={MEMBER_ID} --role=mod`
31
+ Then STDOUT should contain:
32
+ """
33
+ Success: Member promoted to new role successfully.
34
+ """
35
+
36
+ When I run `wp bp group member list {GROUP_ID} --fields=user_id --role=mod`
37
+ Then STDOUT should be a table containing rows:
38
+ | user_id |
39
+ | {MEMBER_ID} |
40
+
41
+ When I run `wp bp group member demote --group-id={GROUP_ID} --user-id={MEMBER_ID}`
42
+ Then STDOUT should contain:
43
+ """
44
+ Success: User demoted to the "member" status.
45
+ """
46
+
47
+ When I try `wp bp group member list {GROUP_ID} --fields=user_id --role=mod`
48
+ Then the return code should be 1
49
+
50
+ When I run `wp bp group member ban --group-id={GROUP_ID} --user-id={MEMBER_ID}`
51
+ Then STDOUT should contain:
52
+ """
53
+ Success: Member banned from the group.
54
+ """
55
+
56
+ When I run `wp bp group member list {GROUP_ID} --fields=user_id --role=banned`
57
+ Then STDOUT should be a table containing rows:
58
+ | user_id |
59
+ | {MEMBER_ID} |
60
+
61
+ When I run `wp bp group member unban --group-id={GROUP_ID} --user-id={MEMBER_ID}`
62
+ Then STDOUT should contain:
63
+ """
64
+ Success: Member unbanned from the group.
65
+ """
66
+
67
+ When I try `wp bp group member list {GROUP_ID} --fields=user_id --role=banned`
68
+ Then the return code should be 1
69
+
70
+ When I run `wp bp group member remove --group-id={GROUP_ID} --user-id={MEMBER_ID}`
71
+ Then STDOUT should contain:
72
+ """
73
+ Success: Member #{MEMBER_ID} removed from the group #{GROUP_ID}.
74
+ """
75
+
76
+ When I run `wp bp group member list {GROUP_ID} --fields=user_id --role=member,admin,mod,banned`
77
+ Then STDOUT should be a table containing rows:
78
+ | user_id |
79
+ | {CREATOR_ID} |
cli/features/group.feature ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Groups
2
+
3
+ Scenario: Group CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp bp group create --name="Totally Cool Group" --slug=totally-cool-group --porcelain`
7
+ Then STDOUT should be a number
8
+ And save STDOUT as {GROUP_ID}
9
+
10
+ When I run `wp bp group get {GROUP_ID}`
11
+ Then STDOUT should be a table containing rows:
12
+ | Field | Value |
13
+ | id | {GROUP_ID} |
14
+ | name | Totally Cool Group |
15
+
16
+ When I run `wp bp group get totally-cool-group`
17
+ Then STDOUT should be a table containing rows:
18
+ | Field | Value |
19
+ | id | {GROUP_ID} |
20
+ | name | Totally Cool Group |
21
+
22
+ When I try `wp bp group get i-do-not-exist`
23
+ Then the return code should be 1
24
+
25
+ When I run `wp bp group update {GROUP_ID} --description=foo`
26
+ Then STDOUT should not be empty
27
+
28
+ When I run `wp bp group get {GROUP_ID}`
29
+ Then STDOUT should be a table containing rows:
30
+ | Field | Value |
31
+ | id | {GROUP_ID} |
32
+ | name | Totally Cool Group |
33
+ | description | foo |
34
+ | url | http://example.com/groups/totally-cool-group/ |
35
+
36
+ When I run `wp bp group delete {GROUP_ID} --yes`
37
+ Then STDOUT should contain:
38
+ """
39
+ Success: Group successfully deleted.
40
+ """
41
+
42
+ When I try `wp bp group get {GROUP_ID}`
43
+ Then the return code should be 1
44
+
45
+ Scenario: Group list
46
+ Given a BP install
47
+
48
+ When I run `wp bp group create --name="ZZZ Group 1" --slug=group1 --porcelain`
49
+ Then STDOUT should be a number
50
+ And save STDOUT as {GROUP_ONE_ID}
51
+
52
+ When I run `wp bp group create --name="AAA Group 2" --slug=group2 --porcelain`
53
+ Then STDOUT should be a number
54
+ And save STDOUT as {GROUP_TWO_ID}
55
+
56
+ When I run `wp bp group list --fields=id,name,slug`
57
+ Then STDOUT should be a table containing rows:
58
+ | id | name | slug |
59
+ | {GROUP_ONE_ID} | ZZZ Group 1 | group1 |
60
+ | {GROUP_TWO_ID} | AAA Group 2 | group2 |
61
+
62
+ When I run `wp bp group list --fields=id,name,slug --orderby=name`
63
+ Then STDOUT should be a table containing rows:
64
+ | id | name | slug |
65
+ | {GROUP_TWO_ID} | AAA Group 2 | group2 |
66
+ | {GROUP_ONE_ID} | ZZZ Group 1 | group1 |
67
+
68
+ When I run `wp bp group list --fields=id,name,slug --orderby=name --order=DESC`
69
+ Then STDOUT should be a table containing rows:
70
+ | id | name | slug |
71
+ | {GROUP_ONE_ID} | ZZZ Group 1 | group1 |
72
+ | {GROUP_TWO_ID} | AAA Group 2 | group2 |
73
+
74
+ When I run `wp user create testuser1 testuser1@example.com --porcelain`
75
+ Then STDOUT should be a number
76
+ And save STDOUT as {MEMBER_ID}
77
+
78
+ When I try `wp bp group list --fields=id --user-id={MEMBER_ID}`
79
+ Then the return code should be 1
80
+
81
+ When I run `wp bp group member create --group-id={GROUP_ONE_ID} --user-id={MEMBER_ID}`
82
+ Then the return code should be 0
83
+
84
+ When I run `wp bp group list --fields=id --user-id={MEMBER_ID}`
85
+ Then STDOUT should be a table containing rows:
86
+ | id |
87
+ | {GROUP_ONE_ID} |
cli/features/message.feature ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Messages
2
+
3
+ Scenario: Message CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp user create testuser1 testuser1@example.com --porcelain`
7
+ Then STDOUT should be a number
8
+ And save STDOUT as {BOB_ID}
9
+
10
+ When I run `wp user create testuser2 testuser2@example.com --porcelain`
11
+ Then STDOUT should be a number
12
+ And save STDOUT as {SALLY_ID}
13
+
14
+ When I run `wp bp message send-notice --subject="Important Notice" --content="Notice Message"`
15
+ Then STDOUT should contain:
16
+ """
17
+ Success: Notice was successfully sent.
18
+ """
19
+
20
+ When I run `wp bp message create --from={BOB_ID} --to={SALLY_ID} --subject="Message" --content="Message Content" --porcelain`
21
+ Then STDOUT should be a number
22
+ And save STDOUT as {THREAD_ID}
23
+
24
+ When I run `wp bp message star-thread {THREAD_ID} --user-id={SALLY_ID}`
25
+ Then STDOUT should contain:
26
+ """
27
+ Success: Thread was successfully starred.
28
+ """
29
+
30
+ When I run `wp bp message unstar-thread {THREAD_ID} --user-id={SALLY_ID}`
31
+ Then STDOUT should contain:
32
+ """
33
+ Success: Thread was successfully unstarred.
34
+ """
35
+
36
+ When I run `wp bp message delete-thread {THREAD_ID} --user-id={SALLY_ID} --yes`
37
+ Then STDOUT should contain:
38
+ """
39
+ Success: Thread successfully deleted.
40
+ """
41
+
42
+ Scenario: Message list
43
+ Given a BP install
44
+
45
+ When I run `wp user create testuser2 testuser2@example.com --porcelain`
46
+ And save STDOUT as {BOB_ID}
47
+
48
+ When I run `wp user create testuser3 testuser3@example.com --porcelain`
49
+ And save STDOUT as {SALLY_ID}
50
+
51
+ When I try `wp bp message list --user-id={BOB_ID} --fields=id`
52
+ Then the return code should be 1
53
+
54
+ When I try `wp bp message list --user-id={SALLY_ID} --fields=id`
55
+ Then the return code should be 1
56
+
57
+ When I run `wp bp message create --from={BOB_ID} --to={SALLY_ID} --subject="Test Thread" --content="Message one" --porcelain`
58
+ Then STDOUT should be a number
59
+ And save STDOUT as {THREAD_ID}
60
+
61
+ When I run `wp bp message create --from={SALLY_ID} --thread-id={THREAD_ID} --subject="Test Answer" --content="Message two"`
62
+ Then STDOUT should contain:
63
+ """
64
+ Success: Message successfully created.
65
+ """
66
+
67
+ When I run `wp bp message create --from={BOB_ID} --thread-id={THREAD_ID} --subject="Another Answer" --content="Message three"`
68
+ Then STDOUT should contain:
69
+ """
70
+ Success: Message successfully created.
71
+ """
72
+
73
+ When I run `wp bp message list --user-id={BOB_ID} --fields=sender_id`
74
+ Then STDOUT should be a table containing rows:
75
+ | sender_id |
76
+ | {BOB_ID} |
77
+ | {SALLY_ID} |
78
+
79
+ When I run `wp bp message list --user-id={SALLY_ID} --fields=thread_id,sender_id,subject,message`
80
+ Then STDOUT should be a table containing rows:
81
+ | thread_id | sender_id | subject | message |
82
+ | {THREAD_ID} | {BOB_ID} | Test Thread | Message one |
83
+ | {THREAD_ID} | {SALLY_ID} | Test Answer | Message two |
84
+ | {THREAD_ID} | {BOB_ID} | Another Answer | Message three |
85
+
86
+ When I run `wp user create testuser4 testuser4@example.com --porcelain`
87
+ And save STDOUT as {JOHN_ID}
88
+
89
+ When I try `wp bp message list --user-id={JOHN_ID} --fields=id`
90
+ Then the return code should be 1
91
+
92
+ When I run `wp bp message create --from={JOHN_ID} --to={SALLY_ID} --subject="Second Thread" --content="Message four" --porcelain`
93
+ Then STDOUT should be a number
94
+ And save STDOUT as {ANOTHER_THREAD_ID}
95
+
96
+ When I run `wp bp message create --from={SALLY_ID} --thread-id={ANOTHER_THREAD_ID} --subject="Final Message" --content="Final Message"`
97
+ Then STDOUT should contain:
98
+ """
99
+ Success: Message successfully created.
100
+ """
101
+
102
+ When I run `wp bp message list --user-id={JOHN_ID} --fields=thread_id,sender_id,subject,message`
103
+ Then STDOUT should be a table containing rows:
104
+ | thread_id | sender_id | subject | message |
105
+ | {ANOTHER_THREAD_ID} | {JOHN_ID} | Second Thread | Message four |
cli/features/signup.feature ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Signups
2
+
3
+ Scenario: Signup CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp bp signup add --user-login=test_user --user-email=test@example.com --porcelain`
7
+ Then STDOUT should be a number
8
+ And save STDOUT as {SIGNUP_ID}
9
+
10
+ When I run `wp bp signup list --fields=signup_id,user_login,user_email`
11
+ Then STDOUT should be a table containing rows:
12
+ | signup_id | user_login | user_email |
13
+ | {SIGNUP_ID} | test_user | test@example.com |
14
+
15
+ When I run `wp bp signup delete {SIGNUP_ID} --yes`
16
+ Then STDOUT should contain:
17
+ """
18
+ Success: Signup deleted.
19
+ """
20
+
21
+ Scenario: Signup fetching by identifier
22
+ Given a BP install
23
+
24
+ When I run `wp bp signup add --user-login=signup1 --user-email=signup1@example.com --porcelain`
25
+ Then STDOUT should be a number
26
+ And save STDOUT as {SIGNUP_ONE_ID}
27
+
28
+ When I run `wp bp signup get {SIGNUP_ONE_ID} --fields=signup_id,user_login,user_email`
29
+ Then STDOUT should be a table containing rows:
30
+ | Field | Value |
31
+ | signup_id | {SIGNUP_ONE_ID} |
32
+ | user_login | signup1 |
33
+ | user_email | signup1@example.com |
34
+
35
+ When I run `wp bp signup add --user-login={SIGNUP_ONE_ID} --user-email=signup2@example.com --porcelain`
36
+ Then STDOUT should be a number
37
+ And save STDOUT as {SIGNUP_TWO_ID}
38
+
39
+ When I run `wp bp signup get {SIGNUP_ONE_ID} --fields=signup_id,user_login,user_email`
40
+ Then STDOUT should be a table containing rows:
41
+ | Field | Value |
42
+ | signup_id | {SIGNUP_ONE_ID} |
43
+ | user_login | signup1 |
44
+ | user_email | signup1@example.com |
45
+
46
+ When I run `wp bp signup get {SIGNUP_ONE_ID} --fields=signup_id,user_login,user_email --match-field=user_login`
47
+ Then STDOUT should be a table containing rows:
48
+ | Field | Value |
49
+ | signup_id | {SIGNUP_TWO_ID} |
50
+ | user_login | {SIGNUP_ONE_ID} |
51
+ | user_email | signup2@example.com |
52
+
53
+ Scenario: Signup activation
54
+ Given a BP install
55
+
56
+ When I run `wp bp signup add --user-login=test_user --user-email=test@example.com --porcelain`
57
+ Then STDOUT should be a number
58
+ And save STDOUT as {SIGNUP_ID}
59
+
60
+ When I run `wp bp signup activate {SIGNUP_ID}`
61
+ Then STDOUT should contain:
62
+ """
63
+ Signup activated
64
+ """
65
+
66
+ When I run `wp user get test_user --field=user_email`
67
+ Then STDOUT should contain:
68
+ """
69
+ test@example.com
70
+ """
71
+
72
+ Scenario: Signup resending
73
+ Given a BP install
74
+
75
+ When I run `wp bp signup add --user-login=test_user --user-email=test@example.com --porcelain`
76
+ Then STDOUT should be a number
77
+ And save STDOUT as {SIGNUP_ID}
78
+
79
+ When I run `wp bp signup resend {SIGNUP_ID}`
80
+ Then STDOUT should contain:
81
+ """
82
+ success
83
+ """
cli/features/steps/given-custom.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Behat\Gherkin\Node\PyStringNode,
4
+ Behat\Gherkin\Node\TableNode,
5
+ WP_CLI\Process;
6
+
7
+ $steps->Given( '/^a BP install$/',
8
+ function ( $world ) {
9
+ $world->install_wp();
10
+ $dest_dir = $world->variables['RUN_DIR'] . '/wp-content/plugins/buddypress/';
11
+ if ( ! is_dir( $dest_dir ) ) {
12
+ mkdir( $dest_dir );
13
+ }
14
+
15
+ $bp_src_dir = getenv( 'BP_SRC_DIR' );
16
+ if ( ! is_dir( $bp_src_dir ) ) {
17
+ throw new Exception( 'BuddyPress not found in BP_SRC_DIR' );
18
+ }
19
+
20
+ try {
21
+ $world->copy_dir( $bp_src_dir, $dest_dir );
22
+ $world->proc( 'wp plugin activate buddypress' )->run_check();
23
+
24
+ $components = array( 'friends', 'groups', 'xprofile', 'activity', 'messages' );
25
+ foreach ( $components as $component ) {
26
+ $world->proc( "wp bp component activate $component" )->run_check();
27
+ }
28
+ } catch ( Exception $e ) {};
29
+ }
30
+ );
cli/features/steps/given.php ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Behat\Gherkin\Node\PyStringNode,
4
+ Behat\Gherkin\Node\TableNode,
5
+ WP_CLI\Process;
6
+
7
+ $steps->Given( '/^an empty directory$/',
8
+ function ( $world ) {
9
+ $world->create_run_dir();
10
+ }
11
+ );
12
+
13
+ $steps->Given( '/^an? (empty|non-existent) ([^\s]+) directory$/',
14
+ function ( $world, $empty_or_nonexistent, $dir ) {
15
+ $dir = $world->replace_variables( $dir );
16
+ if ( ! WP_CLI\Utils\is_path_absolute( $dir ) ) {
17
+ $dir = $world->variables['RUN_DIR'] . "/$dir";
18
+ }
19
+ if ( 0 !== strpos( $dir, sys_get_temp_dir() ) ) {
20
+ throw new RuntimeException( sprintf( "Attempted to delete directory '%s' that is not in the temp directory '%s'. " . __FILE__ . ':' . __LINE__, $dir, sys_get_temp_dir() ) );
21
+ }
22
+ $world->remove_dir( $dir );
23
+ if ( 'empty' === $empty_or_nonexistent ) {
24
+ mkdir( $dir, 0777, true /*recursive*/ );
25
+ }
26
+ }
27
+ );
28
+
29
+ $steps->Given( '/^an empty cache/',
30
+ function ( $world ) {
31
+ $world->variables['SUITE_CACHE_DIR'] = FeatureContext::create_cache_dir();
32
+ }
33
+ );
34
+
35
+ $steps->Given( '/^an? ([^\s]+) file:$/',
36
+ function ( $world, $path, PyStringNode $content ) {
37
+ $content = (string) $content . "\n";
38
+ $full_path = $world->variables['RUN_DIR'] . "/$path";
39
+ $dir = dirname( $full_path );
40
+ if ( ! file_exists( $dir ) ) {
41
+ mkdir( $dir, 0777, true /*recursive*/ );
42
+ }
43
+ file_put_contents( $full_path, $content );
44
+ }
45
+ );
46
+
47
+ $steps->Given( '/^"([^"]+)" replaced with "([^"]+)" in the ([^\s]+) file$/', function( $world, $search, $replace, $path ) {
48
+ $full_path = $world->variables['RUN_DIR'] . "/$path";
49
+ $contents = file_get_contents( $full_path );
50
+ $contents = str_replace( $search, $replace, $contents );
51
+ file_put_contents( $full_path, $contents );
52
+ });
53
+
54
+ $steps->Given( '/^WP files$/',
55
+ function ( $world ) {
56
+ $world->download_wp();
57
+ }
58
+ );
59
+
60
+ $steps->Given( '/^wp-config\.php$/',
61
+ function ( $world ) {
62
+ $world->create_config();
63
+ }
64
+ );
65
+
66
+ $steps->Given( '/^a database$/',
67
+ function ( $world ) {
68
+ $world->create_db();
69
+ }
70
+ );
71
+
72
+ $steps->Given( '/^a WP install$/',
73
+ function ( $world ) {
74
+ $world->install_wp();
75
+ }
76
+ );
77
+
78
+ $steps->Given( "/^a WP install in '([^\s]+)'$/",
79
+ function ( $world, $subdir ) {
80
+ $world->install_wp( $subdir );
81
+ }
82
+ );
83
+
84
+ $steps->Given( '/^a WP install with Composer$/',
85
+ function ( $world ) {
86
+ $world->install_wp_with_composer();
87
+ }
88
+ );
89
+
90
+ $steps->Given( "/^a WP install with Composer and a custom vendor directory '([^\s]+)'$/",
91
+ function ( $world, $vendor_directory ) {
92
+ $world->install_wp_with_composer( $vendor_directory );
93
+ }
94
+ );
95
+
96
+ $steps->Given( '/^a WP multisite (subdirectory|subdomain)?\s?install$/',
97
+ function ( $world, $type = 'subdirectory' ) {
98
+ $world->install_wp();
99
+ $subdomains = ! empty( $type ) && 'subdomain' === $type ? 1 : 0;
100
+ $world->proc( 'wp core install-network', array( 'title' => 'WP CLI Network', 'subdomains' => $subdomains ) )->run_check();
101
+ }
102
+ );
103
+
104
+ $steps->Given( '/^these installed and active plugins:$/',
105
+ function( $world, $stream ) {
106
+ $plugins = implode( ' ', array_map( 'trim', explode( PHP_EOL, (string)$stream ) ) );
107
+ $world->proc( "wp plugin install $plugins --activate" )->run_check();
108
+ }
109
+ );
110
+
111
+ $steps->Given( '/^a custom wp-content directory$/',
112
+ function ( $world ) {
113
+ $wp_config_path = $world->variables['RUN_DIR'] . "/wp-config.php";
114
+
115
+ $wp_config_code = file_get_contents( $wp_config_path );
116
+
117
+ $world->move_files( 'wp-content', 'my-content' );
118
+ $world->add_line_to_wp_config( $wp_config_code,
119
+ "define( 'WP_CONTENT_DIR', dirname(__FILE__) . '/my-content' );" );
120
+
121
+ $world->move_files( 'my-content/plugins', 'my-plugins' );
122
+ $world->add_line_to_wp_config( $wp_config_code,
123
+ "define( 'WP_PLUGIN_DIR', __DIR__ . '/my-plugins' );" );
124
+
125
+ file_put_contents( $wp_config_path, $wp_config_code );
126
+ }
127
+ );
128
+
129
+ $steps->Given( '/^download:$/',
130
+ function ( $world, TableNode $table ) {
131
+ foreach ( $table->getHash() as $row ) {
132
+ $path = $world->replace_variables( $row['path'] );
133
+ if ( file_exists( $path ) ) {
134
+ // assume it's the same file and skip re-download
135
+ continue;
136
+ }
137
+
138
+ Process::create( \WP_CLI\Utils\esc_cmd( 'curl -sSL %s > %s', $row['url'], $path ) )->run_check();
139
+ }
140
+ }
141
+ );
142
+
143
+ $steps->Given( '/^save (STDOUT|STDERR) ([\'].+[^\'])?\s?as \{(\w+)\}$/',
144
+ function ( $world, $stream, $output_filter, $key ) {
145
+
146
+ $stream = strtolower( $stream );
147
+
148
+ if ( $output_filter ) {
149
+ $output_filter = '/' . trim( str_replace( '%s', '(.+[^\b])', $output_filter ), "' " ) . '/';
150
+ if ( false !== preg_match( $output_filter, $world->result->$stream, $matches ) )
151
+ $output = array_pop( $matches );
152
+ else
153
+ $output = '';
154
+ } else {
155
+ $output = $world->result->$stream;
156
+ }
157
+ $world->variables[ $key ] = trim( $output, "\n" );
158
+ }
159
+ );
160
+
161
+ $steps->Given( '/^a new Phar with (?:the same version|version "([^"]+)")$/',
162
+ function ( $world, $version = 'same' ) {
163
+ $world->build_phar( $version );
164
+ }
165
+ );
166
+
167
+ $steps->Given( '/^a downloaded Phar with (?:the same version|version "([^"]+)")$/',
168
+ function ( $world, $version = 'same' ) {
169
+ $world->download_phar( $version );
170
+ }
171
+ );
172
+
173
+ $steps->Given( '/^save the (.+) file ([\'].+[^\'])?as \{(\w+)\}$/',
174
+ function ( $world, $filepath, $output_filter, $key ) {
175
+ $full_file = file_get_contents( $world->replace_variables( $filepath ) );
176
+
177
+ if ( $output_filter ) {
178
+ $output_filter = '/' . trim( str_replace( '%s', '(.+[^\b])', $output_filter ), "' " ) . '/';
179
+ if ( false !== preg_match( $output_filter, $full_file, $matches ) )
180
+ $output = array_pop( $matches );
181
+ else
182
+ $output = '';
183
+ } else {
184
+ $output = $full_file;
185
+ }
186
+ $world->variables[ $key ] = trim( $output, "\n" );
187
+ }
188
+ );
189
+
190
+ $steps->Given('/^a misconfigured WP_CONTENT_DIR constant directory$/',
191
+ function($world) {
192
+ $wp_config_path = $world->variables['RUN_DIR'] . "/wp-config.php";
193
+
194
+ $wp_config_code = file_get_contents( $wp_config_path );
195
+
196
+ $world->add_line_to_wp_config( $wp_config_code,
197
+ "define( 'WP_CONTENT_DIR', '' );" );
198
+
199
+ file_put_contents( $wp_config_path, $wp_config_code );
200
+ }
201
+ );
202
+
203
+ $steps->Given( '/^a dependency on current wp-cli$/',
204
+ function ( $world ) {
205
+ $world->composer_require_current_wp_cli();
206
+ }
207
+ );
208
+
209
+ $steps->Given( '/^a PHP built-in web server$/',
210
+ function ( $world ) {
211
+ $world->start_php_server();
212
+ }
213
+ );
cli/features/steps/then.php ADDED
@@ -0,0 +1,217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Behat\Gherkin\Node\PyStringNode,
4
+ Behat\Gherkin\Node\TableNode;
5
+
6
+ $steps->Then( '/^the return code should be (\d+)$/',
7
+ function ( $world, $return_code ) {
8
+ if ( $return_code != $world->result->return_code ) {
9
+ throw new RuntimeException( $world->result );
10
+ }
11
+ }
12
+ );
13
+
14
+ $steps->Then( '/^(STDOUT|STDERR) should (be|contain|not contain):$/',
15
+ function ( $world, $stream, $action, PyStringNode $expected ) {
16
+ $stream = strtolower( $stream );
17
+
18
+ $expected = $world->replace_variables( (string) $expected );
19
+
20
+ checkString( $world->result->$stream, $expected, $action, $world->result );
21
+ }
22
+ );
23
+
24
+ $steps->Then( '/^(STDOUT|STDERR) should be a number$/',
25
+ function ( $world, $stream ) {
26
+
27
+ $stream = strtolower( $stream );
28
+
29
+ assertNumeric( trim( $world->result->$stream, "\n" ) );
30
+ }
31
+ );
32
+
33
+ $steps->Then( '/^(STDOUT|STDERR) should not be a number$/',
34
+ function ( $world, $stream ) {
35
+
36
+ $stream = strtolower( $stream );
37
+
38
+ assertNotNumeric( trim( $world->result->$stream, "\n" ) );
39
+ }
40
+ );
41
+
42
+ $steps->Then( '/^STDOUT should be a table containing rows:$/',
43
+ function ( $world, TableNode $expected ) {
44
+ $output = $world->result->stdout;
45
+ $actual_rows = explode( "\n", rtrim( $output, "\n" ) );
46
+
47
+ $expected_rows = array();
48
+ foreach ( $expected->getRows() as $row ) {
49
+ $expected_rows[] = $world->replace_variables( implode( "\t", $row ) );
50
+ }
51
+
52
+ compareTables( $expected_rows, $actual_rows, $output );
53
+ }
54
+ );
55
+
56
+ $steps->Then( '/^STDOUT should end with a table containing rows:$/',
57
+ function ( $world, TableNode $expected ) {
58
+ $output = $world->result->stdout;
59
+ $actual_rows = explode( "\n", rtrim( $output, "\n" ) );
60
+
61
+ $expected_rows = array();
62
+ foreach ( $expected->getRows() as $row ) {
63
+ $expected_rows[] = $world->replace_variables( implode( "\t", $row ) );
64
+ }
65
+
66
+ $start = array_search( $expected_rows[0], $actual_rows );
67
+
68
+ if ( false === $start )
69
+ throw new \Exception( $world->result );
70
+
71
+ compareTables( $expected_rows, array_slice( $actual_rows, $start ), $output );
72
+ }
73
+ );
74
+
75
+ $steps->Then( '/^STDOUT should be JSON containing:$/',
76
+ function ( $world, PyStringNode $expected ) {
77
+ $output = $world->result->stdout;
78
+ $expected = $world->replace_variables( (string) $expected );
79
+
80
+ if ( !checkThatJsonStringContainsJsonString( $output, $expected ) ) {
81
+ throw new \Exception( $world->result );
82
+ }
83
+ });
84
+
85
+ $steps->Then( '/^STDOUT should be a JSON array containing:$/',
86
+ function ( $world, PyStringNode $expected ) {
87
+ $output = $world->result->stdout;
88
+ $expected = $world->replace_variables( (string) $expected );
89
+
90
+ $actualValues = json_decode( $output );
91
+ $expectedValues = json_decode( $expected );
92
+
93
+ $missing = array_diff( $expectedValues, $actualValues );
94
+ if ( !empty( $missing ) ) {
95
+ throw new \Exception( $world->result );
96
+ }
97
+ });
98
+
99
+ $steps->Then( '/^STDOUT should be CSV containing:$/',
100
+ function ( $world, TableNode $expected ) {
101
+ $output = $world->result->stdout;
102
+
103
+ $expected_rows = $expected->getRows();
104
+ foreach ( $expected as &$row ) {
105
+ foreach ( $row as &$value ) {
106
+ $value = $world->replace_variables( $value );
107
+ }
108
+ }
109
+
110
+ if ( ! checkThatCsvStringContainsValues( $output, $expected_rows ) )
111
+ throw new \Exception( $world->result );
112
+ }
113
+ );
114
+
115
+ $steps->Then( '/^STDOUT should be YAML containing:$/',
116
+ function ( $world, PyStringNode $expected ) {
117
+ $output = $world->result->stdout;
118
+ $expected = $world->replace_variables( (string) $expected );
119
+
120
+ if ( !checkThatYamlStringContainsYamlString( $output, $expected ) ) {
121
+ throw new \Exception( $world->result );
122
+ }
123
+ });
124
+
125
+ $steps->Then( '/^(STDOUT|STDERR) should be empty$/',
126
+ function ( $world, $stream ) {
127
+
128
+ $stream = strtolower( $stream );
129
+
130
+ if ( !empty( $world->result->$stream ) ) {
131
+ throw new \Exception( $world->result );
132
+ }
133
+ }
134
+ );
135
+
136
+ $steps->Then( '/^(STDOUT|STDERR) should not be empty$/',
137
+ function ( $world, $stream ) {
138
+
139
+ $stream = strtolower( $stream );
140
+
141
+ if ( '' === rtrim( $world->result->$stream, "\n" ) ) {
142
+ throw new Exception( $world->result );
143
+ }
144
+ }
145
+ );
146
+
147
+ $steps->Then( '/^(STDOUT|STDERR) should be a version string (<|<=|>|>=|==|=|!=|<>) ([+\w.{}-]+)$/',
148
+ function ( $world, $stream, $operator, $goal_ver ) {
149
+ $goal_ver = $world->replace_variables( $goal_ver );
150
+ $stream = strtolower( $stream );
151
+ if ( false === version_compare( trim( $world->result->$stream, "\n" ), $goal_ver, $operator ) ) {
152
+ throw new Exception( $world->result );
153
+ }
154
+ }
155
+ );
156
+
157
+ $steps->Then( '/^the (.+) (file|directory) should (exist|not exist|be:|contain:|not contain:)$/',
158
+ function ( $world, $path, $type, $action, $expected = null ) {
159
+ $path = $world->replace_variables( $path );
160
+
161
+ // If it's a relative path, make it relative to the current test dir
162
+ if ( '/' !== $path[0] )
163
+ $path = $world->variables['RUN_DIR'] . "/$path";
164
+
165
+ if ( 'file' == $type ) {
166
+ $test = 'file_exists';
167
+ } else if ( 'directory' == $type ) {
168
+ $test = 'is_dir';
169
+ }
170
+
171
+ switch ( $action ) {
172
+ case 'exist':
173
+ if ( ! $test( $path ) ) {
174
+ throw new Exception( "$path doesn't exist." );
175
+ }
176
+ break;
177
+ case 'not exist':
178
+ if ( $test( $path ) ) {
179
+ throw new Exception( "$path exists." );
180
+ }
181
+ break;
182
+ default:
183
+ if ( ! $test( $path ) ) {
184
+ throw new Exception( "$path doesn't exist." );
185
+ }
186
+ $action = substr( $action, 0, -1 );
187
+ $expected = $world->replace_variables( (string) $expected );
188
+ if ( 'file' == $type ) {
189
+ $contents = file_get_contents( $path );
190
+ } else if ( 'directory' == $type ) {
191
+ $files = glob( rtrim( $path, '/' ) . '/*' );
192
+ foreach( $files as &$file ) {
193
+ $file = str_replace( $path . '/', '', $file );
194
+ }
195
+ $contents = implode( PHP_EOL, $files );
196
+ }
197
+ checkString( $contents, $expected, $action );
198
+ }
199
+ }
200
+ );
201
+
202
+ $steps->Then( '/^an email should (be sent|not be sent)$/', function( $world, $expected ) {
203
+ if ( 'be sent' === $expected ) {
204
+ assertNotEquals( 0, $world->email_sends );
205
+ } else if ( 'not be sent' === $expected ) {
206
+ assertEquals( 0, $world->email_sends );
207
+ } else {
208
+ throw new Exception( 'Invalid expectation' );
209
+ }
210
+ });
211
+
212
+ $steps->Then( '/^the HTTP status code should be (\d+)$/',
213
+ function ( $world, $return_code ) {
214
+ $response = \Requests::request( 'http://localhost:8080' );
215
+ assertEquals( $return_code, $response->status_code );
216
+ }
217
+ );
cli/features/steps/when.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ use Behat\Gherkin\Node\PyStringNode,
4
+ Behat\Gherkin\Node\TableNode,
5
+ WP_CLI\Process;
6
+
7
+ function invoke_proc( $proc, $mode ) {
8
+ $map = array(
9
+ 'run' => 'run_check',
10
+ 'try' => 'run'
11
+ );
12
+ $method = $map[ $mode ];
13
+
14
+ return $proc->$method();
15
+ }
16
+
17
+ function capture_email_sends( $stdout ) {
18
+ $stdout = preg_replace( '#WP-CLI test suite: Sent email to.+\n?#', '', $stdout, -1, $email_sends );
19
+ return array( $stdout, $email_sends );
20
+ }
21
+
22
+ $steps->When( '/^I launch in the background `([^`]+)`$/',
23
+ function ( $world, $cmd ) {
24
+ $world->background_proc( $cmd );
25
+ }
26
+ );
27
+
28
+ $steps->When( '/^I (run|try) `([^`]+)`$/',
29
+ function ( $world, $mode, $cmd ) {
30
+ $cmd = $world->replace_variables( $cmd );
31
+ $world->result = invoke_proc( $world->proc( $cmd ), $mode );
32
+ list( $world->result->stdout, $world->email_sends ) = capture_email_sends( $world->result->stdout );
33
+ }
34
+ );
35
+
36
+ $steps->When( "/^I (run|try) `([^`]+)` from '([^\s]+)'$/",
37
+ function ( $world, $mode, $cmd, $subdir ) {
38
+ $cmd = $world->replace_variables( $cmd );
39
+ $world->result = invoke_proc( $world->proc( $cmd, array(), $subdir ), $mode );
40
+ list( $world->result->stdout, $world->email_sends ) = capture_email_sends( $world->result->stdout );
41
+ }
42
+ );
43
+
44
+ $steps->When( '/^I (run|try) the previous command again$/',
45
+ function ( $world, $mode ) {
46
+ if ( !isset( $world->result ) )
47
+ throw new \Exception( 'No previous command.' );
48
+
49
+ $proc = Process::create( $world->result->command, $world->result->cwd, $world->result->env );
50
+ $world->result = invoke_proc( $proc, $mode );
51
+ list( $world->result->stdout, $world->email_sends ) = capture_email_sends( $world->result->stdout );
52
+ }
53
+ );
54
+
cli/features/tool.feature ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress Tools
2
+
3
+ Scenario: BuddyPress repair
4
+ Given a BP install
5
+
6
+ When I run `wp bp tool repair friend-count`
7
+ Then STDOUT should contain:
8
+ """
9
+ Complete!
10
+ """
cli/features/xprofile-data.feature ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress XProfile Data
2
+
3
+ Scenario: XProfile Data CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp bp xprofile group create --name="Group Name" --description="Group Description" --porcelain`
7
+ Then STDOUT should be a number
8
+ And save STDOUT as {GROUP_ID}
9
+
10
+ When I run `wp bp xprofile field create --field-group-id={GROUP_ID} --name="Field Name" --porcelain`
11
+ Then STDOUT should be a number
12
+ And save STDOUT as {FIELD_ID}
13
+
14
+ When I run `wp user create testuser1 testuser1@example.com --porcelain`
15
+ Then STDOUT should be a number
16
+ And save STDOUT as {USER_ID}
17
+
18
+ When I run `wp bp xprofile data set --field-id={FIELD_ID} --user-id={USER_ID} --value=foo`
19
+ Then STDOUT should contain:
20
+ """
21
+ Updated
22
+ """
23
+
24
+ When I run `wp bp xprofile data get --user-id={USER_ID} --field-id={FIELD_ID}`
25
+ Then STDOUT should be:
26
+ """
27
+ foo
28
+ """
29
+
30
+ When I run `wp bp xprofile data get --user-id={USER_ID}`
31
+ Then STDOUT should be a table containing rows:
32
+ | field_id | field_name | value |
33
+ | {FIELD_ID} | Field Name | "foo" |
34
+
35
+ When I try `wp bp xprofile data delete --user-id={USER_ID} --yes`
36
+ Then the return code should be 1
37
+ Then STDERR should contain:
38
+ """
39
+ Either --field-id or --delete-all must be provided
40
+ """
41
+
42
+ When I run `wp bp xprofile data delete --user-id={USER_ID} --field-id={FIELD_ID} --yes`
43
+ Then STDOUT should contain:
44
+ """
45
+ XProfile data removed
46
+ """
47
+
48
+ When I run `wp bp xprofile data get --user-id={USER_ID} --field-id={FIELD_ID}`
49
+ Then STDOUT should not contain:
50
+ """
51
+ foo
52
+ """
cli/features/xprofile-field.feature ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress XProfile Fields
2
+
3
+ Scenario: XProfile Field CRUD Operations
4
+ Given a BP install
5
+
6
+ When I run `wp bp xprofile group create --name="Group Name" --description="Group Description" --porcelain`
7
+ Then STDOUT should be a number
8
+ And save STDOUT as {GROUP_ID}
9
+
10
+ When I run `wp bp xprofile field create --type=checkbox --field-group-id={GROUP_ID} --name="Field Name" --porcelain`
11
+ Then STDOUT should be a number
12
+ And save STDOUT as {FIELD_ID}
13
+
14
+ When I run `wp bp xprofile field get {FIELD_ID}`
15
+ Then STDOUT should be a table containing rows:
16
+ | Field | Value |
17
+ | id | {FIELD_ID} |
18
+ | group_id | {GROUP_ID} |
19
+ | name | Field Name |
20
+ | type | checkbox |
21
+
22
+ When I run `wp bp xprofile field delete {FIELD_ID} --yes`
23
+ Then STDOUT should contain:
24
+ """
25
+ Deleted XProfile field
26
+ """
27
+
28
+ When I try `wp bp xprofile field delete {FIELD_ID} --yes`
29
+ Then the return code should be 1
cli/features/xprofile-group.feature ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Feature: Manage BuddyPress XProfile Groups
2
+
3
+ Scenario: XProfile Group CRUD operations
4
+ Given a BP install
5
+
6
+ When I run `wp bp xprofile group create --name="Group Name" --description="Group Description" --porcelain`
7
+ Then STDOUT should be a number
8
+ And save STDOUT as {GROUP_ID}
9
+
10
+ When I run `wp bp xprofile group get {GROUP_ID}`
11
+ Then STDOUT should be a table containing rows:
12
+ | Field | Value |
13
+ | id | {GROUP_ID} |
14
+ | name | Group Name |
15
+ | description | Group Description |
16
+ | can_delete | 1 |
17
+ | group_order | 0 |
18
+
19
+ When I run `wp bp xprofile group delete {GROUP_ID} --yes`
20
+ Then STDOUT should contain:
21
+ """
22
+ Field group deleted.
23
+ """
24
+
25
+ When I try `wp bp xprofile group get {GROUP_ID}`
26
+ Then the return code should be 1
cli/license.txt ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 2, June 1991
3
+
4
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
5
+ 675 Mass Ave, Cambridge, MA 02139, USA
6
+ Everyone is permitted to copy and distribute verbatim copies
7
+ of this license document, but changing it is not allowed.
8
+
9
+ Preamble
10
+
11
+ The licenses for most software are designed to take away your
12
+ freedom to share and change it. By contrast, the GNU General Public
13
+ License is intended to guarantee your freedom to share and change free
14
+ software--to make sure the software is free for all its users. This
15
+ General Public License applies to most of the Free Software
16
+ Foundation's software and to any other program whose authors commit to
17
+ using it. (Some other Free Software Foundation software is covered by
18
+ the GNU Library General Public License instead.) You can apply it to
19
+ your programs, too.
20
+
21
+ When we speak of free software, we are referring to freedom, not
22
+ price. Our General Public Licenses are designed to make sure that you
23
+ have the freedom to distribute copies of free software (and charge for
24
+ this service if you wish), that you receive source code or can get it
25
+ if you want it, that you can change the software or use pieces of it
26
+ in new free programs; and that you know you can do these things.
27
+
28
+ To protect your rights, we need to make restrictions that forbid
29
+ anyone to deny you these rights or to ask you to surrender the rights.
30
+ These restrictions translate to certain responsibilities for you if you
31
+ distribute copies of the software, or if you modify it.
32
+
33
+ For example, if you distribute copies of such a program, whether
34
+ gratis or for a fee, you must give the recipients all the rights that
35
+ you have. You must make sure that they, too, receive or can get the
36
+ source code. And you must show them these terms so they know their
37
+ rights.
38
+
39
+ We protect your rights with two steps: (1) copyright the software, and
40
+ (2) offer you this license which gives you legal permission to copy,
41
+ distribute and/or modify the software.
42
+
43
+ Also, for each author's protection and ours, we want to make certain
44
+ that everyone understands that there is no warranty for this free
45
+ software. If the software is modified by someone else and passed on, we
46
+ want its recipients to know that what they have is not the original, so
47
+ that any problems introduced by others will not reflect on the original
48
+ authors' reputations.
49
+
50
+ Finally, any free program is threatened constantly by software
51
+ patents. We wish to avoid the danger that redistributors of a free
52
+ program will individually obtain patent licenses, in effect making the
53
+ program proprietary. To prevent this, we have made it clear that any
54
+ patent must be licensed for everyone's free use or not licensed at all.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ GNU GENERAL PUBLIC LICENSE
60
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
61
+
62
+ 0. This License applies to any program or other work which contains
63
+ a notice placed by the copyright holder saying it may be distributed
64
+ under the terms of this General Public License. The "Program", below,
65
+ refers to any such program or work, and a "work based on the Program"
66
+ means either the Program or any derivative work under copyright law:
67
+ that is to say, a work containing the Program or a portion of it,
68
+ either verbatim or with modifications and/or translated into another
69
+ language. (Hereinafter, translation is included without limitation in
70
+ the term "modification".) Each licensee is addressed as "you".
71
+
72
+ Activities other than copying, distribution and modification are not
73
+ covered by this License; they are outside its scope. The act of
74
+ running the Program is not restricted, and the output from the Program
75
+ is covered only if its contents constitute a work based on the
76
+ Program (independent of having been made by running the Program).
77
+ Whether that is true depends on what the Program does.
78
+
79
+ 1. You may copy and distribute verbatim copies of the Program's
80
+ source code as you receive it, in any medium, provided that you
81
+ conspicuously and appropriately publish on each copy an appropriate
82
+ copyright notice and disclaimer of warranty; keep intact all the
83
+ notices that refer to this License and to the absence of any warranty;
84
+ and give any other recipients of the Program a copy of this License
85
+ along with the Program.
86
+
87
+ You may charge a fee for the physical act of transferring a copy, and
88
+ you may at your option offer warranty protection in exchange for a fee.
89
+
90
+ 2. You may modify your copy or copies of the Program or any portion
91
+ of it, thus forming a work based on the Program, and copy and
92
+ distribute such modifications or work under the terms of Section 1
93
+ above, provided that you also meet all of these conditions:
94
+
95
+ a) You must cause the modified files to carry prominent notices
96
+ stating that you changed the files and the date of any change.
97
+
98
+ b) You must cause any work that you distribute or publish, that in
99
+ whole or in part contains or is derived from the Program or any
100
+ part thereof, to be licensed as a whole at no charge to all third
101
+ parties under the terms of this License.
102
+
103
+ c) If the modified program normally reads commands interactively
104
+ when run, you must cause it, when started running for such
105
+ interactive use in the most ordinary way, to print or display an
106
+ announcement including an appropriate copyright notice and a
107
+ notice that there is no warranty (or else, saying that you provide
108
+ a warranty) and that users may redistribute the program under
109
+ these conditions, and telling the user how to view a copy of this
110
+ License. (Exception: if the Program itself is interactive but
111
+ does not normally print such an announcement, your work based on
112
+ the Program is not required to print an announcement.)
113
+
114
+ These requirements apply to the modified work as a whole. If
115
+ identifiable sections of that work are not derived from the Program,
116
+ and can be reasonably considered independent and separate works in
117
+ themselves, then this License, and its terms, do not apply to those
118
+ sections when you distribute them as separate works. But when you
119
+ distribute the same sections as part of a whole which is a work based
120
+ on the Program, the distribution of the whole must be on the terms of
121
+ this License, whose permissions for other licensees extend to the
122
+ entire whole, and thus to each and every part regardless of who wrote it.
123
+ Thus, it is not the intent of this section to claim rights or contest
124
+ your rights to work written entirely by you; rather, the intent is to
125
+ exercise the right to control the distribution of derivative or
126
+ collective works based on the Program.
127
+
128
+ In addition, mere aggregation of another work not based on the Program
129
+ with the Program (or with a work based on the Program) on a volume of
130
+ a storage or distribution medium does not bring the other work under
131
+ the scope of this License.
132
+
133
+ 3. You may copy and distribute the Program (or a work based on it,
134
+ under Section 2) in object code or executable form under the terms of
135
+ Sections 1 and 2 above provided that you also do one of the following:
136
+
137
+ a) Accompany it with the complete corresponding machine-readable
138
+ source code, which must be distributed under the terms of Sections
139
+ 1 and 2 above on a medium customarily used for software interchange; or,
140
+
141
+ b) Accompany it with a written offer, valid for at least three
142
+ years, to give any third party, for a charge no more than your
143
+ cost of physically performing source distribution, a complete
144
+ machine-readable copy of the corresponding source code, to be
145
+ distributed under the terms of Sections 1 and 2 above on a medium
146
+ customarily used for software interchange; or,
147
+
148
+ c) Accompany it with the information you received as to the offer
149
+ to distribute corresponding source code. (This alternative is
150
+ allowed only for noncommercial distribution and only if you
151
+ received the program in object code or executable form with such
152
+ an offer, in accord with Subsection b above.)
153
+
154
+ The source code for a work means the preferred form of the work for
155
+ making modifications to it. For an executable work, complete source
156
+ code means all the source code for all modules it contains, plus any
157
+ associated interface definition files, plus the scripts used to
158
+ control compilation and installation of the executable. However, as a
159
+ special exception, the source code distributed need not include
160
+ anything that is normally distributed (in either source or binary
161
+ form) with the major components (compiler, kernel, and so on) of the
162
+ operating system on which the executable runs, unless that component
163
+ itself accompanies the executable.
164
+
165
+ If distribution of executable or object code is made by offering
166
+ access to copy from a designated place, then offering equivalent
167
+ access to copy the source code from the same place counts as
168
+ distribution of the source code, even though third parties are not
169
+ compelled to copy the source along with the object code.
170
+
171
+ 4. You may not copy, modify, sublicense, or distribute the Program
172
+ except as expressly provided under this License. Any attempt
173
+ otherwise to copy, modify, sublicense or distribute the Program is
174
+ void, and will automatically terminate your rights under this License.
175
+ However, parties who have received copies, or rights, from you under
176
+ this License will not have their licenses terminated so long as such
177
+ parties remain in full compliance.
178
+
179
+ 5. You are not required to accept this License, since you have not
180
+ signed it. However, nothing else grants you permission to modify or
181
+ distribute the Program or its derivative works. These actions are
182
+ prohibited by law if you do not accept this License. Therefore, by
183
+ modifying or distributing the Program (or any work based on the
184
+ Program), you indicate your acceptance of this License to do so, and
185
+ all its terms and conditions for copying, distributing or modifying
186
+ the Program or works based on it.
187
+
188
+ 6. Each time you redistribute the Program (or any work based on the
189
+ Program), the recipient automatically receives a license from the
190
+ original licensor to copy, distribute or modify the Program subject to
191
+ these terms and conditions. You may not impose any further
192
+ restrictions on the recipients' exercise of the rights granted herein.
193
+ You are not responsible for enforcing compliance by third parties to
194
+ this License.
195
+
196
+ 7. If, as a consequence of a court judgment or allegation of patent
197
+ infringement or for any other reason (not limited to patent issues),
198
+ conditions are imposed on you (whether by court order, agreement or
199
+ otherwise) that contradict the conditions of this License, they do not
200
+ excuse you from the conditions of this License. If you cannot
201
+ distribute so as to satisfy simultaneously your obligations under this
202
+ License and any other pertinent obligations, then as a consequence you
203
+ may not distribute the Program at all. For example, if a patent
204
+ license would not permit royalty-free redistribution of the Program by
205
+ all those who receive copies directly or indirectly through you, then
206
+ the only way you could satisfy both it and this License would be to
207
+ refrain entirely from distribution of the Program.
208
+
209
+ If any portion of this section is held invalid or unenforceable under
210
+ any particular circumstance, the balance of the section is intended to
211
+ apply and the section as a whole is intended to apply in other
212
+ circumstances.
213
+
214
+ It is not the purpose of this section to induce you to infringe any
215
+ patents or other property right claims or to contest validity of any
216
+ such claims; this section has the sole purpose of protecting the
217
+ integrity of the free software distribution system, which is
218
+ implemented by public license practices. Many people have made
219
+ generous contributions to the wide range of software distributed
220
+ through that system in reliance on consistent application of that
221
+ system; it is up to the author/donor to decide if he or she is willing
222
+ to distribute software through any other system and a licensee cannot
223
+ impose that choice.
224
+
225
+ This section is intended to make thoroughly clear what is believed to
226
+ be a consequence of the rest of this License.
227
+
228
+ 8. If the distribution and/or use of the Program is restricted in
229
+ certain countries either by patents or by copyrighted interfaces, the
230
+ original copyright holder who places the Program under this License
231
+ may add an explicit geographical distribution limitation excluding
232
+ those countries, so that distribution is permitted only in or among
233
+ countries not thus excluded. In such case, this License incorporates
234
+ the limitation as if written in the body of this License.
235
+
236
+ 9. The Free Software Foundation may publish revised and/or new versions
237
+ of the General Public License from time to time. Such new versions will
238
+ be similar in spirit to the present version, but may differ in detail to
239
+ address new problems or concerns.
240
+
241
+ Each version is given a distinguishing version number. If the Program
242
+ specifies a version number of this License which applies to it and "any
243
+ later version", you have the option of following the terms and conditions
244
+ either of that version or of any later version published by the Free
245
+ Software Foundation. If the Program does not specify a version number of
246
+ this License, you may choose any version ever published by the Free Software
247
+ Foundation.
248
+
249
+ 10. If you wish to incorporate parts of the Program into other free
250
+ programs whose distribution conditions are different, write to the author
251
+ to ask for permission. For software which is copyrighted by the Free
252
+ Software Foundation, write to the Free Software Foundation; we sometimes
253
+ make exceptions for this. Our decision will be guided by the two goals
254
+ of preserving the free status of all derivatives of our free software and
255
+ of promoting the sharing and reuse of software generally.
256
+
257
+ NO WARRANTY
258
+
259
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
260
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
261
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
262
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
263
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
264
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
265
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
266
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
267
+ REPAIR OR CORRECTION.
268
+
269
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
270
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
271
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
272
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
273
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
274
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
275
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
276
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
277
+ POSSIBILITY OF SUCH DAMAGES.
278
+
279
+ END OF TERMS AND CONDITIONS
280
+
cli/readme.md ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # buddypress/wp-cli-buddypress
2
+
3
+ WP-CLI commands for use with BuddyPress.
4
+
5
+ [![Build Status](https://travis-ci.org/buddypress/wp-cli-buddypress.svg?branch=master)](https://travis-ci.org/buddypress/wp-cli-buddypress)
6
+
7
+ These commands may be in flux, as we work toward a potential merge into BuddyPress. See https://buddypress.trac.wordpress.org/ticket/7604.
8
+
9
+ Please use and provide feedback!
10
+
11
+ ## System Requirements
12
+
13
+ * PHP >= 5.3
14
+ * wp-cli >= 0.23.0
15
+ * BuddyPress trunk (development version).
16
+
17
+ ## Setup
18
+
19
+ * Install [wp-cli](https://wp-cli.org)
20
+ * Install wp-cli-buddypress. Manuall installation is recommended, though Composer installation should work too. See https://wp-cli.org/package-index/ for information.
21
+ * Inside of a WP installation, type `wp bp`. You should see a list of available commands.
22
+
23
+ ## Changelog
24
+
25
+ ### 1.6.0
26
+
27
+ * `bp email` commands introduced
28
+ * With PSR-4 support for the classes
29
+
30
+ ### 1.5.0
31
+
32
+ * CRUD commands introduced to the main BuddyPress components
33
+ * Behat tests added for all commands
34
+ * Codebase fixed for WPCS
35
+
36
+ ### 1.4.0
37
+
38
+ * New commands: `bp xprofile list_fields`, `bp xprofile delete_field`
39
+ * Added the ability to pass multiple comma-separated values when updating xprofile fields
40
+ * Fixed bug in component activation
41
+
42
+ ### 1.3.1
43
+
44
+ * Improved logic for user-id parsing
45
+
46
+ ### 1.3.0
47
+
48
+ * New commands: `bp group get_members`, `bp group update`
49
+ * Ability to pass 'content' when using `bp activity generate`
50
+ * When using `bp activity generate` with type=activity_update and component=groups, format the activity action properly
51
+
52
+ ### 1.2.0
53
+
54
+ * Use wp-cli's new fourth-level commands
55
+ * New commands: xprofile create_group, xprofile create_field, xprofile set_data
56
+
57
+ ### 1.1.1
58
+
59
+ * Ensure that components have their install routine run after activation
60
+
61
+ ### 1.1
62
+
63
+ * New commands: activate, deactivate, activity_create, activity_generate
64
+ * Improved documentation
65
+ * Added support for installation via Composer
66
+
67
+ ### 1.0
68
+
69
+ * Initial release
cli/utils/behat-tags.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Generate a list of tags to skip during the test run.
4
+ *
5
+ * Require a minimum version of WordPress:
6
+ *
7
+ * @require-wp-4.0
8
+ * Scenario: Core translation CRUD
9
+ *
10
+ * Then use in bash script:
11
+ *
12
+ * BEHAT_TAGS=$(php behat-tags.php)
13
+ * vendor/bin/behat --format progress $BEHAT_TAGS
14
+ */
15
+
16
+ function version_tags( $prefix, $current, $operator = '<' ) {
17
+ if ( ! $current )
18
+ return array();
19
+
20
+ exec( "grep '@{$prefix}-[0-9\.]*' -h -o features/*.feature | uniq", $existing_tags );
21
+
22
+ $skip_tags = array();
23
+
24
+ foreach ( $existing_tags as $tag ) {
25
+ $compare = str_replace( "@{$prefix}-", '', $tag );
26
+ if ( version_compare( $current, $compare, $operator ) ) {
27
+ $skip_tags[] = $tag;
28
+ }
29
+ }
30
+
31
+ return $skip_tags;
32
+ }
33
+
34
+ $wp_version_reqs = array();
35
+ // Only apply @require-wp tags when WP_VERSION isn't 'latest' or 'nightly'
36
+ // 'latest' and 'nightly' are expected to work with all features
37
+ if ( ! in_array( getenv( 'WP_VERSION' ), array( 'latest', 'nightly', 'trunk' ), true ) ) {
38
+ $wp_version_reqs = version_tags( 'require-wp', getenv( 'WP_VERSION' ), '<' );
39
+ }
40
+
41
+ $skip_tags = array_merge(
42
+ $wp_version_reqs,
43
+ version_tags( 'require-php', PHP_VERSION, '<' ),
44
+ version_tags( 'less-than-php', PHP_VERSION, '>' )
45
+ );
46
+
47
+ # Skip Github API tests by default because of rate limiting. See https://github.com/wp-cli/wp-cli/issues/1612
48
+ $skip_tags[] = '@github-api';
49
+
50
+ # Skip tests known to be broken.
51
+ $skip_tags[] = '@broken';
52
+
53
+ # Require PHP extension, eg 'imagick'.
54
+ function extension_tags() {
55
+ $extension_tags = array();
56
+ exec( "grep '@require-extension-[A-Za-z_]*' -h -o features/*.feature | uniq", $extension_tags );
57
+
58
+ $skip_tags = array();
59
+
60
+ $substr_start = strlen( '@require-extension-' );
61
+ foreach ( $extension_tags as $tag ) {
62
+ $extension = substr( $tag, $substr_start );
63
+ if ( ! extension_loaded( $extension ) ) {
64
+ $skip_tags[] = $tag;
65
+ }
66
+ }
67
+
68
+ return $skip_tags;
69
+ }
70
+
71
+ $skip_tags = array_merge( $skip_tags, extension_tags() );
72
+
73
+ if ( !empty( $skip_tags ) ) {
74
+ echo '--tags=~' . implode( '&&~', $skip_tags );
75
+ }
76
+
cli/wp-cli-bp.php ADDED
@@ -0,0 +1,190 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Buddypress\CLI;
3
+
4
+ use WP_CLI;
5
+
6
+ // Bail if WP-CLI is not present.
7
+ if ( ! defined( '\WP_CLI' ) ) {
8
+ return;
9
+ }
10
+
11
+ WP_CLI::add_hook( 'before_wp_load', function() {
12
+ require_once( __DIR__ . '/component.php' );
13
+ require_once( __DIR__ . '/components/signup.php' );
14
+ require_once( __DIR__ . '/components/activity.php' );
15
+ require_once( __DIR__ . '/components/activity-favorite.php' );
16
+ require_once( __DIR__ . '/components/component.php' );
17
+ require_once( __DIR__ . '/components/group.php' );
18
+ require_once( __DIR__ . '/components/group-member.php' );
19
+ require_once( __DIR__ . '/components/group-invite.php' );
20
+ require_once( __DIR__ . '/components/member.php' );
21
+ require_once( __DIR__ . '/components/friend.php' );
22
+ require_once( __DIR__ . '/components/xprofile-group.php' );
23
+ require_once( __DIR__ . '/components/xprofile-field.php' );
24
+ require_once( __DIR__ . '/components/xprofile-data.php' );
25
+ require_once( __DIR__ . '/components/tool.php' );
26
+ require_once( __DIR__ . '/components/message.php' );
27
+ require_once( __DIR__ . '/components/email.php' );
28
+
29
+ WP_CLI::add_command( 'bp signup', __NAMESPACE__ . '\\Command\\Signup', array(
30
+ 'before_invoke' => function() {
31
+ if ( ! class_exists( 'Buddypress' ) ) {
32
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
33
+ }
34
+ },
35
+ ) );
36
+
37
+ WP_CLI::add_command( 'bp email', __NAMESPACE__ . '\\Command\\Email', array(
38
+ 'before_invoke' => function() {
39
+ if ( ! class_exists( 'Buddypress' ) ) {
40
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
41
+ }
42
+ },
43
+ ) );
44
+
45
+ WP_CLI::add_command( 'bp activity', __NAMESPACE__ . '\\Command\\Activity', array(
46
+ 'before_invoke' => function() {
47
+ if ( ! class_exists( 'Buddypress' ) ) {
48
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
49
+ }
50
+
51
+ if ( ! bp_is_active( 'activity' ) ) {
52
+ WP_CLI::error( 'The Activity component is not active.' );
53
+ }
54
+ },
55
+ ) );
56
+
57
+ WP_CLI::add_command( 'bp activity favorite', __NAMESPACE__ . '\\Command\\Activity_Favorite', array(
58
+ 'before_invoke' => function() {
59
+ if ( ! class_exists( 'Buddypress' ) ) {
60
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
61
+ }
62
+
63
+ if ( ! bp_is_active( 'activity' ) ) {
64
+ WP_CLI::error( 'The Activity component is not active.' );
65
+ }
66
+ },
67
+ ) );
68
+
69
+ WP_CLI::add_command( 'bp component', __NAMESPACE__ . '\\Command\\Components', array(
70
+ 'before_invoke' => function() {
71
+ if ( ! class_exists( 'Buddypress' ) ) {
72
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
73
+ }
74
+ },
75
+ ) );
76
+
77
+ WP_CLI::add_command( 'bp group', __NAMESPACE__ . '\\Command\\Group', array(
78
+ 'before_invoke' => function() {
79
+ if ( ! class_exists( 'Buddypress' ) ) {
80
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
81
+ }
82
+
83
+ if ( ! bp_is_active( 'groups' ) ) {
84
+ WP_CLI::error( 'The Groups component is not active.' );
85
+ }
86
+ },
87
+ ) );
88
+
89
+ WP_CLI::add_command( 'bp group member', __NAMESPACE__ . '\\Command\\Group_Member', array(
90
+ 'before_invoke' => function() {
91
+ if ( ! class_exists( 'Buddypress' ) ) {
92
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
93
+ }
94
+
95
+ if ( ! bp_is_active( 'groups' ) ) {
96
+ WP_CLI::error( 'The Groups component is not active.' );
97
+ }
98
+ },
99
+ ) );
100
+
101
+ WP_CLI::add_command( 'bp group invite', __NAMESPACE__ . '\\Command\\Group_Invite', array(
102
+ 'before_invoke' => function() {
103
+ if ( ! class_exists( 'Buddypress' ) ) {
104
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
105
+ }
106
+
107
+ if ( ! bp_is_active( 'groups' ) ) {
108
+ WP_CLI::error( 'The Groups component is not active.' );
109
+ }
110
+ },
111
+ ) );
112
+
113
+ WP_CLI::add_command( 'bp member', __NAMESPACE__ . '\\Command\\Member', array(
114
+ 'before_invoke' => function() {
115
+ if ( ! class_exists( 'Buddypress' ) ) {
116
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
117
+ }
118
+ },
119
+ ) );
120
+
121
+ WP_CLI::add_command( 'bp friend', __NAMESPACE__ . '\\Command\\Friend', array(
122
+ 'before_invoke' => function() {
123
+ if ( ! class_exists( 'Buddypress' ) ) {
124
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
125
+ }
126
+
127
+ if ( ! bp_is_active( 'friends' ) ) {
128
+ WP_CLI::error( 'The Friends component is not active.' );
129
+ }
130
+ },
131
+ ) );
132
+
133
+ WP_CLI::add_command( 'bp xprofile group', __NAMESPACE__ . '\\Command\\XProfile_Group', array(
134
+ 'before_invoke' => function() {
135
+ if ( ! class_exists( 'Buddypress' ) ) {
136
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
137
+ }
138
+
139
+ if ( ! bp_is_active( 'xprofile' ) ) {
140
+ WP_CLI::error( 'The XProfile component is not active.' );
141
+ }
142
+ },
143
+ ) );
144
+
145
+ WP_CLI::add_command( 'bp xprofile field', __NAMESPACE__ . '\\Command\\XProfile_Field', array(
146
+ 'before_invoke' => function() {
147
+ if ( ! class_exists( 'Buddypress' ) ) {
148
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
149
+ }
150
+
151
+ if ( ! bp_is_active( 'xprofile' ) ) {
152
+ WP_CLI::error( 'The XProfile component is not active.' );
153
+ }
154
+ },
155
+ ) );
156
+
157
+ WP_CLI::add_command( 'bp xprofile data', __NAMESPACE__ . '\\Command\\XProfile_Data', array(
158
+ 'before_invoke' => function() {
159
+ if ( ! class_exists( 'Buddypress' ) ) {
160
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
161
+ }
162
+
163
+ if ( ! bp_is_active( 'xprofile' ) ) {
164
+ WP_CLI::error( 'The XProfile component is not active.' );
165
+ }
166
+ },
167
+ ) );
168
+
169
+ WP_CLI::add_command( 'bp tool', __NAMESPACE__ . '\\Command\\Tool', array(
170
+ 'before_invoke' => function() {
171
+ if ( ! class_exists( 'Buddypress' ) ) {
172
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
173
+ }
174
+
175
+ require_once( buddypress()->plugin_dir . 'bp-core/admin/bp-core-admin-tools.php' );
176
+ },
177
+ ) );
178
+
179
+ WP_CLI::add_command( 'bp message', __NAMESPACE__ . '\\Command\\Message', array(
180
+ 'before_invoke' => function() {
181
+ if ( ! class_exists( 'Buddypress' ) ) {
182
+ WP_CLI::error( 'The BuddyPress plugin is not active.' );
183
+ }
184
+
185
+ if ( ! bp_is_active( 'messages' ) ) {
186
+ WP_CLI::error( 'The Message component is not active.' );
187
+ }
188
+ },
189
+ ) );
190
+ } );
cli/wp-cli.yml ADDED
@@ -0,0 +1,2 @@
 
 
1
+ require:
2
+ - wp-cli-bp.php