Completed
Push — master ( d69721...8d1412 )
by
unknown
53s
created
redux-core/inc/classes/class-redux-options-constructor.php 2 patches
Spacing   +78 added lines, -78 removed lines patch added patch discarded remove patch
@@ -76,8 +76,8 @@  discard block
 block discarded – undo
76 76
 			foreach ( $sections as $key => $section ) {
77 77
 				if ( 'fields' === $key ) {
78 78
 					foreach ( $section as $field ) {
79
-						if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[ $field['id'] ] ) && Redux_Helpers::is_integer( $options_values[ $field['id'] ] ) ) {
80
-							$options_values[ $field['id'] ] = apply_filters( 'wpml_object_id', $options_values[ $field['id'] ], $field['data'], true );
79
+						if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[$field['id']] ) && Redux_Helpers::is_integer( $options_values[$field['id']] ) ) {
80
+							$options_values[$field['id']] = apply_filters( 'wpml_object_id', $options_values[$field['id']], $field['data'], true );
81 81
 						}
82 82
 					}
83 83
 				} elseif ( is_array( $section ) && ! empty( $section ) ) {
@@ -188,10 +188,10 @@  discard block
 block discarded – undo
188 188
 				// Store the changed values in the transient.
189 189
 				if ( $value !== $core->options ) {
190 190
 					foreach ( $value as $k => $v ) {
191
-						if ( ! isset( $core->options[ $k ] ) ) {
192
-							$core->options[ $k ] = '';
193
-						} elseif ( $v === $core->options[ $k ] ) {
194
-							unset( $core->options[ $k ] );
191
+						if ( ! isset( $core->options[$k] ) ) {
192
+							$core->options[$k] = '';
193
+						} elseif ( $v === $core->options[$k] ) {
194
+							unset( $core->options[$k] );
195 195
 						}
196 196
 					}
197 197
 
@@ -227,7 +227,7 @@  discard block
 block discarded – undo
227 227
 				 */
228 228
 
229 229
 				// phpcs:ignore WordPress.NamingConventions.ValidHookName
230
-				$GLOBALS[ $options_global ] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options );
230
+				$GLOBALS[$options_global] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options );
231 231
 			}
232 232
 		}
233 233
 
@@ -291,7 +291,7 @@  discard block
 block discarded – undo
291 291
 				}
292 292
 
293 293
 				if ( empty( $section ) ) {
294
-					unset( $core->sections[ $k ] );
294
+					unset( $core->sections[$k] );
295 295
 					continue;
296 296
 				}
297 297
 
@@ -301,7 +301,7 @@  discard block
 block discarded – undo
301 301
 
302 302
 				if ( isset( $section['customizer_only'] ) && true === $section['customizer_only'] ) {
303 303
 					$section['panel']     = false;
304
-					$core->sections[ $k ] = $section;
304
+					$core->sections[$k] = $section;
305 305
 				}
306 306
 
307 307
 				$heading = $section['heading'] ?? $section['title'];
@@ -315,10 +315,10 @@  discard block
 block discarded – undo
315 315
 
316 316
 							if ( ! in_array( $field_type, array( 'section', 'divide', 'info', 'raw' ), true ) ) {
317 317
 								$field_id = $field_data['id'];
318
-								$default  = $core->options_defaults[ $field_id ] ?? '';
319
-								$data     = $core->options[ $field_id ] ?? $default;
318
+								$default  = $core->options_defaults[$field_id] ?? '';
319
+								$data     = $core->options[$field_id] ?? $default;
320 320
 
321
-								$this->hidden_perm_fields[ $field_id ] = $data;
321
+								$this->hidden_perm_fields[$field_id] = $data;
322 322
 							}
323 323
 						}
324 324
 
@@ -327,7 +327,7 @@  discard block
 block discarded – undo
327 327
 				}
328 328
 
329 329
 				if ( ! $display || ! function_exists( 'add_settings_section' ) ) {
330
-					$this->no_panel_section[ $k ] = $section;
330
+					$this->no_panel_section[$k] = $section;
331 331
 				} else {
332 332
 					add_settings_section(
333 333
 						$core->args['opt_name'] . $k . '_section',
@@ -351,11 +351,11 @@  discard block
 block discarded – undo
351 351
 							$field['type']                             = 'raw';
352 352
 							$field['content']                          = $field['desc'];
353 353
 							$field['desc']                             = '';
354
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
354
+							$core->sections[$k]['fields'][$fieldk] = $field;
355 355
 						} elseif ( 'info' === $field['type'] ) {
356 356
 							if ( ! isset( $field['full_width'] ) ) {
357 357
 								$field['full_width']                       = true;
358
-								$core->sections[ $k ]['fields'][ $fieldk ] = $field;
358
+								$core->sections[$k]['fields'][$fieldk] = $field;
359 359
 							}
360 360
 						}
361 361
 
@@ -366,7 +366,7 @@  discard block
 block discarded – undo
366 366
 							} elseif ( ! isset( $field['full_width'] ) ) {
367 367
 								$field['full_width'] = true;
368 368
 							}
369
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
369
+							$core->sections[$k]['fields'][$fieldk] = $field;
370 370
 						}
371 371
 
372 372
 						/**
@@ -378,9 +378,9 @@  discard block
 block discarded – undo
378 378
 						// phpcs:ignore WordPress.NamingConventions.ValidHookName
379 379
 						$field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}/register", $field );
380 380
 
381
-						$core->field_types[ $field['type'] ] = $core->field_types[ $field['type'] ] ?? array();
381
+						$core->field_types[$field['type']] = $core->field_types[$field['type']] ?? array();
382 382
 
383
-						$core->field_sections[ $field['type'] ][ $field['id'] ] = $k;
383
+						$core->field_sections[$field['type']][$field['id']] = $k;
384 384
 
385 385
 						$display = true;
386 386
 
@@ -395,14 +395,14 @@  discard block
 block discarded – undo
395 395
 
396 396
 						if ( isset( $section['customizer'] ) ) {
397 397
 							$field['customizer']                       = $section['customizer'];
398
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
398
+							$core->sections[$k]['fields'][$fieldk] = $field;
399 399
 						}
400 400
 
401 401
 						if ( isset( $field['permissions'] ) && false !== $field['permissions'] ) {
402 402
 							if ( ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
403
-								$data = $core->options[ $field['id'] ] ?? $core->options_defaults[ $field['id'] ];
403
+								$data = $core->options[$field['id']] ?? $core->options_defaults[$field['id']];
404 404
 
405
-								$this->hidden_perm_fields[ $field['id'] ] = $data;
405
+								$this->hidden_perm_fields[$field['id']] = $data;
406 406
 
407 407
 								continue;
408 408
 							}
@@ -436,79 +436,79 @@  discard block
 block discarded – undo
436 436
 						$field['name'] = $core->args['opt_name'] . '[' . $field['id'] . ']';
437 437
 
438 438
 						// Set the default value if present.
439
-						$core->options_defaults[ $field['id'] ] = $core->options_defaults[ $field['id'] ] ?? '';
439
+						$core->options_defaults[$field['id']] = $core->options_defaults[$field['id']] ?? '';
440 440
 
441 441
 						// Set the defaults to the value if not present.
442 442
 						$do_update = false;
443 443
 
444 444
 						// Check fields for values in the default parameter.
445
-						if ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['default'] ) ) {
446
-							$core->options_defaults[ $field['id'] ] = $field['default'];
447
-							$core->options[ $field['id'] ]          = $field['default'];
445
+						if ( ! isset( $core->options[$field['id']] ) && isset( $field['default'] ) ) {
446
+							$core->options_defaults[$field['id']] = $field['default'];
447
+							$core->options[$field['id']]          = $field['default'];
448 448
 							$do_update                              = true;
449 449
 
450 450
 							// Check fields that hae no default value, but an option value with settings to
451 451
 							// be saved by default.
452
-						} elseif ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['options'] ) ) {
452
+						} elseif ( ! isset( $core->options[$field['id']] ) && isset( $field['options'] ) ) {
453 453
 
454 454
 							// If a sorter field, check for options and save them as defaults.
455 455
 							if ( 'sorter' === $field['type'] || 'sortable' === $field['type'] ) {
456
-								$core->options_defaults[ $field['id'] ] = $field['options'];
457
-								$core->options[ $field['id'] ]          = $field['options'];
456
+								$core->options_defaults[$field['id']] = $field['options'];
457
+								$core->options[$field['id']]          = $field['options'];
458 458
 								$do_update                              = true;
459 459
 							}
460 460
 						}
461 461
 
462 462
 						// CORRECT URLS if media URLs are wrong, but attachment IDs are present.
463 463
 						if ( 'media' === $field['type'] ) {
464
-							if ( isset( $core->options[ $field['id'] ]['id'] ) && isset( $core->options[ $field['id'] ]['url'] ) && ! empty( $core->options[ $field['id'] ]['url'] ) && strpos( $core->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
465
-								$data = wp_get_attachment_url( $core->options[ $field['id'] ]['id'] );
464
+							if ( isset( $core->options[$field['id']]['id'] ) && isset( $core->options[$field['id']]['url'] ) && ! empty( $core->options[$field['id']]['url'] ) && strpos( $core->options[$field['id']]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
465
+								$data = wp_get_attachment_url( $core->options[$field['id']]['id'] );
466 466
 
467 467
 								if ( isset( $data ) && ! empty( $data ) ) {
468
-									$core->options[ $field['id'] ]['url'] = $data;
468
+									$core->options[$field['id']]['url'] = $data;
469 469
 
470 470
 									$data = wp_get_attachment_image_src(
471
-										$core->options[ $field['id'] ]['id'],
471
+										$core->options[$field['id']]['id'],
472 472
 										array(
473 473
 											150,
474 474
 											150,
475 475
 										)
476 476
 									);
477 477
 
478
-									$core->options[ $field['id'] ]['thumbnail'] = $data[0];
478
+									$core->options[$field['id']]['thumbnail'] = $data[0];
479 479
 									$do_update                                  = true;
480 480
 								}
481 481
 							}
482 482
 						}
483 483
 
484 484
 						if ( 'background' === $field['type'] ) {
485
-							if ( isset( $core->options[ $field['id'] ]['media']['id'] ) && isset( $core->options[ $field['id'] ]['background-image'] ) && ! empty( $core->options[ $field['id'] ]['background-image'] ) && strpos( $core->options[ $field['id'] ]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
486
-								$data = wp_get_attachment_url( $core->options[ $field['id'] ]['media']['id'] );
485
+							if ( isset( $core->options[$field['id']]['media']['id'] ) && isset( $core->options[$field['id']]['background-image'] ) && ! empty( $core->options[$field['id']]['background-image'] ) && strpos( $core->options[$field['id']]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
486
+								$data = wp_get_attachment_url( $core->options[$field['id']]['media']['id'] );
487 487
 
488 488
 								if ( isset( $data ) && ! empty( $data ) ) {
489
-									$core->options[ $field['id'] ]['background-image'] = $data;
489
+									$core->options[$field['id']]['background-image'] = $data;
490 490
 
491 491
 									$data = wp_get_attachment_image_src(
492
-										$core->options[ $field['id'] ]['media']['id'],
492
+										$core->options[$field['id']]['media']['id'],
493 493
 										array(
494 494
 											150,
495 495
 											150,
496 496
 										)
497 497
 									);
498 498
 
499
-									$core->options[ $field['id'] ]['media']['thumbnail'] = $data[0];
499
+									$core->options[$field['id']]['media']['thumbnail'] = $data[0];
500 500
 									$do_update = true;
501 501
 								}
502 502
 							}
503 503
 						}
504 504
 
505 505
 						if ( 'slides' === $field['type'] ) {
506
-							if ( isset( $core->options[ $field['id'] ] ) && is_array( $core->options[ $field['id'] ] ) && isset( $core->options[ $field['id'] ][0]['attachment_id'] ) && isset( $core->options[ $field['id'] ][0]['image'] ) && ! empty( $core->options[ $field['id'] ][0]['image'] ) && strpos( $core->options[ $field['id'] ][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
507
-								foreach ( $core->options[ $field['id'] ] as $key => $val ) {
506
+							if ( isset( $core->options[$field['id']] ) && is_array( $core->options[$field['id']] ) && isset( $core->options[$field['id']][0]['attachment_id'] ) && isset( $core->options[$field['id']][0]['image'] ) && ! empty( $core->options[$field['id']][0]['image'] ) && strpos( $core->options[$field['id']][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
507
+								foreach ( $core->options[$field['id']] as $key => $val ) {
508 508
 									$data = wp_get_attachment_url( $val['attachment_id'] );
509 509
 
510 510
 									if ( isset( $data ) && ! empty( $data ) ) {
511
-										$core->options[ $field['id'] ][ $key ]['image'] = $data;
511
+										$core->options[$field['id']][$key]['image'] = $data;
512 512
 
513 513
 										$data = wp_get_attachment_image_src(
514 514
 											$val['attachment_id'],
@@ -518,7 +518,7 @@  discard block
 block discarded – undo
518 518
 											)
519 519
 										);
520 520
 
521
-										$core->options[ $field['id'] ][ $key ]['thumb'] = $data[0];
521
+										$core->options[$field['id']][$key]['thumb'] = $data[0];
522 522
 										$do_update                                      = true;
523 523
 									}
524 524
 								}
@@ -545,21 +545,21 @@  discard block
 block discarded – undo
545 545
 						$field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}", $field );
546 546
 
547 547
 						if ( empty( $field ) ) {
548
-							unset( $core->sections[ $k ]['fields'][ $fieldk ] );
548
+							unset( $core->sections[$k]['fields'][$fieldk] );
549 549
 							continue;
550 550
 						}
551 551
 
552
-						if ( ! empty( Redux_Core::$folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default.
552
+						if ( ! empty( Redux_Core::$folds[$field['id']]['parent'] ) ) { // This has some fold items, hide it by default.
553 553
 							$field['class'] .= ' fold';
554 554
 						}
555 555
 
556
-						if ( ! empty( Redux_Core::$folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on.
556
+						if ( ! empty( Redux_Core::$folds[$field['id']]['children'] ) ) { // Sets the values you shoe fold children on.
557 557
 							$field['class'] .= ' fold-parent';
558 558
 						}
559 559
 
560 560
 						if ( ! empty( $field['compiler'] ) ) {
561 561
 							$field['class']                       .= ' compiler';
562
-							$core->compiler_fields[ $field['id'] ] = 1;
562
+							$core->compiler_fields[$field['id']] = 1;
563 563
 						}
564 564
 
565 565
 						if ( isset( $field['unit'] ) && ! isset( $field['units'] ) ) {
@@ -567,11 +567,11 @@  discard block
 block discarded – undo
567 567
 							unset( $field['unit'] );
568 568
 						}
569 569
 
570
-						$core->sections[ $k ]['fields'][ $fieldk ] = $field;
570
+						$core->sections[$k]['fields'][$fieldk] = $field;
571 571
 
572 572
 						if ( isset( $core->args['display_source'] ) ) {
573 573
 							// phpcs:ignore WordPress.PHP.DevelopmentFunctions
574
-							$th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[ $k ]['fields'][ $fieldk ], true ) . '</pre></div>';
574
+							$th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[$k]['fields'][$fieldk], true ) . '</pre></div>';
575 575
 							$th .= '<br /><a href="#TB_inline?width=600&height=800&inlineId=' . $field['id'] . '-settings" class="thickbox"><small>View Source</small></a>';
576 576
 						}
577 577
 
@@ -583,9 +583,9 @@  discard block
 block discarded – undo
583 583
 						do_action( "redux/options/{$core->args['opt_name']}/field/{$field['type']}/register", $field );
584 584
 
585 585
 						$core->required_class->check_dependencies( $field );
586
-						$core->field_head[ $field['id'] ] = $th;
586
+						$core->field_head[$field['id']] = $th;
587 587
 
588
-						if ( ! $display || isset( $this->no_panel_section[ $k ] ) ) {
588
+						if ( ! $display || isset( $this->no_panel_section[$k] ) ) {
589 589
 							$this->no_panel[] = $field['id'];
590 590
 						} else {
591 591
 							if ( isset( $field['disabled'] ) && $field['disabled'] ) {
@@ -718,7 +718,7 @@  discard block
 block discarded – undo
718 718
 			if ( isset( $plugin_options['redux-no_panel'] ) ) {
719 719
 				$keys = explode( '|', $plugin_options['redux-no_panel'] );
720 720
 				foreach ( $keys as $key ) {
721
-					$plugin_options[ $key ] = $core->options[ $key ];
721
+					$plugin_options[$key] = $core->options[$key];
722 722
 				}
723 723
 				if ( isset( $plugin_options['redux-no_panel'] ) ) {
724 724
 					unset( $plugin_options['redux-no_panel'] );
@@ -727,7 +727,7 @@  discard block
 block discarded – undo
727 727
 
728 728
 			if ( is_array( $this->hidden_perm_fields ) && ! empty( $this->hidden_perm_fields ) ) {
729 729
 				foreach ( $this->hidden_perm_fields as $id => $data ) {
730
-					$plugin_options[ $id ] = $data;
730
+					$plugin_options[$id] = $data;
731 731
 				}
732 732
 			}
733 733
 
@@ -755,9 +755,9 @@  discard block
 block discarded – undo
755 755
 			if ( is_array( $imported_options ) && ! empty( $imported_options ) && isset( $imported_options['redux-backup'] ) && ( 1 === $imported_options['redux-backup'] || '1' === $imported_options['redux-backup'] ) ) {
756 756
 				$core->transients['changed_values'] = array();
757 757
 				foreach ( $plugin_options as $key => $value ) {
758
-					if ( isset( $imported_options[ $key ] ) && $value !== $imported_options[ $key ] ) {
759
-						$plugin_options[ $key ]                     = $value;
760
-						$core->transients['changed_values'][ $key ] = $value;
758
+					if ( isset( $imported_options[$key] ) && $value !== $imported_options[$key] ) {
759
+						$plugin_options[$key]                     = $value;
760
+						$core->transients['changed_values'][$key] = $value;
761 761
 					}
762 762
 				}
763 763
 
@@ -778,7 +778,7 @@  discard block
 block discarded – undo
778 778
 				);
779 779
 
780 780
 				setcookie( 'redux_current_tab_' . $core->args['opt_name'], '', 1, '/', $time + 1000, '/' );
781
-				$_COOKIE[ 'redux_current_tab_' . $core->args['opt_name'] ] = 1;
781
+				$_COOKIE['redux_current_tab_' . $core->args['opt_name']] = 1;
782 782
 
783 783
 				unset( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] );
784 784
 				if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded', 'network' ), true ) ) {
@@ -816,8 +816,8 @@  discard block
 block discarded – undo
816 816
 				}
817 817
 
818 818
 				foreach ( $core->options as $key => $value ) {
819
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
820
-						$core->transients['changed_values'][ $key ] = $value;
819
+					if ( isset( $plugin_options[$key] ) && $plugin_options[$key] !== $value ) {
820
+						$core->transients['changed_values'][$key] = $value;
821 821
 					}
822 822
 				}
823 823
 
@@ -831,21 +831,21 @@  discard block
 block discarded – undo
831 831
 
832 832
 			// Section reset to default.
833 833
 			if ( ! empty( $plugin_options['defaults-section'] ) ) {
834
-				if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[ $plugin_options['redux-section'] ]['fields'] ) ) {
834
+				if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[$plugin_options['redux-section']]['fields'] ) ) {
835 835
 					if ( empty( $core->options_defaults ) ) {
836 836
 						$core->options_defaults = $core->_default_values();
837 837
 					}
838 838
 
839
-					foreach ( $core->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) {
839
+					foreach ( $core->sections[$plugin_options['redux-section']]['fields'] as $field ) {
840 840
 						if ( 'tabbed' === $field['type'] ) {
841 841
 							if ( ! empty( $field['tabs'] ) ) {
842 842
 								foreach ( $field['tabs'] as $val ) {
843 843
 									if ( ! empty( $val['fields'] ) ) {
844 844
 										foreach ( $val['fields'] as $f ) {
845
-											if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
846
-												$plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
845
+											if ( isset( $core->options_defaults[$f['id']] ) ) {
846
+												$plugin_options[$f['id']] = $core->options_defaults[$f['id']];
847 847
 											} else {
848
-												$plugin_options[ $f['id'] ] = '';
848
+												$plugin_options[$f['id']] = '';
849 849
 											}
850 850
 										}
851 851
 									}
@@ -854,18 +854,18 @@  discard block
 block discarded – undo
854 854
 						} elseif ( 'repeater' === $field['type'] ) {
855 855
 							if ( ! empty( $field['fields'] ) ) {
856 856
 								foreach ( $field['fields'] as $f ) {
857
-									if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
858
-										$plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
857
+									if ( isset( $core->options_defaults[$f['id']] ) ) {
858
+										$plugin_options[$f['id']] = $core->options_defaults[$f['id']];
859 859
 									} else {
860
-										$plugin_options[ $f['id'] ] = '';
860
+										$plugin_options[$f['id']] = '';
861 861
 									}
862 862
 								}
863 863
 							}
864 864
 						} else {
865
-							if ( isset( $core->options_defaults[ $field['id'] ] ) ) {
866
-								$plugin_options[ $field['id'] ] = $core->options_defaults[ $field['id'] ];
865
+							if ( isset( $core->options_defaults[$field['id']] ) ) {
866
+								$plugin_options[$field['id']] = $core->options_defaults[$field['id']];
867 867
 							} else {
868
-								$plugin_options[ $field['id'] ] = '';
868
+								$plugin_options[$field['id']] = '';
869 869
 							}
870 870
 						}
871 871
 
@@ -887,8 +887,8 @@  discard block
 block discarded – undo
887 887
 				$core->transients['changed_values'] = array();
888 888
 
889 889
 				foreach ( $core->options as $key => $value ) {
890
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
891
-						$core->transients['changed_values'][ $key ] = $value;
890
+					if ( isset( $plugin_options[$key] ) && $plugin_options[$key] !== $value ) {
891
+						$core->transients['changed_values'][$key] = $value;
892 892
 					}
893 893
 				}
894 894
 
@@ -962,8 +962,8 @@  discard block
 block discarded – undo
962 962
 
963 963
 			if ( ! empty( $core->options ) ) {
964 964
 				foreach ( $core->options as $key => $value ) {
965
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
966
-						$core->transients['changed_values'][ $key ] = $value;
965
+					if ( isset( $plugin_options[$key] ) && $plugin_options[$key] !== $value ) {
966
+						$core->transients['changed_values'][$key] = $value;
967 967
 					}
968 968
 				}
969 969
 			}
@@ -1003,7 +1003,7 @@  discard block
 block discarded – undo
1003 1003
 					$this->default_values(); // fill cache.
1004 1004
 				}
1005 1005
 
1006
-				return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $defaults;
1006
+				return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[$opt_name] : $defaults;
1007 1007
 			}
1008 1008
 
1009 1009
 			return '';
@@ -1027,11 +1027,11 @@  discard block
 block discarded – undo
1027 1027
 			$defaults = $this->options_defaults;
1028 1028
 			$value    = '';
1029 1029
 
1030
-			if ( isset( $defaults[ $key ] ) ) {
1031
-				if ( false !== $array_key && isset( $defaults[ $key ][ $array_key ] ) ) {
1032
-					$value = $defaults[ $key ][ $array_key ];
1030
+			if ( isset( $defaults[$key] ) ) {
1031
+				if ( false !== $array_key && isset( $defaults[$key][$array_key] ) ) {
1032
+					$value = $defaults[$key][$array_key];
1033 1033
 				} else {
1034
-					$value = $defaults[ $key ];
1034
+					$value = $defaults[$key];
1035 1035
 				}
1036 1036
 			}
1037 1037
 
Please login to merge, or discard this patch.
Indentation   +1030 added lines, -1030 removed lines patch added patch discarded remove patch
@@ -12,1034 +12,1034 @@
 block discarded – undo
12 12
 
13 13
 if ( ! class_exists( 'Redux_Options_Constructor', false ) ) {
14 14
 
15
-	/**
16
-	 * Class Redux_Options
17
-	 */
18
-	class Redux_Options_Constructor extends Redux_Class {
19
-
20
-		/**
21
-		 * Array to hold single panel data.
22
-		 *
23
-		 * @var array
24
-		 */
25
-		public array $no_panel = array();
26
-
27
-		/**
28
-		 * Array to hold single panel sections.
29
-		 *
30
-		 * @var array
31
-		 */
32
-		private array $no_panel_section = array();
33
-
34
-		/**
35
-		 * Array to hold hidden fields.
36
-		 *
37
-		 * @var array
38
-		 */
39
-		private array $hidden_perm_fields = array();
40
-
41
-		/**
42
-		 * Array to hold hidden sections.
43
-		 *
44
-		 * @var array
45
-		 */
46
-		public array $hidden_perm_sections = array();
47
-
48
-		/**
49
-		 * Array to hold default options.
50
-		 *
51
-		 * @var array
52
-		 */
53
-		private array $options_defaults = array();
54
-
55
-		/**
56
-		 * Redux_Options constructor.
57
-		 *
58
-		 * @param object $redux ReduxFramework pointer.
59
-		 */
60
-		public function __construct( $redux ) {
61
-			parent::__construct( $redux );
62
-
63
-			add_action( 'admin_init', array( $this, 'register' ) );
64
-		}
65
-
66
-		/**
67
-		 * If we switch language in wpml the id of the post/page selected will be in the wrong language
68
-		 * So it won't appear as selected in the list of options and will be lost on next save, this fixes this by translating this id
69
-		 * Bonus it also gives the user the id of the post in the right language when they retrieve it.
70
-		 * The recursion allows for it to work in a repeatable field.
71
-		 *
72
-		 * @param array $sections       Sections array.
73
-		 * @param array $options_values Values array.
74
-		 */
75
-		private function translate_data_field_recursive( array $sections, array &$options_values ) {
76
-			foreach ( $sections as $key => $section ) {
77
-				if ( 'fields' === $key ) {
78
-					foreach ( $section as $field ) {
79
-						if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[ $field['id'] ] ) && Redux_Helpers::is_integer( $options_values[ $field['id'] ] ) ) {
80
-							$options_values[ $field['id'] ] = apply_filters( 'wpml_object_id', $options_values[ $field['id'] ], $field['data'], true );
81
-						}
82
-					}
83
-				} elseif ( is_array( $section ) && ! empty( $section ) ) {
84
-					$this->translate_data_field_recursive( $section, $options_values );
85
-				}
86
-			}
87
-		}
88
-
89
-		/**
90
-		 * Retrieves the options.
91
-		 */
92
-		public function get() {
93
-			$core = $this->core();
94
-
95
-			$defaults = false;
96
-
97
-			if ( ! empty( $core->defaults ) ) {
98
-				$defaults = $core->defaults;
99
-			}
100
-
101
-			if ( empty( $core->args ) ) {
102
-				return;
103
-			}
104
-
105
-			switch ( $core->args['database'] ) {
106
-				case 'transient':
107
-					$result = get_transient( $core->args['opt_name'] . '-transient' );
108
-					break;
109
-				case 'theme_mods':
110
-					$result = get_theme_mod( $core->args['opt_name'] . '-mods' );
111
-					break;
112
-				case 'theme_mods_expanded':
113
-					$result = get_theme_mods();
114
-					break;
115
-				case 'network':
116
-					$result = get_site_option( $core->args['opt_name'], array() );
117
-					break;
118
-				default:
119
-					$result = get_option( $core->args['opt_name'], array() );
120
-
121
-			}
122
-
123
-			if ( ! is_array( $result ) ) {
124
-				return;
125
-			}
126
-
127
-			if ( empty( $result ) && empty( $defaults ) ) {
128
-				return;
129
-			}
130
-
131
-			if ( empty( $result ) && ! empty( $defaults ) ) {
132
-				$results = $defaults;
133
-				$this->set( $results );
134
-			} else {
135
-				$core->options = $result;
136
-			}
137
-
138
-			// Don't iterate unnecessarily.
139
-			if ( has_filter( 'wpml_object_id' ) ) {
140
-				$this->translate_data_field_recursive( $core->sections, $core->options );
141
-			}
142
-
143
-			/**
144
-			 * Action 'redux/options/{opt_name}/options'
145
-			 *
146
-			 * @param mixed $value option values
147
-			 */
148
-
149
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
150
-			$core->options = apply_filters( "redux/options/{$core->args['opt_name']}/options", $core->options, $core->sections );
151
-
152
-			// Get transient values.
153
-			$core->transient_class->get();
154
-
155
-			// Set a global variable by the global_variable argument.
156
-			$this->set_global_variable( $core );
157
-		}
158
-
159
-		/**
160
-		 * ->set_options(); This is used to set an arbitrary option in the option array
161
-		 *
162
-		 * @since ReduxFramework 3.0.0
163
-		 *
164
-		 * @param string|array $value the value of the option being added.
165
-		 */
166
-		public function set( $value = '' ) {
167
-			$core = $this->core();
168
-
169
-			$core->transients['last_save'] = time();
170
-
171
-			if ( ! empty( $value ) ) {
172
-				switch ( $core->args['database'] ) {
173
-					case 'transient':
174
-						set_transient( $core->args['opt_name'] . '-transient', $value, $core->args['transient_time'] );
175
-						break;
176
-					case 'theme_mods':
177
-						set_theme_mod( $core->args['opt_name'] . '-mods', $value );
178
-						break;
179
-					case 'theme_mods_expanded':
180
-						foreach ( $value as $k => $v ) {
181
-							set_theme_mod( $k, $v );
182
-						}
183
-						break;
184
-					case 'network':
185
-						update_site_option( $core->args['opt_name'], $value );
186
-						break;
187
-					default:
188
-						update_option( $core->args['opt_name'], $value );
189
-
190
-				}
191
-
192
-				// Store the changed values in the transient.
193
-				if ( $value !== $core->options ) {
194
-					foreach ( $value as $k => $v ) {
195
-						if ( ! isset( $core->options[ $k ] ) ) {
196
-							$core->options[ $k ] = '';
197
-						} elseif ( $v === $core->options[ $k ] ) {
198
-							unset( $core->options[ $k ] );
199
-						}
200
-					}
201
-
202
-					$core->transients['changed_values'] = $core->options;
203
-				}
204
-
205
-				$core->options = $value;
206
-
207
-				// Set a global variable by the global_variable argument.
208
-				$this->set_global_variable( $core );
209
-
210
-				// Saving the transient values.
211
-				$core->transient_class->set();
212
-			}
213
-		}
214
-
215
-		/**
216
-		 * Set a global variable by the global_variable argument
217
-		 *
218
-		 * @param null|ReduxFramework $core ReduxFramework core object.
219
-		 *
220
-		 * @return  void          (global was set)
221
-		 * @since   3.1.5
222
-		 */
223
-		private function set_global_variable( ?ReduxFramework $core ): void {
224
-			if ( ! empty( $core->args['global_variable'] ) ) {
225
-				$options_global = $core->args['global_variable'];
226
-
227
-				/**
228
-				 * Filter 'redux/options/{opt_name}/global_variable'
229
-				 *
230
-				 * @param array $value option value to set global_variable with
231
-				 */
232
-
233
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
234
-				$GLOBALS[ $options_global ] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options );
235
-			}
236
-		}
237
-
238
-		/**
239
-		 * Register Option for use
240
-		 *
241
-		 * @return void
242
-		 * @throws ReflectionException Exception.
243
-		 * @since  1.0.0
244
-		 * @access public
245
-		 */
246
-		public function register() {
247
-			$core = $this->core();
248
-
249
-			if ( ! is_object( $core ) ) {
250
-				return;
251
-			}
252
-
253
-			if ( true === $core->args['options_api'] ) {
254
-				register_setting(
255
-					$core->args['opt_name'] . '_group',
256
-					$core->args['opt_name'],
257
-					array(
258
-						$this,
259
-						'validate_options',
260
-					)
261
-				);
262
-			}
263
-
264
-			if ( is_null( $core->sections ) ) {
265
-				return;
266
-			}
267
-
268
-			if ( empty( $core->options_defaults ) ) {
269
-				$core->options_defaults = $core->default_values();
270
-			}
271
-
272
-			$run_update = false;
273
-
274
-			foreach ( $core->sections as $k => $section ) {
275
-				if ( isset( $section['type'] ) && 'divide' === $section['type'] ) {
276
-					continue;
277
-				}
278
-
279
-				$display = true;
280
-
281
-				if ( isset( $_GET['page'] ) && $_GET['page'] === $core->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification
282
-					if ( isset( $section['panel'] ) && false === $section['panel'] ) {
283
-						$display = false;
284
-					}
285
-				}
286
-
287
-				/**
288
-				 * Filter 'redux/options/{opt_name}/section/{section.id}'
289
-				 *
290
-				 * @param array $section section configuration
291
-				 */
292
-				if ( isset( $section['id'] ) ) {
293
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
294
-					$section = apply_filters( "redux/options/{$core->args['opt_name']}/section/{$section['id']}", $section );
295
-				}
296
-
297
-				if ( empty( $section ) ) {
298
-					unset( $core->sections[ $k ] );
299
-					continue;
300
-				}
301
-
302
-				if ( ! isset( $section['title'] ) ) {
303
-					$section['title'] = '';
304
-				}
305
-
306
-				if ( isset( $section['customizer_only'] ) && true === $section['customizer_only'] ) {
307
-					$section['panel']     = false;
308
-					$core->sections[ $k ] = $section;
309
-				}
310
-
311
-				$heading = $section['heading'] ?? $section['title'];
312
-
313
-				if ( isset( $section['permissions'] ) && false !== $section['permissions'] ) {
314
-					if ( ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
315
-						$core->hidden_perm_sections[] = $section['title'];
316
-
317
-						foreach ( $section['fields'] as $field_data ) {
318
-							$field_type = $field_data['type'];
319
-
320
-							if ( ! in_array( $field_type, array( 'section', 'divide', 'info', 'raw' ), true ) ) {
321
-								$field_id = $field_data['id'];
322
-								$default  = $core->options_defaults[ $field_id ] ?? '';
323
-								$data     = $core->options[ $field_id ] ?? $default;
324
-
325
-								$this->hidden_perm_fields[ $field_id ] = $data;
326
-							}
327
-						}
328
-
329
-						continue;
330
-					}
331
-				}
332
-
333
-				if ( ! $display || ! function_exists( 'add_settings_section' ) ) {
334
-					$this->no_panel_section[ $k ] = $section;
335
-				} else {
336
-					add_settings_section(
337
-						$core->args['opt_name'] . $k . '_section',
338
-						$heading,
339
-						array(
340
-							$core->render_class,
341
-							'section_desc',
342
-						),
343
-						$core->args['opt_name'] . $k . '_section_group'
344
-					);
345
-				}
346
-
347
-				$section_ident = false;
348
-				if ( isset( $section['fields'] ) ) {
349
-					foreach ( $section['fields'] as $fieldk => $field ) {
350
-						if ( ! isset( $field['type'] ) ) {
351
-							continue; // You need a type!
352
-						}
353
-
354
-						if ( 'info' === $field['type'] && isset( $field['raw_html'] ) && true === $field['raw_html'] ) {
355
-							$field['type']                             = 'raw';
356
-							$field['content']                          = $field['desc'];
357
-							$field['desc']                             = '';
358
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
359
-						} elseif ( 'info' === $field['type'] ) {
360
-							if ( ! isset( $field['full_width'] ) ) {
361
-								$field['full_width']                       = true;
362
-								$core->sections[ $k ]['fields'][ $fieldk ] = $field;
363
-							}
364
-						}
365
-
366
-						if ( 'raw' === $field['type'] ) {
367
-							if ( isset( $field['align'] ) ) {
368
-								$field['full_width'] = ! $field['align'];
369
-								unset( $field['align'] );
370
-							} elseif ( ! isset( $field['full_width'] ) ) {
371
-								$field['full_width'] = true;
372
-							}
373
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
374
-						}
375
-
376
-						/**
377
-						 * Filter 'redux/options/{opt_name}/field/{field.id}'
378
-						 *
379
-						 * @param array $field field config
380
-						 */
381
-
382
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
383
-						$field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}/register", $field );
384
-
385
-						$core->field_types[ $field['type'] ] = $core->field_types[ $field['type'] ] ?? array();
386
-
387
-						$core->field_sections[ $field['type'] ][ $field['id'] ] = $k;
388
-
389
-						$display = true;
390
-
391
-						if ( isset( $_GET['page'] ) && $core->args['page_slug'] === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification
392
-							if ( isset( $field['panel'] ) && false === $field['panel'] ) {
393
-								$display = false;
394
-							}
395
-						}
396
-						if ( isset( $field['customizer_only'] ) && true === $field['customizer_only'] ) {
397
-							$display = false;
398
-						}
399
-
400
-						if ( isset( $section['customizer'] ) ) {
401
-							$field['customizer']                       = $section['customizer'];
402
-							$core->sections[ $k ]['fields'][ $fieldk ] = $field;
403
-						}
404
-
405
-						if ( isset( $field['permissions'] ) && false !== $field['permissions'] ) {
406
-							if ( ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
407
-								$data = $core->options[ $field['id'] ] ?? $core->options_defaults[ $field['id'] ];
408
-
409
-								$this->hidden_perm_fields[ $field['id'] ] = $data;
410
-
411
-								continue;
412
-							}
413
-						}
414
-
415
-						if ( ! isset( $field['id'] ) ) {
416
-							echo '<br /><h3>No field ID is set.</h3><pre>';
417
-
418
-							// phpcs:ignore WordPress.PHP.DevelopmentFunctions
419
-							print_r( $field );
420
-
421
-							echo '</pre><br />';
422
-
423
-							continue;
424
-						}
425
-
426
-						if ( isset( $field['type'] ) && 'section' === $field['type'] ) {
427
-							if ( isset( $field['indent'] ) && true === $field['indent'] ) {
428
-								$section_ident = true;
429
-							} else {
430
-								$section_ident = false;
431
-							}
432
-						}
433
-
434
-						if ( isset( $field['type'] ) && 'info' === $field['type'] && $section_ident ) {
435
-							$field['indent'] = true;
436
-						}
437
-
438
-						$th = $core->render_class->get_header_html( $field );
439
-
440
-						$field['name'] = $core->args['opt_name'] . '[' . $field['id'] . ']';
441
-
442
-						// Set the default value if present.
443
-						$core->options_defaults[ $field['id'] ] = $core->options_defaults[ $field['id'] ] ?? '';
444
-
445
-						// Set the defaults to the value if not present.
446
-						$do_update = false;
447
-
448
-						// Check fields for values in the default parameter.
449
-						if ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['default'] ) ) {
450
-							$core->options_defaults[ $field['id'] ] = $field['default'];
451
-							$core->options[ $field['id'] ]          = $field['default'];
452
-							$do_update                              = true;
453
-
454
-							// Check fields that hae no default value, but an option value with settings to
455
-							// be saved by default.
456
-						} elseif ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['options'] ) ) {
457
-
458
-							// If a sorter field, check for options and save them as defaults.
459
-							if ( 'sorter' === $field['type'] || 'sortable' === $field['type'] ) {
460
-								$core->options_defaults[ $field['id'] ] = $field['options'];
461
-								$core->options[ $field['id'] ]          = $field['options'];
462
-								$do_update                              = true;
463
-							}
464
-						}
465
-
466
-						// CORRECT URLS if media URLs are wrong, but attachment IDs are present.
467
-						if ( 'media' === $field['type'] ) {
468
-							if ( isset( $core->options[ $field['id'] ]['id'] ) && isset( $core->options[ $field['id'] ]['url'] ) && ! empty( $core->options[ $field['id'] ]['url'] ) && strpos( $core->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
469
-								$data = wp_get_attachment_url( $core->options[ $field['id'] ]['id'] );
470
-
471
-								if ( isset( $data ) && ! empty( $data ) ) {
472
-									$core->options[ $field['id'] ]['url'] = $data;
473
-
474
-									$data = wp_get_attachment_image_src(
475
-										$core->options[ $field['id'] ]['id'],
476
-										array(
477
-											150,
478
-											150,
479
-										)
480
-									);
481
-
482
-									$core->options[ $field['id'] ]['thumbnail'] = $data[0];
483
-									$do_update                                  = true;
484
-								}
485
-							}
486
-						}
487
-
488
-						if ( 'background' === $field['type'] ) {
489
-							if ( isset( $core->options[ $field['id'] ]['media']['id'] ) && isset( $core->options[ $field['id'] ]['background-image'] ) && ! empty( $core->options[ $field['id'] ]['background-image'] ) && strpos( $core->options[ $field['id'] ]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
490
-								$data = wp_get_attachment_url( $core->options[ $field['id'] ]['media']['id'] );
491
-
492
-								if ( isset( $data ) && ! empty( $data ) ) {
493
-									$core->options[ $field['id'] ]['background-image'] = $data;
494
-
495
-									$data = wp_get_attachment_image_src(
496
-										$core->options[ $field['id'] ]['media']['id'],
497
-										array(
498
-											150,
499
-											150,
500
-										)
501
-									);
502
-
503
-									$core->options[ $field['id'] ]['media']['thumbnail'] = $data[0];
504
-									$do_update = true;
505
-								}
506
-							}
507
-						}
508
-
509
-						if ( 'slides' === $field['type'] ) {
510
-							if ( isset( $core->options[ $field['id'] ] ) && is_array( $core->options[ $field['id'] ] ) && isset( $core->options[ $field['id'] ][0]['attachment_id'] ) && isset( $core->options[ $field['id'] ][0]['image'] ) && ! empty( $core->options[ $field['id'] ][0]['image'] ) && strpos( $core->options[ $field['id'] ][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
511
-								foreach ( $core->options[ $field['id'] ] as $key => $val ) {
512
-									$data = wp_get_attachment_url( $val['attachment_id'] );
513
-
514
-									if ( isset( $data ) && ! empty( $data ) ) {
515
-										$core->options[ $field['id'] ][ $key ]['image'] = $data;
516
-
517
-										$data = wp_get_attachment_image_src(
518
-											$val['attachment_id'],
519
-											array(
520
-												150,
521
-												150,
522
-											)
523
-										);
524
-
525
-										$core->options[ $field['id'] ][ $key ]['thumb'] = $data[0];
526
-										$do_update                                      = true;
527
-									}
528
-								}
529
-							}
530
-						}
531
-						// END -> CORRECT URLS if media URLs are wrong, but attachment IDs are present.
532
-						if ( true === $do_update && ! isset( $core->never_save_to_db ) ) {
533
-							if ( $core->args['save_defaults'] ) { // Only save that to the DB if allowed to.
534
-								$run_update = true;
535
-							}
536
-						}
537
-
538
-						if ( ! isset( $field['class'] ) ) { // No errors, please.
539
-							$field['class'] = '';
540
-						}
541
-
542
-						/**
543
-						 * Filter 'redux/options/{opt_name}/field/{field.id}'.
544
-						 *
545
-						 * @param array $field field config
546
-						 */
547
-
548
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
549
-						$field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}", $field );
550
-
551
-						if ( empty( $field ) ) {
552
-							unset( $core->sections[ $k ]['fields'][ $fieldk ] );
553
-							continue;
554
-						}
555
-
556
-						if ( ! empty( Redux_Core::$folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default.
557
-							$field['class'] .= ' fold';
558
-						}
559
-
560
-						if ( ! empty( Redux_Core::$folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on.
561
-							$field['class'] .= ' fold-parent';
562
-						}
563
-
564
-						if ( ! empty( $field['compiler'] ) ) {
565
-							$field['class']                       .= ' compiler';
566
-							$core->compiler_fields[ $field['id'] ] = 1;
567
-						}
568
-
569
-						if ( isset( $field['unit'] ) && ! isset( $field['units'] ) ) {
570
-							$field['units'] = $field['unit'];
571
-							unset( $field['unit'] );
572
-						}
573
-
574
-						$core->sections[ $k ]['fields'][ $fieldk ] = $field;
575
-
576
-						if ( isset( $core->args['display_source'] ) ) {
577
-							// phpcs:ignore WordPress.PHP.DevelopmentFunctions
578
-							$th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[ $k ]['fields'][ $fieldk ], true ) . '</pre></div>';
579
-							$th .= '<br /><a href="#TB_inline?width=600&height=800&inlineId=' . $field['id'] . '-settings" class="thickbox"><small>View Source</small></a>';
580
-						}
581
-
582
-						/**
583
-						 * Action 'redux/options/{opt_name}/field/{field.type}/register'
584
-						 */
585
-
586
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
587
-						do_action( "redux/options/{$core->args['opt_name']}/field/{$field['type']}/register", $field );
588
-
589
-						$core->required_class->check_dependencies( $field );
590
-						$core->field_head[ $field['id'] ] = $th;
591
-
592
-						if ( ! $display || isset( $this->no_panel_section[ $k ] ) ) {
593
-							$this->no_panel[] = $field['id'];
594
-						} else {
595
-							if ( isset( $field['disabled'] ) && $field['disabled'] ) {
596
-								$field['class'] .= ' redux_disable_field';
597
-							}
598
-
599
-							if ( isset( $field['hidden'] ) && $field['hidden'] ) {
600
-								$field['class'] .= ' redux_hide_field';
601
-							}
602
-
603
-							if ( true === $core->args['options_api'] ) {
604
-								add_settings_field(
605
-									"{$fieldk}_field",
606
-									$th,
607
-									array(
608
-										$core->render_class,
609
-										'field_input',
610
-									),
611
-									"{$core->args['opt_name']}{$k}_section_group",
612
-									"{$core->args['opt_name']}{$k}_section",
613
-									$field
614
-								);
615
-							}
616
-						}
617
-					}
618
-				}
619
-			}
620
-
621
-			/**
622
-			 * Action 'redux/options/{opt_name}/register'
623
-			 *
624
-			 * @param array $section Option sections
625
-			 */
626
-
627
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
628
-			do_action( "redux/options/{$core->args['opt_name']}/register", $core->sections );
629
-
630
-			if ( $run_update && ! isset( $core->never_save_to_db ) ) { // Always update the DB with new fields.
631
-				$this->set( $core->options );
632
-			}
633
-
634
-			if ( isset( $core->transients['run_compiler'] ) && $core->transients['run_compiler'] ) {
635
-
636
-				Redux_Core::$no_output = true;
637
-				$temp                  = $core->args['output_variables_prefix'];
638
-
639
-				// Allow the override of variable's prefix for use by SCSS or LESS.
640
-				if ( isset( $core->args['compiler_output_variables_prefix'] ) ) {
641
-					$core->args['output_variables_prefix'] = $core->args['compiler_output_variables_prefix'];
642
-				}
643
-				$core->output_class->enqueue();
644
-				$core->args['output_variables_prefix'] = $temp;
645
-
646
-				// phpcs:ignore WordPress.NamingConventions.ValidVariableName
647
-				$compiler_css = $core->compilerCSS;
648
-
649
-				/**
650
-				 * Action 'redux/options/{opt_name}/compiler'
651
-				 *
652
-				 * @param array  $options Options.
653
-				 * @param string $css CSS that get sent to the compiler hook.
654
-				 * @param array  $changed_values Changed values.
655
-				 * @param array  $output_variables Output variables.
656
-				 */
657
-
658
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
659
-				do_action( "redux/options/{$core->args['opt_name']}/compiler", $core->options, $compiler_css, $core->transients['changed_values'], $core->output_variables );
660
-
661
-				/**
662
-				 * Action 'redux/options/{opt_name}/compiler/advanced'
663
-				 *
664
-				 * @param object $redux ReduxFramework object.
665
-				 */
666
-
667
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
668
-				do_action( "redux/options/{$core->args['opt_name']}/compiler/advanced", $core );
669
-
670
-				unset( $core->transients['run_compiler'] );
671
-				$core->transient_class->set();
672
-			}
673
-		}
674
-
675
-		/**
676
-		 * Get default options into an array suitable for the settings API
677
-		 *
678
-		 * @since       1.0.0
679
-		 * @access      public
680
-		 * @return      array $this->options_defaults
681
-		 */
682
-		public function default_values(): array {
683
-			$core = $this->core();
684
-
685
-			if ( ! is_null( $core->sections ) && is_null( $core->options_defaults ) ) {
686
-				$core->options_defaults = $core->options_defaults_class->default_values( $core->args['opt_name'], $core->sections, $core->wordpress_data );
687
-			}
688
-
689
-			/**
690
-			 * Filter 'redux/options/{opt_name}/defaults'
691
-			 *
692
-			 * @param array $defaults option default values
693
-			 */
694
-
695
-			$core->transients['changed_values'] = $core->transients['changed_values'] ?? array();
696
-
697
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
698
-			$core->options_defaults = apply_filters( "redux/options/{$core->args['opt_name']}/defaults", $core->options_defaults, $core->transients['changed_values'] );
699
-
700
-			return $core->options_defaults;
701
-		}
702
-
703
-		/**
704
-		 * Validate the Options before insertion
705
-		 *
706
-		 * @param  array $plugin_options The option array.
707
-		 *
708
-		 * @return array|mixed|string
709
-		 * @since  3.0.0
710
-		 * @access public
711
-		 */
712
-		public function validate_options( array $plugin_options ) {
713
-			$core = $this->core();
714
-
715
-			if ( true === Redux_Core::$validation_ran ) {
716
-				return $plugin_options;
717
-			}
718
-
719
-			Redux_Core::$validation_ran = true;
720
-
721
-			// Save the values not in the panel.
722
-			if ( isset( $plugin_options['redux-no_panel'] ) ) {
723
-				$keys = explode( '|', $plugin_options['redux-no_panel'] );
724
-				foreach ( $keys as $key ) {
725
-					$plugin_options[ $key ] = $core->options[ $key ];
726
-				}
727
-				if ( isset( $plugin_options['redux-no_panel'] ) ) {
728
-					unset( $plugin_options['redux-no_panel'] );
729
-				}
730
-			}
731
-
732
-			if ( is_array( $this->hidden_perm_fields ) && ! empty( $this->hidden_perm_fields ) ) {
733
-				foreach ( $this->hidden_perm_fields as $id => $data ) {
734
-					$plugin_options[ $id ] = $data;
735
-				}
736
-			}
737
-
738
-			if ( $plugin_options === $core->options ) {
739
-				return $plugin_options;
740
-			}
741
-
742
-			$time = time();
743
-
744
-			// Sets last saved time.
745
-			$core->transients['last_save'] = $time;
746
-
747
-			$imported_options = array();
748
-
749
-			if ( isset( $plugin_options['import_code'] ) && '' !== $plugin_options['import_code'] ) {
750
-				$imported_options = json_decode( $plugin_options['import_code'], true );
751
-			}
752
-
753
-			// Import.
754
-			$core->transients['last_save_mode'] = 'import'; // Last save mode.
755
-			$core->transients['last_compiler']  = $time;
756
-			$core->transients['last_import']    = $time;
757
-			$core->transients['run_compiler']   = 1;
758
-
759
-			if ( is_array( $imported_options ) && ! empty( $imported_options ) && isset( $imported_options['redux-backup'] ) && ( 1 === $imported_options['redux-backup'] || '1' === $imported_options['redux-backup'] ) ) {
760
-				$core->transients['changed_values'] = array();
761
-				foreach ( $plugin_options as $key => $value ) {
762
-					if ( isset( $imported_options[ $key ] ) && $value !== $imported_options[ $key ] ) {
763
-						$plugin_options[ $key ]                     = $value;
764
-						$core->transients['changed_values'][ $key ] = $value;
765
-					}
766
-				}
767
-
768
-				/**
769
-				 * Action 'redux/options/{opt_name}/import'.
770
-				 *
771
-				 * @param  &array [&$plugin_options, redux_options]
772
-				 */
773
-
774
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
775
-				do_action_ref_array(
776
-					"redux/options/{$core->args['opt_name']}/import", // phpcs:ignore WordPress.NamingConventions.ValidHookName
777
-					array(
778
-						&$plugin_options,
779
-						$imported_options,
780
-						$core->transients['changed_values'],
781
-					)
782
-				);
783
-
784
-				setcookie( 'redux_current_tab_' . $core->args['opt_name'], '', 1, '/', $time + 1000, '/' );
785
-				$_COOKIE[ 'redux_current_tab_' . $core->args['opt_name'] ] = 1;
786
-
787
-				unset( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] );
788
-				if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded', 'network' ), true ) ) {
789
-					$this->set( $plugin_options );
790
-
791
-					return null;
792
-				}
793
-
794
-				$plugin_options = wp_parse_args( $imported_options, $plugin_options );
795
-
796
-				$core->transient_class->set();
797
-
798
-				return $plugin_options;
799
-			}
800
-
801
-			// Reset all to defaults.
802
-			if ( ! empty( $plugin_options['defaults'] ) ) {
803
-				if ( empty( $core->options_defaults ) ) {
804
-					$core->options_defaults = $core->_default_values();
805
-				}
806
-
807
-				/**
808
-				 * Filter: 'redux/validate/{opt_name}/defaults'.
809
-				 *
810
-				 * @param  &array [ $this->options_defaults, $plugin_options]
811
-				 */
812
-
813
-				// phpcs:ignore WordPress.NamingConventions.ValidHookName
814
-				$plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults", $core->options_defaults );
815
-
816
-				$core->transients['changed_values'] = array();
817
-
818
-				if ( empty( $core->options ) ) {
819
-					$core->options = $core->options_defaults;
820
-				}
821
-
822
-				foreach ( $core->options as $key => $value ) {
823
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
824
-						$core->transients['changed_values'][ $key ] = $value;
825
-					}
826
-				}
827
-
828
-				$core->transients['run_compiler']   = 1;
829
-				$core->transients['last_save_mode'] = 'defaults'; // Last save mode.
830
-
831
-				$core->transient_class->set();
832
-
833
-				return $plugin_options;
834
-			}
835
-
836
-			// Section reset to default.
837
-			if ( ! empty( $plugin_options['defaults-section'] ) ) {
838
-				if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[ $plugin_options['redux-section'] ]['fields'] ) ) {
839
-					if ( empty( $core->options_defaults ) ) {
840
-						$core->options_defaults = $core->_default_values();
841
-					}
842
-
843
-					foreach ( $core->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) {
844
-						if ( 'tabbed' === $field['type'] ) {
845
-							if ( ! empty( $field['tabs'] ) ) {
846
-								foreach ( $field['tabs'] as $val ) {
847
-									if ( ! empty( $val['fields'] ) ) {
848
-										foreach ( $val['fields'] as $f ) {
849
-											if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
850
-												$plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
851
-											} else {
852
-												$plugin_options[ $f['id'] ] = '';
853
-											}
854
-										}
855
-									}
856
-								}
857
-							}
858
-						} elseif ( 'repeater' === $field['type'] ) {
859
-							if ( ! empty( $field['fields'] ) ) {
860
-								foreach ( $field['fields'] as $f ) {
861
-									if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
862
-										$plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
863
-									} else {
864
-										$plugin_options[ $f['id'] ] = '';
865
-									}
866
-								}
867
-							}
868
-						} else {
869
-							if ( isset( $core->options_defaults[ $field['id'] ] ) ) {
870
-								$plugin_options[ $field['id'] ] = $core->options_defaults[ $field['id'] ];
871
-							} else {
872
-								$plugin_options[ $field['id'] ] = '';
873
-							}
874
-						}
875
-
876
-						if ( isset( $field['compiler'] ) ) {
877
-							$compiler = true;
878
-						}
879
-					}
880
-
881
-					/**
882
-					 * Filter: 'redux/validate/{opt_name}/defaults_section'.
883
-					 *
884
-					 * @param  &array [ $this->options_defaults, $plugin_options]
885
-					 */
886
-
887
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
888
-					$plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults_section", $plugin_options );
889
-				}
890
-
891
-				$core->transients['changed_values'] = array();
892
-
893
-				foreach ( $core->options as $key => $value ) {
894
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
895
-						$core->transients['changed_values'][ $key ] = $value;
896
-					}
897
-				}
898
-
899
-				if ( isset( $compiler ) ) {
900
-					$core->transients['last_compiler'] = $time;
901
-					$core->transients['run_compiler']  = 1;
902
-				}
903
-
904
-				$core->transients['last_save_mode'] = 'defaults_section'; // Last save mode.
905
-
906
-				unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
907
-
908
-				$core->transient_class->set();
909
-
910
-				return $plugin_options;
911
-			}
912
-
913
-			$core->transients['last_save_mode'] = 'normal'; // Last save mode.
914
-
915
-			/**
916
-			 * Filter: 'redux/validate/{opt_name}/before_validation'
917
-			 *
918
-			 * @param  &array [&$plugin_options, redux_options]
919
-			 */
920
-
921
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
922
-			$plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/before_validation", $plugin_options, $core->options );
923
-
924
-			// Validate fields (if needed).
925
-			$plugin_options = $core->validate_class->validate( $plugin_options, $core->options, $core->sections );
926
-
927
-			// Sanitize options, if needed.
928
-			$plugin_options = $core->sanitize_class->sanitize( $plugin_options, $core->options, $core->sections );
929
-
930
-			if ( ! empty( $core->errors ) || ! empty( $core->warnings ) || ! empty( $core->sanitize ) ) {
931
-				$core->transients['notices'] = array(
932
-					'errors'   => $core->errors,
933
-					'warnings' => $core->warnings,
934
-					'sanitize' => $core->sanitize,
935
-				);
936
-			}
937
-
938
-			if ( ! isset( $core->transients['changed_values'] ) ) {
939
-				$core->transients['changed_values'] = array();
940
-			}
941
-
942
-			/**
943
-			 * Action 'redux/options/{opt_name}/validate'
944
-			 *
945
-			 * @param  &array [&$plugin_options, redux_options]
946
-			 */
947
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
948
-			do_action_ref_array(
949
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
950
-				"redux/options/{$core->args['opt_name']}/validate",
951
-				array(
952
-					&$plugin_options,
953
-					$core->options,
954
-					$core->transients['changed_values'],
955
-				)
956
-			);
957
-
958
-			if ( ! empty( $plugin_options['compiler'] ) ) {
959
-				unset( $plugin_options['compiler'] );
960
-
961
-				$core->transients['last_compiler'] = $time;
962
-				$core->transients['run_compiler']  = 1;
963
-			}
964
-
965
-			$core->transients['changed_values'] = array(); // Changed values since last save.
966
-
967
-			if ( ! empty( $core->options ) ) {
968
-				foreach ( $core->options as $key => $value ) {
969
-					if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
970
-						$core->transients['changed_values'][ $key ] = $value;
971
-					}
972
-				}
973
-			}
974
-
975
-			unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
976
-			if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded' ), true ) ) {
977
-				$core->set( $core->args['opt_name'], $plugin_options );
978
-				return null;
979
-			}
980
-
981
-			if ( defined( 'WP_CACHE' ) && WP_CACHE && class_exists( 'W3_ObjectCache' ) && function_exists( 'w3_instance' ) ) {
982
-				$w3_inst = w3_instance( 'W3_ObjectCache' );
983
-				$w3      = $w3_inst->instance();
984
-				$key     = $w3->_get_cache_key( $core->args['opt_name'] . '-transients', 'transient' );
985
-				$w3->delete( $key, 'transient', true );
986
-			}
987
-
988
-			$core->transient_class->set();
989
-
990
-			return $plugin_options;
991
-		}
992
-
993
-		/**
994
-		 * ->get_default(); This is used to return the default value if default_show is set.
995
-		 *
996
-		 * @param string $opt_name The option name to return.
997
-		 * @param mixed  $defaults (null) The value to return if default not set.
998
-		 *
999
-		 * @return      mixed $default
1000
-		 * @since       1.0.1
1001
-		 * @access      public
1002
-		 */
1003
-		public function get_default( string $opt_name, $defaults = null ) {
1004
-			if ( true === $this->args['default_show'] ) {
1005
-
1006
-				if ( empty( $this->options_defaults ) ) {
1007
-					$this->default_values(); // fill cache.
1008
-				}
1009
-
1010
-				return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $defaults;
1011
-			}
1012
-
1013
-			return '';
1014
-		}
1015
-
1016
-		/**
1017
-		 * Get the default value for an option
1018
-		 *
1019
-		 * @param string $key       The option's ID.
1020
-		 * @param string $array_key The key of the default's array.
1021
-		 *
1022
-		 * @return mixed
1023
-		 * @since  3.3.6
1024
-		 * @access public
1025
-		 */
1026
-		public function get_default_value( string $key, $array_key = false ) {
1027
-			if ( empty( $this->options_defaults ) ) {
1028
-				$this->options_defaults = $this->default_values();
1029
-			}
1030
-
1031
-			$defaults = $this->options_defaults;
1032
-			$value    = '';
1033
-
1034
-			if ( isset( $defaults[ $key ] ) ) {
1035
-				if ( false !== $array_key && isset( $defaults[ $key ][ $array_key ] ) ) {
1036
-					$value = $defaults[ $key ][ $array_key ];
1037
-				} else {
1038
-					$value = $defaults[ $key ];
1039
-				}
1040
-			}
1041
-
1042
-			return $value;
1043
-		}
1044
-	}
15
+    /**
16
+     * Class Redux_Options
17
+     */
18
+    class Redux_Options_Constructor extends Redux_Class {
19
+
20
+        /**
21
+         * Array to hold single panel data.
22
+         *
23
+         * @var array
24
+         */
25
+        public array $no_panel = array();
26
+
27
+        /**
28
+         * Array to hold single panel sections.
29
+         *
30
+         * @var array
31
+         */
32
+        private array $no_panel_section = array();
33
+
34
+        /**
35
+         * Array to hold hidden fields.
36
+         *
37
+         * @var array
38
+         */
39
+        private array $hidden_perm_fields = array();
40
+
41
+        /**
42
+         * Array to hold hidden sections.
43
+         *
44
+         * @var array
45
+         */
46
+        public array $hidden_perm_sections = array();
47
+
48
+        /**
49
+         * Array to hold default options.
50
+         *
51
+         * @var array
52
+         */
53
+        private array $options_defaults = array();
54
+
55
+        /**
56
+         * Redux_Options constructor.
57
+         *
58
+         * @param object $redux ReduxFramework pointer.
59
+         */
60
+        public function __construct( $redux ) {
61
+            parent::__construct( $redux );
62
+
63
+            add_action( 'admin_init', array( $this, 'register' ) );
64
+        }
65
+
66
+        /**
67
+         * If we switch language in wpml the id of the post/page selected will be in the wrong language
68
+         * So it won't appear as selected in the list of options and will be lost on next save, this fixes this by translating this id
69
+         * Bonus it also gives the user the id of the post in the right language when they retrieve it.
70
+         * The recursion allows for it to work in a repeatable field.
71
+         *
72
+         * @param array $sections       Sections array.
73
+         * @param array $options_values Values array.
74
+         */
75
+        private function translate_data_field_recursive( array $sections, array &$options_values ) {
76
+            foreach ( $sections as $key => $section ) {
77
+                if ( 'fields' === $key ) {
78
+                    foreach ( $section as $field ) {
79
+                        if ( ! empty( $field['id'] ) && ! empty( $field['data'] ) && ! empty( $options_values[ $field['id'] ] ) && Redux_Helpers::is_integer( $options_values[ $field['id'] ] ) ) {
80
+                            $options_values[ $field['id'] ] = apply_filters( 'wpml_object_id', $options_values[ $field['id'] ], $field['data'], true );
81
+                        }
82
+                    }
83
+                } elseif ( is_array( $section ) && ! empty( $section ) ) {
84
+                    $this->translate_data_field_recursive( $section, $options_values );
85
+                }
86
+            }
87
+        }
88
+
89
+        /**
90
+         * Retrieves the options.
91
+         */
92
+        public function get() {
93
+            $core = $this->core();
94
+
95
+            $defaults = false;
96
+
97
+            if ( ! empty( $core->defaults ) ) {
98
+                $defaults = $core->defaults;
99
+            }
100
+
101
+            if ( empty( $core->args ) ) {
102
+                return;
103
+            }
104
+
105
+            switch ( $core->args['database'] ) {
106
+                case 'transient':
107
+                    $result = get_transient( $core->args['opt_name'] . '-transient' );
108
+                    break;
109
+                case 'theme_mods':
110
+                    $result = get_theme_mod( $core->args['opt_name'] . '-mods' );
111
+                    break;
112
+                case 'theme_mods_expanded':
113
+                    $result = get_theme_mods();
114
+                    break;
115
+                case 'network':
116
+                    $result = get_site_option( $core->args['opt_name'], array() );
117
+                    break;
118
+                default:
119
+                    $result = get_option( $core->args['opt_name'], array() );
120
+
121
+            }
122
+
123
+            if ( ! is_array( $result ) ) {
124
+                return;
125
+            }
126
+
127
+            if ( empty( $result ) && empty( $defaults ) ) {
128
+                return;
129
+            }
130
+
131
+            if ( empty( $result ) && ! empty( $defaults ) ) {
132
+                $results = $defaults;
133
+                $this->set( $results );
134
+            } else {
135
+                $core->options = $result;
136
+            }
137
+
138
+            // Don't iterate unnecessarily.
139
+            if ( has_filter( 'wpml_object_id' ) ) {
140
+                $this->translate_data_field_recursive( $core->sections, $core->options );
141
+            }
142
+
143
+            /**
144
+             * Action 'redux/options/{opt_name}/options'
145
+             *
146
+             * @param mixed $value option values
147
+             */
148
+
149
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
150
+            $core->options = apply_filters( "redux/options/{$core->args['opt_name']}/options", $core->options, $core->sections );
151
+
152
+            // Get transient values.
153
+            $core->transient_class->get();
154
+
155
+            // Set a global variable by the global_variable argument.
156
+            $this->set_global_variable( $core );
157
+        }
158
+
159
+        /**
160
+         * ->set_options(); This is used to set an arbitrary option in the option array
161
+         *
162
+         * @since ReduxFramework 3.0.0
163
+         *
164
+         * @param string|array $value the value of the option being added.
165
+         */
166
+        public function set( $value = '' ) {
167
+            $core = $this->core();
168
+
169
+            $core->transients['last_save'] = time();
170
+
171
+            if ( ! empty( $value ) ) {
172
+                switch ( $core->args['database'] ) {
173
+                    case 'transient':
174
+                        set_transient( $core->args['opt_name'] . '-transient', $value, $core->args['transient_time'] );
175
+                        break;
176
+                    case 'theme_mods':
177
+                        set_theme_mod( $core->args['opt_name'] . '-mods', $value );
178
+                        break;
179
+                    case 'theme_mods_expanded':
180
+                        foreach ( $value as $k => $v ) {
181
+                            set_theme_mod( $k, $v );
182
+                        }
183
+                        break;
184
+                    case 'network':
185
+                        update_site_option( $core->args['opt_name'], $value );
186
+                        break;
187
+                    default:
188
+                        update_option( $core->args['opt_name'], $value );
189
+
190
+                }
191
+
192
+                // Store the changed values in the transient.
193
+                if ( $value !== $core->options ) {
194
+                    foreach ( $value as $k => $v ) {
195
+                        if ( ! isset( $core->options[ $k ] ) ) {
196
+                            $core->options[ $k ] = '';
197
+                        } elseif ( $v === $core->options[ $k ] ) {
198
+                            unset( $core->options[ $k ] );
199
+                        }
200
+                    }
201
+
202
+                    $core->transients['changed_values'] = $core->options;
203
+                }
204
+
205
+                $core->options = $value;
206
+
207
+                // Set a global variable by the global_variable argument.
208
+                $this->set_global_variable( $core );
209
+
210
+                // Saving the transient values.
211
+                $core->transient_class->set();
212
+            }
213
+        }
214
+
215
+        /**
216
+         * Set a global variable by the global_variable argument
217
+         *
218
+         * @param null|ReduxFramework $core ReduxFramework core object.
219
+         *
220
+         * @return  void          (global was set)
221
+         * @since   3.1.5
222
+         */
223
+        private function set_global_variable( ?ReduxFramework $core ): void {
224
+            if ( ! empty( $core->args['global_variable'] ) ) {
225
+                $options_global = $core->args['global_variable'];
226
+
227
+                /**
228
+                 * Filter 'redux/options/{opt_name}/global_variable'
229
+                 *
230
+                 * @param array $value option value to set global_variable with
231
+                 */
232
+
233
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
234
+                $GLOBALS[ $options_global ] = apply_filters( "redux/options/{$core->args['opt_name']}/global_variable", $core->options );
235
+            }
236
+        }
237
+
238
+        /**
239
+         * Register Option for use
240
+         *
241
+         * @return void
242
+         * @throws ReflectionException Exception.
243
+         * @since  1.0.0
244
+         * @access public
245
+         */
246
+        public function register() {
247
+            $core = $this->core();
248
+
249
+            if ( ! is_object( $core ) ) {
250
+                return;
251
+            }
252
+
253
+            if ( true === $core->args['options_api'] ) {
254
+                register_setting(
255
+                    $core->args['opt_name'] . '_group',
256
+                    $core->args['opt_name'],
257
+                    array(
258
+                        $this,
259
+                        'validate_options',
260
+                    )
261
+                );
262
+            }
263
+
264
+            if ( is_null( $core->sections ) ) {
265
+                return;
266
+            }
267
+
268
+            if ( empty( $core->options_defaults ) ) {
269
+                $core->options_defaults = $core->default_values();
270
+            }
271
+
272
+            $run_update = false;
273
+
274
+            foreach ( $core->sections as $k => $section ) {
275
+                if ( isset( $section['type'] ) && 'divide' === $section['type'] ) {
276
+                    continue;
277
+                }
278
+
279
+                $display = true;
280
+
281
+                if ( isset( $_GET['page'] ) && $_GET['page'] === $core->args['page_slug'] ) { // phpcs:ignore WordPress.Security.NonceVerification
282
+                    if ( isset( $section['panel'] ) && false === $section['panel'] ) {
283
+                        $display = false;
284
+                    }
285
+                }
286
+
287
+                /**
288
+                 * Filter 'redux/options/{opt_name}/section/{section.id}'
289
+                 *
290
+                 * @param array $section section configuration
291
+                 */
292
+                if ( isset( $section['id'] ) ) {
293
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
294
+                    $section = apply_filters( "redux/options/{$core->args['opt_name']}/section/{$section['id']}", $section );
295
+                }
296
+
297
+                if ( empty( $section ) ) {
298
+                    unset( $core->sections[ $k ] );
299
+                    continue;
300
+                }
301
+
302
+                if ( ! isset( $section['title'] ) ) {
303
+                    $section['title'] = '';
304
+                }
305
+
306
+                if ( isset( $section['customizer_only'] ) && true === $section['customizer_only'] ) {
307
+                    $section['panel']     = false;
308
+                    $core->sections[ $k ] = $section;
309
+                }
310
+
311
+                $heading = $section['heading'] ?? $section['title'];
312
+
313
+                if ( isset( $section['permissions'] ) && false !== $section['permissions'] ) {
314
+                    if ( ! Redux_Helpers::current_user_can( $section['permissions'] ) ) {
315
+                        $core->hidden_perm_sections[] = $section['title'];
316
+
317
+                        foreach ( $section['fields'] as $field_data ) {
318
+                            $field_type = $field_data['type'];
319
+
320
+                            if ( ! in_array( $field_type, array( 'section', 'divide', 'info', 'raw' ), true ) ) {
321
+                                $field_id = $field_data['id'];
322
+                                $default  = $core->options_defaults[ $field_id ] ?? '';
323
+                                $data     = $core->options[ $field_id ] ?? $default;
324
+
325
+                                $this->hidden_perm_fields[ $field_id ] = $data;
326
+                            }
327
+                        }
328
+
329
+                        continue;
330
+                    }
331
+                }
332
+
333
+                if ( ! $display || ! function_exists( 'add_settings_section' ) ) {
334
+                    $this->no_panel_section[ $k ] = $section;
335
+                } else {
336
+                    add_settings_section(
337
+                        $core->args['opt_name'] . $k . '_section',
338
+                        $heading,
339
+                        array(
340
+                            $core->render_class,
341
+                            'section_desc',
342
+                        ),
343
+                        $core->args['opt_name'] . $k . '_section_group'
344
+                    );
345
+                }
346
+
347
+                $section_ident = false;
348
+                if ( isset( $section['fields'] ) ) {
349
+                    foreach ( $section['fields'] as $fieldk => $field ) {
350
+                        if ( ! isset( $field['type'] ) ) {
351
+                            continue; // You need a type!
352
+                        }
353
+
354
+                        if ( 'info' === $field['type'] && isset( $field['raw_html'] ) && true === $field['raw_html'] ) {
355
+                            $field['type']                             = 'raw';
356
+                            $field['content']                          = $field['desc'];
357
+                            $field['desc']                             = '';
358
+                            $core->sections[ $k ]['fields'][ $fieldk ] = $field;
359
+                        } elseif ( 'info' === $field['type'] ) {
360
+                            if ( ! isset( $field['full_width'] ) ) {
361
+                                $field['full_width']                       = true;
362
+                                $core->sections[ $k ]['fields'][ $fieldk ] = $field;
363
+                            }
364
+                        }
365
+
366
+                        if ( 'raw' === $field['type'] ) {
367
+                            if ( isset( $field['align'] ) ) {
368
+                                $field['full_width'] = ! $field['align'];
369
+                                unset( $field['align'] );
370
+                            } elseif ( ! isset( $field['full_width'] ) ) {
371
+                                $field['full_width'] = true;
372
+                            }
373
+                            $core->sections[ $k ]['fields'][ $fieldk ] = $field;
374
+                        }
375
+
376
+                        /**
377
+                         * Filter 'redux/options/{opt_name}/field/{field.id}'
378
+                         *
379
+                         * @param array $field field config
380
+                         */
381
+
382
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
383
+                        $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}/register", $field );
384
+
385
+                        $core->field_types[ $field['type'] ] = $core->field_types[ $field['type'] ] ?? array();
386
+
387
+                        $core->field_sections[ $field['type'] ][ $field['id'] ] = $k;
388
+
389
+                        $display = true;
390
+
391
+                        if ( isset( $_GET['page'] ) && $core->args['page_slug'] === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification
392
+                            if ( isset( $field['panel'] ) && false === $field['panel'] ) {
393
+                                $display = false;
394
+                            }
395
+                        }
396
+                        if ( isset( $field['customizer_only'] ) && true === $field['customizer_only'] ) {
397
+                            $display = false;
398
+                        }
399
+
400
+                        if ( isset( $section['customizer'] ) ) {
401
+                            $field['customizer']                       = $section['customizer'];
402
+                            $core->sections[ $k ]['fields'][ $fieldk ] = $field;
403
+                        }
404
+
405
+                        if ( isset( $field['permissions'] ) && false !== $field['permissions'] ) {
406
+                            if ( ! Redux_Helpers::current_user_can( $field['permissions'] ) ) {
407
+                                $data = $core->options[ $field['id'] ] ?? $core->options_defaults[ $field['id'] ];
408
+
409
+                                $this->hidden_perm_fields[ $field['id'] ] = $data;
410
+
411
+                                continue;
412
+                            }
413
+                        }
414
+
415
+                        if ( ! isset( $field['id'] ) ) {
416
+                            echo '<br /><h3>No field ID is set.</h3><pre>';
417
+
418
+                            // phpcs:ignore WordPress.PHP.DevelopmentFunctions
419
+                            print_r( $field );
420
+
421
+                            echo '</pre><br />';
422
+
423
+                            continue;
424
+                        }
425
+
426
+                        if ( isset( $field['type'] ) && 'section' === $field['type'] ) {
427
+                            if ( isset( $field['indent'] ) && true === $field['indent'] ) {
428
+                                $section_ident = true;
429
+                            } else {
430
+                                $section_ident = false;
431
+                            }
432
+                        }
433
+
434
+                        if ( isset( $field['type'] ) && 'info' === $field['type'] && $section_ident ) {
435
+                            $field['indent'] = true;
436
+                        }
437
+
438
+                        $th = $core->render_class->get_header_html( $field );
439
+
440
+                        $field['name'] = $core->args['opt_name'] . '[' . $field['id'] . ']';
441
+
442
+                        // Set the default value if present.
443
+                        $core->options_defaults[ $field['id'] ] = $core->options_defaults[ $field['id'] ] ?? '';
444
+
445
+                        // Set the defaults to the value if not present.
446
+                        $do_update = false;
447
+
448
+                        // Check fields for values in the default parameter.
449
+                        if ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['default'] ) ) {
450
+                            $core->options_defaults[ $field['id'] ] = $field['default'];
451
+                            $core->options[ $field['id'] ]          = $field['default'];
452
+                            $do_update                              = true;
453
+
454
+                            // Check fields that hae no default value, but an option value with settings to
455
+                            // be saved by default.
456
+                        } elseif ( ! isset( $core->options[ $field['id'] ] ) && isset( $field['options'] ) ) {
457
+
458
+                            // If a sorter field, check for options and save them as defaults.
459
+                            if ( 'sorter' === $field['type'] || 'sortable' === $field['type'] ) {
460
+                                $core->options_defaults[ $field['id'] ] = $field['options'];
461
+                                $core->options[ $field['id'] ]          = $field['options'];
462
+                                $do_update                              = true;
463
+                            }
464
+                        }
465
+
466
+                        // CORRECT URLS if media URLs are wrong, but attachment IDs are present.
467
+                        if ( 'media' === $field['type'] ) {
468
+                            if ( isset( $core->options[ $field['id'] ]['id'] ) && isset( $core->options[ $field['id'] ]['url'] ) && ! empty( $core->options[ $field['id'] ]['url'] ) && strpos( $core->options[ $field['id'] ]['url'], str_replace( 'http://', '', WP_CONTENT_URL ) ) === false ) {
469
+                                $data = wp_get_attachment_url( $core->options[ $field['id'] ]['id'] );
470
+
471
+                                if ( isset( $data ) && ! empty( $data ) ) {
472
+                                    $core->options[ $field['id'] ]['url'] = $data;
473
+
474
+                                    $data = wp_get_attachment_image_src(
475
+                                        $core->options[ $field['id'] ]['id'],
476
+                                        array(
477
+                                            150,
478
+                                            150,
479
+                                        )
480
+                                    );
481
+
482
+                                    $core->options[ $field['id'] ]['thumbnail'] = $data[0];
483
+                                    $do_update                                  = true;
484
+                                }
485
+                            }
486
+                        }
487
+
488
+                        if ( 'background' === $field['type'] ) {
489
+                            if ( isset( $core->options[ $field['id'] ]['media']['id'] ) && isset( $core->options[ $field['id'] ]['background-image'] ) && ! empty( $core->options[ $field['id'] ]['background-image'] ) && strpos( $core->options[ $field['id'] ]['background-image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
490
+                                $data = wp_get_attachment_url( $core->options[ $field['id'] ]['media']['id'] );
491
+
492
+                                if ( isset( $data ) && ! empty( $data ) ) {
493
+                                    $core->options[ $field['id'] ]['background-image'] = $data;
494
+
495
+                                    $data = wp_get_attachment_image_src(
496
+                                        $core->options[ $field['id'] ]['media']['id'],
497
+                                        array(
498
+                                            150,
499
+                                            150,
500
+                                        )
501
+                                    );
502
+
503
+                                    $core->options[ $field['id'] ]['media']['thumbnail'] = $data[0];
504
+                                    $do_update = true;
505
+                                }
506
+                            }
507
+                        }
508
+
509
+                        if ( 'slides' === $field['type'] ) {
510
+                            if ( isset( $core->options[ $field['id'] ] ) && is_array( $core->options[ $field['id'] ] ) && isset( $core->options[ $field['id'] ][0]['attachment_id'] ) && isset( $core->options[ $field['id'] ][0]['image'] ) && ! empty( $core->options[ $field['id'] ][0]['image'] ) && strpos( $core->options[ $field['id'] ][0]['image'], str_replace( array( 'http://', 'https://' ), '', WP_CONTENT_URL ) ) === false ) {
511
+                                foreach ( $core->options[ $field['id'] ] as $key => $val ) {
512
+                                    $data = wp_get_attachment_url( $val['attachment_id'] );
513
+
514
+                                    if ( isset( $data ) && ! empty( $data ) ) {
515
+                                        $core->options[ $field['id'] ][ $key ]['image'] = $data;
516
+
517
+                                        $data = wp_get_attachment_image_src(
518
+                                            $val['attachment_id'],
519
+                                            array(
520
+                                                150,
521
+                                                150,
522
+                                            )
523
+                                        );
524
+
525
+                                        $core->options[ $field['id'] ][ $key ]['thumb'] = $data[0];
526
+                                        $do_update                                      = true;
527
+                                    }
528
+                                }
529
+                            }
530
+                        }
531
+                        // END -> CORRECT URLS if media URLs are wrong, but attachment IDs are present.
532
+                        if ( true === $do_update && ! isset( $core->never_save_to_db ) ) {
533
+                            if ( $core->args['save_defaults'] ) { // Only save that to the DB if allowed to.
534
+                                $run_update = true;
535
+                            }
536
+                        }
537
+
538
+                        if ( ! isset( $field['class'] ) ) { // No errors, please.
539
+                            $field['class'] = '';
540
+                        }
541
+
542
+                        /**
543
+                         * Filter 'redux/options/{opt_name}/field/{field.id}'.
544
+                         *
545
+                         * @param array $field field config
546
+                         */
547
+
548
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
549
+                        $field = apply_filters( "redux/options/{$core->args['opt_name']}/field/{$field['id']}", $field );
550
+
551
+                        if ( empty( $field ) ) {
552
+                            unset( $core->sections[ $k ]['fields'][ $fieldk ] );
553
+                            continue;
554
+                        }
555
+
556
+                        if ( ! empty( Redux_Core::$folds[ $field['id'] ]['parent'] ) ) { // This has some fold items, hide it by default.
557
+                            $field['class'] .= ' fold';
558
+                        }
559
+
560
+                        if ( ! empty( Redux_Core::$folds[ $field['id'] ]['children'] ) ) { // Sets the values you shoe fold children on.
561
+                            $field['class'] .= ' fold-parent';
562
+                        }
563
+
564
+                        if ( ! empty( $field['compiler'] ) ) {
565
+                            $field['class']                       .= ' compiler';
566
+                            $core->compiler_fields[ $field['id'] ] = 1;
567
+                        }
568
+
569
+                        if ( isset( $field['unit'] ) && ! isset( $field['units'] ) ) {
570
+                            $field['units'] = $field['unit'];
571
+                            unset( $field['unit'] );
572
+                        }
573
+
574
+                        $core->sections[ $k ]['fields'][ $fieldk ] = $field;
575
+
576
+                        if ( isset( $core->args['display_source'] ) ) {
577
+                            // phpcs:ignore WordPress.PHP.DevelopmentFunctions
578
+                            $th .= '<div id="' . $field['id'] . '-settings" style="display:none;"><pre>' . var_export( $core->sections[ $k ]['fields'][ $fieldk ], true ) . '</pre></div>';
579
+                            $th .= '<br /><a href="#TB_inline?width=600&height=800&inlineId=' . $field['id'] . '-settings" class="thickbox"><small>View Source</small></a>';
580
+                        }
581
+
582
+                        /**
583
+                         * Action 'redux/options/{opt_name}/field/{field.type}/register'
584
+                         */
585
+
586
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
587
+                        do_action( "redux/options/{$core->args['opt_name']}/field/{$field['type']}/register", $field );
588
+
589
+                        $core->required_class->check_dependencies( $field );
590
+                        $core->field_head[ $field['id'] ] = $th;
591
+
592
+                        if ( ! $display || isset( $this->no_panel_section[ $k ] ) ) {
593
+                            $this->no_panel[] = $field['id'];
594
+                        } else {
595
+                            if ( isset( $field['disabled'] ) && $field['disabled'] ) {
596
+                                $field['class'] .= ' redux_disable_field';
597
+                            }
598
+
599
+                            if ( isset( $field['hidden'] ) && $field['hidden'] ) {
600
+                                $field['class'] .= ' redux_hide_field';
601
+                            }
602
+
603
+                            if ( true === $core->args['options_api'] ) {
604
+                                add_settings_field(
605
+                                    "{$fieldk}_field",
606
+                                    $th,
607
+                                    array(
608
+                                        $core->render_class,
609
+                                        'field_input',
610
+                                    ),
611
+                                    "{$core->args['opt_name']}{$k}_section_group",
612
+                                    "{$core->args['opt_name']}{$k}_section",
613
+                                    $field
614
+                                );
615
+                            }
616
+                        }
617
+                    }
618
+                }
619
+            }
620
+
621
+            /**
622
+             * Action 'redux/options/{opt_name}/register'
623
+             *
624
+             * @param array $section Option sections
625
+             */
626
+
627
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
628
+            do_action( "redux/options/{$core->args['opt_name']}/register", $core->sections );
629
+
630
+            if ( $run_update && ! isset( $core->never_save_to_db ) ) { // Always update the DB with new fields.
631
+                $this->set( $core->options );
632
+            }
633
+
634
+            if ( isset( $core->transients['run_compiler'] ) && $core->transients['run_compiler'] ) {
635
+
636
+                Redux_Core::$no_output = true;
637
+                $temp                  = $core->args['output_variables_prefix'];
638
+
639
+                // Allow the override of variable's prefix for use by SCSS or LESS.
640
+                if ( isset( $core->args['compiler_output_variables_prefix'] ) ) {
641
+                    $core->args['output_variables_prefix'] = $core->args['compiler_output_variables_prefix'];
642
+                }
643
+                $core->output_class->enqueue();
644
+                $core->args['output_variables_prefix'] = $temp;
645
+
646
+                // phpcs:ignore WordPress.NamingConventions.ValidVariableName
647
+                $compiler_css = $core->compilerCSS;
648
+
649
+                /**
650
+                 * Action 'redux/options/{opt_name}/compiler'
651
+                 *
652
+                 * @param array  $options Options.
653
+                 * @param string $css CSS that get sent to the compiler hook.
654
+                 * @param array  $changed_values Changed values.
655
+                 * @param array  $output_variables Output variables.
656
+                 */
657
+
658
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
659
+                do_action( "redux/options/{$core->args['opt_name']}/compiler", $core->options, $compiler_css, $core->transients['changed_values'], $core->output_variables );
660
+
661
+                /**
662
+                 * Action 'redux/options/{opt_name}/compiler/advanced'
663
+                 *
664
+                 * @param object $redux ReduxFramework object.
665
+                 */
666
+
667
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
668
+                do_action( "redux/options/{$core->args['opt_name']}/compiler/advanced", $core );
669
+
670
+                unset( $core->transients['run_compiler'] );
671
+                $core->transient_class->set();
672
+            }
673
+        }
674
+
675
+        /**
676
+         * Get default options into an array suitable for the settings API
677
+         *
678
+         * @since       1.0.0
679
+         * @access      public
680
+         * @return      array $this->options_defaults
681
+         */
682
+        public function default_values(): array {
683
+            $core = $this->core();
684
+
685
+            if ( ! is_null( $core->sections ) && is_null( $core->options_defaults ) ) {
686
+                $core->options_defaults = $core->options_defaults_class->default_values( $core->args['opt_name'], $core->sections, $core->wordpress_data );
687
+            }
688
+
689
+            /**
690
+             * Filter 'redux/options/{opt_name}/defaults'
691
+             *
692
+             * @param array $defaults option default values
693
+             */
694
+
695
+            $core->transients['changed_values'] = $core->transients['changed_values'] ?? array();
696
+
697
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
698
+            $core->options_defaults = apply_filters( "redux/options/{$core->args['opt_name']}/defaults", $core->options_defaults, $core->transients['changed_values'] );
699
+
700
+            return $core->options_defaults;
701
+        }
702
+
703
+        /**
704
+         * Validate the Options before insertion
705
+         *
706
+         * @param  array $plugin_options The option array.
707
+         *
708
+         * @return array|mixed|string
709
+         * @since  3.0.0
710
+         * @access public
711
+         */
712
+        public function validate_options( array $plugin_options ) {
713
+            $core = $this->core();
714
+
715
+            if ( true === Redux_Core::$validation_ran ) {
716
+                return $plugin_options;
717
+            }
718
+
719
+            Redux_Core::$validation_ran = true;
720
+
721
+            // Save the values not in the panel.
722
+            if ( isset( $plugin_options['redux-no_panel'] ) ) {
723
+                $keys = explode( '|', $plugin_options['redux-no_panel'] );
724
+                foreach ( $keys as $key ) {
725
+                    $plugin_options[ $key ] = $core->options[ $key ];
726
+                }
727
+                if ( isset( $plugin_options['redux-no_panel'] ) ) {
728
+                    unset( $plugin_options['redux-no_panel'] );
729
+                }
730
+            }
731
+
732
+            if ( is_array( $this->hidden_perm_fields ) && ! empty( $this->hidden_perm_fields ) ) {
733
+                foreach ( $this->hidden_perm_fields as $id => $data ) {
734
+                    $plugin_options[ $id ] = $data;
735
+                }
736
+            }
737
+
738
+            if ( $plugin_options === $core->options ) {
739
+                return $plugin_options;
740
+            }
741
+
742
+            $time = time();
743
+
744
+            // Sets last saved time.
745
+            $core->transients['last_save'] = $time;
746
+
747
+            $imported_options = array();
748
+
749
+            if ( isset( $plugin_options['import_code'] ) && '' !== $plugin_options['import_code'] ) {
750
+                $imported_options = json_decode( $plugin_options['import_code'], true );
751
+            }
752
+
753
+            // Import.
754
+            $core->transients['last_save_mode'] = 'import'; // Last save mode.
755
+            $core->transients['last_compiler']  = $time;
756
+            $core->transients['last_import']    = $time;
757
+            $core->transients['run_compiler']   = 1;
758
+
759
+            if ( is_array( $imported_options ) && ! empty( $imported_options ) && isset( $imported_options['redux-backup'] ) && ( 1 === $imported_options['redux-backup'] || '1' === $imported_options['redux-backup'] ) ) {
760
+                $core->transients['changed_values'] = array();
761
+                foreach ( $plugin_options as $key => $value ) {
762
+                    if ( isset( $imported_options[ $key ] ) && $value !== $imported_options[ $key ] ) {
763
+                        $plugin_options[ $key ]                     = $value;
764
+                        $core->transients['changed_values'][ $key ] = $value;
765
+                    }
766
+                }
767
+
768
+                /**
769
+                 * Action 'redux/options/{opt_name}/import'.
770
+                 *
771
+                 * @param  &array [&$plugin_options, redux_options]
772
+                 */
773
+
774
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
775
+                do_action_ref_array(
776
+                    "redux/options/{$core->args['opt_name']}/import", // phpcs:ignore WordPress.NamingConventions.ValidHookName
777
+                    array(
778
+                        &$plugin_options,
779
+                        $imported_options,
780
+                        $core->transients['changed_values'],
781
+                    )
782
+                );
783
+
784
+                setcookie( 'redux_current_tab_' . $core->args['opt_name'], '', 1, '/', $time + 1000, '/' );
785
+                $_COOKIE[ 'redux_current_tab_' . $core->args['opt_name'] ] = 1;
786
+
787
+                unset( $plugin_options['defaults'], $plugin_options['compiler'], $plugin_options['import'], $plugin_options['import_code'] );
788
+                if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded', 'network' ), true ) ) {
789
+                    $this->set( $plugin_options );
790
+
791
+                    return null;
792
+                }
793
+
794
+                $plugin_options = wp_parse_args( $imported_options, $plugin_options );
795
+
796
+                $core->transient_class->set();
797
+
798
+                return $plugin_options;
799
+            }
800
+
801
+            // Reset all to defaults.
802
+            if ( ! empty( $plugin_options['defaults'] ) ) {
803
+                if ( empty( $core->options_defaults ) ) {
804
+                    $core->options_defaults = $core->_default_values();
805
+                }
806
+
807
+                /**
808
+                 * Filter: 'redux/validate/{opt_name}/defaults'.
809
+                 *
810
+                 * @param  &array [ $this->options_defaults, $plugin_options]
811
+                 */
812
+
813
+                // phpcs:ignore WordPress.NamingConventions.ValidHookName
814
+                $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults", $core->options_defaults );
815
+
816
+                $core->transients['changed_values'] = array();
817
+
818
+                if ( empty( $core->options ) ) {
819
+                    $core->options = $core->options_defaults;
820
+                }
821
+
822
+                foreach ( $core->options as $key => $value ) {
823
+                    if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
824
+                        $core->transients['changed_values'][ $key ] = $value;
825
+                    }
826
+                }
827
+
828
+                $core->transients['run_compiler']   = 1;
829
+                $core->transients['last_save_mode'] = 'defaults'; // Last save mode.
830
+
831
+                $core->transient_class->set();
832
+
833
+                return $plugin_options;
834
+            }
835
+
836
+            // Section reset to default.
837
+            if ( ! empty( $plugin_options['defaults-section'] ) ) {
838
+                if ( isset( $plugin_options['redux-section'] ) && isset( $core->sections[ $plugin_options['redux-section'] ]['fields'] ) ) {
839
+                    if ( empty( $core->options_defaults ) ) {
840
+                        $core->options_defaults = $core->_default_values();
841
+                    }
842
+
843
+                    foreach ( $core->sections[ $plugin_options['redux-section'] ]['fields'] as $field ) {
844
+                        if ( 'tabbed' === $field['type'] ) {
845
+                            if ( ! empty( $field['tabs'] ) ) {
846
+                                foreach ( $field['tabs'] as $val ) {
847
+                                    if ( ! empty( $val['fields'] ) ) {
848
+                                        foreach ( $val['fields'] as $f ) {
849
+                                            if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
850
+                                                $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
851
+                                            } else {
852
+                                                $plugin_options[ $f['id'] ] = '';
853
+                                            }
854
+                                        }
855
+                                    }
856
+                                }
857
+                            }
858
+                        } elseif ( 'repeater' === $field['type'] ) {
859
+                            if ( ! empty( $field['fields'] ) ) {
860
+                                foreach ( $field['fields'] as $f ) {
861
+                                    if ( isset( $core->options_defaults[ $f['id'] ] ) ) {
862
+                                        $plugin_options[ $f['id'] ] = $core->options_defaults[ $f['id'] ];
863
+                                    } else {
864
+                                        $plugin_options[ $f['id'] ] = '';
865
+                                    }
866
+                                }
867
+                            }
868
+                        } else {
869
+                            if ( isset( $core->options_defaults[ $field['id'] ] ) ) {
870
+                                $plugin_options[ $field['id'] ] = $core->options_defaults[ $field['id'] ];
871
+                            } else {
872
+                                $plugin_options[ $field['id'] ] = '';
873
+                            }
874
+                        }
875
+
876
+                        if ( isset( $field['compiler'] ) ) {
877
+                            $compiler = true;
878
+                        }
879
+                    }
880
+
881
+                    /**
882
+                     * Filter: 'redux/validate/{opt_name}/defaults_section'.
883
+                     *
884
+                     * @param  &array [ $this->options_defaults, $plugin_options]
885
+                     */
886
+
887
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
888
+                    $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/defaults_section", $plugin_options );
889
+                }
890
+
891
+                $core->transients['changed_values'] = array();
892
+
893
+                foreach ( $core->options as $key => $value ) {
894
+                    if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
895
+                        $core->transients['changed_values'][ $key ] = $value;
896
+                    }
897
+                }
898
+
899
+                if ( isset( $compiler ) ) {
900
+                    $core->transients['last_compiler'] = $time;
901
+                    $core->transients['run_compiler']  = 1;
902
+                }
903
+
904
+                $core->transients['last_save_mode'] = 'defaults_section'; // Last save mode.
905
+
906
+                unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
907
+
908
+                $core->transient_class->set();
909
+
910
+                return $plugin_options;
911
+            }
912
+
913
+            $core->transients['last_save_mode'] = 'normal'; // Last save mode.
914
+
915
+            /**
916
+             * Filter: 'redux/validate/{opt_name}/before_validation'
917
+             *
918
+             * @param  &array [&$plugin_options, redux_options]
919
+             */
920
+
921
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
922
+            $plugin_options = apply_filters( "redux/validate/{$core->args['opt_name']}/before_validation", $plugin_options, $core->options );
923
+
924
+            // Validate fields (if needed).
925
+            $plugin_options = $core->validate_class->validate( $plugin_options, $core->options, $core->sections );
926
+
927
+            // Sanitize options, if needed.
928
+            $plugin_options = $core->sanitize_class->sanitize( $plugin_options, $core->options, $core->sections );
929
+
930
+            if ( ! empty( $core->errors ) || ! empty( $core->warnings ) || ! empty( $core->sanitize ) ) {
931
+                $core->transients['notices'] = array(
932
+                    'errors'   => $core->errors,
933
+                    'warnings' => $core->warnings,
934
+                    'sanitize' => $core->sanitize,
935
+                );
936
+            }
937
+
938
+            if ( ! isset( $core->transients['changed_values'] ) ) {
939
+                $core->transients['changed_values'] = array();
940
+            }
941
+
942
+            /**
943
+             * Action 'redux/options/{opt_name}/validate'
944
+             *
945
+             * @param  &array [&$plugin_options, redux_options]
946
+             */
947
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
948
+            do_action_ref_array(
949
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
950
+                "redux/options/{$core->args['opt_name']}/validate",
951
+                array(
952
+                    &$plugin_options,
953
+                    $core->options,
954
+                    $core->transients['changed_values'],
955
+                )
956
+            );
957
+
958
+            if ( ! empty( $plugin_options['compiler'] ) ) {
959
+                unset( $plugin_options['compiler'] );
960
+
961
+                $core->transients['last_compiler'] = $time;
962
+                $core->transients['run_compiler']  = 1;
963
+            }
964
+
965
+            $core->transients['changed_values'] = array(); // Changed values since last save.
966
+
967
+            if ( ! empty( $core->options ) ) {
968
+                foreach ( $core->options as $key => $value ) {
969
+                    if ( isset( $plugin_options[ $key ] ) && $plugin_options[ $key ] !== $value ) {
970
+                        $core->transients['changed_values'][ $key ] = $value;
971
+                    }
972
+                }
973
+            }
974
+
975
+            unset( $plugin_options['defaults'], $plugin_options['defaults_section'], $plugin_options['import'], $plugin_options['import_code'], $plugin_options['import_link'], $plugin_options['compiler'], $plugin_options['redux-section'] );
976
+            if ( in_array( $core->args['database'], array( 'transient', 'theme_mods', 'theme_mods_expanded' ), true ) ) {
977
+                $core->set( $core->args['opt_name'], $plugin_options );
978
+                return null;
979
+            }
980
+
981
+            if ( defined( 'WP_CACHE' ) && WP_CACHE && class_exists( 'W3_ObjectCache' ) && function_exists( 'w3_instance' ) ) {
982
+                $w3_inst = w3_instance( 'W3_ObjectCache' );
983
+                $w3      = $w3_inst->instance();
984
+                $key     = $w3->_get_cache_key( $core->args['opt_name'] . '-transients', 'transient' );
985
+                $w3->delete( $key, 'transient', true );
986
+            }
987
+
988
+            $core->transient_class->set();
989
+
990
+            return $plugin_options;
991
+        }
992
+
993
+        /**
994
+         * ->get_default(); This is used to return the default value if default_show is set.
995
+         *
996
+         * @param string $opt_name The option name to return.
997
+         * @param mixed  $defaults (null) The value to return if default not set.
998
+         *
999
+         * @return      mixed $default
1000
+         * @since       1.0.1
1001
+         * @access      public
1002
+         */
1003
+        public function get_default( string $opt_name, $defaults = null ) {
1004
+            if ( true === $this->args['default_show'] ) {
1005
+
1006
+                if ( empty( $this->options_defaults ) ) {
1007
+                    $this->default_values(); // fill cache.
1008
+                }
1009
+
1010
+                return array_key_exists( $opt_name, $this->options_defaults ) ? $this->options_defaults[ $opt_name ] : $defaults;
1011
+            }
1012
+
1013
+            return '';
1014
+        }
1015
+
1016
+        /**
1017
+         * Get the default value for an option
1018
+         *
1019
+         * @param string $key       The option's ID.
1020
+         * @param string $array_key The key of the default's array.
1021
+         *
1022
+         * @return mixed
1023
+         * @since  3.3.6
1024
+         * @access public
1025
+         */
1026
+        public function get_default_value( string $key, $array_key = false ) {
1027
+            if ( empty( $this->options_defaults ) ) {
1028
+                $this->options_defaults = $this->default_values();
1029
+            }
1030
+
1031
+            $defaults = $this->options_defaults;
1032
+            $value    = '';
1033
+
1034
+            if ( isset( $defaults[ $key ] ) ) {
1035
+                if ( false !== $array_key && isset( $defaults[ $key ][ $array_key ] ) ) {
1036
+                    $value = $defaults[ $key ][ $array_key ];
1037
+                } else {
1038
+                    $value = $defaults[ $key ];
1039
+                }
1040
+            }
1041
+
1042
+            return $value;
1043
+        }
1044
+    }
1045 1045
 }
Please login to merge, or discard this patch.
redux-core/class-redux-core.php 2 patches
Indentation   +614 added lines, -614 removed lines patch added patch discarded remove patch
@@ -11,620 +11,620 @@
 block discarded – undo
11 11
 
12 12
 if ( ! class_exists( 'Redux_Core', false ) ) {
13 13
 
14
-	/**
15
-	 * Class Redux_Core
16
-	 */
17
-	class Redux_Core {
18
-
19
-		/**
20
-		 * Class instance.
21
-		 *
22
-		 * @var null|Redux_Core
23
-		 */
24
-		public static ?Redux_Core $instance = null;
25
-
26
-		/**
27
-		 * Project version
28
-		 *
29
-		 * @var string
30
-		 */
31
-		public static string $version;
32
-
33
-		/**
34
-		 * Project directory.
35
-		 *
36
-		 * @var string.
37
-		 */
38
-		public static string $dir;
39
-
40
-		/**
41
-		 * Project URL.
42
-		 *
43
-		 * @var string.
44
-		 */
45
-		public static string $url;
46
-
47
-		/**
48
-		 * Base directory path.
49
-		 *
50
-		 * @var string
51
-		 */
52
-		public static string $redux_path;
53
-
54
-		/**
55
-		 * Absolute direction path to WordPress upload directory.
56
-		 *
57
-		 * @var string
58
-		 */
59
-		public static string $upload_dir = '';
60
-
61
-		/**
62
-		 * Full URL to WordPress upload directory.
63
-		 *
64
-		 * @var null|string
65
-		 */
66
-		public static ?string $upload_url = '';
67
-
68
-		/**
69
-		 * Set when Redux is run as a plugin.
70
-		 *
71
-		 * @var bool
72
-		 */
73
-		public static bool $is_plugin = true;
74
-
75
-		/**
76
-		 * Indicated in_theme or in_plugin.
77
-		 *
78
-		 * @var string
79
-		 */
80
-		public static string $installed = '';
81
-
82
-		/**
83
-		 * Set when Redux is run as a plugin.
84
-		 *
85
-		 * @var bool
86
-		 */
87
-		public static bool $as_plugin = false;
88
-
89
-		/**
90
-		 * Set when Redux is embedded within a theme.
91
-		 *
92
-		 * @var bool
93
-		 */
94
-		public static bool $in_theme = false;
95
-
96
-		/**
97
-		 * Pointer to an updated Google fonts array.
98
-		 *
99
-		 * @var array|null
100
-		 */
101
-		public static ?array $updated_google_fonts = array();
102
-
103
-		/**
104
-		 * List of files calling Redux.
105
-		 *
106
-		 * @var array|null
107
-		 */
108
-		public static ?array $callers = array();
109
-
110
-		/**
111
-		 * Pointer to _SERVER global.
112
-		 *
113
-		 * @var array|null
114
-		 */
115
-		public static ?array $server = array();
116
-
117
-		/**
118
-		 * Field folding information for localization.
119
-		 *
120
-		 * @var null|array
121
-		 */
122
-		public static ?array $required = array();
123
-
124
-		/**
125
-		 * Field child-folding information for localization.
126
-		 *
127
-		 * @var null|array
128
-		 */
129
-		public static ?array $required_child = array();
130
-
131
-		/**
132
-		 * Array of fields to be folded.
133
-		 *
134
-		 * @var array|null
135
-		 */
136
-		public static ?array $folds = array();
137
-
138
-		/**
139
-		 * Array of fields that didn't pass the fold dependency test and are hidden.
140
-		 *
141
-		 * @var null|array
142
-		 */
143
-		public static ?array $fields_hidden = array();
144
-
145
-		/**
146
-		 * Values to generate google font CSS.
147
-		 *
148
-		 * @var null|array
149
-		 */
150
-		public static ?array $typography = array();
151
-
152
-		/**
153
-		 * Validation ran flag.
154
-		 *
155
-		 * @var bool
156
-		 */
157
-		public static bool $validation_ran = false;
158
-
159
-		/**
160
-		 * No output flag.
161
-		 *
162
-		 * @var bool
163
-		 */
164
-		public static bool $no_output = false;
165
-
166
-		/**
167
-		 * Array of fonts used by the panel for localization.
168
-		 *
169
-		 * @var null|array
170
-		 */
171
-		public static ?array $fonts = array();
172
-
173
-		/**
174
-		 * Array of Google fonts used by the panel for localization.
175
-		 *
176
-		 * @var null|array
177
-		 */
178
-		public static ?array $google_array = array();
179
-
180
-		/**
181
-		 * Array of various font groups used within the typography field.
182
-		 *
183
-		 * @var null|array
184
-		 */
185
-		public static ?array $font_groups = array();
186
-
187
-		/**
188
-		 * File system object used for I/O file operations.  Done the WordPress way.
189
-		 *
190
-		 * @var null|object
191
-		 */
192
-		public static ?object $filesystem;
193
-
194
-		/**
195
-		 * Pointer to the third party fixes class.
196
-		 *
197
-		 * @var Redux_ThirdParty_Fixes
198
-		 */
199
-		public static Redux_ThirdParty_Fixes $third_party_fixes;
200
-
201
-		/**
202
-		 * Redux Welcome screen object.
203
-		 *
204
-		 * @var Redux_Welcome
205
-		 */
206
-		public static Redux_Welcome $welcome;
207
-
208
-		/**
209
-		 * Creates instance of class.
210
-		 *
211
-		 * @return Redux_Core
212
-		 * @throws Exception Comment.
213
-		 */
214
-		public static function instance(): ?Redux_Core {
215
-			if ( ! self::$instance ) {
216
-				self::$instance = new self();
217
-
218
-				self::$instance->includes();
219
-				self::$instance->init();
220
-				self::$instance->hooks();
221
-
222
-				add_action( 'plugins_loaded', array( 'Redux_Core', 'plugins_loaded' ) );
223
-			}
224
-
225
-			return self::$instance;
226
-		}
227
-
228
-		/**
229
-		 * Things to run after pluggable.php had loaded.
230
-		 */
231
-		public static function plugins_loaded() {}
232
-
233
-		/**
234
-		 * Class init.
235
-		 */
236
-		private function init() {
237
-			self::$server = array(
238
-				'SERVER_SOFTWARE' => '',
239
-				'REMOTE_ADDR'     => Redux_Helpers::is_local_host() ? '127.0.0.1' : '',
240
-				'HTTP_USER_AGENT' => '',
241
-				'HTTP_HOST'       => '',
242
-				'REQUEST_URI'     => '',
243
-			);
244
-
245
-			// phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
246
-			if ( ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) {
247
-				self::$server['SERVER_SOFTWARE'] = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) );
248
-			}
249
-			if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) {
250
-				self::$server['REMOTE_ADDR'] = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) );
251
-			}
252
-			if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
253
-				self::$server['HTTP_USER_AGENT'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) );
254
-			}
255
-			if ( ! empty( $_SERVER['HTTP_HOST'] ) ) {
256
-				self::$server['HTTP_HOST'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) );
257
-			}
258
-			if ( ! empty( $_SERVER['REQUEST_URI'] ) ) {
259
-				self::$server['REQUEST_URI'] = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) );
260
-			}
261
-
262
-			// phpcs:enable
263
-
264
-			self::$dir = trailingslashit( wp_normalize_path( dirname( realpath( __FILE__ ) ) ) );
265
-
266
-			Redux_Functions_Ex::generator();
267
-
268
-			if ( defined( 'REDUX_PLUGIN_FILE' ) ) {
269
-				$plugin_info = Redux_Functions_Ex::is_inside_plugin( REDUX_PLUGIN_FILE );
270
-			}
271
-
272
-			$plugin_info = Redux_Functions_Ex::is_inside_plugin( __FILE__ );
273
-
274
-			if ( false !== $plugin_info ) {
275
-				self::$installed = class_exists( 'Redux_Framework_Plugin' ) ? 'plugin' : 'in_plugin';
276
-				self::$is_plugin = class_exists( 'Redux_Framework_Plugin' );
277
-				self::$as_plugin = true;
278
-				self::$url       = trailingslashit( dirname( $plugin_info['url'] ) );
279
-			} else {
280
-				$theme_info = Redux_Functions_Ex::is_inside_theme( __FILE__ );
281
-				if ( false !== $theme_info ) {
282
-					self::$url       = trailingslashit( dirname( $theme_info['url'] ) );
283
-					self::$in_theme  = true;
284
-					self::$installed = 'in_theme';
285
-				}
286
-			}
287
-
288
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
289
-			self::$url = apply_filters( 'redux/url', self::$url );
290
-
291
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
292
-			self::$dir = apply_filters( 'redux/dir', self::$dir );
293
-
294
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
295
-			self::$is_plugin = apply_filters( 'redux/is_plugin', self::$is_plugin );
296
-
297
-			if ( ! function_exists( 'current_time' ) ) {
298
-				require_once ABSPATH . '/wp-includes/functions.php';
299
-			}
300
-
301
-			$upload_dir       = wp_upload_dir();
302
-			self::$upload_dir = $upload_dir['basedir'] . '/redux/';
303
-			self::$upload_url = str_replace( array( 'https://', 'http://' ), '//', $upload_dir['baseurl'] . '/redux/' );
304
-
305
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
306
-			self::$upload_dir = apply_filters( 'redux/upload_dir', self::$upload_dir );
307
-
308
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
309
-			self::$upload_url = apply_filters( 'redux/upload_url', self::$upload_url );
310
-		}
311
-
312
-		/**
313
-		 * Code to execute on a framework __construct.
314
-		 *
315
-		 * @param ReduxFramework $redux Pointer to ReduxFramework object.
316
-		 */
317
-		public static function core_construct( ReduxFramework $redux ) {
318
-			self::$third_party_fixes = new Redux_ThirdParty_Fixes( $redux );
319
-
320
-			Redux_ThemeCheck::get_instance();
321
-		}
322
-
323
-		/**
324
-		 * Autoregister run.
325
-		 *
326
-		 * @throws Exception Comment.
327
-		 */
328
-		private function includes() {
329
-			if ( is_admin() ) {
330
-				if ( class_exists( 'Redux_Pro' ) && isset( Redux_Pro::$dir ) ) {
331
-					echo '<div class="error"><p>' . sprintf( esc_html__( 'Redux has detected the Redux Pro plugin is enabled. All featured of Redux Pro are now part of the entire Redux plugin and is no longer required. Please disable the Redux Pro plugin to avoid potential conflicts.', 'redux-framework' ), '<code></code>' ) . '</p></div>';
332
-				}
333
-			}
334
-
335
-			require_once __DIR__ . '/inc/classes/class-redux-path.php';
336
-			require_once __DIR__ . '/inc/classes/class-redux-functions-ex.php';
337
-			require_once __DIR__ . '/inc/classes/class-redux-helpers.php';
338
-			require_once __DIR__ . '/inc/classes/class-redux-instances.php';
339
-
340
-			Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/classes' );
341
-			Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/welcome' );
342
-
343
-			spl_autoload_register( array( $this, 'register_classes' ) );
344
-
345
-			self::$welcome = new Redux_Welcome();
346
-
347
-			add_filter( 'debug_information', array( $this, 'add_debug_info' ) );
348
-		}
349
-
350
-		/**
351
-		 * Add debug info for the WP Site Health screen.
352
-		 *
353
-		 * @param array $debug_info Debug data.
354
-		 *
355
-		 * @return array
356
-		 * @throws ReflectionException Exception.
357
-		 */
358
-		public function add_debug_info( array $debug_info ): array {
359
-
360
-			// Get browser data.
361
-			if ( ! class_exists( 'ReduxBrowser' ) ) {
362
-				require_once self::$dir . 'inc/lib/browser.php';
363
-			}
364
-
365
-			$browser = new ReduxBrowser();
366
-
367
-			$browser_data = array(
368
-				'Agent'    => $browser->getUserAgent(),
369
-				'Browser'  => $browser->getBrowser(),
370
-				'Version'  => $browser->getVersion(),
371
-				'Platform' => $browser->getPlatform(),
372
-			);
373
-
374
-			// Set Redux dir permission results to Site Health screen.
375
-			$debug_info['wp-filesystem']['fields'][] = array(
376
-				'label' => esc_html__( 'The Redux upload directory', 'redux-framework' ),
377
-				'value' => wp_is_writable( self::$upload_dir ) ? 'Writable' : 'Not writable',
378
-			);
379
-
380
-			// Set Redux plugin results to Site Health screen.
381
-			$debug_info['redux-framework'] = array(
382
-				'label'       => esc_html__( 'Redux Framework', 'redux-framework' ),
383
-				'description' => esc_html__( 'Debug information specific to Redux Framework.', 'redux-framework' ),
384
-				'fields'      => array(
385
-					'version'        => array(
386
-						'label' => esc_html__( 'Version', 'redux-framework' ),
387
-						'value' => self::$version,
388
-					),
389
-					'installation'   => array(
390
-						'label' => esc_html__( 'Installation', 'redux-framework' ),
391
-						'value' => self::$installed,
392
-					),
393
-					'data directory' => array(
394
-						'label' => esc_html__( 'Data directory', 'redux-framework' ),
395
-						'value' => self::$dir,
396
-					),
397
-					'browser'        => array(
398
-						'label' => esc_html__( 'Browser', 'redux-framework' ),
399
-						'value' => $browser_data,
400
-					),
401
-				),
402
-			);
403
-
404
-			$redux = Redux::all_instances();
405
-
406
-			$extensions = array();
407
-
408
-			if ( ! empty( $redux ) && is_array( $redux ) ) {
409
-				foreach ( $redux as $inst => $data ) {
410
-					Redux::init( $inst );
411
-
412
-					$inst_name = ucwords( str_replace( array( '_', '-' ), ' ', $inst ) );
413
-					$args      = $data->args;
414
-
415
-					$ext = Redux::get_extensions( $inst );
416
-					if ( ! empty( $ext ) && is_array( $ext ) ) {
417
-						ksort( $ext );
418
-
419
-						foreach ( $ext as $name => $arr ) {
420
-							$ver = $arr['version'];
421
-
422
-							$ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) );
423
-
424
-							$extensions[ $ex ] = esc_html( $ver );
425
-						}
426
-					}
427
-
428
-					// Output Redux instances.
429
-					$debug_info[ 'redux-instance-' . $inst ] = array(
430
-						// translators: %s = Instance name.
431
-						'label'       => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ),
432
-						// translators: %s = Instance name w/ HTML.
433
-						'description' => sprintf( esc_html__( 'Debug information for the %s Redux instance.', 'redux-framework' ), '<code>' . $inst . '</code>' ),
434
-						'fields'      => array(
435
-							'opt_name'         => array(
436
-								'label' => esc_html( 'opt_name' ),
437
-								'value' => $args['opt_name'],
438
-							),
439
-							'global_variable'  => array(
440
-								'label' => esc_html( 'global_variable' ),
441
-								'value' => $args['global_variable'],
442
-							),
443
-							'dev_mode'         => array(
444
-								'label' => esc_html( 'dev_mode' ),
445
-								'value' => $args['dev_mode'] ? 'true' : 'false',
446
-							),
447
-							'ajax_save'        => array(
448
-								'label' => esc_html( 'ajax_save' ),
449
-								'value' => $args['ajax_save'] ? 'true' : 'false',
450
-							),
451
-							'page_slug'        => array(
452
-								'label' => esc_html( 'page_slug' ),
453
-								'value' => $args['page_slug'],
454
-							),
455
-							'page_permissions' => array(
456
-								'label' => esc_html( 'page_permissions' ),
457
-								'value' => $args['page_permissions'],
458
-							),
459
-							'menu_type'        => array(
460
-								'label' => esc_html( 'menu_type' ),
461
-								'value' => $args['menu_type'],
462
-							),
463
-							'page_parent'      => array(
464
-								'label' => esc_html( 'page_parent' ),
465
-								'value' => $args['page_parent'],
466
-							),
467
-							'compiler'         => array(
468
-								'label' => esc_html( 'compiler' ),
469
-								'value' => $args['compiler'] ? 'true' : 'false',
470
-							),
471
-							'output'           => array(
472
-								'label' => esc_html( 'output' ),
473
-								'value' => $args['output'] ? 'true' : 'false',
474
-							),
475
-							'output_tag'       => array(
476
-								'label' => esc_html( 'output_tag' ),
477
-								'value' => $args['output_tag'] ? 'true' : 'false',
478
-							),
479
-							'templates_path'   => array(
480
-								'label' => esc_html( 'templates_path' ),
481
-								'value' => $args['templates_path'],
482
-							),
483
-							'extensions'       => array(
484
-								'label' => esc_html( 'extensions' ),
485
-								'value' => $extensions,
486
-							),
487
-						),
488
-					);
489
-				}
490
-			}
491
-
492
-			return $debug_info;
493
-		}
494
-
495
-		/**
496
-		 * Register callback for autoload.
497
-		 *
498
-		 * @param string $class_name name of class.
499
-		 */
500
-		public function register_classes( string $class_name ) {
501
-			$class_name_test = self::strtolower( $class_name );
502
-
503
-			if ( strpos( $class_name_test, 'redux' ) === false ) {
504
-				return;
505
-			}
506
-
507
-			if ( ! class_exists( 'Redux_Functions_Ex' ) ) {
508
-				require_once Redux_Path::get_path( '/inc/classes/class-redux-functions-ex.php' );
509
-			}
510
-
511
-			if ( ! class_exists( $class_name ) ) {
512
-				// Backward compatibility for extensions sucks!
513
-				if ( 'Redux_Instances' === $class_name ) {
514
-					require_once Redux_Path::get_path( '/inc/classes/class-redux-instances.php' );
515
-					require_once Redux_Path::get_path( '/inc/lib/redux-instances.php' );
516
-
517
-					return;
518
-				}
519
-
520
-				// Load Redux APIs.
521
-				if ( 'Redux' === $class_name ) {
522
-					require_once Redux_Path::get_path( '/inc/classes/class-redux-api.php' );
523
-
524
-					return;
525
-				}
526
-
527
-				// Redux extra theme checks.
528
-				if ( 'Redux_ThemeCheck' === $class_name ) {
529
-					require_once Redux_Path::get_path( '/inc/themecheck/class-redux-themecheck.php' );
530
-
531
-					return;
532
-				}
533
-
534
-				if ( 'Redux_Welcome' === $class_name ) {
535
-					require_once Redux_Path::get_path( '/inc/welcome/class-redux-welcome.php' );
536
-
537
-					return;
538
-				}
539
-
540
-				$mappings = array(
541
-					'ReduxFrameworkInstances'  => 'Redux_Instances',
542
-					'reduxCorePanel'           => 'Redux_Panel',
543
-					'reduxCoreEnqueue'         => 'Redux_Enqueue',
544
-					'Redux_Abstract_Extension' => 'Redux_Extension_Abstract',
545
-				);
546
-				$alias    = false;
547
-				if ( isset( $mappings[ $class_name ] ) ) {
548
-					$alias      = $class_name;
549
-					$class_name = $mappings[ $class_name ];
550
-				}
551
-
552
-				// Everything else.
553
-				$file = 'class.' . $class_name_test . '.php';
554
-
555
-				$class_path = Redux_Path::get_path( '/inc/classes/' . $file );
556
-
557
-				if ( ! file_exists( $class_path ) ) {
558
-					$class_file_name = str_replace( '_', '-', $class_name );
559
-					$file            = 'class-' . $class_name_test . '.php';
560
-					$class_path      = Redux_Path::get_path( '/inc/classes/' . $file );
561
-				}
562
-
563
-				if ( file_exists( $class_path ) && ! class_exists( $class_name ) ) {
564
-					require_once $class_path;
565
-				}
566
-				if ( class_exists( $class_name ) && ! empty( $alias ) && ! class_exists( $alias ) ) {
567
-					class_alias( $class_name, $alias );
568
-				}
569
-			}
570
-
571
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
572
-			do_action( 'redux/core/includes', $this );
573
-		}
574
-
575
-		/**
576
-		 * Hooks to run on instance creation.
577
-		 */
578
-		private function hooks() {
579
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
580
-			do_action( 'redux/core/hooks', $this );
581
-		}
582
-
583
-		/**
584
-		 * Action to run on WordPress heartbeat.
585
-		 *
586
-		 * @return bool
587
-		 */
588
-		public static function is_heartbeat(): bool {
589
-			// Disregard WP AJAX 'heartbeat' call.  Why waste resources?
590
-			if ( isset( $_POST ) && isset( $_POST['_nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_nonce'] ) ), 'heartbeat-nonce' ) ) {
591
-
592
-				if ( isset( $_POST['action'] ) && 'heartbeat' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) {
593
-
594
-					// Hook, for purists.
595
-					if ( has_action( 'redux/ajax/heartbeat' ) ) {
596
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
597
-						do_action( 'redux/ajax/heartbeat' );
598
-					}
599
-
600
-					return true;
601
-				}
602
-
603
-				return false;
604
-			}
605
-
606
-			// Buh bye!
607
-			return false;
608
-		}
609
-
610
-		/**
611
-		 * Helper method to check for mb_strtolower or to use the standard strtolower.
612
-		 *
613
-		 * @param string|null $str String to make lowercase.
614
-		 *
615
-		 * @return string|null
616
-		 */
617
-		public static function strtolower( ?string $str ): string {
618
-			if ( function_exists( 'mb_strtolower' ) && function_exists( 'mb_detect_encoding' ) ) {
619
-				return mb_strtolower( $str, mb_detect_encoding( $str ) );
620
-			} else {
621
-				return strtolower( $str );
622
-			}
623
-		}
624
-	}
625
-
626
-	/*
14
+    /**
15
+     * Class Redux_Core
16
+     */
17
+    class Redux_Core {
18
+
19
+        /**
20
+         * Class instance.
21
+         *
22
+         * @var null|Redux_Core
23
+         */
24
+        public static ?Redux_Core $instance = null;
25
+
26
+        /**
27
+         * Project version
28
+         *
29
+         * @var string
30
+         */
31
+        public static string $version;
32
+
33
+        /**
34
+         * Project directory.
35
+         *
36
+         * @var string.
37
+         */
38
+        public static string $dir;
39
+
40
+        /**
41
+         * Project URL.
42
+         *
43
+         * @var string.
44
+         */
45
+        public static string $url;
46
+
47
+        /**
48
+         * Base directory path.
49
+         *
50
+         * @var string
51
+         */
52
+        public static string $redux_path;
53
+
54
+        /**
55
+         * Absolute direction path to WordPress upload directory.
56
+         *
57
+         * @var string
58
+         */
59
+        public static string $upload_dir = '';
60
+
61
+        /**
62
+         * Full URL to WordPress upload directory.
63
+         *
64
+         * @var null|string
65
+         */
66
+        public static ?string $upload_url = '';
67
+
68
+        /**
69
+         * Set when Redux is run as a plugin.
70
+         *
71
+         * @var bool
72
+         */
73
+        public static bool $is_plugin = true;
74
+
75
+        /**
76
+         * Indicated in_theme or in_plugin.
77
+         *
78
+         * @var string
79
+         */
80
+        public static string $installed = '';
81
+
82
+        /**
83
+         * Set when Redux is run as a plugin.
84
+         *
85
+         * @var bool
86
+         */
87
+        public static bool $as_plugin = false;
88
+
89
+        /**
90
+         * Set when Redux is embedded within a theme.
91
+         *
92
+         * @var bool
93
+         */
94
+        public static bool $in_theme = false;
95
+
96
+        /**
97
+         * Pointer to an updated Google fonts array.
98
+         *
99
+         * @var array|null
100
+         */
101
+        public static ?array $updated_google_fonts = array();
102
+
103
+        /**
104
+         * List of files calling Redux.
105
+         *
106
+         * @var array|null
107
+         */
108
+        public static ?array $callers = array();
109
+
110
+        /**
111
+         * Pointer to _SERVER global.
112
+         *
113
+         * @var array|null
114
+         */
115
+        public static ?array $server = array();
116
+
117
+        /**
118
+         * Field folding information for localization.
119
+         *
120
+         * @var null|array
121
+         */
122
+        public static ?array $required = array();
123
+
124
+        /**
125
+         * Field child-folding information for localization.
126
+         *
127
+         * @var null|array
128
+         */
129
+        public static ?array $required_child = array();
130
+
131
+        /**
132
+         * Array of fields to be folded.
133
+         *
134
+         * @var array|null
135
+         */
136
+        public static ?array $folds = array();
137
+
138
+        /**
139
+         * Array of fields that didn't pass the fold dependency test and are hidden.
140
+         *
141
+         * @var null|array
142
+         */
143
+        public static ?array $fields_hidden = array();
144
+
145
+        /**
146
+         * Values to generate google font CSS.
147
+         *
148
+         * @var null|array
149
+         */
150
+        public static ?array $typography = array();
151
+
152
+        /**
153
+         * Validation ran flag.
154
+         *
155
+         * @var bool
156
+         */
157
+        public static bool $validation_ran = false;
158
+
159
+        /**
160
+         * No output flag.
161
+         *
162
+         * @var bool
163
+         */
164
+        public static bool $no_output = false;
165
+
166
+        /**
167
+         * Array of fonts used by the panel for localization.
168
+         *
169
+         * @var null|array
170
+         */
171
+        public static ?array $fonts = array();
172
+
173
+        /**
174
+         * Array of Google fonts used by the panel for localization.
175
+         *
176
+         * @var null|array
177
+         */
178
+        public static ?array $google_array = array();
179
+
180
+        /**
181
+         * Array of various font groups used within the typography field.
182
+         *
183
+         * @var null|array
184
+         */
185
+        public static ?array $font_groups = array();
186
+
187
+        /**
188
+         * File system object used for I/O file operations.  Done the WordPress way.
189
+         *
190
+         * @var null|object
191
+         */
192
+        public static ?object $filesystem;
193
+
194
+        /**
195
+         * Pointer to the third party fixes class.
196
+         *
197
+         * @var Redux_ThirdParty_Fixes
198
+         */
199
+        public static Redux_ThirdParty_Fixes $third_party_fixes;
200
+
201
+        /**
202
+         * Redux Welcome screen object.
203
+         *
204
+         * @var Redux_Welcome
205
+         */
206
+        public static Redux_Welcome $welcome;
207
+
208
+        /**
209
+         * Creates instance of class.
210
+         *
211
+         * @return Redux_Core
212
+         * @throws Exception Comment.
213
+         */
214
+        public static function instance(): ?Redux_Core {
215
+            if ( ! self::$instance ) {
216
+                self::$instance = new self();
217
+
218
+                self::$instance->includes();
219
+                self::$instance->init();
220
+                self::$instance->hooks();
221
+
222
+                add_action( 'plugins_loaded', array( 'Redux_Core', 'plugins_loaded' ) );
223
+            }
224
+
225
+            return self::$instance;
226
+        }
227
+
228
+        /**
229
+         * Things to run after pluggable.php had loaded.
230
+         */
231
+        public static function plugins_loaded() {}
232
+
233
+        /**
234
+         * Class init.
235
+         */
236
+        private function init() {
237
+            self::$server = array(
238
+                'SERVER_SOFTWARE' => '',
239
+                'REMOTE_ADDR'     => Redux_Helpers::is_local_host() ? '127.0.0.1' : '',
240
+                'HTTP_USER_AGENT' => '',
241
+                'HTTP_HOST'       => '',
242
+                'REQUEST_URI'     => '',
243
+            );
244
+
245
+            // phpcs:disable WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase
246
+            if ( ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) {
247
+                self::$server['SERVER_SOFTWARE'] = sanitize_text_field( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) );
248
+            }
249
+            if ( ! empty( $_SERVER['REMOTE_ADDR'] ) ) {
250
+                self::$server['REMOTE_ADDR'] = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) );
251
+            }
252
+            if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
253
+                self::$server['HTTP_USER_AGENT'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) );
254
+            }
255
+            if ( ! empty( $_SERVER['HTTP_HOST'] ) ) {
256
+                self::$server['HTTP_HOST'] = sanitize_text_field( wp_unslash( $_SERVER['HTTP_HOST'] ) );
257
+            }
258
+            if ( ! empty( $_SERVER['REQUEST_URI'] ) ) {
259
+                self::$server['REQUEST_URI'] = sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) );
260
+            }
261
+
262
+            // phpcs:enable
263
+
264
+            self::$dir = trailingslashit( wp_normalize_path( dirname( realpath( __FILE__ ) ) ) );
265
+
266
+            Redux_Functions_Ex::generator();
267
+
268
+            if ( defined( 'REDUX_PLUGIN_FILE' ) ) {
269
+                $plugin_info = Redux_Functions_Ex::is_inside_plugin( REDUX_PLUGIN_FILE );
270
+            }
271
+
272
+            $plugin_info = Redux_Functions_Ex::is_inside_plugin( __FILE__ );
273
+
274
+            if ( false !== $plugin_info ) {
275
+                self::$installed = class_exists( 'Redux_Framework_Plugin' ) ? 'plugin' : 'in_plugin';
276
+                self::$is_plugin = class_exists( 'Redux_Framework_Plugin' );
277
+                self::$as_plugin = true;
278
+                self::$url       = trailingslashit( dirname( $plugin_info['url'] ) );
279
+            } else {
280
+                $theme_info = Redux_Functions_Ex::is_inside_theme( __FILE__ );
281
+                if ( false !== $theme_info ) {
282
+                    self::$url       = trailingslashit( dirname( $theme_info['url'] ) );
283
+                    self::$in_theme  = true;
284
+                    self::$installed = 'in_theme';
285
+                }
286
+            }
287
+
288
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
289
+            self::$url = apply_filters( 'redux/url', self::$url );
290
+
291
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
292
+            self::$dir = apply_filters( 'redux/dir', self::$dir );
293
+
294
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
295
+            self::$is_plugin = apply_filters( 'redux/is_plugin', self::$is_plugin );
296
+
297
+            if ( ! function_exists( 'current_time' ) ) {
298
+                require_once ABSPATH . '/wp-includes/functions.php';
299
+            }
300
+
301
+            $upload_dir       = wp_upload_dir();
302
+            self::$upload_dir = $upload_dir['basedir'] . '/redux/';
303
+            self::$upload_url = str_replace( array( 'https://', 'http://' ), '//', $upload_dir['baseurl'] . '/redux/' );
304
+
305
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
306
+            self::$upload_dir = apply_filters( 'redux/upload_dir', self::$upload_dir );
307
+
308
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
309
+            self::$upload_url = apply_filters( 'redux/upload_url', self::$upload_url );
310
+        }
311
+
312
+        /**
313
+         * Code to execute on a framework __construct.
314
+         *
315
+         * @param ReduxFramework $redux Pointer to ReduxFramework object.
316
+         */
317
+        public static function core_construct( ReduxFramework $redux ) {
318
+            self::$third_party_fixes = new Redux_ThirdParty_Fixes( $redux );
319
+
320
+            Redux_ThemeCheck::get_instance();
321
+        }
322
+
323
+        /**
324
+         * Autoregister run.
325
+         *
326
+         * @throws Exception Comment.
327
+         */
328
+        private function includes() {
329
+            if ( is_admin() ) {
330
+                if ( class_exists( 'Redux_Pro' ) && isset( Redux_Pro::$dir ) ) {
331
+                    echo '<div class="error"><p>' . sprintf( esc_html__( 'Redux has detected the Redux Pro plugin is enabled. All featured of Redux Pro are now part of the entire Redux plugin and is no longer required. Please disable the Redux Pro plugin to avoid potential conflicts.', 'redux-framework' ), '<code></code>' ) . '</p></div>';
332
+                }
333
+            }
334
+
335
+            require_once __DIR__ . '/inc/classes/class-redux-path.php';
336
+            require_once __DIR__ . '/inc/classes/class-redux-functions-ex.php';
337
+            require_once __DIR__ . '/inc/classes/class-redux-helpers.php';
338
+            require_once __DIR__ . '/inc/classes/class-redux-instances.php';
339
+
340
+            Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/classes' );
341
+            Redux_Functions_Ex::register_class_path( 'Redux', __DIR__ . '/inc/welcome' );
342
+
343
+            spl_autoload_register( array( $this, 'register_classes' ) );
344
+
345
+            self::$welcome = new Redux_Welcome();
346
+
347
+            add_filter( 'debug_information', array( $this, 'add_debug_info' ) );
348
+        }
349
+
350
+        /**
351
+         * Add debug info for the WP Site Health screen.
352
+         *
353
+         * @param array $debug_info Debug data.
354
+         *
355
+         * @return array
356
+         * @throws ReflectionException Exception.
357
+         */
358
+        public function add_debug_info( array $debug_info ): array {
359
+
360
+            // Get browser data.
361
+            if ( ! class_exists( 'ReduxBrowser' ) ) {
362
+                require_once self::$dir . 'inc/lib/browser.php';
363
+            }
364
+
365
+            $browser = new ReduxBrowser();
366
+
367
+            $browser_data = array(
368
+                'Agent'    => $browser->getUserAgent(),
369
+                'Browser'  => $browser->getBrowser(),
370
+                'Version'  => $browser->getVersion(),
371
+                'Platform' => $browser->getPlatform(),
372
+            );
373
+
374
+            // Set Redux dir permission results to Site Health screen.
375
+            $debug_info['wp-filesystem']['fields'][] = array(
376
+                'label' => esc_html__( 'The Redux upload directory', 'redux-framework' ),
377
+                'value' => wp_is_writable( self::$upload_dir ) ? 'Writable' : 'Not writable',
378
+            );
379
+
380
+            // Set Redux plugin results to Site Health screen.
381
+            $debug_info['redux-framework'] = array(
382
+                'label'       => esc_html__( 'Redux Framework', 'redux-framework' ),
383
+                'description' => esc_html__( 'Debug information specific to Redux Framework.', 'redux-framework' ),
384
+                'fields'      => array(
385
+                    'version'        => array(
386
+                        'label' => esc_html__( 'Version', 'redux-framework' ),
387
+                        'value' => self::$version,
388
+                    ),
389
+                    'installation'   => array(
390
+                        'label' => esc_html__( 'Installation', 'redux-framework' ),
391
+                        'value' => self::$installed,
392
+                    ),
393
+                    'data directory' => array(
394
+                        'label' => esc_html__( 'Data directory', 'redux-framework' ),
395
+                        'value' => self::$dir,
396
+                    ),
397
+                    'browser'        => array(
398
+                        'label' => esc_html__( 'Browser', 'redux-framework' ),
399
+                        'value' => $browser_data,
400
+                    ),
401
+                ),
402
+            );
403
+
404
+            $redux = Redux::all_instances();
405
+
406
+            $extensions = array();
407
+
408
+            if ( ! empty( $redux ) && is_array( $redux ) ) {
409
+                foreach ( $redux as $inst => $data ) {
410
+                    Redux::init( $inst );
411
+
412
+                    $inst_name = ucwords( str_replace( array( '_', '-' ), ' ', $inst ) );
413
+                    $args      = $data->args;
414
+
415
+                    $ext = Redux::get_extensions( $inst );
416
+                    if ( ! empty( $ext ) && is_array( $ext ) ) {
417
+                        ksort( $ext );
418
+
419
+                        foreach ( $ext as $name => $arr ) {
420
+                            $ver = $arr['version'];
421
+
422
+                            $ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) );
423
+
424
+                            $extensions[ $ex ] = esc_html( $ver );
425
+                        }
426
+                    }
427
+
428
+                    // Output Redux instances.
429
+                    $debug_info[ 'redux-instance-' . $inst ] = array(
430
+                        // translators: %s = Instance name.
431
+                        'label'       => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ),
432
+                        // translators: %s = Instance name w/ HTML.
433
+                        'description' => sprintf( esc_html__( 'Debug information for the %s Redux instance.', 'redux-framework' ), '<code>' . $inst . '</code>' ),
434
+                        'fields'      => array(
435
+                            'opt_name'         => array(
436
+                                'label' => esc_html( 'opt_name' ),
437
+                                'value' => $args['opt_name'],
438
+                            ),
439
+                            'global_variable'  => array(
440
+                                'label' => esc_html( 'global_variable' ),
441
+                                'value' => $args['global_variable'],
442
+                            ),
443
+                            'dev_mode'         => array(
444
+                                'label' => esc_html( 'dev_mode' ),
445
+                                'value' => $args['dev_mode'] ? 'true' : 'false',
446
+                            ),
447
+                            'ajax_save'        => array(
448
+                                'label' => esc_html( 'ajax_save' ),
449
+                                'value' => $args['ajax_save'] ? 'true' : 'false',
450
+                            ),
451
+                            'page_slug'        => array(
452
+                                'label' => esc_html( 'page_slug' ),
453
+                                'value' => $args['page_slug'],
454
+                            ),
455
+                            'page_permissions' => array(
456
+                                'label' => esc_html( 'page_permissions' ),
457
+                                'value' => $args['page_permissions'],
458
+                            ),
459
+                            'menu_type'        => array(
460
+                                'label' => esc_html( 'menu_type' ),
461
+                                'value' => $args['menu_type'],
462
+                            ),
463
+                            'page_parent'      => array(
464
+                                'label' => esc_html( 'page_parent' ),
465
+                                'value' => $args['page_parent'],
466
+                            ),
467
+                            'compiler'         => array(
468
+                                'label' => esc_html( 'compiler' ),
469
+                                'value' => $args['compiler'] ? 'true' : 'false',
470
+                            ),
471
+                            'output'           => array(
472
+                                'label' => esc_html( 'output' ),
473
+                                'value' => $args['output'] ? 'true' : 'false',
474
+                            ),
475
+                            'output_tag'       => array(
476
+                                'label' => esc_html( 'output_tag' ),
477
+                                'value' => $args['output_tag'] ? 'true' : 'false',
478
+                            ),
479
+                            'templates_path'   => array(
480
+                                'label' => esc_html( 'templates_path' ),
481
+                                'value' => $args['templates_path'],
482
+                            ),
483
+                            'extensions'       => array(
484
+                                'label' => esc_html( 'extensions' ),
485
+                                'value' => $extensions,
486
+                            ),
487
+                        ),
488
+                    );
489
+                }
490
+            }
491
+
492
+            return $debug_info;
493
+        }
494
+
495
+        /**
496
+         * Register callback for autoload.
497
+         *
498
+         * @param string $class_name name of class.
499
+         */
500
+        public function register_classes( string $class_name ) {
501
+            $class_name_test = self::strtolower( $class_name );
502
+
503
+            if ( strpos( $class_name_test, 'redux' ) === false ) {
504
+                return;
505
+            }
506
+
507
+            if ( ! class_exists( 'Redux_Functions_Ex' ) ) {
508
+                require_once Redux_Path::get_path( '/inc/classes/class-redux-functions-ex.php' );
509
+            }
510
+
511
+            if ( ! class_exists( $class_name ) ) {
512
+                // Backward compatibility for extensions sucks!
513
+                if ( 'Redux_Instances' === $class_name ) {
514
+                    require_once Redux_Path::get_path( '/inc/classes/class-redux-instances.php' );
515
+                    require_once Redux_Path::get_path( '/inc/lib/redux-instances.php' );
516
+
517
+                    return;
518
+                }
519
+
520
+                // Load Redux APIs.
521
+                if ( 'Redux' === $class_name ) {
522
+                    require_once Redux_Path::get_path( '/inc/classes/class-redux-api.php' );
523
+
524
+                    return;
525
+                }
526
+
527
+                // Redux extra theme checks.
528
+                if ( 'Redux_ThemeCheck' === $class_name ) {
529
+                    require_once Redux_Path::get_path( '/inc/themecheck/class-redux-themecheck.php' );
530
+
531
+                    return;
532
+                }
533
+
534
+                if ( 'Redux_Welcome' === $class_name ) {
535
+                    require_once Redux_Path::get_path( '/inc/welcome/class-redux-welcome.php' );
536
+
537
+                    return;
538
+                }
539
+
540
+                $mappings = array(
541
+                    'ReduxFrameworkInstances'  => 'Redux_Instances',
542
+                    'reduxCorePanel'           => 'Redux_Panel',
543
+                    'reduxCoreEnqueue'         => 'Redux_Enqueue',
544
+                    'Redux_Abstract_Extension' => 'Redux_Extension_Abstract',
545
+                );
546
+                $alias    = false;
547
+                if ( isset( $mappings[ $class_name ] ) ) {
548
+                    $alias      = $class_name;
549
+                    $class_name = $mappings[ $class_name ];
550
+                }
551
+
552
+                // Everything else.
553
+                $file = 'class.' . $class_name_test . '.php';
554
+
555
+                $class_path = Redux_Path::get_path( '/inc/classes/' . $file );
556
+
557
+                if ( ! file_exists( $class_path ) ) {
558
+                    $class_file_name = str_replace( '_', '-', $class_name );
559
+                    $file            = 'class-' . $class_name_test . '.php';
560
+                    $class_path      = Redux_Path::get_path( '/inc/classes/' . $file );
561
+                }
562
+
563
+                if ( file_exists( $class_path ) && ! class_exists( $class_name ) ) {
564
+                    require_once $class_path;
565
+                }
566
+                if ( class_exists( $class_name ) && ! empty( $alias ) && ! class_exists( $alias ) ) {
567
+                    class_alias( $class_name, $alias );
568
+                }
569
+            }
570
+
571
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
572
+            do_action( 'redux/core/includes', $this );
573
+        }
574
+
575
+        /**
576
+         * Hooks to run on instance creation.
577
+         */
578
+        private function hooks() {
579
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
580
+            do_action( 'redux/core/hooks', $this );
581
+        }
582
+
583
+        /**
584
+         * Action to run on WordPress heartbeat.
585
+         *
586
+         * @return bool
587
+         */
588
+        public static function is_heartbeat(): bool {
589
+            // Disregard WP AJAX 'heartbeat' call.  Why waste resources?
590
+            if ( isset( $_POST ) && isset( $_POST['_nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_nonce'] ) ), 'heartbeat-nonce' ) ) {
591
+
592
+                if ( isset( $_POST['action'] ) && 'heartbeat' === sanitize_text_field( wp_unslash( $_POST['action'] ) ) ) {
593
+
594
+                    // Hook, for purists.
595
+                    if ( has_action( 'redux/ajax/heartbeat' ) ) {
596
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
597
+                        do_action( 'redux/ajax/heartbeat' );
598
+                    }
599
+
600
+                    return true;
601
+                }
602
+
603
+                return false;
604
+            }
605
+
606
+            // Buh bye!
607
+            return false;
608
+        }
609
+
610
+        /**
611
+         * Helper method to check for mb_strtolower or to use the standard strtolower.
612
+         *
613
+         * @param string|null $str String to make lowercase.
614
+         *
615
+         * @return string|null
616
+         */
617
+        public static function strtolower( ?string $str ): string {
618
+            if ( function_exists( 'mb_strtolower' ) && function_exists( 'mb_detect_encoding' ) ) {
619
+                return mb_strtolower( $str, mb_detect_encoding( $str ) );
620
+            } else {
621
+                return strtolower( $str );
622
+            }
623
+        }
624
+    }
625
+
626
+    /*
627 627
 	 * Backwards comparability alias
628 628
 	 */
629
-	class_alias( 'Redux_Core', 'redux-core' );
629
+    class_alias( 'Redux_Core', 'redux-core' );
630 630
 }
Please login to merge, or discard this patch.
Spacing   +16 added lines, -16 removed lines patch added patch discarded remove patch
@@ -98,56 +98,56 @@  discard block
 block discarded – undo
98 98
 		 *
99 99
 		 * @var array|null
100 100
 		 */
101
-		public static ?array $updated_google_fonts = array();
101
+		public static ? array $updated_google_fonts = array();
102 102
 
103 103
 		/**
104 104
 		 * List of files calling Redux.
105 105
 		 *
106 106
 		 * @var array|null
107 107
 		 */
108
-		public static ?array $callers = array();
108
+		public static ? array $callers = array();
109 109
 
110 110
 		/**
111 111
 		 * Pointer to _SERVER global.
112 112
 		 *
113 113
 		 * @var array|null
114 114
 		 */
115
-		public static ?array $server = array();
115
+		public static ? array $server = array();
116 116
 
117 117
 		/**
118 118
 		 * Field folding information for localization.
119 119
 		 *
120 120
 		 * @var null|array
121 121
 		 */
122
-		public static ?array $required = array();
122
+		public static ? array $required = array();
123 123
 
124 124
 		/**
125 125
 		 * Field child-folding information for localization.
126 126
 		 *
127 127
 		 * @var null|array
128 128
 		 */
129
-		public static ?array $required_child = array();
129
+		public static ? array $required_child = array();
130 130
 
131 131
 		/**
132 132
 		 * Array of fields to be folded.
133 133
 		 *
134 134
 		 * @var array|null
135 135
 		 */
136
-		public static ?array $folds = array();
136
+		public static ? array $folds = array();
137 137
 
138 138
 		/**
139 139
 		 * Array of fields that didn't pass the fold dependency test and are hidden.
140 140
 		 *
141 141
 		 * @var null|array
142 142
 		 */
143
-		public static ?array $fields_hidden = array();
143
+		public static ? array $fields_hidden = array();
144 144
 
145 145
 		/**
146 146
 		 * Values to generate google font CSS.
147 147
 		 *
148 148
 		 * @var null|array
149 149
 		 */
150
-		public static ?array $typography = array();
150
+		public static ? array $typography = array();
151 151
 
152 152
 		/**
153 153
 		 * Validation ran flag.
@@ -168,21 +168,21 @@  discard block
 block discarded – undo
168 168
 		 *
169 169
 		 * @var null|array
170 170
 		 */
171
-		public static ?array $fonts = array();
171
+		public static ? array $fonts = array();
172 172
 
173 173
 		/**
174 174
 		 * Array of Google fonts used by the panel for localization.
175 175
 		 *
176 176
 		 * @var null|array
177 177
 		 */
178
-		public static ?array $google_array = array();
178
+		public static ? array $google_array = array();
179 179
 
180 180
 		/**
181 181
 		 * Array of various font groups used within the typography field.
182 182
 		 *
183 183
 		 * @var null|array
184 184
 		 */
185
-		public static ?array $font_groups = array();
185
+		public static ? array $font_groups = array();
186 186
 
187 187
 		/**
188 188
 		 * File system object used for I/O file operations.  Done the WordPress way.
@@ -421,12 +421,12 @@  discard block
 block discarded – undo
421 421
 
422 422
 							$ex = esc_html( ucwords( str_replace( array( '_', '-' ), ' ', $name ) ) );
423 423
 
424
-							$extensions[ $ex ] = esc_html( $ver );
424
+							$extensions[$ex] = esc_html( $ver );
425 425
 						}
426 426
 					}
427 427
 
428 428
 					// Output Redux instances.
429
-					$debug_info[ 'redux-instance-' . $inst ] = array(
429
+					$debug_info['redux-instance-' . $inst] = array(
430 430
 						// translators: %s = Instance name.
431 431
 						'label'       => sprintf( esc_html__( 'Redux Instance: %s', 'redux-framework' ), $inst_name ),
432 432
 						// translators: %s = Instance name w/ HTML.
@@ -543,10 +543,10 @@  discard block
 block discarded – undo
543 543
 					'reduxCoreEnqueue'         => 'Redux_Enqueue',
544 544
 					'Redux_Abstract_Extension' => 'Redux_Extension_Abstract',
545 545
 				);
546
-				$alias    = false;
547
-				if ( isset( $mappings[ $class_name ] ) ) {
546
+				$alias = false;
547
+				if ( isset( $mappings[$class_name] ) ) {
548 548
 					$alias      = $class_name;
549
-					$class_name = $mappings[ $class_name ];
549
+					$class_name = $mappings[$class_name];
550 550
 				}
551 551
 
552 552
 				// Everything else.
Please login to merge, or discard this patch.
redux-core/inc/extensions/customizer/inc/class-redux-customizer-section.php 1 patch
Indentation   +155 added lines, -155 removed lines patch added patch discarded remove patch
@@ -15,108 +15,108 @@  discard block
 block discarded – undo
15 15
  */
16 16
 class Redux_Customizer_Section extends WP_Customize_Section {
17 17
 
18
-	/**
19
-	 * Type of this section.
20
-	 *
21
-	 * @since  4.1.0
22
-	 * @access public
23
-	 * @var string
24
-	 */
25
-	public $type = 'redux';
26
-
27
-	/**
28
-	 * Panel opt_name.
29
-	 *
30
-	 * @since  4.0.0
31
-	 * @access public
32
-	 * @var string
33
-	 */
34
-	public $opt_name = '';
35
-
36
-	/**
37
-	 * Section array.
38
-	 *
39
-	 * @var array|mixed
40
-	 */
41
-	public $section = array();
42
-
43
-	/**
44
-	 * Section array.
45
-	 *
46
-	 * @var string
47
-	 */
48
-	public string $wp_ver;
49
-
50
-	/**
51
-	 * Constructor.
52
-	 * Any supplied $args override class property defaults.
53
-	 *
54
-	 * @since 3.4.0
55
-	 *
56
-	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
57
-	 * @param string               $id      A specific ID of the section.
58
-	 * @param array                $args    Section arguments.
59
-	 */
60
-	public function __construct( $manager, $id, $args = array() ) {
61
-		global $wp_version;
62
-
63
-		parent::__construct( $manager, $id, $args );
64
-
65
-		// Redux addition.
66
-		if ( isset( $args['section'] ) ) {
67
-			$this->section     = $args['section'];
68
-			$this->description = $this->section['desc'] ?? '';
69
-			$this->opt_name    = $args['opt_name'] ?? '';
70
-		}
71
-
72
-		$version      = explode( '-', $wp_version );
73
-		$this->wp_ver = $version[0];
74
-	}
75
-
76
-	/**
77
-	 * WP < 4.3 Render
78
-	 */
79
-	protected function render() {
80
-		global $wp_version;
81
-		$version = explode( '-', $wp_version );
82
-		if ( version_compare( $version[0], '4.3', '<' ) ) {
83
-			$this->render_fallback();
84
-		}
85
-	}
86
-
87
-	/**
88
-	 * Render the section, and the controls that have been added to it.
89
-	 *
90
-	 * @since 3.4.0
91
-	 */
92
-	protected function render_fallback() {
93
-		$classes = 'accordion-section redux-section control-section control-section-' . $this->type;
94
-		?>
18
+    /**
19
+     * Type of this section.
20
+     *
21
+     * @since  4.1.0
22
+     * @access public
23
+     * @var string
24
+     */
25
+    public $type = 'redux';
26
+
27
+    /**
28
+     * Panel opt_name.
29
+     *
30
+     * @since  4.0.0
31
+     * @access public
32
+     * @var string
33
+     */
34
+    public $opt_name = '';
35
+
36
+    /**
37
+     * Section array.
38
+     *
39
+     * @var array|mixed
40
+     */
41
+    public $section = array();
42
+
43
+    /**
44
+     * Section array.
45
+     *
46
+     * @var string
47
+     */
48
+    public string $wp_ver;
49
+
50
+    /**
51
+     * Constructor.
52
+     * Any supplied $args override class property defaults.
53
+     *
54
+     * @since 3.4.0
55
+     *
56
+     * @param WP_Customize_Manager $manager Customizer bootstrap instance.
57
+     * @param string               $id      A specific ID of the section.
58
+     * @param array                $args    Section arguments.
59
+     */
60
+    public function __construct( $manager, $id, $args = array() ) {
61
+        global $wp_version;
62
+
63
+        parent::__construct( $manager, $id, $args );
64
+
65
+        // Redux addition.
66
+        if ( isset( $args['section'] ) ) {
67
+            $this->section     = $args['section'];
68
+            $this->description = $this->section['desc'] ?? '';
69
+            $this->opt_name    = $args['opt_name'] ?? '';
70
+        }
71
+
72
+        $version      = explode( '-', $wp_version );
73
+        $this->wp_ver = $version[0];
74
+    }
75
+
76
+    /**
77
+     * WP < 4.3 Render
78
+     */
79
+    protected function render() {
80
+        global $wp_version;
81
+        $version = explode( '-', $wp_version );
82
+        if ( version_compare( $version[0], '4.3', '<' ) ) {
83
+            $this->render_fallback();
84
+        }
85
+    }
86
+
87
+    /**
88
+     * Render the section, and the controls that have been added to it.
89
+     *
90
+     * @since 3.4.0
91
+     */
92
+    protected function render_fallback() {
93
+        $classes = 'accordion-section redux-section control-section control-section-' . $this->type;
94
+        ?>
95 95
 		<li id="accordion-section-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>">
96 96
 			<h3 class="accordion-section-title" tabindex="0">
97 97
 				<?php
98
-				echo wp_kses(
99
-					$this->title,
100
-					array(
101
-						'em'     => array(),
102
-						'i'      => array(),
103
-						'strong' => array(),
104
-						'span'   => array(
105
-							'class' => array(),
106
-							'style' => array(),
107
-						),
108
-					)
109
-				);
110
-				?>
98
+                echo wp_kses(
99
+                    $this->title,
100
+                    array(
101
+                        'em'     => array(),
102
+                        'i'      => array(),
103
+                        'strong' => array(),
104
+                        'span'   => array(
105
+                            'class' => array(),
106
+                            'style' => array(),
107
+                        ),
108
+                    )
109
+                );
110
+                ?>
111 111
 				<span class="screen-reader-text"><?php esc_attr_e( 'Press return or enter to expand', 'redux-framework' ); ?></span>
112 112
 			</h3>
113 113
 			<ul class="accordion-section-content redux-main">
114 114
 				<?php
115
-				if ( isset( $this->opt_name ) && isset( $this->section ) ) {
116
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
117
-					do_action( "redux/page/$this->opt_name/section/before", $this->section );
118
-				}
119
-				?>
115
+                if ( isset( $this->opt_name ) && isset( $this->section ) ) {
116
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
117
+                    do_action( "redux/page/$this->opt_name/section/before", $this->section );
118
+                }
119
+                ?>
120 120
 				<?php if ( ! empty( $this->description ) ) { ?>
121 121
 					<li class="customize-section-description-container">
122 122
 						<p class="description customize-section-description legacy"><?php echo wp_kses_post( $this->description ); ?></p>
@@ -125,60 +125,60 @@  discard block
 block discarded – undo
125 125
 			</ul>
126 126
 		</li>
127 127
 		<?php
128
-	}
129
-
130
-
131
-	/**
132
-	 * Gather the parameters passed to client JavaScript via JSON.
133
-	 *
134
-	 * @since 4.1.0
135
-	 *
136
-	 * @return array The array to be exported to the client as JSON.
137
-	 */
138
-	public function json(): array {
139
-		$array = wp_array_slice_assoc(
140
-			parent::json(),
141
-			array(
142
-				'id',
143
-				'title',
144
-				'description',
145
-				'priority',
146
-				'panel',
147
-				'type',
148
-			)
149
-		);
150
-
151
-		$array['content']        = $this->get_content();
152
-		$array['active']         = $this->active();
153
-		$array['instanceNumber'] = $this->instance_number;
154
-
155
-		if ( $this->panel ) {
156
-			/* translators: &#9656; is the unicode right-pointing triangle, and %s is the section title in the Customizer */
157
-			$array['customizeAction'] = sprintf( __( 'Customizing &#9656; %s', 'redux-framework' ), esc_html( $this->manager->get_panel( $this->panel )->title ) );
158
-		} else {
159
-			$array['customizeAction'] = __( 'Customizing', 'redux-framework' );
160
-		}
161
-
162
-		// BEGIN Redux Additions.
163
-		$array['width'] = $this->section['customizer_width'] ?? '';
164
-		$array['icon']  = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide';
165
-
166
-		$array['opt_name'] = $this->opt_name;
167
-
168
-		return $array;
169
-	}
170
-
171
-	/**
172
-	 * An Underscore (JS) template for rendering this section.
173
-	 * Class variables for this section class are available in the `data` JS object;
174
-	 * export custom variables by overriding {@see WP_Customize_Section::json()}.
175
-	 *
176
-	 * @see   WP_Customize_Section::print_template()
177
-	 * @since 4.3.0
178
-	 */
179
-	protected function render_template() {
180
-
181
-		?>
128
+    }
129
+
130
+
131
+    /**
132
+     * Gather the parameters passed to client JavaScript via JSON.
133
+     *
134
+     * @since 4.1.0
135
+     *
136
+     * @return array The array to be exported to the client as JSON.
137
+     */
138
+    public function json(): array {
139
+        $array = wp_array_slice_assoc(
140
+            parent::json(),
141
+            array(
142
+                'id',
143
+                'title',
144
+                'description',
145
+                'priority',
146
+                'panel',
147
+                'type',
148
+            )
149
+        );
150
+
151
+        $array['content']        = $this->get_content();
152
+        $array['active']         = $this->active();
153
+        $array['instanceNumber'] = $this->instance_number;
154
+
155
+        if ( $this->panel ) {
156
+            /* translators: &#9656; is the unicode right-pointing triangle, and %s is the section title in the Customizer */
157
+            $array['customizeAction'] = sprintf( __( 'Customizing &#9656; %s', 'redux-framework' ), esc_html( $this->manager->get_panel( $this->panel )->title ) );
158
+        } else {
159
+            $array['customizeAction'] = __( 'Customizing', 'redux-framework' );
160
+        }
161
+
162
+        // BEGIN Redux Additions.
163
+        $array['width'] = $this->section['customizer_width'] ?? '';
164
+        $array['icon']  = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide';
165
+
166
+        $array['opt_name'] = $this->opt_name;
167
+
168
+        return $array;
169
+    }
170
+
171
+    /**
172
+     * An Underscore (JS) template for rendering this section.
173
+     * Class variables for this section class are available in the `data` JS object;
174
+     * export custom variables by overriding {@see WP_Customize_Section::json()}.
175
+     *
176
+     * @see   WP_Customize_Section::print_template()
177
+     * @since 4.3.0
178
+     */
179
+    protected function render_template() {
180
+
181
+        ?>
182 182
 		<li id="accordion-section-{{ data.id }}"
183 183
 			class="redux-standalone-section redux-customizer-opt-name redux-section accordion-section control-section control-section-{{ data.type }}"
184 184
 			data-opt-name="{{ data.opt_name }}"
@@ -210,14 +210,14 @@  discard block
 block discarded – undo
210 210
 					<p class="description customize-section-description">{{{ data.description }}}</p>
211 211
 					<# } #>
212 212
 					<?php
213
-					if ( isset( $this->opt_name ) && isset( $this->section ) ) {
214
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
215
-						do_action( "redux/page/$this->opt_name/section/before", $this->section );
216
-					}
217
-					?>
213
+                    if ( isset( $this->opt_name ) && isset( $this->section ) ) {
214
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
215
+                        do_action( "redux/page/$this->opt_name/section/before", $this->section );
216
+                    }
217
+                    ?>
218 218
 				</li>
219 219
 			</ul>
220 220
 		</li>
221 221
 		<?php
222
-	}
222
+    }
223 223
 }
Please login to merge, or discard this patch.
redux-core/inc/extensions/customizer/inc/class-redux-customizer-panel.php 1 patch
Indentation   +141 added lines, -141 removed lines patch added patch discarded remove patch
@@ -19,83 +19,83 @@  discard block
 block discarded – undo
19 19
  */
20 20
 class Redux_Customizer_Panel extends WP_Customize_Panel {
21 21
 
22
-	/**
23
-	 * Type of this panel.
24
-	 *
25
-	 * @since  4.0.0
26
-	 * @access public
27
-	 * @var string
28
-	 */
29
-	public $type = 'redux';
22
+    /**
23
+     * Type of this panel.
24
+     *
25
+     * @since  4.0.0
26
+     * @access public
27
+     * @var string
28
+     */
29
+    public $type = 'redux';
30 30
 
31
-	/**
32
-	 * Panel opt_name.
33
-	 *
34
-	 * @since  4.0.0
35
-	 * @access public
36
-	 * @var string
37
-	 */
38
-	public $opt_name = '';
31
+    /**
32
+     * Panel opt_name.
33
+     *
34
+     * @since  4.0.0
35
+     * @access public
36
+     * @var string
37
+     */
38
+    public $opt_name = '';
39 39
 
40
-	/**
41
-	 * Section array.
42
-	 *
43
-	 * @var array|mixed
44
-	 */
45
-	public $section = array();
40
+    /**
41
+     * Section array.
42
+     *
43
+     * @var array|mixed
44
+     */
45
+    public $section = array();
46 46
 
47
-	/**
48
-	 * Section array.
49
-	 *
50
-	 * @var string
51
-	 */
52
-	public string $wp_ver;
47
+    /**
48
+     * Section array.
49
+     *
50
+     * @var string
51
+     */
52
+    public string $wp_ver;
53 53
 
54
-	/**
55
-	 * Constructor.
56
-	 * Any supplied $args override class property defaults.
57
-	 *
58
-	 * @since 4.0.0
59
-	 *
60
-	 * @param WP_Customize_Manager $manager Customizer bootstrap instance.
61
-	 * @param string               $id      A specific ID for the panel.
62
-	 * @param array                $args    Panel arguments.
63
-	 */
64
-	public function __construct( $manager, $id, $args = array() ) {
65
-		global $wp_version;
54
+    /**
55
+     * Constructor.
56
+     * Any supplied $args override class property defaults.
57
+     *
58
+     * @since 4.0.0
59
+     *
60
+     * @param WP_Customize_Manager $manager Customizer bootstrap instance.
61
+     * @param string               $id      A specific ID for the panel.
62
+     * @param array                $args    Panel arguments.
63
+     */
64
+    public function __construct( $manager, $id, $args = array() ) {
65
+        global $wp_version;
66 66
 
67
-		parent::__construct( $manager, $id, $args );
67
+        parent::__construct( $manager, $id, $args );
68 68
 
69
-		$version      = explode( '-', $wp_version );
70
-		$this->wp_ver = $version[0];
69
+        $version      = explode( '-', $wp_version );
70
+        $this->wp_ver = $version[0];
71 71
 
72
-		// Redux addition.
73
-		if ( isset( $args['section'] ) ) {
74
-			$this->section     = $args['section'];
75
-			$this->description = $this->section['desc'] ?? '';
76
-			$this->opt_name    = $args['opt_name'] ?? '';
77
-		}
78
-	}
72
+        // Redux addition.
73
+        if ( isset( $args['section'] ) ) {
74
+            $this->section     = $args['section'];
75
+            $this->description = $this->section['desc'] ?? '';
76
+            $this->opt_name    = $args['opt_name'] ?? '';
77
+        }
78
+    }
79 79
 
80
-	/**
81
-	 * WP < 4.3 Render
82
-	 *
83
-	 * @since
84
-	 * @access protected
85
-	 */
86
-	protected function render() {
87
-		if ( version_compare( $this->wp_ver, '4.3', '<' ) ) {
88
-			$this->render_fallback();
89
-		}
90
-	}
80
+    /**
81
+     * WP < 4.3 Render
82
+     *
83
+     * @since
84
+     * @access protected
85
+     */
86
+    protected function render() {
87
+        if ( version_compare( $this->wp_ver, '4.3', '<' ) ) {
88
+            $this->render_fallback();
89
+        }
90
+    }
91 91
 
92
-	/**
93
-	 * Render.
94
-	 */
95
-	protected function render_fallback() {
96
-		$classes = 'accordion-section redux-main redux-panel control-section control-panel control-panel-' . esc_attr( $this->type );
92
+    /**
93
+     * Render.
94
+     */
95
+    protected function render_fallback() {
96
+        $classes = 'accordion-section redux-main redux-panel control-section control-panel control-panel-' . esc_attr( $this->type );
97 97
 
98
-		?>
98
+        ?>
99 99
 		<li id="accordion-panel-<?php echo esc_attr( $this->id ); ?>" class="<?php echo esc_attr( $classes ); ?>"
100 100
 			data-width="<?php echo isset( $this->section['customizer_width'] ) ? esc_attr( $this->section['customizer_width'] ) : ''; ?>">
101 101
 			<h3 class="accordion-section-title" tabindex="0">
@@ -103,19 +103,19 @@  discard block
 block discarded – undo
103 103
 					<i class="<?php echo esc_attr( $this->section['icon'] ); ?>"></i>
104 104
 				<?php endif; ?>
105 105
 				<?php
106
-				echo wp_kses(
107
-					$this->title,
108
-					array(
109
-						'em'     => array(),
110
-						'i'      => array(),
111
-						'strong' => array(),
112
-						'span'   => array(
113
-							'class' => array(),
114
-							'style' => array(),
115
-						),
116
-					)
117
-				);
118
-				?>
106
+                echo wp_kses(
107
+                    $this->title,
108
+                    array(
109
+                        'em'     => array(),
110
+                        'i'      => array(),
111
+                        'strong' => array(),
112
+                        'span'   => array(
113
+                            'class' => array(),
114
+                            'style' => array(),
115
+                        ),
116
+                    )
117
+                );
118
+                ?>
119 119
 				<span class="screen-reader-text"><?php esc_html_e( 'Press return or enter to open this panel', 'redux-framework' ); ?></span>
120 120
 			</h3>
121 121
 			<ul class="accordion-sub-container control-panel-content">
@@ -125,22 +125,22 @@  discard block
 block discarded – undo
125 125
 			</ul>
126 126
 		</li>
127 127
 		<?php
128
-	}
128
+    }
129 129
 
130
-	/**
131
-	 * Render the sections that have been added to the panel.
132
-	 *
133
-	 * @since  4.1.0
134
-	 * @access protected
135
-	 */
136
-	protected function render_content() {
137
-		?>
130
+    /**
131
+     * Render the sections that have been added to the panel.
132
+     *
133
+     * @since  4.1.0
134
+     * @access protected
135
+     */
136
+    protected function render_content() {
137
+        ?>
138 138
 		<li class="panel-meta accordion-section redux-panel redux-panel-meta control-section
139 139
 		<?php
140
-		if ( empty( $this->description ) ) {
141
-			echo ' cannot-expand';
142
-		}
143
-		?>
140
+        if ( empty( $this->description ) ) {
141
+            echo ' cannot-expand';
142
+        }
143
+        ?>
144 144
 		">
145 145
 			<div class="accordion-section-title" tabindex="0">
146 146
 				<span class="preview-notice">
@@ -155,47 +155,47 @@  discard block
 block discarded – undo
155 155
 			<?php } ?>
156 156
 		</li>
157 157
 		<?php
158
-	}
158
+    }
159 159
 
160
-	/**
161
-	 * JSON.
162
-	 *
163
-	 * @return array
164
-	 */
165
-	public function json(): array {
166
-		$array = wp_array_slice_assoc(
167
-			parent::json(),
168
-			array(
169
-				'id',
170
-				'title',
171
-				'description',
172
-				'priority',
173
-				'type',
174
-			)
175
-		);
160
+    /**
161
+     * JSON.
162
+     *
163
+     * @return array
164
+     */
165
+    public function json(): array {
166
+        $array = wp_array_slice_assoc(
167
+            parent::json(),
168
+            array(
169
+                'id',
170
+                'title',
171
+                'description',
172
+                'priority',
173
+                'type',
174
+            )
175
+        );
176 176
 
177
-		$array['content']        = $this->get_content();
178
-		$array['active']         = $this->active();
179
-		$array['instanceNumber'] = $this->instance_number;
177
+        $array['content']        = $this->get_content();
178
+        $array['active']         = $this->active();
179
+        $array['instanceNumber'] = $this->instance_number;
180 180
 
181
-		// BEGIN Redux Additions.
182
-		$array['width'] = $this->section['customizer_width'] ?? '';
183
-		$array['icon']  = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide';
181
+        // BEGIN Redux Additions.
182
+        $array['width'] = $this->section['customizer_width'] ?? '';
183
+        $array['icon']  = ( isset( $this->section['icon'] ) && ! empty( $this->section['icon'] ) ) ? $this->section['icon'] : 'hide';
184 184
 
185
-		$array['opt_name'] = $this->opt_name;
186
-		return $array;
187
-	}
185
+        $array['opt_name'] = $this->opt_name;
186
+        return $array;
187
+    }
188 188
 
189
-	/**
190
-	 * An Underscore (JS) template for this panel's content (but not its container).
191
-	 * Class variables for this panel class are available in the `data` JS object;
192
-	 * export custom variables by overriding {@see WP_Customize_Panel::json()}.
193
-	 *
194
-	 * @see   WP_Customize_Panel::print_template()
195
-	 * @since 4.3.0
196
-	 */
197
-	protected function content_template() {
198
-		?>
189
+    /**
190
+     * An Underscore (JS) template for this panel's content (but not its container).
191
+     * Class variables for this panel class are available in the `data` JS object;
192
+     * export custom variables by overriding {@see WP_Customize_Panel::json()}.
193
+     *
194
+     * @see   WP_Customize_Panel::print_template()
195
+     * @since 4.3.0
196
+     */
197
+    protected function content_template() {
198
+        ?>
199 199
 		<li
200 200
 			class="panel-meta customize-info redux-customizer-opt-name redux-panel accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>"
201 201
 			data-opt-name="{{{ data.opt_name }}}">
@@ -223,18 +223,18 @@  discard block
 block discarded – undo
223 223
 			<# } #>
224 224
 		</li>
225 225
 		<?php
226
-	}
226
+    }
227 227
 
228
-	/**
229
-	 * An Underscore (JS) template for rendering this panel's container.
230
-	 * Class variables for this panel class are available in the `data` JS object;
231
-	 * export custom variables by overriding {@see WP_Customize_Panel::json()}.
232
-	 *
233
-	 * @see   WP_Customize_Panel::print_template()
234
-	 * @since 4.3.0
235
-	 */
236
-	protected function render_template() {
237
-		?>
228
+    /**
229
+     * An Underscore (JS) template for rendering this panel's container.
230
+     * Class variables for this panel class are available in the `data` JS object;
231
+     * export custom variables by overriding {@see WP_Customize_Panel::json()}.
232
+     *
233
+     * @see   WP_Customize_Panel::print_template()
234
+     * @since 4.3.0
235
+     */
236
+    protected function render_template() {
237
+        ?>
238 238
 		<li id="accordion-panel-{{ data.id }}"
239 239
 			class="accordion-section redux-panel control-section control-panel control-panel-{{ data.type }}"
240 240
 			data-width="{{ data.width }}">
@@ -252,5 +252,5 @@  discard block
 block discarded – undo
252 252
 			<ul class="accordion-sub-container control-panel-content"></ul>
253 253
 		</li>
254 254
 		<?php
255
-	}
255
+    }
256 256
 }
Please login to merge, or discard this patch.
redux-core/inc/lib/font-awesome-6-free.php 3 patches
Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}
}
2 1
\ No newline at end of file
2
+<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

   defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
    function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}
}
3 3
\ No newline at end of file
Please login to merge, or discard this patch.
Switch Indentation   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}
}
2 1
\ No newline at end of file
2
+<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}

}
3 3
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,1 +1,1 @@
 block discarded – undo
1
-<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' );
	}
}
2 1
\ No newline at end of file
2
+<?php
/**
 * Redux Icon Select Font Awesome 6 Free icon array.
 *
 * @package Redux
 * @author  Kevin Provance <[email protected]>
 */

defined( 'ABSPATH' ) || exit;

if ( ! function_exists( 'redux_icon_select_fa_6_free' ) ) {

	/**
	 * Array of free Font Awesome 6 icons.
	 *
	 * @return array
	 */
	function redux_icon_select_fa_6_free(): array {
		return array( 'fas fa-0', 'fas fa-1', 'fas fa-2', 'fas fa-3', 'fas fa-4', 'fas fa-5', 'fas fa-6', 'fas fa-7', 'fas fa-8', 'fas fa-9', 'fab fa-42-group', 'fab fa-500px', 'fas fa-a', 'fab fa-accessible-icon', 'fab fa-accusoft', 'fas fa-address-book', 'far fa-fas fa-address-book', 'fas fa-address-card', 'far fa-fas fa-address-card', 'fab fa-adn', 'fab fa-adversal', 'fab fa-affiliatetheme', 'fab fa-airbnb', 'fab fa-algolia', 'fas fa-align-center', 'fas fa-align-justify', 'fas fa-align-left', 'fas fa-align-right', 'fab fa-alipay', 'fab fa-amazon', 'fab fa-amazon-pay', 'fab fa-amilia', 'fas fa-anchor', 'fas fa-anchor-circle-check', 'fas fa-anchor-circle-exclamation', 'fas fa-anchor-circle-xmark', 'fas fa-anchor-lock', 'fab fa-android', 'fab fa-angellist', 'fas fa-angle-down', 'fas fa-angle-left', 'fas fa-angle-right', 'fas fa-angle-up', 'fas fa-angles-down', 'fas fa-angles-left', 'fas fa-angles-right', 'fas fa-angles-up', 'fab fa-angrycreative', 'fab fa-angular', 'fas fa-ankh', 'fab fa-app-store', 'fab fa-app-store-ios', 'fab fa-apper', 'fab fa-apple', 'fab fa-apple-pay', 'fas fa-apple-whole', 'fas fa-archway', 'fas fa-arrow-down', 'fas fa-arrow-down-1-9', 'fas fa-arrow-down-9-1', 'fas fa-arrow-down-a-z', 'fas fa-arrow-down-long', 'fas fa-arrow-down-short-wide', 'fas fa-arrow-down-up-across-line', 'fas fa-arrow-down-up-lock', 'fas fa-arrow-down-wide-short', 'fas fa-arrow-down-z-a', 'fas fa-arrow-left', 'fas fa-arrow-left-long', 'fas fa-arrow-pointer', 'fas fa-arrow-right', 'fas fa-arrow-right-arrow-left', 'fas fa-arrow-right-from-bracket', 'fas fa-arrow-right-long', 'fas fa-arrow-right-to-bracket', 'fas fa-arrow-right-to-city', 'fas fa-arrow-rotate-left', 'fas fa-arrow-rotate-right', 'fas fa-arrow-trend-down', 'fas fa-arrow-trend-up', 'fas fa-arrow-turn-down', 'fas fa-arrow-turn-up', 'fas fa-arrow-up', 'fas fa-arrow-up-1-9', 'fas fa-arrow-up-9-1', 'fas fa-arrow-up-a-z', 'fas fa-arrow-up-from-bracket', 'fas fa-arrow-up-from-ground-water', 'fas fa-arrow-up-from-water-pump', 'fas fa-arrow-up-long', 'fas fa-arrow-up-right-dots', 'fas fa-arrow-up-right-from-square', 'fas fa-arrow-up-short-wide', 'fas fa-arrow-up-wide-short', 'fas fa-arrow-up-z-a', 'fas fa-arrows-down-to-line', 'fas fa-arrows-down-to-people', 'fas fa-arrows-left-right', 'fas fa-arrows-left-right-to-line', 'fas fa-arrows-rotate', 'fas fa-arrows-spin', 'fas fa-arrows-split-up-and-left', 'fas fa-arrows-to-circle', 'fas fa-arrows-to-dot', 'fas fa-arrows-to-eye', 'fas fa-arrows-turn-right', 'fas fa-arrows-turn-to-dots', 'fas fa-arrows-up-down', 'fas fa-arrows-up-down-left-right', 'fas fa-arrows-up-to-line', 'fab fa-artstation', 'fas fa-asterisk', 'fab fa-asymmetrik', 'fas fa-at', 'fab fa-atlassian', 'fas fa-atom', 'fab fa-audible', 'fas fa-audio-description', 'fas fa-austral-sign', 'fab fa-autoprefixer', 'fab fa-avianex', 'fab fa-aviato', 'fas fa-award', 'fab fa-aws', 'fas fa-b', 'fas fa-baby', 'fas fa-baby-carriage', 'fas fa-backward', 'fas fa-backward-fast', 'fas fa-backward-step', 'fas fa-bacon', 'fas fa-bacteria', 'fas fa-bacterium', 'fas fa-bag-shopping', 'fas fa-bahai', 'fas fa-baht-sign', 'fas fa-ban', 'fas fa-ban-smoking', 'fas fa-bandage', 'fab fa-bandcamp', 'fas fa-bangladeshi-taka-sign', 'fas fa-barcode', 'fas fa-bars', 'fas fa-bars-progress', 'fas fa-bars-staggered', 'fas fa-baseball', 'fas fa-baseball-bat-ball', 'fas fa-basket-shopping', 'fas fa-basketball', 'fas fa-bath', 'fas fa-battery-empty', 'fas fa-battery-full', 'fas fa-battery-half', 'fas fa-battery-quarter', 'fas fa-battery-three-quarters', 'fab fa-battle-net', 'fas fa-bed', 'fas fa-bed-pulse', 'fas fa-beer-mug-empty', 'fab fa-behance', 'fas fa-bell', 'far fa-fas fa-bell', 'fas fa-bell-concierge', 'fas fa-bell-slash', 'far fa-fas fa-bell-slash', 'fas fa-bezier-curve', 'fas fa-bicycle', 'fab fa-bilibili', 'fab fa-bimobject', 'fas fa-binoculars', 'fas fa-biohazard', 'fab fa-bitbucket', 'fab fa-bitcoin', 'fas fa-bitcoin-sign', 'fab fa-bity', 'fab fa-black-tie', 'fab fa-blackberry', 'fas fa-blender', 'fas fa-blender-phone', 'fas fa-blog', 'fab fa-blogger', 'fab fa-blogger-b', 'fab fa-bluesky', 'fab fa-bluetooth', 'fab fa-bluetooth-b', 'fas fa-bold', 'fas fa-bolt', 'fas fa-bolt-lightning', 'fas fa-bomb', 'fas fa-bone', 'fas fa-bong', 'fas fa-book', 'fas fa-book-atlas', 'fas fa-book-bible', 'fas fa-book-bookmark', 'fas fa-book-journal-whills', 'fas fa-book-medical', 'fas fa-book-open', 'fas fa-book-open-reader', 'fas fa-book-quran', 'fas fa-book-skull', 'fas fa-book-tanakh', 'fas fa-bookmark', 'far fa-fas fa-bookmark', 'fab fa-bootstrap', 'fas fa-border-all', 'fas fa-border-none', 'fas fa-border-top-left', 'fas fa-bore-hole', 'fab fa-bots', 'fas fa-bottle-droplet', 'fas fa-bottle-water', 'fas fa-bowl-food', 'fas fa-bowl-rice', 'fas fa-bowling-ball', 'fas fa-box', 'fas fa-box-archive', 'fas fa-box-open', 'fas fa-box-tissue', 'fas fa-boxes-packing', 'fas fa-boxes-stacked', 'fas fa-braille', 'fas fa-brain', 'fab fa-brave', 'fab fa-brave-reverse', 'fas fa-brazilian-real-sign', 'fas fa-bread-slice', 'fas fa-bridge', 'fas fa-bridge-circle-check', 'fas fa-bridge-circle-exclamation', 'fas fa-bridge-circle-xmark', 'fas fa-bridge-lock', 'fas fa-bridge-water', 'fas fa-briefcase', 'fas fa-briefcase-medical', 'fas fa-broom', 'fas fa-broom-ball', 'fas fa-brush', 'fab fa-btc', 'fas fa-bucket', 'fab fa-buffer', 'fas fa-bug', 'fas fa-bug-slash', 'fas fa-bugs', 'fas fa-building', 'far fa-fas fa-building', 'fas fa-building-circle-arrow-right', 'fas fa-building-circle-check', 'fas fa-building-circle-exclamation', 'fas fa-building-circle-xmark', 'fas fa-building-columns', 'fas fa-building-flag', 'fas fa-building-lock', 'fas fa-building-ngo', 'fas fa-building-shield', 'fas fa-building-un', 'fas fa-building-user', 'fas fa-building-wheat', 'fas fa-bullhorn', 'fas fa-bullseye', 'fas fa-burger', 'fab fa-buromobelexperte', 'fas fa-burst', 'fas fa-bus', 'fas fa-bus-simple', 'fas fa-business-time', 'fab fa-buy-n-large', 'fab fa-buysellads', 'fas fa-c', 'fas fa-cable-car', 'fas fa-cake-candles', 'fas fa-calculator', 'fas fa-calendar', 'far fa-fas fa-calendar', 'fas fa-calendar-check', 'far fa-fas fa-calendar-check', 'fas fa-calendar-day', 'fas fa-calendar-days', 'far fa-fas fa-calendar-days', 'fas fa-calendar-minus', 'far fa-fas fa-calendar-minus', 'fas fa-calendar-plus', 'far fa-fas fa-calendar-plus', 'fas fa-calendar-week', 'fas fa-calendar-xmark', 'far fa-fas fa-calendar-xmark', 'fas fa-camera', 'fas fa-camera-retro', 'fas fa-camera-rotate', 'fas fa-campground', 'fab fa-canadian-maple-leaf', 'fas fa-candy-cane', 'fas fa-cannabis', 'fas fa-capsules', 'fas fa-car', 'fas fa-car-battery', 'fas fa-car-burst', 'fas fa-car-on', 'fas fa-car-rear', 'fas fa-car-side', 'fas fa-car-tunnel', 'fas fa-caravan', 'fas fa-caret-down', 'fas fa-caret-left', 'fas fa-caret-right', 'fas fa-caret-up', 'fas fa-carrot', 'fas fa-cart-arrow-down', 'fas fa-cart-flatbed', 'fas fa-cart-flatbed-suitcase', 'fas fa-cart-plus', 'fas fa-cart-shopping', 'fas fa-cash-register', 'fas fa-cat', 'fab fa-cc-amazon-pay', 'fab fa-cc-amex', 'fab fa-cc-apple-pay', 'fab fa-cc-diners-club', 'fab fa-cc-discover', 'fab fa-cc-jcb', 'fab fa-cc-mastercard', 'fab fa-cc-paypal', 'fab fa-cc-stripe', 'fab fa-cc-visa', 'fas fa-cedi-sign', 'fas fa-cent-sign', 'fab fa-centercode', 'fab fa-centos', 'fas fa-certificate', 'fas fa-chair', 'fas fa-chalkboard', 'fas fa-chalkboard-user', 'fas fa-champagne-glasses', 'fas fa-charging-station', 'fas fa-chart-area', 'fas fa-chart-bar', 'far fa-fas fa-chart-bar', 'fas fa-chart-column', 'fas fa-chart-diagram', 'fas fa-chart-gantt', 'fas fa-chart-line', 'fas fa-chart-pie', 'fas fa-chart-simple', 'fas fa-check', 'fas fa-check-double', 'fas fa-check-to-slot', 'fas fa-cheese', 'fas fa-chess', 'fas fa-chess-bishop', 'far fa-fas fa-chess-bishop', 'fas fa-chess-board', 'fas fa-chess-king', 'far fa-fas fa-chess-king', 'fas fa-chess-knight', 'far fa-fas fa-chess-knight', 'fas fa-chess-pawn', 'far fa-fas fa-chess-pawn', 'fas fa-chess-queen', 'far fa-fas fa-chess-queen', 'fas fa-chess-rook', 'far fa-fas fa-chess-rook', 'fas fa-chevron-down', 'fas fa-chevron-left', 'fas fa-chevron-right', 'fas fa-chevron-up', 'fas fa-child', 'fas fa-child-combatant', 'fas fa-child-dress', 'fas fa-child-reaching', 'fas fa-children', 'fab fa-chrome', 'fab fa-chromecast', 'fas fa-church', 'fas fa-circle', 'far fa-fas fa-circle', 'fas fa-circle-arrow-down', 'fas fa-circle-arrow-left', 'fas fa-circle-arrow-right', 'fas fa-circle-arrow-up', 'fas fa-circle-check', 'far fa-fas fa-circle-check', 'fas fa-circle-chevron-down', 'fas fa-circle-chevron-left', 'fas fa-circle-chevron-right', 'fas fa-circle-chevron-up', 'fas fa-circle-dollar-to-slot', 'fas fa-circle-dot', 'far fa-fas fa-circle-dot', 'fas fa-circle-down', 'far fa-fas fa-circle-down', 'fas fa-circle-exclamation', 'fas fa-circle-h', 'fas fa-circle-half-stroke', 'fas fa-circle-info', 'fas fa-circle-left', 'far fa-fas fa-circle-left', 'fas fa-circle-minus', 'fas fa-circle-nodes', 'fas fa-circle-notch', 'fas fa-circle-pause', 'far fa-fas fa-circle-pause', 'fas fa-circle-play', 'far fa-fas fa-circle-play', 'fas fa-circle-plus', 'fas fa-circle-question', 'far fa-fas fa-circle-question', 'fas fa-circle-radiation', 'fas fa-circle-right', 'far fa-fas fa-circle-right', 'fas fa-circle-stop', 'far fa-fas fa-circle-stop', 'fas fa-circle-up', 'far fa-fas fa-circle-up', 'fas fa-circle-user', 'far fa-fas fa-circle-user', 'fas fa-circle-xmark', 'far fa-fas fa-circle-xmark', 'fas fa-city', 'fas fa-clapperboard', 'fas fa-clipboard', 'far fa-fas fa-clipboard', 'fas fa-clipboard-check', 'fas fa-clipboard-list', 'fas fa-clipboard-question', 'fas fa-clipboard-user', 'fas fa-clock', 'far fa-fas fa-clock', 'fas fa-clock-rotate-left', 'fas fa-clone', 'far fa-fas fa-clone', 'fas fa-closed-captioning', 'far fa-fas fa-closed-captioning', 'fas fa-cloud', 'fas fa-cloud-arrow-down', 'fas fa-cloud-arrow-up', 'fas fa-cloud-bolt', 'fas fa-cloud-meatball', 'fas fa-cloud-moon', 'fas fa-cloud-moon-rain', 'fas fa-cloud-rain', 'fas fa-cloud-showers-heavy', 'fas fa-cloud-showers-water', 'fas fa-cloud-sun', 'fas fa-cloud-sun-rain', 'fab fa-cloudflare', 'fab fa-cloudscale', 'fab fa-cloudsmith', 'fab fa-cloudversify', 'fas fa-clover', 'fab fa-cmplid', 'fas fa-code', 'fas fa-code-branch', 'fas fa-code-commit', 'fas fa-code-compare', 'fas fa-code-fork', 'fas fa-code-merge', 'fas fa-code-pull-request', 'fab fa-codepen', 'fab fa-codiepie', 'fas fa-coins', 'fas fa-colon-sign', 'fas fa-comment', 'far fa-fas fa-comment', 'fas fa-comment-dollar', 'fas fa-comment-dots', 'far fa-fas fa-comment-dots', 'fas fa-comment-medical', 'fas fa-comment-nodes', 'fas fa-comment-slash', 'fas fa-comment-sms', 'fas fa-comments', 'far fa-fas fa-comments', 'fas fa-comments-dollar', 'fas fa-compact-disc', 'fas fa-compass', 'far fa-fas fa-compass', 'fas fa-compass-drafting', 'fas fa-compress', 'fas fa-computer', 'fas fa-computer-mouse', 'fab fa-confluence', 'fab fa-connectdevelop', 'fab fa-contao', 'fas fa-cookie', 'fas fa-cookie-bite', 'fas fa-copy', 'far fa-fas fa-copy', 'fas fa-copyright', 'far fa-fas fa-copyright', 'fab fa-cotton-bureau', 'fas fa-couch', 'fas fa-cow', 'fab fa-cpanel', 'fab fa-creative-commons', 'fab fa-creative-commons-by', 'fab fa-creative-commons-nc', 'fab fa-creative-commons-nc-eu', 'fab fa-creative-commons-nc-jp', 'fab fa-creative-commons-nd', 'fab fa-creative-commons-pd', 'fab fa-creative-commons-pd-alt', 'fab fa-creative-commons-remix', 'fab fa-creative-commons-sa', 'fab fa-creative-commons-sampling', 'fab fa-creative-commons-sampling-plus', 'fab fa-creative-commons-share', 'fab fa-creative-commons-zero', 'fas fa-credit-card', 'far fa-fas fa-credit-card', 'fab fa-critical-role', 'fas fa-crop', 'fas fa-crop-simple', 'fas fa-cross', 'fas fa-crosshairs', 'fas fa-crow', 'fas fa-crown', 'fas fa-crutch', 'fas fa-cruzeiro-sign', 'fab fa-css', 'fab fa-css3', 'fab fa-css3-alt', 'fas fa-cube', 'fas fa-cubes', 'fas fa-cubes-stacked', 'fab fa-cuttlefish', 'fas fa-d', 'fab fa-d-and-d', 'fab fa-d-and-d-beyond', 'fab fa-dailymotion', 'fab fa-dart-lang', 'fab fa-dashcube', 'fas fa-database', 'fab fa-debian', 'fab fa-deezer', 'fas fa-delete-left', 'fab fa-delicious', 'fas fa-democrat', 'fab fa-deploydog', 'fab fa-deskpro', 'fas fa-desktop', 'fab fa-dev', 'fab fa-deviantart', 'fas fa-dharmachakra', 'fab fa-dhl', 'fas fa-diagram-next', 'fas fa-diagram-predecessor', 'fas fa-diagram-project', 'fas fa-diagram-successor', 'fas fa-diamond', 'fas fa-diamond-turn-right', 'fab fa-diaspora', 'fas fa-dice', 'fas fa-dice-d20', 'fas fa-dice-d6', 'fas fa-dice-five', 'fas fa-dice-four', 'fas fa-dice-one', 'fas fa-dice-six', 'fas fa-dice-three', 'fas fa-dice-two', 'fab fa-digg', 'fab fa-digital-ocean', 'fab fa-discord', 'fab fa-discourse', 'fas fa-disease', 'fas fa-display', 'fas fa-divide', 'fas fa-dna', 'fab fa-dochub', 'fab fa-docker', 'fas fa-dog', 'fas fa-dollar-sign', 'fas fa-dolly', 'fas fa-dong-sign', 'fas fa-door-closed', 'fas fa-door-open', 'fas fa-dove', 'fas fa-down-left-and-up-right-to-center', 'fas fa-down-long', 'fas fa-download', 'fab fa-draft2digital', 'fas fa-dragon', 'fas fa-draw-polygon', 'fab fa-dribbble', 'fab fa-dropbox', 'fas fa-droplet', 'fas fa-droplet-slash', 'fas fa-drum', 'fas fa-drum-steelpan', 'fas fa-drumstick-bite', 'fab fa-drupal', 'fas fa-dumbbell', 'fas fa-dumpster', 'fas fa-dumpster-fire', 'fas fa-dungeon', 'fab fa-dyalog', 'fas fa-e', 'fas fa-ear-deaf', 'fas fa-ear-listen', 'fab fa-earlybirds', 'fas fa-earth-africa', 'fas fa-earth-americas', 'fas fa-earth-asia', 'fas fa-earth-europe', 'fas fa-earth-oceania', 'fab fa-ebay', 'fab fa-edge', 'fab fa-edge-legacy', 'fas fa-egg', 'fas fa-eject', 'fab fa-elementor', 'fas fa-elevator', 'fas fa-ellipsis', 'fas fa-ellipsis-vertical', 'fab fa-ello', 'fab fa-ember', 'fab fa-empire', 'fas fa-envelope', 'far fa-fas fa-envelope', 'fas fa-envelope-circle-check', 'fas fa-envelope-open', 'far fa-fas fa-envelope-open', 'fas fa-envelope-open-text', 'fas fa-envelopes-bulk', 'fab fa-envira', 'fas fa-equals', 'fas fa-eraser', 'fab fa-erlang', 'fab fa-ethereum', 'fas fa-ethernet', 'fab fa-etsy', 'fas fa-euro-sign', 'fab fa-evernote', 'fas fa-exclamation', 'fas fa-expand', 'fab fa-expeditedssl', 'fas fa-explosion', 'fas fa-eye', 'far fa-fas fa-eye', 'fas fa-eye-dropper', 'fas fa-eye-low-vision', 'fas fa-eye-slash', 'far fa-fas fa-eye-slash', 'fas fa-f', 'fas fa-face-angry', 'far fa-fas fa-face-angry', 'fas fa-face-dizzy', 'far fa-fas fa-face-dizzy', 'fas fa-face-flushed', 'far fa-fas fa-face-flushed', 'fas fa-face-frown', 'far fa-fas fa-face-frown', 'fas fa-face-frown-open', 'far fa-fas fa-face-frown-open', 'fas fa-face-grimace', 'far fa-fas fa-face-grimace', 'fas fa-face-grin', 'far fa-fas fa-face-grin', 'fas fa-face-grin-beam', 'far fa-fas fa-face-grin-beam', 'fas fa-face-grin-beam-sweat', 'far fa-fas fa-face-grin-beam-sweat', 'fas fa-face-grin-hearts', 'far fa-fas fa-face-grin-hearts', 'fas fa-face-grin-squint', 'far fa-fas fa-face-grin-squint', 'fas fa-face-grin-squint-tears', 'far fa-fas fa-face-grin-squint-tears', 'fas fa-face-grin-stars', 'far fa-fas fa-face-grin-stars', 'fas fa-face-grin-tears', 'far fa-fas fa-face-grin-tears', 'fas fa-face-grin-tongue', 'far fa-fas fa-face-grin-tongue', 'fas fa-face-grin-tongue-squint', 'far fa-fas fa-face-grin-tongue-squint', 'fas fa-face-grin-tongue-wink', 'far fa-fas fa-face-grin-tongue-wink', 'fas fa-face-grin-wide', 'far fa-fas fa-face-grin-wide', 'fas fa-face-grin-wink', 'far fa-fas fa-face-grin-wink', 'fas fa-face-kiss', 'far fa-fas fa-face-kiss', 'fas fa-face-kiss-beam', 'far fa-fas fa-face-kiss-beam', 'fas fa-face-kiss-wink-heart', 'far fa-fas fa-face-kiss-wink-heart', 'fas fa-face-laugh', 'far fa-fas fa-face-laugh', 'fas fa-face-laugh-beam', 'far fa-fas fa-face-laugh-beam', 'fas fa-face-laugh-squint', 'far fa-fas fa-face-laugh-squint', 'fas fa-face-laugh-wink', 'far fa-fas fa-face-laugh-wink', 'fas fa-face-meh', 'far fa-fas fa-face-meh', 'fas fa-face-meh-blank', 'far fa-fas fa-face-meh-blank', 'fas fa-face-rolling-eyes', 'far fa-fas fa-face-rolling-eyes', 'fas fa-face-sad-cry', 'far fa-fas fa-face-sad-cry', 'fas fa-face-sad-tear', 'far fa-fas fa-face-sad-tear', 'fas fa-face-smile', 'far fa-fas fa-face-smile', 'fas fa-face-smile-beam', 'far fa-fas fa-face-smile-beam', 'fas fa-face-smile-wink', 'far fa-fas fa-face-smile-wink', 'fas fa-face-surprise', 'far fa-fas fa-face-surprise', 'fas fa-face-tired', 'far fa-fas fa-face-tired', 'fab fa-facebook', 'fab fa-facebook-f', 'fab fa-facebook-messenger', 'fas fa-fan', 'fab fa-fantasy-flight-games', 'fas fa-faucet', 'fas fa-faucet-drip', 'fas fa-fax', 'fas fa-feather', 'fas fa-feather-pointed', 'fab fa-fedex', 'fab fa-fedora', 'fas fa-ferry', 'fab fa-figma', 'fas fa-file', 'far fa-fas fa-file', 'fas fa-file-arrow-down', 'fas fa-file-arrow-up', 'fas fa-file-audio', 'far fa-fas fa-file-audio', 'fas fa-file-circle-check', 'fas fa-file-circle-exclamation', 'fas fa-file-circle-minus', 'fas fa-file-circle-plus', 'fas fa-file-circle-question', 'fas fa-file-circle-xmark', 'fas fa-file-code', 'far fa-fas fa-file-code', 'fas fa-file-contract', 'fas fa-file-csv', 'fas fa-file-excel', 'far fa-fas fa-file-excel', 'fas fa-file-export', 'fas fa-file-fragment', 'fas fa-file-half-dashed', 'fas fa-file-image', 'far fa-fas fa-file-image', 'fas fa-file-import', 'fas fa-file-invoice', 'fas fa-file-invoice-dollar', 'fas fa-file-lines', 'far fa-fas fa-file-lines', 'fas fa-file-medical', 'fas fa-file-pdf', 'far fa-fas fa-file-pdf', 'fas fa-file-pen', 'fas fa-file-powerpoint', 'far fa-fas fa-file-powerpoint', 'fas fa-file-prescription', 'fas fa-file-shield', 'fas fa-file-signature', 'fas fa-file-video', 'far fa-fas fa-file-video', 'fas fa-file-waveform', 'fas fa-file-word', 'far fa-fas fa-file-word', 'fas fa-file-zipper', 'far fa-fas fa-file-zipper', 'fab fa-files-pinwheel', 'fas fa-fill', 'fas fa-fill-drip', 'fas fa-film', 'fas fa-filter', 'fas fa-filter-circle-dollar', 'fas fa-filter-circle-xmark', 'fas fa-fingerprint', 'fas fa-fire', 'fas fa-fire-burner', 'fas fa-fire-extinguisher', 'fas fa-fire-flame-curved', 'fas fa-fire-flame-simple', 'fab fa-firefox', 'fab fa-firefox-browser', 'fab fa-first-order', 'fab fa-first-order-alt', 'fab fa-firstdraft', 'fas fa-fish', 'fas fa-fish-fins', 'fas fa-flag', 'far fa-fas fa-flag', 'fas fa-flag-checkered', 'fas fa-flag-usa', 'fas fa-flask', 'fas fa-flask-vial', 'fab fa-flickr', 'fab fa-flipboard', 'fas fa-floppy-disk', 'far fa-fas fa-floppy-disk', 'fas fa-florin-sign', 'fab fa-flutter', 'fab fa-fly', 'fas fa-folder', 'far fa-fas fa-folder', 'fas fa-folder-closed', 'far fa-fas fa-folder-closed', 'fas fa-folder-minus', 'fas fa-folder-open', 'far fa-fas fa-folder-open', 'fas fa-folder-plus', 'fas fa-folder-tree', 'fas fa-font', 'fas fa-font-awesome', 'far fa-fas fa-font-awesome', 'fab fa-far fa-fas fa-font-awesome', 'fab fa-fonticons', 'fab fa-fonticons-fi', 'fas fa-football', 'fab fa-fort-awesome', 'fab fa-fort-awesome-alt', 'fab fa-forumbee', 'fas fa-forward', 'fas fa-forward-fast', 'fas fa-forward-step', 'fab fa-foursquare', 'fas fa-franc-sign', 'fab fa-free-code-camp', 'fab fa-freebsd', 'fas fa-frog', 'fab fa-fulcrum', 'fas fa-futbol', 'far fa-fas fa-futbol', 'fas fa-g', 'fab fa-galactic-republic', 'fab fa-galactic-senate', 'fas fa-gamepad', 'fas fa-gas-pump', 'fas fa-gauge', 'fas fa-gauge-high', 'fas fa-gauge-simple', 'fas fa-gauge-simple-high', 'fas fa-gavel', 'fas fa-gear', 'fas fa-gears', 'fas fa-gem', 'far fa-fas fa-gem', 'fas fa-genderless', 'fab fa-get-pocket', 'fab fa-gg', 'fab fa-gg-circle', 'fas fa-ghost', 'fas fa-gift', 'fas fa-gifts', 'fab fa-git', 'fab fa-git-alt', 'fab fa-github', 'fab fa-github-alt', 'fab fa-gitkraken', 'fab fa-gitlab', 'fab fa-gitter', 'fas fa-glass-water', 'fas fa-glass-water-droplet', 'fas fa-glasses', 'fab fa-glide', 'fab fa-glide-g', 'fas fa-globe', 'fab fa-gofore', 'fab fa-golang', 'fas fa-golf-ball-tee', 'fab fa-goodreads', 'fab fa-goodreads-g', 'fab fa-google', 'fab fa-google-drive', 'fab fa-google-pay', 'fab fa-google-play', 'fab fa-google-plus', 'fab fa-google-plus-g', 'fab fa-google-scholar', 'fab fa-google-wallet', 'fas fa-gopuram', 'fas fa-graduation-cap', 'fab fa-gratipay', 'fab fa-grav', 'fas fa-greater-than', 'fas fa-greater-than-equal', 'fas fa-grip', 'fas fa-grip-lines', 'fas fa-grip-lines-vertical', 'fas fa-grip-vertical', 'fab fa-gripfire', 'fas fa-group-arrows-rotate', 'fab fa-grunt', 'fas fa-guarani-sign', 'fab fa-guilded', 'fas fa-guitar', 'fab fa-gulp', 'fas fa-gun', 'fas fa-h', 'fab fa-hacker-news', 'fab fa-hackerrank', 'fas fa-hammer', 'fas fa-hamsa', 'fas fa-hand', 'far fa-fas fa-hand', 'fas fa-hand-back-fist', 'far fa-fas fa-hand-back-fist', 'fas fa-hand-dots', 'fas fa-hand-fist', 'fas fa-hand-holding', 'fas fa-hand-holding-dollar', 'fas fa-hand-holding-droplet', 'fas fa-hand-holding-hand', 'fas fa-hand-holding-heart', 'fas fa-hand-holding-medical', 'fas fa-hand-lizard', 'far fa-fas fa-hand-lizard', 'fas fa-hand-middle-finger', 'fas fa-hand-peace', 'far fa-fas fa-hand-peace', 'fas fa-hand-point-down', 'far fa-fas fa-hand-point-down', 'fas fa-hand-point-left', 'far fa-fas fa-hand-point-left', 'fas fa-hand-point-right', 'far fa-fas fa-hand-point-right', 'fas fa-hand-point-up', 'far fa-fas fa-hand-point-up', 'fas fa-hand-pointer', 'far fa-fas fa-hand-pointer', 'fas fa-hand-scissors', 'far fa-fas fa-hand-scissors', 'fas fa-hand-sparkles', 'fas fa-hand-spock', 'far fa-fas fa-hand-spock', 'fas fa-handcuffs', 'fas fa-hands', 'fas fa-hands-asl-interpreting', 'fas fa-hands-bound', 'fas fa-hands-bubbles', 'fas fa-hands-clapping', 'fas fa-hands-holding', 'fas fa-hands-holding-child', 'fas fa-hands-holding-circle', 'fas fa-hands-praying', 'fas fa-handshake', 'far fa-fas fa-handshake', 'fas fa-handshake-angle', 'fas fa-handshake-simple', 'fas fa-handshake-simple-slash', 'fas fa-handshake-slash', 'fas fa-hanukiah', 'fas fa-hard-drive', 'far fa-fas fa-hard-drive', 'fab fa-hashnode', 'fas fa-hashtag', 'fas fa-hat-cowboy', 'fas fa-hat-cowboy-side', 'fas fa-hat-wizard', 'fas fa-head-side-cough', 'fas fa-head-side-cough-slash', 'fas fa-head-side-mask', 'fas fa-head-side-virus', 'fas fa-heading', 'fas fa-headphones', 'fas fa-headphones-simple', 'fas fa-headset', 'fas fa-heart', 'far fa-fas fa-heart', 'fas fa-heart-circle-bolt', 'fas fa-heart-circle-check', 'fas fa-heart-circle-exclamation', 'fas fa-heart-circle-minus', 'fas fa-heart-circle-plus', 'fas fa-heart-circle-xmark', 'fas fa-heart-crack', 'fas fa-heart-pulse', 'fas fa-helicopter', 'fas fa-helicopter-symbol', 'fas fa-helmet-safety', 'fas fa-helmet-un', 'fas fa-hexagon-nodes', 'fas fa-hexagon-nodes-bolt', 'fas fa-highlighter', 'fas fa-hill-avalanche', 'fas fa-hill-rockslide', 'fas fa-hippo', 'fab fa-hips', 'fab fa-hire-a-helper', 'fab fa-hive', 'fas fa-hockey-puck', 'fas fa-holly-berry', 'fab fa-hooli', 'fab fa-hornbill', 'fas fa-horse', 'fas fa-horse-head', 'fas fa-hospital', 'far fa-fas fa-hospital', 'fas fa-hospital-user', 'fas fa-hot-tub-person', 'fas fa-hotdog', 'fas fa-hotel', 'fab fa-hotjar', 'fas fa-hourglass', 'far fa-fas fa-hourglass', 'fas fa-hourglass-end', 'fas fa-hourglass-half', 'far fa-fas fa-hourglass-half', 'fas fa-hourglass-start', 'fas fa-house', 'fas fa-house-chimney', 'fas fa-house-chimney-crack', 'fas fa-house-chimney-medical', 'fas fa-house-chimney-user', 'fas fa-house-chimney-window', 'fas fa-house-circle-check', 'fas fa-house-circle-exclamation', 'fas fa-house-circle-xmark', 'fas fa-house-crack', 'fas fa-house-fire', 'fas fa-house-flag', 'fas fa-house-flood-water', 'fas fa-house-flood-water-circle-arrow-right', 'fas fa-house-laptop', 'fas fa-house-lock', 'fas fa-house-medical', 'fas fa-house-medical-circle-check', 'fas fa-house-medical-circle-exclamation', 'fas fa-house-medical-circle-xmark', 'fas fa-house-medical-flag', 'fas fa-house-signal', 'fas fa-house-tsunami', 'fas fa-house-user', 'fab fa-houzz', 'fas fa-hryvnia-sign', 'fab fa-html5', 'fab fa-hubspot', 'fas fa-hurricane', 'fas fa-i', 'fas fa-i-cursor', 'fas fa-ice-cream', 'fas fa-icicles', 'fas fa-icons', 'fas fa-id-badge', 'far fa-fas fa-id-badge', 'fas fa-id-card', 'far fa-fas fa-id-card', 'fas fa-id-card-clip', 'fab fa-ideal', 'fas fa-igloo', 'fas fa-image', 'far fa-fas fa-image', 'fas fa-image-portrait', 'fas fa-images', 'far fa-fas fa-images', 'fab fa-imdb', 'fas fa-inbox', 'fas fa-indent', 'fas fa-indian-rupee-sign', 'fas fa-industry', 'fas fa-infinity', 'fas fa-info', 'fab fa-instagram', 'fab fa-instalod', 'fab fa-intercom', 'fab fa-internet-explorer', 'fab fa-invision', 'fab fa-ioxhost', 'fas fa-italic', 'fab fa-itch-io', 'fab fa-itunes', 'fab fa-itunes-note', 'fas fa-j', 'fas fa-jar', 'fas fa-jar-wheat', 'fab fa-java', 'fas fa-jedi', 'fab fa-jedi-order', 'fab fa-jenkins', 'fas fa-jet-fighter', 'fas fa-jet-fighter-up', 'fab fa-jira', 'fab fa-joget', 'fas fa-joint', 'fab fa-joomla', 'fab fa-js', 'fab fa-jsfiddle', 'fas fa-jug-detergent', 'fab fa-jxl', 'fas fa-k', 'fas fa-kaaba', 'fab fa-kaggle', 'fas fa-key', 'fab fa-keybase', 'fas fa-keyboard', 'far fa-fas fa-keyboard', 'fab fa-keycdn', 'fas fa-khanda', 'fab fa-kickstarter', 'fab fa-kickstarter-k', 'fas fa-kip-sign', 'fas fa-kit-medical', 'fas fa-kitchen-set', 'fas fa-kiwi-bird', 'fab fa-korvue', 'fas fa-l', 'fas fa-land-mine-on', 'fas fa-landmark', 'fas fa-landmark-dome', 'fas fa-landmark-flag', 'fas fa-language', 'fas fa-laptop', 'fas fa-laptop-code', 'fas fa-laptop-file', 'fas fa-laptop-medical', 'fab fa-laravel', 'fas fa-lari-sign', 'fab fa-lastfm', 'fas fa-layer-group', 'fas fa-leaf', 'fab fa-leanpub', 'fas fa-left-long', 'fas fa-left-right', 'fas fa-lemon', 'far fa-fas fa-lemon', 'fab fa-less', 'fas fa-less-than', 'fas fa-less-than-equal', 'fab fa-letterboxd', 'fas fa-life-ring', 'far fa-fas fa-life-ring', 'fas fa-lightbulb', 'far fa-fas fa-lightbulb', 'fab fa-line', 'fas fa-lines-leaning', 'fas fa-link', 'fas fa-link-slash', 'fab fa-linkedin', 'fab fa-linkedin-in', 'fab fa-linode', 'fab fa-linux', 'fas fa-lira-sign', 'fas fa-list', 'fas fa-list-check', 'fas fa-list-ol', 'fas fa-list-ul', 'fas fa-litecoin-sign', 'fas fa-location-arrow', 'fas fa-location-crosshairs', 'fas fa-location-dot', 'fas fa-location-pin', 'fas fa-location-pin-lock', 'fas fa-lock', 'fas fa-lock-open', 'fas fa-locust', 'fas fa-lungs', 'fas fa-lungs-virus', 'fab fa-lyft', 'fas fa-m', 'fab fa-magento', 'fas fa-magnet', 'fas fa-magnifying-glass', 'fas fa-magnifying-glass-arrow-right', 'fas fa-magnifying-glass-chart', 'fas fa-magnifying-glass-dollar', 'fas fa-magnifying-glass-location', 'fas fa-magnifying-glass-minus', 'fas fa-magnifying-glass-plus', 'fab fa-mailchimp', 'fas fa-manat-sign', 'fab fa-mandalorian', 'fas fa-map', 'far fa-fas fa-map', 'fas fa-map-location', 'fas fa-map-location-dot', 'fas fa-map-pin', 'fab fa-markdown', 'fas fa-marker', 'fas fa-mars', 'fas fa-mars-and-venus', 'fas fa-mars-and-venus-burst', 'fas fa-mars-double', 'fas fa-mars-stroke', 'fas fa-mars-stroke-right', 'fas fa-mars-stroke-up', 'fas fa-martini-glass', 'fas fa-martini-glass-citrus', 'fas fa-martini-glass-empty', 'fas fa-mask', 'fas fa-mask-face', 'fas fa-mask-ventilator', 'fas fa-masks-theater', 'fab fa-mastodon', 'fas fa-mattress-pillow', 'fab fa-maxcdn', 'fas fa-maximize', 'fab fa-mdb', 'fas fa-medal', 'fab fa-medapps', 'fab fa-medium', 'fab fa-medrt', 'fab fa-meetup', 'fab fa-megaport', 'fas fa-memory', 'fab fa-mendeley', 'fas fa-menorah', 'fas fa-mercury', 'fas fa-message', 'far fa-fas fa-message', 'fab fa-meta', 'fas fa-meteor', 'fab fa-microblog', 'fas fa-microchip', 'fas fa-microphone', 'fas fa-microphone-lines', 'fas fa-microphone-lines-slash', 'fas fa-microphone-slash', 'fas fa-microscope', 'fab fa-microsoft', 'fas fa-mill-sign', 'fas fa-minimize', 'fab fa-mintbit', 'fas fa-minus', 'fas fa-mitten', 'fab fa-mix', 'fab fa-mixcloud', 'fab fa-mixer', 'fab fa-mizuni', 'fas fa-mobile', 'fas fa-mobile-button', 'fas fa-mobile-retro', 'fas fa-mobile-screen', 'fas fa-mobile-screen-button', 'fab fa-modx', 'fab fa-monero', 'fas fa-money-bill', 'fas fa-money-bill-1', 'far fa-fas fa-money-bill-1', 'fas fa-money-bill-1-wave', 'fas fa-money-bill-transfer', 'fas fa-money-bill-trend-up', 'fas fa-money-bill-wave', 'fas fa-money-bill-wheat', 'fas fa-money-bills', 'fas fa-money-check', 'fas fa-money-check-dollar', 'fas fa-monument', 'fas fa-moon', 'far fa-fas fa-moon', 'fas fa-mortar-pestle', 'fas fa-mosque', 'fas fa-mosquito', 'fas fa-mosquito-net', 'fas fa-motorcycle', 'fas fa-mound', 'fas fa-mountain', 'fas fa-mountain-city', 'fas fa-mountain-sun', 'fas fa-mug-hot', 'fas fa-mug-saucer', 'fas fa-music', 'fas fa-n', 'fas fa-naira-sign', 'fab fa-napster', 'fab fa-neos', 'fas fa-network-wired', 'fas fa-neuter', 'fas fa-newspaper', 'far fa-fas fa-newspaper', 'fab fa-nfc-directional', 'fab fa-nfc-symbol', 'fab fa-nimblr', 'fab fa-node', 'fab fa-node-js', 'fas fa-not-equal', 'fas fa-notdef', 'fas fa-note-sticky', 'far fa-fas fa-note-sticky', 'fas fa-notes-medical', 'fab fa-npm', 'fab fa-ns8', 'fab fa-nutritionix', 'fas fa-o', 'fas fa-object-group', 'far fa-fas fa-object-group', 'fas fa-object-ungroup', 'far fa-fas fa-object-ungroup', 'fab fa-octopus-deploy', 'fab fa-odnoklassniki', 'fab fa-odysee', 'fas fa-oil-can', 'fas fa-oil-well', 'fab fa-old-republic', 'fas fa-om', 'fab fa-opencart', 'fab fa-openid', 'fab fa-opensuse', 'fab fa-opera', 'fab fa-optin-monster', 'fab fa-orcid', 'fab fa-osi', 'fas fa-otter', 'fas fa-outdent', 'fas fa-p', 'fab fa-padlet', 'fab fa-page4', 'fab fa-pagelines', 'fas fa-pager', 'fas fa-paint-roller', 'fas fa-paintbrush', 'fas fa-palette', 'fab fa-palfed', 'fas fa-pallet', 'fas fa-panorama', 'fas fa-paper-plane', 'far fa-fas fa-paper-plane', 'fas fa-paperclip', 'fas fa-parachute-box', 'fas fa-paragraph', 'fas fa-passport', 'fas fa-paste', 'far fa-fas fa-paste', 'fab fa-patreon', 'fas fa-pause', 'fas fa-paw', 'fab fa-paypal', 'fas fa-peace', 'fas fa-pen', 'fas fa-pen-clip', 'fas fa-pen-fancy', 'fas fa-pen-nib', 'fas fa-pen-ruler', 'fas fa-pen-to-square', 'far fa-fas fa-pen-to-square', 'fas fa-pencil', 'fas fa-people-arrows', 'fas fa-people-carry-box', 'fas fa-people-group', 'fas fa-people-line', 'fas fa-people-pulling', 'fas fa-people-robbery', 'fas fa-people-roof', 'fas fa-pepper-hot', 'fab fa-perbyte', 'fas fa-percent', 'fab fa-periscope', 'fas fa-person', 'fas fa-person-arrow-down-to-line', 'fas fa-person-arrow-up-from-line', 'fas fa-person-biking', 'fas fa-person-booth', 'fas fa-person-breastfeeding', 'fas fa-person-burst', 'fas fa-person-cane', 'fas fa-person-chalkboard', 'fas fa-person-circle-check', 'fas fa-person-circle-exclamation', 'fas fa-person-circle-minus', 'fas fa-person-circle-plus', 'fas fa-person-circle-question', 'fas fa-person-circle-xmark', 'fas fa-person-digging', 'fas fa-person-dots-from-line', 'fas fa-person-dress', 'fas fa-person-dress-burst', 'fas fa-person-drowning', 'fas fa-person-falling', 'fas fa-person-falling-burst', 'fas fa-person-half-dress', 'fas fa-person-harassing', 'fas fa-person-hiking', 'fas fa-person-military-pointing', 'fas fa-person-military-rifle', 'fas fa-person-military-to-person', 'fas fa-person-praying', 'fas fa-person-pregnant', 'fas fa-person-rays', 'fas fa-person-rifle', 'fas fa-person-running', 'fas fa-person-shelter', 'fas fa-person-skating', 'fas fa-person-skiing', 'fas fa-person-skiing-nordic', 'fas fa-person-snowboarding', 'fas fa-person-swimming', 'fas fa-person-through-window', 'fas fa-person-walking', 'fas fa-person-walking-arrow-loop-left', 'fas fa-person-walking-arrow-right', 'fas fa-person-walking-dashed-line-arrow-right', 'fas fa-person-walking-luggage', 'fas fa-person-walking-with-cane', 'fas fa-peseta-sign', 'fas fa-peso-sign', 'fab fa-phabricator', 'fab fa-phoenix-framework', 'fab fa-phoenix-squadron', 'fas fa-phone', 'fas fa-phone-flip', 'fas fa-phone-slash', 'fas fa-phone-volume', 'fas fa-photo-film', 'fab fa-php', 'fab fa-pied-piper', 'fab fa-pied-piper-alt', 'fab fa-pied-piper-hat', 'fab fa-pied-piper-pp', 'fas fa-piggy-bank', 'fas fa-pills', 'fab fa-pinterest', 'fab fa-pinterest-p', 'fab fa-pix', 'fab fa-pixiv', 'fas fa-pizza-slice', 'fas fa-place-of-worship', 'fas fa-plane', 'fas fa-plane-arrival', 'fas fa-plane-circle-check', 'fas fa-plane-circle-exclamation', 'fas fa-plane-circle-xmark', 'fas fa-plane-departure', 'fas fa-plane-lock', 'fas fa-plane-slash', 'fas fa-plane-up', 'fas fa-plant-wilt', 'fas fa-plate-wheat', 'fas fa-play', 'fab fa-playstation', 'fas fa-plug', 'fas fa-plug-circle-bolt', 'fas fa-plug-circle-check', 'fas fa-plug-circle-exclamation', 'fas fa-plug-circle-minus', 'fas fa-plug-circle-plus', 'fas fa-plug-circle-xmark', 'fas fa-plus', 'fas fa-plus-minus', 'fas fa-podcast', 'fas fa-poo', 'fas fa-poo-storm', 'fas fa-poop', 'fas fa-power-off', 'fas fa-prescription', 'fas fa-prescription-bottle', 'fas fa-prescription-bottle-medical', 'fas fa-print', 'fab fa-product-hunt', 'fas fa-pump-medical', 'fas fa-pump-soap', 'fab fa-pushed', 'fas fa-puzzle-piece', 'fab fa-python', 'fas fa-q', 'fab fa-qq', 'fas fa-qrcode', 'fas fa-question', 'fab fa-quinscape', 'fab fa-quora', 'fas fa-quote-left', 'fas fa-quote-right', 'fas fa-r', 'fab fa-r-project', 'fas fa-radiation', 'fas fa-radio', 'fas fa-rainbow', 'fas fa-ranking-star', 'fab fa-raspberry-pi', 'fab fa-ravelry', 'fab fa-react', 'fab fa-reacteurope', 'fab fa-readme', 'fab fa-rebel', 'fas fa-receipt', 'fas fa-record-vinyl', 'fas fa-rectangle-ad', 'fas fa-rectangle-list', 'far fa-fas fa-rectangle-list', 'fas fa-rectangle-xmark', 'far fa-fas fa-rectangle-xmark', 'fas fa-recycle', 'fab fa-red-river', 'fab fa-reddit', 'fab fa-reddit-alien', 'fab fa-redhat', 'fas fa-registered', 'far fa-fas fa-registered', 'fab fa-renren', 'fas fa-repeat', 'fas fa-reply', 'fas fa-reply-all', 'fab fa-replyd', 'fas fa-republican', 'fab fa-researchgate', 'fab fa-resolving', 'fas fa-restroom', 'fas fa-retweet', 'fab fa-rev', 'fas fa-ribbon', 'fas fa-right-from-bracket', 'fas fa-right-left', 'fas fa-right-long', 'fas fa-right-to-bracket', 'fas fa-ring', 'fas fa-road', 'fas fa-road-barrier', 'fas fa-road-bridge', 'fas fa-road-circle-check', 'fas fa-road-circle-exclamation', 'fas fa-road-circle-xmark', 'fas fa-road-lock', 'fas fa-road-spikes', 'fas fa-robot', 'fas fa-rocket', 'fab fa-rocketchat', 'fab fa-rockrms', 'fas fa-rotate', 'fas fa-rotate-left', 'fas fa-rotate-right', 'fas fa-route', 'fas fa-rss', 'fas fa-ruble-sign', 'fas fa-rug', 'fas fa-ruler', 'fas fa-ruler-combined', 'fas fa-ruler-horizontal', 'fas fa-ruler-vertical', 'fas fa-rupee-sign', 'fas fa-rupiah-sign', 'fab fa-rust', 'fas fa-s', 'fas fa-sack-dollar', 'fas fa-sack-xmark', 'fab fa-safari', 'fas fa-sailboat', 'fab fa-salesforce', 'fab fa-sass', 'fas fa-satellite', 'fas fa-satellite-dish', 'fas fa-scale-balanced', 'fas fa-scale-unbalanced', 'fas fa-scale-unbalanced-flip', 'fab fa-schlix', 'fas fa-school', 'fas fa-school-circle-check', 'fas fa-school-circle-exclamation', 'fas fa-school-circle-xmark', 'fas fa-school-flag', 'fas fa-school-lock', 'fas fa-scissors', 'fab fa-screenpal', 'fas fa-screwdriver', 'fas fa-screwdriver-wrench', 'fab fa-scribd', 'fas fa-scroll', 'fas fa-scroll-torah', 'fas fa-sd-card', 'fab fa-searchengin', 'fas fa-section', 'fas fa-seedling', 'fab fa-sellcast', 'fab fa-sellsy', 'fas fa-server', 'fab fa-servicestack', 'fas fa-shapes', 'fas fa-share', 'fas fa-share-from-square', 'far fa-fas fa-share-from-square', 'fas fa-share-nodes', 'fas fa-sheet-plastic', 'fas fa-shekel-sign', 'fas fa-shield', 'fas fa-shield-cat', 'fas fa-shield-dog', 'fas fa-shield-halved', 'fas fa-shield-heart', 'fas fa-shield-virus', 'fas fa-ship', 'fas fa-shirt', 'fab fa-shirtsinbulk', 'fas fa-shoe-prints', 'fab fa-shoelace', 'fas fa-shop', 'fas fa-shop-lock', 'fas fa-shop-slash', 'fab fa-shopify', 'fab fa-shopware', 'fas fa-shower', 'fas fa-shrimp', 'fas fa-shuffle', 'fas fa-shuttle-space', 'fas fa-sign-hanging', 'fas fa-signal', 'fab fa-signal-messenger', 'fas fa-signature', 'fas fa-signs-post', 'fas fa-sim-card', 'fab fa-simplybuilt', 'fas fa-sink', 'fab fa-sistrix', 'fas fa-sitemap', 'fab fa-sith', 'fab fa-sitrox', 'fab fa-sketch', 'fas fa-skull', 'fas fa-skull-crossbones', 'fab fa-skyatlas', 'fab fa-skype', 'fab fa-slack', 'fas fa-slash', 'fas fa-sleigh', 'fas fa-sliders', 'fab fa-slideshare', 'fas fa-smog', 'fas fa-smoking', 'fab fa-snapchat', 'fas fa-snowflake', 'far fa-fas fa-snowflake', 'fas fa-snowman', 'fas fa-snowplow', 'fas fa-soap', 'fas fa-socks', 'fas fa-solar-panel', 'fas fa-sort', 'fas fa-sort-down', 'fas fa-sort-up', 'fab fa-soundcloud', 'fab fa-sourcetree', 'fas fa-spa', 'fab fa-space-awesome', 'fas fa-spaghetti-monster-flying', 'fab fa-speakap', 'fab fa-speaker-deck', 'fas fa-spell-check', 'fas fa-spider', 'fas fa-spinner', 'fas fa-splotch', 'fas fa-spoon', 'fab fa-spotify', 'fas fa-spray-can', 'fas fa-spray-can-sparkles', 'fas fa-square', 'far fa-fas fa-square', 'fas fa-square-arrow-up-right', 'fab fa-square-behance', 'fas fa-square-binary', 'fab fa-square-bluesky', 'fas fa-square-caret-down', 'far fa-fas fa-square-caret-down', 'fas fa-square-caret-left', 'far fa-fas fa-square-caret-left', 'fas fa-square-caret-right', 'far fa-fas fa-square-caret-right', 'fas fa-square-caret-up', 'far fa-fas fa-square-caret-up', 'fas fa-square-check', 'far fa-fas fa-square-check', 'fab fa-square-dribbble', 'fas fa-square-envelope', 'fab fa-square-facebook', 'fab fa-square-font-awesome', 'fab fa-square-font-awesome-stroke', 'fas fa-square-full', 'far fa-fas fa-square-full', 'fab fa-square-git', 'fab fa-square-github', 'fab fa-square-gitlab', 'fab fa-square-google-plus', 'fas fa-square-h', 'fab fa-square-hacker-news', 'fab fa-square-instagram', 'fab fa-square-js', 'fab fa-square-lastfm', 'fab fa-square-letterboxd', 'fas fa-square-minus', 'far fa-fas fa-square-minus', 'fas fa-square-nfi', 'fab fa-square-odnoklassniki', 'fas fa-square-parking', 'fas fa-square-pen', 'fas fa-square-person-confined', 'fas fa-square-phone', 'fas fa-square-phone-flip', 'fab fa-square-pied-piper', 'fab fa-square-pinterest', 'fas fa-square-plus', 'far fa-fas fa-square-plus', 'fas fa-square-poll-horizontal', 'fas fa-square-poll-vertical', 'fab fa-square-reddit', 'fas fa-square-root-variable', 'fas fa-square-rss', 'fas fa-square-share-nodes', 'fab fa-square-snapchat', 'fab fa-square-steam', 'fab fa-square-threads', 'fab fa-square-tumblr', 'fab fa-square-twitter', 'fas fa-square-up-right', 'fab fa-square-upwork', 'fab fa-square-viadeo', 'fab fa-square-vimeo', 'fas fa-square-virus', 'fab fa-square-web-awesome', 'fab fa-square-web-awesome-stroke', 'fab fa-square-whatsapp', 'fab fa-square-x-twitter', 'fab fa-square-xing', 'fas fa-square-xmark', 'fab fa-square-youtube', 'fab fa-squarespace', 'fab fa-stack-exchange', 'fab fa-stack-overflow', 'fab fa-stackpath', 'fas fa-staff-snake', 'fas fa-stairs', 'fas fa-stamp', 'fas fa-stapler', 'fas fa-star', 'far fa-fas fa-star', 'fas fa-star-and-crescent', 'fas fa-star-half', 'far fa-fas fa-star-half', 'fas fa-star-half-stroke', 'far fa-fas fa-star-half-stroke', 'fas fa-star-of-david', 'fas fa-star-of-life', 'fab fa-staylinked', 'fab fa-steam', 'fab fa-steam-symbol', 'fas fa-sterling-sign', 'fas fa-stethoscope', 'fab fa-sticker-mule', 'fas fa-stop', 'fas fa-stopwatch', 'fas fa-stopwatch-20', 'fas fa-store', 'fas fa-store-slash', 'fab fa-strava', 'fas fa-street-view', 'fas fa-strikethrough', 'fab fa-stripe', 'fab fa-stripe-s', 'fas fa-stroopwafel', 'fab fa-stubber', 'fab fa-studiovinari', 'fab fa-stumbleupon', 'fab fa-stumbleupon-circle', 'fas fa-subscript', 'fas fa-suitcase', 'fas fa-suitcase-medical', 'fas fa-suitcase-rolling', 'fas fa-sun', 'far fa-fas fa-sun', 'fas fa-sun-plant-wilt', 'fab fa-superpowers', 'fas fa-superscript', 'fab fa-supple', 'fab fa-suse', 'fas fa-swatchbook', 'fab fa-swift', 'fab fa-symfony', 'fas fa-synagogue', 'fas fa-syringe', 'fas fa-t', 'fas fa-table', 'fas fa-table-cells', 'fas fa-table-cells-column-lock', 'fas fa-table-cells-large', 'fas fa-table-cells-row-lock', 'fas fa-table-cells-row-unlock', 'fas fa-table-columns', 'fas fa-table-list', 'fas fa-table-tennis-paddle-ball', 'fas fa-tablet', 'fas fa-tablet-button', 'fas fa-tablet-screen-button', 'fas fa-tablets', 'fas fa-tachograph-digital', 'fas fa-tag', 'fas fa-tags', 'fas fa-tape', 'fas fa-tarp', 'fas fa-tarp-droplet', 'fas fa-taxi', 'fab fa-teamspeak', 'fas fa-teeth', 'fas fa-teeth-open', 'fab fa-telegram', 'fas fa-temperature-arrow-down', 'fas fa-temperature-arrow-up', 'fas fa-temperature-empty', 'fas fa-temperature-full', 'fas fa-temperature-half', 'fas fa-temperature-high', 'fas fa-temperature-low', 'fas fa-temperature-quarter', 'fas fa-temperature-three-quarters', 'fab fa-tencent-weibo', 'fas fa-tenge-sign', 'fas fa-tent', 'fas fa-tent-arrow-down-to-line', 'fas fa-tent-arrow-left-right', 'fas fa-tent-arrow-turn-left', 'fas fa-tent-arrows-down', 'fas fa-tents', 'fas fa-terminal', 'fas fa-text-height', 'fas fa-text-slash', 'fas fa-text-width', 'fab fa-the-red-yeti', 'fab fa-themeco', 'fab fa-themeisle', 'fas fa-thermometer', 'fab fa-think-peaks', 'fab fa-threads', 'fas fa-thumbs-down', 'far fa-fas fa-thumbs-down', 'fas fa-thumbs-up', 'far fa-fas fa-thumbs-up', 'fas fa-thumbtack', 'fas fa-thumbtack-slash', 'fas fa-ticket', 'fas fa-ticket-simple', 'fab fa-tiktok', 'fas fa-timeline', 'fas fa-toggle-off', 'fas fa-toggle-on', 'fas fa-toilet', 'fas fa-toilet-paper', 'fas fa-toilet-paper-slash', 'fas fa-toilet-portable', 'fas fa-toilets-portable', 'fas fa-toolbox', 'fas fa-tooth', 'fas fa-torii-gate', 'fas fa-tornado', 'fas fa-tower-broadcast', 'fas fa-tower-cell', 'fas fa-tower-observation', 'fas fa-tractor', 'fab fa-trade-federation', 'fas fa-trademark', 'fas fa-traffic-light', 'fas fa-trailer', 'fas fa-train', 'fas fa-train-subway', 'fas fa-train-tram', 'fas fa-transgender', 'fas fa-trash', 'fas fa-trash-arrow-up', 'fas fa-trash-can', 'far fa-fas fa-trash-can', 'fas fa-trash-can-arrow-up', 'fas fa-tree', 'fas fa-tree-city', 'fab fa-trello', 'fas fa-triangle-exclamation', 'fas fa-trophy', 'fas fa-trowel', 'fas fa-trowel-bricks', 'fas fa-truck', 'fas fa-truck-arrow-right', 'fas fa-truck-droplet', 'fas fa-truck-fast', 'fas fa-truck-field', 'fas fa-truck-field-un', 'fas fa-truck-front', 'fas fa-truck-medical', 'fas fa-truck-monster', 'fas fa-truck-moving', 'fas fa-truck-pickup', 'fas fa-truck-plane', 'fas fa-truck-ramp-box', 'fas fa-tty', 'fab fa-tumblr', 'fas fa-turkish-lira-sign', 'fas fa-turn-down', 'fas fa-turn-up', 'fas fa-tv', 'fab fa-twitch', 'fab fa-twitter', 'fab fa-typo3', 'fas fa-u', 'fab fa-uber', 'fab fa-ubuntu', 'fab fa-uikit', 'fab fa-umbraco', 'fas fa-umbrella', 'fas fa-umbrella-beach', 'fab fa-uncharted', 'fas fa-underline', 'fab fa-uniregistry', 'fab fa-unity', 'fas fa-universal-access', 'fas fa-unlock', 'fas fa-unlock-keyhole', 'fab fa-unsplash', 'fab fa-untappd', 'fas fa-up-down', 'fas fa-up-down-left-right', 'fas fa-up-long', 'fas fa-up-right-and-down-left-from-center', 'fas fa-up-right-from-square', 'fas fa-upload', 'fab fa-ups', 'fab fa-upwork', 'fab fa-usb', 'fas fa-user', 'far fa-fas fa-user', 'fas fa-user-astronaut', 'fas fa-user-check', 'fas fa-user-clock', 'fas fa-user-doctor', 'fas fa-user-gear', 'fas fa-user-graduate', 'fas fa-user-group', 'fas fa-user-injured', 'fas fa-user-large', 'fas fa-user-large-slash', 'fas fa-user-lock', 'fas fa-user-minus', 'fas fa-user-ninja', 'fas fa-user-nurse', 'fas fa-user-pen', 'fas fa-user-plus', 'fas fa-user-secret', 'fas fa-user-shield', 'fas fa-user-slash', 'fas fa-user-tag', 'fas fa-user-tie', 'fas fa-user-xmark', 'fas fa-users', 'fas fa-users-between-lines', 'fas fa-users-gear', 'fas fa-users-line', 'fas fa-users-rays', 'fas fa-users-rectangle', 'fas fa-users-slash', 'fas fa-users-viewfinder', 'fab fa-usps', 'fab fa-ussunnah', 'fas fa-utensils', 'fas fa-v', 'fab fa-vaadin', 'fas fa-van-shuttle', 'fas fa-vault', 'fas fa-vector-square', 'fas fa-venus', 'fas fa-venus-double', 'fas fa-venus-mars', 'fas fa-vest', 'fas fa-vest-patches', 'fab fa-viacoin', 'fab fa-viadeo', 'fas fa-vial', 'fas fa-vial-circle-check', 'fas fa-vial-virus', 'fas fa-vials', 'fab fa-viber', 'fas fa-video', 'fas fa-video-slash', 'fas fa-vihara', 'fab fa-vimeo', 'fab fa-vimeo-v', 'fab fa-vine', 'fas fa-virus', 'fas fa-virus-covid', 'fas fa-virus-covid-slash', 'fas fa-virus-slash', 'fas fa-viruses', 'fab fa-vk', 'fab fa-vnv', 'fas fa-voicemail', 'fas fa-volcano', 'fas fa-volleyball', 'fas fa-volume-high', 'fas fa-volume-low', 'fas fa-volume-off', 'fas fa-volume-xmark', 'fas fa-vr-cardboard', 'fab fa-vuejs', 'fas fa-w', 'fas fa-walkie-talkie', 'fas fa-wallet', 'fas fa-wand-magic', 'fas fa-wand-magic-sparkles', 'fas fa-wand-sparkles', 'fas fa-warehouse', 'fab fa-watchman-monitoring', 'fas fa-water', 'fas fa-water-ladder', 'fas fa-wave-square', 'fab fa-waze', 'fas fa-web-awesome', 'fab fa-fas fa-web-awesome', 'fab fa-webflow', 'fab fa-weebly', 'fab fa-weibo', 'fas fa-weight-hanging', 'fas fa-weight-scale', 'fab fa-weixin', 'fab fa-whatsapp', 'fas fa-wheat-awn', 'fas fa-wheat-awn-circle-exclamation', 'fas fa-wheelchair', 'fas fa-wheelchair-move', 'fas fa-whiskey-glass', 'fab fa-whmcs', 'fas fa-wifi', 'fab fa-wikipedia-w', 'fas fa-wind', 'fas fa-window-maximize', 'far fa-fas fa-window-maximize', 'fas fa-window-minimize', 'far fa-fas fa-window-minimize', 'fas fa-window-restore', 'far fa-fas fa-window-restore', 'fab fa-windows', 'fas fa-wine-bottle', 'fas fa-wine-glass', 'fas fa-wine-glass-empty', 'fab fa-wirsindhandwerk', 'fab fa-wix', 'fab fa-wizards-of-the-coast', 'fab fa-wodu', 'fab fa-wolf-pack-battalion', 'fas fa-won-sign', 'fab fa-wordpress', 'fab fa-wordpress-simple', 'fas fa-worm', 'fab fa-wpbeginner', 'fab fa-wpexplorer', 'fab fa-wpforms', 'fab fa-wpressr', 'fas fa-wrench', 'fas fa-x', 'fas fa-x-ray', 'fab fa-x-twitter', 'fab fa-xbox', 'fab fa-xing', 'fas fa-xmark', 'fas fa-xmarks-lines', 'fas fa-y', 'fab fa-y-combinator', 'fab fa-yahoo', 'fab fa-yammer', 'fab fa-yandex', 'fab fa-yandex-international', 'fab fa-yarn', 'fab fa-yelp', 'fas fa-yen-sign', 'fas fa-yin-yang', 'fab fa-yoast', 'fab fa-youtube', 'fas fa-z', 'fab fa-zhihu' ); }
}
3 3
\ No newline at end of file
Please login to merge, or discard this patch.
redux-core/inc/extensions/taxonomy/class-redux-taxonomy-api.php 2 patches
Indentation   +627 added lines, -627 removed lines patch added patch discarded remove patch
@@ -13,631 +13,631 @@
 block discarded – undo
13 13
 // Don't duplicate me!
14 14
 if ( ! class_exists( 'Redux_Taxonomy' ) ) {
15 15
 
16
-	/**
17
-	 * Redux Taxonomy API Class
18
-	 * Simple API for Redux Framework
19
-	 *
20
-	 * @since       1.0.0
21
-	 */
22
-	class Redux_Taxonomy {
23
-
24
-		/**
25
-		 * Terms array.
26
-		 *
27
-		 * @var array
28
-		 */
29
-		public static array $terms = array();
30
-
31
-		/**
32
-		 * Sections array.
33
-		 *
34
-		 * @var array
35
-		 */
36
-		public static array $sections = array();
37
-
38
-		/**
39
-		 * Fields array.
40
-		 *
41
-		 * @var array
42
-		 */
43
-		public static array $fields = array();
44
-
45
-		/**
46
-		 * Priority array.
47
-		 *
48
-		 * @var array
49
-		 */
50
-		public static array $priority = array();
51
-
52
-		/**
53
-		 * Errors array.
54
-		 *
55
-		 * @var array
56
-		 */
57
-		public static array $errors = array();
58
-
59
-		/**
60
-		 * Init array.
61
-		 *
62
-		 * @var array
63
-		 */
64
-		public static array $init = array();
65
-
66
-		/**
67
-		 * Args array.
68
-		 *
69
-		 * @var array
70
-		 */
71
-		public static array $args = array();
72
-
73
-		/**
74
-		 * Load.
75
-		 */
76
-		public static function load() {
77
-			add_action( 'init', array( 'Redux_Taxonomy', 'enqueue' ), 99 );
78
-		}
79
-
80
-		/**
81
-		 * Enqueue support files and fields.
82
-		 *
83
-		 * @throws ReflectionException Exception.
84
-		 */
85
-		public static function enqueue() {
86
-			global $pagenow;
87
-
88
-			// Check and run instances of Redux where the opt_name hasn't been run.
89
-			$pagenows = array( 'edit-tags.php', 'term.php' );
90
-
91
-			if ( ! empty( self::$sections ) && in_array( $pagenow, $pagenows, true ) ) {
92
-				$instances = Redux::all_instances();
93
-
94
-				foreach ( self::$fields as $opt_name => $fields ) {
95
-					if ( ! isset( $instances[ $opt_name ] ) ) {
96
-						Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) );
97
-
98
-						Redux::set_sections(
99
-							$opt_name,
100
-							array(
101
-								array(
102
-									'id'     => 'EXTENSION_TAXONOMY_FAKE_ID' . $opt_name,
103
-									'fields' => $fields,
104
-									'title'  => 'N/A',
105
-								),
106
-							)
107
-						);
108
-
109
-						Redux::init( $opt_name );
110
-
111
-						$instances = ReduxFrameworkInstances::get_all_instances();
112
-					}
113
-
114
-					self::check_opt_name( $opt_name );
115
-
116
-					Redux::set_args( $opt_name, self::$args[ $opt_name ] );
117
-				}
118
-			}
119
-		}
120
-
121
-		/**
122
-		 * Construct Args.
123
-		 *
124
-		 * @param string $opt_name Panel opt_name.
125
-		 *
126
-		 * @return mixed
127
-		 */
128
-		public static function construct_args( string $opt_name ) {
129
-			$args             = self::$args[ $opt_name ];
130
-			$args['opt_name'] = $opt_name;
131
-
132
-			if ( ! isset( $args['menu_title'] ) ) {
133
-				$args['menu_title'] = ucfirst( $opt_name ) . ' Options';
134
-			}
135
-
136
-			if ( ! isset( $args['page_title'] ) ) {
137
-				$args['page_title'] = ucfirst( $opt_name ) . ' Options';
138
-			}
139
-
140
-			if ( ! isset( $args['page_slug'] ) ) {
141
-				$args['page_slug'] = $opt_name . '_options';
142
-			}
143
-
144
-			return $args;
145
-		}
146
-
147
-		/**
148
-		 * Construct Terms
149
-		 *
150
-		 * @param string $opt_name Panel opt_name.
151
-		 *
152
-		 * @return array
153
-		 */
154
-		public static function construct_terms( string $opt_name ): array {
155
-			$terms = array();
156
-
157
-			if ( ! isset( self::$terms[ $opt_name ] ) ) {
158
-				return $terms;
159
-			}
160
-
161
-			foreach ( self::$terms[ $opt_name ] as $term ) {
162
-				$term['sections'] = self::construct_sections( $opt_name, $term['id'] );
163
-				$terms[]          = $term;
164
-			}
165
-
166
-			ksort( $terms );
167
-
168
-			return $terms;
169
-		}
170
-
171
-		/**
172
-		 * Construct Sections.
173
-		 *
174
-		 * @param string $opt_name       Panel opt_name.
175
-		 * @param string $term_id        Term ID.
176
-		 *
177
-		 * @return array
178
-		 */
179
-		public static function construct_sections( string $opt_name, string $term_id ): array {
180
-			$sections = array();
181
-
182
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
183
-				return $sections;
184
-			}
185
-
186
-			foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
187
-				if ( $section['term_id'] === $term_id ) {
188
-					self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section;
189
-
190
-					$p = $section['priority'];
191
-
192
-					while ( isset( $sections[ $p ] ) ) {
193
-						echo esc_html( $p++ );
194
-					}
195
-
196
-					$section['fields'] = self::construct_fields( $opt_name, $section_id );
197
-					$sections[ $p ]    = $section;
198
-				}
199
-			}
200
-
201
-			ksort( $sections );
202
-
203
-			return $sections;
204
-		}
205
-
206
-		/**
207
-		 * Construct Fields.
208
-		 *
209
-		 * @param string $opt_name       Panel opt_name.
210
-		 * @param string $section_id     Section ID.
211
-		 * @param bool   $permissions    Permissions.
212
-		 * @param bool   $add_visibility Add visibility.
213
-		 *
214
-		 * @return array
215
-		 */
216
-		public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array {
217
-			$fields = array();
218
-
219
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
220
-				return $fields;
221
-			}
222
-
223
-			foreach ( self::$fields[ $opt_name ] as $key => $field ) {
224
-				// Nested permissions.
225
-				$field['permissions'] = $field['permissions'] ?? $permissions;
226
-
227
-				self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions'];
228
-
229
-				// Nested add_visibility permissions.
230
-				$field['add_visibility'] = $field['add_visibility'] ?? $add_visibility;
231
-
232
-				self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility'];
233
-
234
-				if ( $field['section_id'] === $section_id ) {
235
-					$p = $field['priority'];
236
-
237
-					while ( isset( $fields[ $p ] ) ) {
238
-						echo esc_html( $p++ );
239
-					}
240
-
241
-					$fields[ $p ] = $field;
242
-				}
243
-			}
244
-
245
-			ksort( $fields );
246
-
247
-			return $fields;
248
-		}
249
-
250
-		/**
251
-		 * Get Section.
252
-		 *
253
-		 * @param string $opt_name Panel opt_name.
254
-		 * @param string $id       ID.
255
-		 *
256
-		 * @return bool
257
-		 */
258
-		public static function get_section( string $opt_name = '', string $id = '' ): bool {
259
-			self::check_opt_name( $opt_name );
260
-
261
-			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
262
-				if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
263
-					$id = strtolower( sanitize_html_class( $id ) );
264
-				}
265
-
266
-				return self::$sections[ $opt_name ][ $id ] ?? false;
267
-			}
268
-
269
-			return false;
270
-		}
271
-
272
-		/**
273
-		 * Set_section.
274
-		 *
275
-		 * @param string $opt_name Panel opt_name.
276
-		 * @param array  $section  Section array.
277
-		 */
278
-		public static function set_section( string $opt_name = '', array $section = array() ) {
279
-			self::check_opt_name( $opt_name );
280
-
281
-			if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) {
282
-				if ( ! isset( $section['id'] ) ) {
283
-					if ( isset( $section['title'] ) ) {
284
-						$section['id'] = strtolower( sanitize_html_class( $section['title'] ) );
285
-					} else {
286
-						$section['id'] = 'section';
287
-					}
288
-
289
-					if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
290
-						$orig = $section['id'];
291
-						$i    = 0;
292
-
293
-						while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
294
-							$section['id'] = $orig . '_' . $i;
295
-						}
296
-					}
297
-				}
298
-
299
-				if ( ! isset( $section['priority'] ) ) {
300
-					$section['priority'] = self::get_priority( $opt_name, 'sections' );
301
-				}
302
-
303
-				if ( isset( $section['fields'] ) ) {
304
-					if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) {
305
-						if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) {
306
-							foreach ( $section['fields'] as $key => $field ) {
307
-								if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) {
308
-									$section['fields'][ $key ]['permissions'] = $section['permissions'];
309
-								}
310
-
311
-								if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) {
312
-									$section['fields'][ $key ]['add_visibility'] = $section['add_visibility'];
313
-								}
314
-							}
315
-						}
316
-
317
-						self::process_fields_array( $opt_name, $section['id'], $section['fields'] );
318
-					}
319
-
320
-					unset( $section['fields'] );
321
-				}
322
-
323
-				self::$sections[ $opt_name ][ $section['id'] ] = $section;
324
-			} else {
325
-				self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
326
-			}
327
-		}
328
-
329
-		/**
330
-		 * Process Sections Array.
331
-		 *
332
-		 * @param string $opt_name Panel opt_name.
333
-		 * @param string $term_id  Term ID.
334
-		 * @param array  $sections Sections array.
335
-		 */
336
-		public static function process_sections_array( string $opt_name = '', string $term_id = '', array $sections = array() ) {
337
-			if ( ! empty( $opt_name ) && ! empty( $term_id ) && is_array( $sections ) && ! empty( $sections ) ) {
338
-				foreach ( $sections as $section ) {
339
-					if ( ! is_array( $section ) ) {
340
-						continue;
341
-					}
342
-
343
-					$section['term_id'] = $term_id;
344
-
345
-					if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) {
346
-						$section['fields'] = array();
347
-					}
348
-
349
-					self::set_section( $opt_name, $section );
350
-				}
351
-			}
352
-		}
353
-
354
-		/**
355
-		 * Process field array.
356
-		 *
357
-		 * @param string $opt_name   Panel opt_name.
358
-		 * @param string $section_id Section ID.
359
-		 * @param array  $fields     Fields array.
360
-		 */
361
-		public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) {
362
-			if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) {
363
-				foreach ( $fields as $field ) {
364
-					if ( ! is_array( $field ) ) {
365
-						continue;
366
-					}
367
-
368
-					$field['section_id'] = $section_id;
369
-
370
-					self::set_field( $opt_name, $field );
371
-				}
372
-			}
373
-		}
374
-
375
-		/**
376
-		 * Get field.
377
-		 *
378
-		 * @param string $opt_name Panel opt_name.
379
-		 * @param string $id       ID.
380
-		 *
381
-		 * @return bool
382
-		 */
383
-		public static function get_field( string $opt_name = '', string $id = '' ): bool {
384
-			self::check_opt_name( $opt_name );
385
-
386
-			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
387
-				return self::$fields[ $opt_name ][ $id ] ?? false;
388
-			}
389
-
390
-			return false;
391
-		}
392
-
393
-		/**
394
-		 * Set field.
395
-		 *
396
-		 * @param string $opt_name Panel opt_name.
397
-		 * @param array  $field    Field array.
398
-		 */
399
-		public static function set_field( string $opt_name = '', array $field = array() ) {
400
-			self::check_opt_name( $opt_name );
401
-
402
-			if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) {
403
-				if ( ! isset( $field['priority'] ) ) {
404
-					$field['priority'] = self::get_priority( $opt_name, 'fields' );
405
-				}
406
-
407
-				self::$fields[ $opt_name ][ $field['id'] ] = $field;
408
-			}
409
-		}
410
-
411
-		/**
412
-		 * Set args.
413
-		 *
414
-		 * @param string $opt_name Panel opt_name.
415
-		 * @param array  $args     Args array.
416
-		 */
417
-		public static function set_args( string $opt_name = '', array $args = array() ) {
418
-			self::check_opt_name( $opt_name );
419
-
420
-			if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) {
421
-				self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array();
422
-				self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
423
-			}
424
-		}
425
-
426
-		/**
427
-		 * Set term.
428
-		 *
429
-		 * @param string $opt_name Panel opt_name.
430
-		 * @param array  $term     Term array.
431
-		 */
432
-		public static function set_term( string $opt_name = '', array $term = array() ) {
433
-			self::check_opt_name( $opt_name );
434
-
435
-			if ( ! empty( $opt_name ) && is_array( $term ) && ! empty( $term ) ) {
436
-				if ( ! isset( $term['id'] ) ) {
437
-					if ( isset( $term['title'] ) ) {
438
-						$term['id'] = strtolower( sanitize_html_class( $term['title'] ) );
439
-					} else {
440
-						$term['id'] = 'term';
441
-					}
442
-
443
-					if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
444
-						$orig = $term['id'];
445
-						$i    = 0;
446
-
447
-						while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
448
-							$term['id'] = $orig . '_' . $i;
449
-						}
450
-					}
451
-				}
452
-
453
-				if ( isset( $term['sections'] ) ) {
454
-					if ( ! empty( $term['sections'] ) && is_array( $term['sections'] ) ) {
455
-						if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) {
456
-							foreach ( $term['sections'] as $key => $section ) {
457
-								if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) {
458
-									$term['sections'][ $key ]['permissions'] = $term['permissions'];
459
-								}
460
-
461
-								if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) {
462
-									$term['sections'][ $key ]['add_visibility'] = $term['add_visibility'];
463
-								}
464
-							}
465
-						}
466
-
467
-						self::process_sections_array( $opt_name, $term['id'], $term['sections'] );
468
-					}
469
-
470
-					unset( $term['sections'] );
471
-				}
472
-
473
-				self::$terms[ $opt_name ][ $term['id'] ] = $term;
474
-			} else {
475
-				self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' );
476
-			}
477
-		}
478
-
479
-		/**
480
-		 * Get terms.
481
-		 *
482
-		 * @param string $opt_name Panel opt_name.
483
-		 *
484
-		 * @return mixed
485
-		 */
486
-		public static function get_terms( string $opt_name = '' ) {
487
-			self::check_opt_name( $opt_name );
488
-
489
-			if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) {
490
-				return self::$terms[ $opt_name ];
491
-			}
492
-
493
-			return false;
494
-		}
495
-
496
-		/**
497
-		 * Get priority.
498
-		 *
499
-		 * @param string $opt_name Panel opt_name.
500
-		 * @param string $type     Field type.
501
-		 *
502
-		 * @return mixed
503
-		 */
504
-		public static function get_priority( string $opt_name, string $type ) {
505
-			$priority                              = self::$priority[ $opt_name ][ $type ];
506
-			self::$priority[ $opt_name ][ $type ] += 1;
507
-
508
-			return $priority;
509
-		}
510
-
511
-		/**
512
-		 * Check opt_name.
513
-		 *
514
-		 * @param string $opt_name Panel opt_name.
515
-		 */
516
-		public static function check_opt_name( string $opt_name = '' ) {
517
-			if ( empty( $opt_name ) || is_array( $opt_name ) ) {
518
-				return;
519
-			}
520
-
521
-			if ( ! isset( self::$terms[ $opt_name ] ) ) {
522
-				self::$terms[ $opt_name ] = array();
523
-			}
524
-
525
-			if ( ! isset( self::$priority[ $opt_name ] ) ) {
526
-				self::$priority[ $opt_name ]['args'] = 1;
527
-			}
528
-
529
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
530
-				self::$sections[ $opt_name ]             = array();
531
-				self::$priority[ $opt_name ]['sections'] = 1;
532
-			}
533
-
534
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
535
-				self::$fields[ $opt_name ]             = array();
536
-				self::$priority[ $opt_name ]['fields'] = 1;
537
-			}
538
-
539
-			if ( ! isset( self::$errors[ $opt_name ] ) ) {
540
-				self::$errors[ $opt_name ] = array();
541
-			}
542
-
543
-			if ( ! isset( self::$init[ $opt_name ] ) ) {
544
-				self::$init[ $opt_name ] = false;
545
-			}
546
-
547
-			if ( ! isset( self::$args[ $opt_name ] ) ) {
548
-				self::$args[ $opt_name ] = false;
549
-			}
550
-		}
551
-
552
-		/**
553
-		 * Get field defaults.
554
-		 *
555
-		 * @param string $opt_name Panel opt_name.
556
-		 *
557
-		 * @return array|void
558
-		 */
559
-		public static function get_field_defaults( string $opt_name ) {
560
-			if ( empty( $opt_name ) ) {
561
-				return;
562
-			}
563
-
564
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
565
-				return array();
566
-			}
567
-
568
-			return array_map(
569
-				function ( $field ) {
570
-					return $field['default'] ?? '';
571
-				},
572
-				self::$fields[ $opt_name ]
573
-			);
574
-		}
575
-
576
-		/**
577
-		 * Get term meta.
578
-		 *
579
-		 * @param array $args Args array.
580
-		 *
581
-		 * @return array|mixed|string
582
-		 */
583
-		public static function get_term_meta( array $args = array() ) {
584
-			$default = array(
585
-				'key'      => '',
586
-				'opt_name' => '',
587
-				'taxonomy' => '',
588
-			);
589
-
590
-			$args = wp_parse_args( $args, $default );
591
-
592
-			// phpcs:ignore WordPress.PHP.DontExtract
593
-			extract( $args );
594
-
595
-			if ( empty( $taxonomy ) ) {
596
-				return array();
597
-			}
598
-
599
-			$single = ! empty( $key );
600
-
601
-			$meta = get_term_meta( $taxonomy, $key, $single );
602
-
603
-			// phpcs:ignore Generic.CodeAnalysis.EmptyStatement
604
-			if ( $single ) {
605
-				// Do nothing.
606
-			} elseif ( ! empty( $meta ) ) {
607
-				foreach ( $meta as $key => $value ) {
608
-					if ( is_array( $value ) ) {
609
-						$value = $value[0];
610
-					}
611
-
612
-					$meta[ $key ] = maybe_unserialize( $value );
613
-				}
614
-			}
615
-
616
-			if ( ! empty( $opt_name ) ) {
617
-				$defaults = self::get_field_defaults( $opt_name );
618
-
619
-				if ( $single ) {
620
-					$default_value = '';
621
-
622
-					if ( isset( $defaults[ $key ] ) ) {
623
-						$default_value = $defaults[ $key ];
624
-					}
625
-
626
-					if ( is_array( $meta ) ) {
627
-						if ( is_array( $default_value ) ) {
628
-							$meta = wp_parse_args( $meta, $default_value );
629
-						}
630
-					} elseif ( '' === $meta && '' !== $default_value ) {
631
-							$meta = $default_value;
632
-					}
633
-				} else {
634
-					$meta = wp_parse_args( $meta, $defaults );
635
-				}
636
-			}
637
-
638
-			return $meta;
639
-		}
640
-	}
641
-
642
-	Redux_Taxonomy::load();
16
+    /**
17
+     * Redux Taxonomy API Class
18
+     * Simple API for Redux Framework
19
+     *
20
+     * @since       1.0.0
21
+     */
22
+    class Redux_Taxonomy {
23
+
24
+        /**
25
+         * Terms array.
26
+         *
27
+         * @var array
28
+         */
29
+        public static array $terms = array();
30
+
31
+        /**
32
+         * Sections array.
33
+         *
34
+         * @var array
35
+         */
36
+        public static array $sections = array();
37
+
38
+        /**
39
+         * Fields array.
40
+         *
41
+         * @var array
42
+         */
43
+        public static array $fields = array();
44
+
45
+        /**
46
+         * Priority array.
47
+         *
48
+         * @var array
49
+         */
50
+        public static array $priority = array();
51
+
52
+        /**
53
+         * Errors array.
54
+         *
55
+         * @var array
56
+         */
57
+        public static array $errors = array();
58
+
59
+        /**
60
+         * Init array.
61
+         *
62
+         * @var array
63
+         */
64
+        public static array $init = array();
65
+
66
+        /**
67
+         * Args array.
68
+         *
69
+         * @var array
70
+         */
71
+        public static array $args = array();
72
+
73
+        /**
74
+         * Load.
75
+         */
76
+        public static function load() {
77
+            add_action( 'init', array( 'Redux_Taxonomy', 'enqueue' ), 99 );
78
+        }
79
+
80
+        /**
81
+         * Enqueue support files and fields.
82
+         *
83
+         * @throws ReflectionException Exception.
84
+         */
85
+        public static function enqueue() {
86
+            global $pagenow;
87
+
88
+            // Check and run instances of Redux where the opt_name hasn't been run.
89
+            $pagenows = array( 'edit-tags.php', 'term.php' );
90
+
91
+            if ( ! empty( self::$sections ) && in_array( $pagenow, $pagenows, true ) ) {
92
+                $instances = Redux::all_instances();
93
+
94
+                foreach ( self::$fields as $opt_name => $fields ) {
95
+                    if ( ! isset( $instances[ $opt_name ] ) ) {
96
+                        Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) );
97
+
98
+                        Redux::set_sections(
99
+                            $opt_name,
100
+                            array(
101
+                                array(
102
+                                    'id'     => 'EXTENSION_TAXONOMY_FAKE_ID' . $opt_name,
103
+                                    'fields' => $fields,
104
+                                    'title'  => 'N/A',
105
+                                ),
106
+                            )
107
+                        );
108
+
109
+                        Redux::init( $opt_name );
110
+
111
+                        $instances = ReduxFrameworkInstances::get_all_instances();
112
+                    }
113
+
114
+                    self::check_opt_name( $opt_name );
115
+
116
+                    Redux::set_args( $opt_name, self::$args[ $opt_name ] );
117
+                }
118
+            }
119
+        }
120
+
121
+        /**
122
+         * Construct Args.
123
+         *
124
+         * @param string $opt_name Panel opt_name.
125
+         *
126
+         * @return mixed
127
+         */
128
+        public static function construct_args( string $opt_name ) {
129
+            $args             = self::$args[ $opt_name ];
130
+            $args['opt_name'] = $opt_name;
131
+
132
+            if ( ! isset( $args['menu_title'] ) ) {
133
+                $args['menu_title'] = ucfirst( $opt_name ) . ' Options';
134
+            }
135
+
136
+            if ( ! isset( $args['page_title'] ) ) {
137
+                $args['page_title'] = ucfirst( $opt_name ) . ' Options';
138
+            }
139
+
140
+            if ( ! isset( $args['page_slug'] ) ) {
141
+                $args['page_slug'] = $opt_name . '_options';
142
+            }
143
+
144
+            return $args;
145
+        }
146
+
147
+        /**
148
+         * Construct Terms
149
+         *
150
+         * @param string $opt_name Panel opt_name.
151
+         *
152
+         * @return array
153
+         */
154
+        public static function construct_terms( string $opt_name ): array {
155
+            $terms = array();
156
+
157
+            if ( ! isset( self::$terms[ $opt_name ] ) ) {
158
+                return $terms;
159
+            }
160
+
161
+            foreach ( self::$terms[ $opt_name ] as $term ) {
162
+                $term['sections'] = self::construct_sections( $opt_name, $term['id'] );
163
+                $terms[]          = $term;
164
+            }
165
+
166
+            ksort( $terms );
167
+
168
+            return $terms;
169
+        }
170
+
171
+        /**
172
+         * Construct Sections.
173
+         *
174
+         * @param string $opt_name       Panel opt_name.
175
+         * @param string $term_id        Term ID.
176
+         *
177
+         * @return array
178
+         */
179
+        public static function construct_sections( string $opt_name, string $term_id ): array {
180
+            $sections = array();
181
+
182
+            if ( ! isset( self::$sections[ $opt_name ] ) ) {
183
+                return $sections;
184
+            }
185
+
186
+            foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
187
+                if ( $section['term_id'] === $term_id ) {
188
+                    self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section;
189
+
190
+                    $p = $section['priority'];
191
+
192
+                    while ( isset( $sections[ $p ] ) ) {
193
+                        echo esc_html( $p++ );
194
+                    }
195
+
196
+                    $section['fields'] = self::construct_fields( $opt_name, $section_id );
197
+                    $sections[ $p ]    = $section;
198
+                }
199
+            }
200
+
201
+            ksort( $sections );
202
+
203
+            return $sections;
204
+        }
205
+
206
+        /**
207
+         * Construct Fields.
208
+         *
209
+         * @param string $opt_name       Panel opt_name.
210
+         * @param string $section_id     Section ID.
211
+         * @param bool   $permissions    Permissions.
212
+         * @param bool   $add_visibility Add visibility.
213
+         *
214
+         * @return array
215
+         */
216
+        public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array {
217
+            $fields = array();
218
+
219
+            if ( ! isset( self::$fields[ $opt_name ] ) ) {
220
+                return $fields;
221
+            }
222
+
223
+            foreach ( self::$fields[ $opt_name ] as $key => $field ) {
224
+                // Nested permissions.
225
+                $field['permissions'] = $field['permissions'] ?? $permissions;
226
+
227
+                self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions'];
228
+
229
+                // Nested add_visibility permissions.
230
+                $field['add_visibility'] = $field['add_visibility'] ?? $add_visibility;
231
+
232
+                self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility'];
233
+
234
+                if ( $field['section_id'] === $section_id ) {
235
+                    $p = $field['priority'];
236
+
237
+                    while ( isset( $fields[ $p ] ) ) {
238
+                        echo esc_html( $p++ );
239
+                    }
240
+
241
+                    $fields[ $p ] = $field;
242
+                }
243
+            }
244
+
245
+            ksort( $fields );
246
+
247
+            return $fields;
248
+        }
249
+
250
+        /**
251
+         * Get Section.
252
+         *
253
+         * @param string $opt_name Panel opt_name.
254
+         * @param string $id       ID.
255
+         *
256
+         * @return bool
257
+         */
258
+        public static function get_section( string $opt_name = '', string $id = '' ): bool {
259
+            self::check_opt_name( $opt_name );
260
+
261
+            if ( ! empty( $opt_name ) && ! empty( $id ) ) {
262
+                if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
263
+                    $id = strtolower( sanitize_html_class( $id ) );
264
+                }
265
+
266
+                return self::$sections[ $opt_name ][ $id ] ?? false;
267
+            }
268
+
269
+            return false;
270
+        }
271
+
272
+        /**
273
+         * Set_section.
274
+         *
275
+         * @param string $opt_name Panel opt_name.
276
+         * @param array  $section  Section array.
277
+         */
278
+        public static function set_section( string $opt_name = '', array $section = array() ) {
279
+            self::check_opt_name( $opt_name );
280
+
281
+            if ( ! empty( $opt_name ) && is_array( $section ) && ! empty( $section ) ) {
282
+                if ( ! isset( $section['id'] ) ) {
283
+                    if ( isset( $section['title'] ) ) {
284
+                        $section['id'] = strtolower( sanitize_html_class( $section['title'] ) );
285
+                    } else {
286
+                        $section['id'] = 'section';
287
+                    }
288
+
289
+                    if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
290
+                        $orig = $section['id'];
291
+                        $i    = 0;
292
+
293
+                        while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
294
+                            $section['id'] = $orig . '_' . $i;
295
+                        }
296
+                    }
297
+                }
298
+
299
+                if ( ! isset( $section['priority'] ) ) {
300
+                    $section['priority'] = self::get_priority( $opt_name, 'sections' );
301
+                }
302
+
303
+                if ( isset( $section['fields'] ) ) {
304
+                    if ( ! empty( $section['fields'] ) && is_array( $section['fields'] ) ) {
305
+                        if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) {
306
+                            foreach ( $section['fields'] as $key => $field ) {
307
+                                if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) {
308
+                                    $section['fields'][ $key ]['permissions'] = $section['permissions'];
309
+                                }
310
+
311
+                                if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) {
312
+                                    $section['fields'][ $key ]['add_visibility'] = $section['add_visibility'];
313
+                                }
314
+                            }
315
+                        }
316
+
317
+                        self::process_fields_array( $opt_name, $section['id'], $section['fields'] );
318
+                    }
319
+
320
+                    unset( $section['fields'] );
321
+                }
322
+
323
+                self::$sections[ $opt_name ][ $section['id'] ] = $section;
324
+            } else {
325
+                self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
326
+            }
327
+        }
328
+
329
+        /**
330
+         * Process Sections Array.
331
+         *
332
+         * @param string $opt_name Panel opt_name.
333
+         * @param string $term_id  Term ID.
334
+         * @param array  $sections Sections array.
335
+         */
336
+        public static function process_sections_array( string $opt_name = '', string $term_id = '', array $sections = array() ) {
337
+            if ( ! empty( $opt_name ) && ! empty( $term_id ) && is_array( $sections ) && ! empty( $sections ) ) {
338
+                foreach ( $sections as $section ) {
339
+                    if ( ! is_array( $section ) ) {
340
+                        continue;
341
+                    }
342
+
343
+                    $section['term_id'] = $term_id;
344
+
345
+                    if ( ! isset( $section['fields'] ) || ! is_array( $section['fields'] ) ) {
346
+                        $section['fields'] = array();
347
+                    }
348
+
349
+                    self::set_section( $opt_name, $section );
350
+                }
351
+            }
352
+        }
353
+
354
+        /**
355
+         * Process field array.
356
+         *
357
+         * @param string $opt_name   Panel opt_name.
358
+         * @param string $section_id Section ID.
359
+         * @param array  $fields     Fields array.
360
+         */
361
+        public static function process_fields_array( string $opt_name = '', string $section_id = '', array $fields = array() ) {
362
+            if ( ! empty( $opt_name ) && ! empty( $section_id ) && is_array( $fields ) && ! empty( $fields ) ) {
363
+                foreach ( $fields as $field ) {
364
+                    if ( ! is_array( $field ) ) {
365
+                        continue;
366
+                    }
367
+
368
+                    $field['section_id'] = $section_id;
369
+
370
+                    self::set_field( $opt_name, $field );
371
+                }
372
+            }
373
+        }
374
+
375
+        /**
376
+         * Get field.
377
+         *
378
+         * @param string $opt_name Panel opt_name.
379
+         * @param string $id       ID.
380
+         *
381
+         * @return bool
382
+         */
383
+        public static function get_field( string $opt_name = '', string $id = '' ): bool {
384
+            self::check_opt_name( $opt_name );
385
+
386
+            if ( ! empty( $opt_name ) && ! empty( $id ) ) {
387
+                return self::$fields[ $opt_name ][ $id ] ?? false;
388
+            }
389
+
390
+            return false;
391
+        }
392
+
393
+        /**
394
+         * Set field.
395
+         *
396
+         * @param string $opt_name Panel opt_name.
397
+         * @param array  $field    Field array.
398
+         */
399
+        public static function set_field( string $opt_name = '', array $field = array() ) {
400
+            self::check_opt_name( $opt_name );
401
+
402
+            if ( ! empty( $opt_name ) && is_array( $field ) && ! empty( $field ) ) {
403
+                if ( ! isset( $field['priority'] ) ) {
404
+                    $field['priority'] = self::get_priority( $opt_name, 'fields' );
405
+                }
406
+
407
+                self::$fields[ $opt_name ][ $field['id'] ] = $field;
408
+            }
409
+        }
410
+
411
+        /**
412
+         * Set args.
413
+         *
414
+         * @param string $opt_name Panel opt_name.
415
+         * @param array  $args     Args array.
416
+         */
417
+        public static function set_args( string $opt_name = '', array $args = array() ) {
418
+            self::check_opt_name( $opt_name );
419
+
420
+            if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) {
421
+                self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array();
422
+                self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
423
+            }
424
+        }
425
+
426
+        /**
427
+         * Set term.
428
+         *
429
+         * @param string $opt_name Panel opt_name.
430
+         * @param array  $term     Term array.
431
+         */
432
+        public static function set_term( string $opt_name = '', array $term = array() ) {
433
+            self::check_opt_name( $opt_name );
434
+
435
+            if ( ! empty( $opt_name ) && is_array( $term ) && ! empty( $term ) ) {
436
+                if ( ! isset( $term['id'] ) ) {
437
+                    if ( isset( $term['title'] ) ) {
438
+                        $term['id'] = strtolower( sanitize_html_class( $term['title'] ) );
439
+                    } else {
440
+                        $term['id'] = 'term';
441
+                    }
442
+
443
+                    if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
444
+                        $orig = $term['id'];
445
+                        $i    = 0;
446
+
447
+                        while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
448
+                            $term['id'] = $orig . '_' . $i;
449
+                        }
450
+                    }
451
+                }
452
+
453
+                if ( isset( $term['sections'] ) ) {
454
+                    if ( ! empty( $term['sections'] ) && is_array( $term['sections'] ) ) {
455
+                        if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) {
456
+                            foreach ( $term['sections'] as $key => $section ) {
457
+                                if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) {
458
+                                    $term['sections'][ $key ]['permissions'] = $term['permissions'];
459
+                                }
460
+
461
+                                if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) {
462
+                                    $term['sections'][ $key ]['add_visibility'] = $term['add_visibility'];
463
+                                }
464
+                            }
465
+                        }
466
+
467
+                        self::process_sections_array( $opt_name, $term['id'], $term['sections'] );
468
+                    }
469
+
470
+                    unset( $term['sections'] );
471
+                }
472
+
473
+                self::$terms[ $opt_name ][ $term['id'] ] = $term;
474
+            } else {
475
+                self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' );
476
+            }
477
+        }
478
+
479
+        /**
480
+         * Get terms.
481
+         *
482
+         * @param string $opt_name Panel opt_name.
483
+         *
484
+         * @return mixed
485
+         */
486
+        public static function get_terms( string $opt_name = '' ) {
487
+            self::check_opt_name( $opt_name );
488
+
489
+            if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) {
490
+                return self::$terms[ $opt_name ];
491
+            }
492
+
493
+            return false;
494
+        }
495
+
496
+        /**
497
+         * Get priority.
498
+         *
499
+         * @param string $opt_name Panel opt_name.
500
+         * @param string $type     Field type.
501
+         *
502
+         * @return mixed
503
+         */
504
+        public static function get_priority( string $opt_name, string $type ) {
505
+            $priority                              = self::$priority[ $opt_name ][ $type ];
506
+            self::$priority[ $opt_name ][ $type ] += 1;
507
+
508
+            return $priority;
509
+        }
510
+
511
+        /**
512
+         * Check opt_name.
513
+         *
514
+         * @param string $opt_name Panel opt_name.
515
+         */
516
+        public static function check_opt_name( string $opt_name = '' ) {
517
+            if ( empty( $opt_name ) || is_array( $opt_name ) ) {
518
+                return;
519
+            }
520
+
521
+            if ( ! isset( self::$terms[ $opt_name ] ) ) {
522
+                self::$terms[ $opt_name ] = array();
523
+            }
524
+
525
+            if ( ! isset( self::$priority[ $opt_name ] ) ) {
526
+                self::$priority[ $opt_name ]['args'] = 1;
527
+            }
528
+
529
+            if ( ! isset( self::$sections[ $opt_name ] ) ) {
530
+                self::$sections[ $opt_name ]             = array();
531
+                self::$priority[ $opt_name ]['sections'] = 1;
532
+            }
533
+
534
+            if ( ! isset( self::$fields[ $opt_name ] ) ) {
535
+                self::$fields[ $opt_name ]             = array();
536
+                self::$priority[ $opt_name ]['fields'] = 1;
537
+            }
538
+
539
+            if ( ! isset( self::$errors[ $opt_name ] ) ) {
540
+                self::$errors[ $opt_name ] = array();
541
+            }
542
+
543
+            if ( ! isset( self::$init[ $opt_name ] ) ) {
544
+                self::$init[ $opt_name ] = false;
545
+            }
546
+
547
+            if ( ! isset( self::$args[ $opt_name ] ) ) {
548
+                self::$args[ $opt_name ] = false;
549
+            }
550
+        }
551
+
552
+        /**
553
+         * Get field defaults.
554
+         *
555
+         * @param string $opt_name Panel opt_name.
556
+         *
557
+         * @return array|void
558
+         */
559
+        public static function get_field_defaults( string $opt_name ) {
560
+            if ( empty( $opt_name ) ) {
561
+                return;
562
+            }
563
+
564
+            if ( ! isset( self::$fields[ $opt_name ] ) ) {
565
+                return array();
566
+            }
567
+
568
+            return array_map(
569
+                function ( $field ) {
570
+                    return $field['default'] ?? '';
571
+                },
572
+                self::$fields[ $opt_name ]
573
+            );
574
+        }
575
+
576
+        /**
577
+         * Get term meta.
578
+         *
579
+         * @param array $args Args array.
580
+         *
581
+         * @return array|mixed|string
582
+         */
583
+        public static function get_term_meta( array $args = array() ) {
584
+            $default = array(
585
+                'key'      => '',
586
+                'opt_name' => '',
587
+                'taxonomy' => '',
588
+            );
589
+
590
+            $args = wp_parse_args( $args, $default );
591
+
592
+            // phpcs:ignore WordPress.PHP.DontExtract
593
+            extract( $args );
594
+
595
+            if ( empty( $taxonomy ) ) {
596
+                return array();
597
+            }
598
+
599
+            $single = ! empty( $key );
600
+
601
+            $meta = get_term_meta( $taxonomy, $key, $single );
602
+
603
+            // phpcs:ignore Generic.CodeAnalysis.EmptyStatement
604
+            if ( $single ) {
605
+                // Do nothing.
606
+            } elseif ( ! empty( $meta ) ) {
607
+                foreach ( $meta as $key => $value ) {
608
+                    if ( is_array( $value ) ) {
609
+                        $value = $value[0];
610
+                    }
611
+
612
+                    $meta[ $key ] = maybe_unserialize( $value );
613
+                }
614
+            }
615
+
616
+            if ( ! empty( $opt_name ) ) {
617
+                $defaults = self::get_field_defaults( $opt_name );
618
+
619
+                if ( $single ) {
620
+                    $default_value = '';
621
+
622
+                    if ( isset( $defaults[ $key ] ) ) {
623
+                        $default_value = $defaults[ $key ];
624
+                    }
625
+
626
+                    if ( is_array( $meta ) ) {
627
+                        if ( is_array( $default_value ) ) {
628
+                            $meta = wp_parse_args( $meta, $default_value );
629
+                        }
630
+                    } elseif ( '' === $meta && '' !== $default_value ) {
631
+                            $meta = $default_value;
632
+                    }
633
+                } else {
634
+                    $meta = wp_parse_args( $meta, $defaults );
635
+                }
636
+            }
637
+
638
+            return $meta;
639
+        }
640
+    }
641
+
642
+    Redux_Taxonomy::load();
643 643
 }
Please login to merge, or discard this patch.
Spacing   +60 added lines, -60 removed lines patch added patch discarded remove patch
@@ -92,7 +92,7 @@  discard block
 block discarded – undo
92 92
 				$instances = Redux::all_instances();
93 93
 
94 94
 				foreach ( self::$fields as $opt_name => $fields ) {
95
-					if ( ! isset( $instances[ $opt_name ] ) ) {
95
+					if ( ! isset( $instances[$opt_name] ) ) {
96 96
 						Redux::set_args( $opt_name, array( 'menu_type' => 'hidden' ) );
97 97
 
98 98
 						Redux::set_sections(
@@ -113,7 +113,7 @@  discard block
 block discarded – undo
113 113
 
114 114
 					self::check_opt_name( $opt_name );
115 115
 
116
-					Redux::set_args( $opt_name, self::$args[ $opt_name ] );
116
+					Redux::set_args( $opt_name, self::$args[$opt_name] );
117 117
 				}
118 118
 			}
119 119
 		}
@@ -126,7 +126,7 @@  discard block
 block discarded – undo
126 126
 		 * @return mixed
127 127
 		 */
128 128
 		public static function construct_args( string $opt_name ) {
129
-			$args             = self::$args[ $opt_name ];
129
+			$args             = self::$args[$opt_name];
130 130
 			$args['opt_name'] = $opt_name;
131 131
 
132 132
 			if ( ! isset( $args['menu_title'] ) ) {
@@ -154,11 +154,11 @@  discard block
 block discarded – undo
154 154
 		public static function construct_terms( string $opt_name ): array {
155 155
 			$terms = array();
156 156
 
157
-			if ( ! isset( self::$terms[ $opt_name ] ) ) {
157
+			if ( ! isset( self::$terms[$opt_name] ) ) {
158 158
 				return $terms;
159 159
 			}
160 160
 
161
-			foreach ( self::$terms[ $opt_name ] as $term ) {
161
+			foreach ( self::$terms[$opt_name] as $term ) {
162 162
 				$term['sections'] = self::construct_sections( $opt_name, $term['id'] );
163 163
 				$terms[]          = $term;
164 164
 			}
@@ -179,22 +179,22 @@  discard block
 block discarded – undo
179 179
 		public static function construct_sections( string $opt_name, string $term_id ): array {
180 180
 			$sections = array();
181 181
 
182
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
182
+			if ( ! isset( self::$sections[$opt_name] ) ) {
183 183
 				return $sections;
184 184
 			}
185 185
 
186
-			foreach ( self::$sections[ $opt_name ] as $section_id => $section ) {
186
+			foreach ( self::$sections[$opt_name] as $section_id => $section ) {
187 187
 				if ( $section['term_id'] === $term_id ) {
188
-					self::$sections[ $opt_name ][ $section_id ]['add_visibility'] = $section;
188
+					self::$sections[$opt_name][$section_id]['add_visibility'] = $section;
189 189
 
190 190
 					$p = $section['priority'];
191 191
 
192
-					while ( isset( $sections[ $p ] ) ) {
192
+					while ( isset( $sections[$p] ) ) {
193 193
 						echo esc_html( $p++ );
194 194
 					}
195 195
 
196 196
 					$section['fields'] = self::construct_fields( $opt_name, $section_id );
197
-					$sections[ $p ]    = $section;
197
+					$sections[$p]    = $section;
198 198
 				}
199 199
 			}
200 200
 
@@ -216,29 +216,29 @@  discard block
 block discarded – undo
216 216
 		public static function construct_fields( string $opt_name = '', string $section_id = '', bool $permissions = false, bool $add_visibility = false ): array {
217 217
 			$fields = array();
218 218
 
219
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
219
+			if ( ! isset( self::$fields[$opt_name] ) ) {
220 220
 				return $fields;
221 221
 			}
222 222
 
223
-			foreach ( self::$fields[ $opt_name ] as $key => $field ) {
223
+			foreach ( self::$fields[$opt_name] as $key => $field ) {
224 224
 				// Nested permissions.
225 225
 				$field['permissions'] = $field['permissions'] ?? $permissions;
226 226
 
227
-				self::$fields[ $opt_name ][ $key ]['permissions'] = $field['permissions'];
227
+				self::$fields[$opt_name][$key]['permissions'] = $field['permissions'];
228 228
 
229 229
 				// Nested add_visibility permissions.
230 230
 				$field['add_visibility'] = $field['add_visibility'] ?? $add_visibility;
231 231
 
232
-				self::$fields[ $opt_name ][ $key ]['add_visibility'] = $field['add_visibility'];
232
+				self::$fields[$opt_name][$key]['add_visibility'] = $field['add_visibility'];
233 233
 
234 234
 				if ( $field['section_id'] === $section_id ) {
235 235
 					$p = $field['priority'];
236 236
 
237
-					while ( isset( $fields[ $p ] ) ) {
237
+					while ( isset( $fields[$p] ) ) {
238 238
 						echo esc_html( $p++ );
239 239
 					}
240 240
 
241
-					$fields[ $p ] = $field;
241
+					$fields[$p] = $field;
242 242
 				}
243 243
 			}
244 244
 
@@ -259,11 +259,11 @@  discard block
 block discarded – undo
259 259
 			self::check_opt_name( $opt_name );
260 260
 
261 261
 			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
262
-				if ( ! isset( self::$sections[ $opt_name ][ $id ] ) ) {
262
+				if ( ! isset( self::$sections[$opt_name][$id] ) ) {
263 263
 					$id = strtolower( sanitize_html_class( $id ) );
264 264
 				}
265 265
 
266
-				return self::$sections[ $opt_name ][ $id ] ?? false;
266
+				return self::$sections[$opt_name][$id] ?? false;
267 267
 			}
268 268
 
269 269
 			return false;
@@ -286,11 +286,11 @@  discard block
 block discarded – undo
286 286
 						$section['id'] = 'section';
287 287
 					}
288 288
 
289
-					if ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
289
+					if ( isset( self::$sections[$opt_name][$section['id']] ) ) {
290 290
 						$orig = $section['id'];
291 291
 						$i    = 0;
292 292
 
293
-						while ( isset( self::$sections[ $opt_name ][ $section['id'] ] ) ) {
293
+						while ( isset( self::$sections[$opt_name][$section['id']] ) ) {
294 294
 							$section['id'] = $orig . '_' . $i;
295 295
 						}
296 296
 					}
@@ -305,11 +305,11 @@  discard block
 block discarded – undo
305 305
 						if ( isset( $section['permissions'] ) || isset( $section['add_visibility'] ) ) {
306 306
 							foreach ( $section['fields'] as $key => $field ) {
307 307
 								if ( ! isset( $field['permissions'] ) && isset( $section['permissions'] ) ) {
308
-									$section['fields'][ $key ]['permissions'] = $section['permissions'];
308
+									$section['fields'][$key]['permissions'] = $section['permissions'];
309 309
 								}
310 310
 
311 311
 								if ( ! isset( $field['add_visibility'] ) && isset( $section['add_visibility'] ) ) {
312
-									$section['fields'][ $key ]['add_visibility'] = $section['add_visibility'];
312
+									$section['fields'][$key]['add_visibility'] = $section['add_visibility'];
313 313
 								}
314 314
 							}
315 315
 						}
@@ -320,9 +320,9 @@  discard block
 block discarded – undo
320 320
 					unset( $section['fields'] );
321 321
 				}
322 322
 
323
-				self::$sections[ $opt_name ][ $section['id'] ] = $section;
323
+				self::$sections[$opt_name][$section['id']] = $section;
324 324
 			} else {
325
-				self::$errors[ $opt_name ]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
325
+				self::$errors[$opt_name]['section']['empty'] = esc_html__( 'Unable to create a section due an empty section array or the section variable passed was not an array.', 'redux-framework' );
326 326
 			}
327 327
 		}
328 328
 
@@ -384,7 +384,7 @@  discard block
 block discarded – undo
384 384
 			self::check_opt_name( $opt_name );
385 385
 
386 386
 			if ( ! empty( $opt_name ) && ! empty( $id ) ) {
387
-				return self::$fields[ $opt_name ][ $id ] ?? false;
387
+				return self::$fields[$opt_name][$id] ?? false;
388 388
 			}
389 389
 
390 390
 			return false;
@@ -404,7 +404,7 @@  discard block
 block discarded – undo
404 404
 					$field['priority'] = self::get_priority( $opt_name, 'fields' );
405 405
 				}
406 406
 
407
-				self::$fields[ $opt_name ][ $field['id'] ] = $field;
407
+				self::$fields[$opt_name][$field['id']] = $field;
408 408
 			}
409 409
 		}
410 410
 
@@ -418,8 +418,8 @@  discard block
 block discarded – undo
418 418
 			self::check_opt_name( $opt_name );
419 419
 
420 420
 			if ( ! empty( $opt_name ) && is_array( $args ) && ! empty( $args ) ) {
421
-				self::$args[ $opt_name ] = self::$args[ $opt_name ] ?? array();
422
-				self::$args[ $opt_name ] = wp_parse_args( $args, self::$args[ $opt_name ] );
421
+				self::$args[$opt_name] = self::$args[$opt_name] ?? array();
422
+				self::$args[$opt_name] = wp_parse_args( $args, self::$args[$opt_name] );
423 423
 			}
424 424
 		}
425 425
 
@@ -440,11 +440,11 @@  discard block
 block discarded – undo
440 440
 						$term['id'] = 'term';
441 441
 					}
442 442
 
443
-					if ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
443
+					if ( isset( self::$terms[$opt_name][$term['id']] ) ) {
444 444
 						$orig = $term['id'];
445 445
 						$i    = 0;
446 446
 
447
-						while ( isset( self::$terms[ $opt_name ][ $term['id'] ] ) ) {
447
+						while ( isset( self::$terms[$opt_name][$term['id']] ) ) {
448 448
 							$term['id'] = $orig . '_' . $i;
449 449
 						}
450 450
 					}
@@ -455,11 +455,11 @@  discard block
 block discarded – undo
455 455
 						if ( isset( $term['permissions'] ) || isset( $term['add_visibility'] ) ) {
456 456
 							foreach ( $term['sections'] as $key => $section ) {
457 457
 								if ( ! isset( $section['permissions'] ) && isset( $term['permissions'] ) ) {
458
-									$term['sections'][ $key ]['permissions'] = $term['permissions'];
458
+									$term['sections'][$key]['permissions'] = $term['permissions'];
459 459
 								}
460 460
 
461 461
 								if ( ! isset( $section['add_visibility'] ) && isset( $term['add_visibility'] ) ) {
462
-									$term['sections'][ $key ]['add_visibility'] = $term['add_visibility'];
462
+									$term['sections'][$key]['add_visibility'] = $term['add_visibility'];
463 463
 								}
464 464
 							}
465 465
 						}
@@ -470,9 +470,9 @@  discard block
 block discarded – undo
470 470
 					unset( $term['sections'] );
471 471
 				}
472 472
 
473
-				self::$terms[ $opt_name ][ $term['id'] ] = $term;
473
+				self::$terms[$opt_name][$term['id']] = $term;
474 474
 			} else {
475
-				self::$errors[ $opt_name ]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' );
475
+				self::$errors[$opt_name]['term']['empty'] = esc_html__( 'Unable to create a term due an empty term array or the term variable passed was not an array.', 'redux-framework' );
476 476
 			}
477 477
 		}
478 478
 
@@ -486,8 +486,8 @@  discard block
 block discarded – undo
486 486
 		public static function get_terms( string $opt_name = '' ) {
487 487
 			self::check_opt_name( $opt_name );
488 488
 
489
-			if ( ! empty( $opt_name ) && ! empty( self::$terms[ $opt_name ] ) ) {
490
-				return self::$terms[ $opt_name ];
489
+			if ( ! empty( $opt_name ) && ! empty( self::$terms[$opt_name] ) ) {
490
+				return self::$terms[$opt_name];
491 491
 			}
492 492
 
493 493
 			return false;
@@ -502,8 +502,8 @@  discard block
 block discarded – undo
502 502
 		 * @return mixed
503 503
 		 */
504 504
 		public static function get_priority( string $opt_name, string $type ) {
505
-			$priority                              = self::$priority[ $opt_name ][ $type ];
506
-			self::$priority[ $opt_name ][ $type ] += 1;
505
+			$priority                              = self::$priority[$opt_name][$type];
506
+			self::$priority[$opt_name][$type] += 1;
507 507
 
508 508
 			return $priority;
509 509
 		}
@@ -518,34 +518,34 @@  discard block
 block discarded – undo
518 518
 				return;
519 519
 			}
520 520
 
521
-			if ( ! isset( self::$terms[ $opt_name ] ) ) {
522
-				self::$terms[ $opt_name ] = array();
521
+			if ( ! isset( self::$terms[$opt_name] ) ) {
522
+				self::$terms[$opt_name] = array();
523 523
 			}
524 524
 
525
-			if ( ! isset( self::$priority[ $opt_name ] ) ) {
526
-				self::$priority[ $opt_name ]['args'] = 1;
525
+			if ( ! isset( self::$priority[$opt_name] ) ) {
526
+				self::$priority[$opt_name]['args'] = 1;
527 527
 			}
528 528
 
529
-			if ( ! isset( self::$sections[ $opt_name ] ) ) {
530
-				self::$sections[ $opt_name ]             = array();
531
-				self::$priority[ $opt_name ]['sections'] = 1;
529
+			if ( ! isset( self::$sections[$opt_name] ) ) {
530
+				self::$sections[$opt_name]             = array();
531
+				self::$priority[$opt_name]['sections'] = 1;
532 532
 			}
533 533
 
534
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
535
-				self::$fields[ $opt_name ]             = array();
536
-				self::$priority[ $opt_name ]['fields'] = 1;
534
+			if ( ! isset( self::$fields[$opt_name] ) ) {
535
+				self::$fields[$opt_name]             = array();
536
+				self::$priority[$opt_name]['fields'] = 1;
537 537
 			}
538 538
 
539
-			if ( ! isset( self::$errors[ $opt_name ] ) ) {
540
-				self::$errors[ $opt_name ] = array();
539
+			if ( ! isset( self::$errors[$opt_name] ) ) {
540
+				self::$errors[$opt_name] = array();
541 541
 			}
542 542
 
543
-			if ( ! isset( self::$init[ $opt_name ] ) ) {
544
-				self::$init[ $opt_name ] = false;
543
+			if ( ! isset( self::$init[$opt_name] ) ) {
544
+				self::$init[$opt_name] = false;
545 545
 			}
546 546
 
547
-			if ( ! isset( self::$args[ $opt_name ] ) ) {
548
-				self::$args[ $opt_name ] = false;
547
+			if ( ! isset( self::$args[$opt_name] ) ) {
548
+				self::$args[$opt_name] = false;
549 549
 			}
550 550
 		}
551 551
 
@@ -561,15 +561,15 @@  discard block
 block discarded – undo
561 561
 				return;
562 562
 			}
563 563
 
564
-			if ( ! isset( self::$fields[ $opt_name ] ) ) {
564
+			if ( ! isset( self::$fields[$opt_name] ) ) {
565 565
 				return array();
566 566
 			}
567 567
 
568 568
 			return array_map(
569
-				function ( $field ) {
569
+				function( $field ) {
570 570
 					return $field['default'] ?? '';
571 571
 				},
572
-				self::$fields[ $opt_name ]
572
+				self::$fields[$opt_name]
573 573
 			);
574 574
 		}
575 575
 
@@ -609,7 +609,7 @@  discard block
 block discarded – undo
609 609
 						$value = $value[0];
610 610
 					}
611 611
 
612
-					$meta[ $key ] = maybe_unserialize( $value );
612
+					$meta[$key] = maybe_unserialize( $value );
613 613
 				}
614 614
 			}
615 615
 
@@ -619,8 +619,8 @@  discard block
 block discarded – undo
619 619
 				if ( $single ) {
620 620
 					$default_value = '';
621 621
 
622
-					if ( isset( $defaults[ $key ] ) ) {
623
-						$default_value = $defaults[ $key ];
622
+					if ( isset( $defaults[$key] ) ) {
623
+						$default_value = $defaults[$key];
624 624
 					}
625 625
 
626 626
 					if ( is_array( $meta ) ) {
Please login to merge, or discard this patch.
redux-core/inc/extensions/customizer/class-redux-extension-customizer.php 2 patches
Spacing   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -55,7 +55,7 @@  discard block
 block discarded – undo
55 55
 		 *
56 56
 		 * @var array|null
57 57
 		 */
58
-		private static ?array $post_values = array();
58
+		private static ? array $post_values = array();
59 59
 
60 60
 		/**
61 61
 		 * Options array.
@@ -316,10 +316,10 @@  discard block
 block discarded – undo
316 316
 				foreach ( $the_data as $key => $value ) {
317 317
 					if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) {
318 318
 						foreach ( $value as $k => $v ) {
319
-							$decode           = (array) json_decode( rawurldecode( $v['data'] ) );
319
+							$decode           = ( array ) json_decode( rawurldecode( $v['data'] ) );
320 320
 							$v                = $decode;
321
-							$dumb_array[ $k ] = $v;
322
-							$the_data[ $key ] = $dumb_array;
321
+							$dumb_array[$k] = $v;
322
+							$the_data[$key] = $dumb_array;
323 323
 						}
324 324
 					}
325 325
 				}
@@ -343,10 +343,10 @@  discard block
 block discarded – undo
343 343
 					foreach ( self::$post_values as $key => $value ) {
344 344
 						if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) {
345 345
 							$key          = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) );
346
-							$data[ $key ] = $value;
346
+							$data[$key] = $value;
347 347
 
348
-							$GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value;
349
-							$this->parent->options[ $key ]                             = $value;
348
+							$GLOBALS[$this->parent->args['global_variable']][$key] = $value;
349
+							$this->parent->options[$key]                             = $value;
350 350
 						}
351 351
 					}
352 352
 				}
@@ -362,7 +362,7 @@  discard block
 block discarded – undo
362 362
 		 */
363 363
 		public function render( object $control ) {
364 364
 			$field_id = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id );
365
-			$field    = $this->options[ $field_id ];
365
+			$field    = $this->options[$field_id];
366 366
 
367 367
 			if ( ! empty( $field['compiler'] ) ) {
368 368
 				echo '<tr class="compiler">';
@@ -370,7 +370,7 @@  discard block
 block discarded – undo
370 370
 				echo '<tr>';
371 371
 			}
372 372
 
373
-			echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[ $field['id'] ] ) . '</th>';
373
+			echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[$field['id']] ) . '</th>';
374 374
 			echo '<td>';
375 375
 
376 376
 			$field['name'] = $field['id'];
@@ -414,8 +414,8 @@  discard block
 block discarded – undo
414 414
 			do_action( 'redux/extension/customizer/control/includes' );
415 415
 
416 416
 			$order = array(
417
-				'heading' => - 500,
418
-				'option'  => - 500,
417
+				'heading' => -500,
418
+				'option'  => -500,
419 419
 			);
420 420
 
421 421
 			$panel = '';
@@ -454,7 +454,7 @@  discard block
 block discarded – undo
454 454
 					$parent_section_id = null;
455 455
 					$new_parent        = true;
456 456
 				}
457
-				if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[ $parent_section_id ]['customizer'] ) && false === $this->parent->sections[ $parent_section_id ]['customizer'] ) ) {
457
+				if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[$parent_section_id]['customizer'] ) && false === $this->parent->sections[$parent_section_id]['customizer'] ) ) {
458 458
 					continue;
459 459
 				}
460 460
 
@@ -487,7 +487,7 @@  discard block
 block discarded – undo
487 487
 				}
488 488
 				$section['id'] = $this->parent->args['opt_name'] . '-' . $section['id'];
489 489
 
490
-				if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) {
490
+				if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[( $key + 1 )]['subsection'] ) && $this->parent->sections[( $key + 1 )]['subsection'] ) {
491 491
 					$this->add_panel(
492 492
 						$this->parent->args['opt_name'] . '-' . $section['id'],
493 493
 						array(
@@ -550,7 +550,7 @@  discard block
 block discarded – undo
550 550
 						continue;
551 551
 					}
552 552
 
553
-					$this->options[ $option['id'] ] = $option;
553
+					$this->options[$option['id']] = $option;
554 554
 					add_action( 'redux/customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( $this, 'render' ) );
555 555
 
556 556
 					$option['permissions'] = $option['permissions'] ?? 'edit_theme_options';
@@ -561,7 +561,7 @@  discard block
 block discarded – undo
561 561
 						++$order['option'];
562 562
 					}
563 563
 
564
-					if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) {
564
+					if ( ! empty( $this->options_defaults[$option['id']] ) ) {
565 565
 						$option['default'] = $this->options_defaults['option']['id'];
566 566
 					}
567 567
 
@@ -634,12 +634,12 @@  discard block
 block discarded – undo
634 634
 						)
635 635
 					);
636 636
 
637
-					$section['fields'][ $skey ]['name'] = $option['id'];
638
-					if ( ! isset( $section['fields'][ $skey ]['class'] ) ) { // No errors please.
639
-						$section['fields'][ $skey ]['class'] = '';
637
+					$section['fields'][$skey]['name'] = $option['id'];
638
+					if ( ! isset( $section['fields'][$skey]['class'] ) ) { // No errors please.
639
+						$section['fields'][$skey]['class'] = '';
640 640
 					}
641 641
 
642
-					$this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ];
642
+					$this->controls[$section['fields'][$skey]['id']] = $section['fields'][$skey];
643 643
 				}
644 644
 			}
645 645
 		}
@@ -706,11 +706,11 @@  discard block
 block discarded – undo
706 706
 					if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) {
707 707
 						$key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) );
708 708
 
709
-						if ( ! isset( $this->orig_options[ $key ] ) || $value !== $this->orig_options[ $key ] || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) {
710
-							$this->parent->options[ $key ] = $value;
709
+						if ( ! isset( $this->orig_options[$key] ) || $value !== $this->orig_options[$key] || ( isset( $this->orig_options[$key] ) && ! empty( $this->orig_options[$key] ) && empty( $value ) ) ) {
710
+							$this->parent->options[$key] = $value;
711 711
 							$changed                       = true;
712 712
 
713
-							if ( isset( $this->parent->compiler_fields[ $key ] ) ) {
713
+							if ( isset( $this->parent->compiler_fields[$key] ) ) {
714 714
 								$compiler = true;
715 715
 							}
716 716
 						}
@@ -813,8 +813,8 @@  discard block
 block discarded – undo
813 813
 			if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) {
814 814
 				$replace = $value;
815 815
 				foreach ( $replace as $sub_array ) {
816
-					$cs_array                 = (array) json_decode( rawurldecode( $sub_array['data'] ) );
817
-					$value[ $cs_array['id'] ] = $cs_array;
816
+					$cs_array                 = ( array ) json_decode( rawurldecode( $sub_array['data'] ) );
817
+					$value[$cs_array['id']] = $cs_array;
818 818
 				}
819 819
 			}
820 820
 
Please login to merge, or discard this patch.
Indentation   +819 added lines, -819 removed lines patch added patch discarded remove patch
@@ -14,828 +14,828 @@
 block discarded – undo
14 14
 // Don't duplicate me!
15 15
 if ( ! class_exists( 'Redux_Extension_Customizer', false ) ) {
16 16
 
17
-	/**
18
-	 * Main ReduxFramework customizer extension class
19
-	 *
20
-	 * @since       1.0.0
21
-	 */
22
-	class Redux_Extension_Customizer extends Redux_Extension_Abstract {
23
-
24
-		/**
25
-		 * Set extension version.
26
-		 *
27
-		 * @var string
28
-		 */
29
-		public static $version = '4.5.1';
30
-
31
-		/**
32
-		 * Set the name of the field.  Ideally, this will also be your extension's name.
33
-		 * Please use underscores and NOT dashes.
34
-		 *
35
-		 * @var string
36
-		 */
37
-		public string $field_name = 'customizer';
38
-
39
-		/**
40
-		 * Set the friendly name of the extension.  This is for display purposes.  No underscores or dashes are required.
41
-		 *
42
-		 * @var string
43
-		 */
44
-		public string $extension_name = 'Customizer';
45
-
46
-		/**
47
-		 * Original options.
48
-		 *
49
-		 * @var array|null
50
-		 */
51
-		private ?array $orig_options = array();
52
-
53
-		/**
54
-		 * Post values.
55
-		 *
56
-		 * @var array|null
57
-		 */
58
-		private static ?array $post_values = array();
59
-
60
-		/**
61
-		 * Options array.
62
-		 *
63
-		 * @var array|null
64
-		 */
65
-		public ?array $options = array();
66
-
67
-		/**
68
-		 * Controls array.
69
-		 *
70
-		 * @var array|null
71
-		 */
72
-		public ?array $controls = array();
73
-
74
-		/**
75
-		 * Before save array.
76
-		 *
77
-		 * @var array|null
78
-		 */
79
-		public ?array $before_save = array();
80
-
81
-		/**
82
-		 * Redux object.
83
-		 *
84
-		 * @var ReduxFramework|null
85
-		 */
86
-		protected ?ReduxFramework $redux;
87
-
88
-		/**
89
-		 * Field array.
90
-		 *
91
-		 * @var array|null
92
-		 */
93
-		private ?array $redux_fields = array();
94
-
95
-		/**
96
-		 * Redux_Extension_my_extension constructor.
97
-		 *
98
-		 * @param ReduxFramework $redux ReduxFramework pointer.
99
-		 */
100
-		public function __construct( $redux ) {
101
-			global $pagenow;
102
-			global $wp_customize;
103
-
104
-			parent::__construct( $redux, __FILE__ );
105
-
106
-			if ( is_admin() && ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) {
107
-				return;
108
-			}
109
-
110
-			$this->add_field( 'customizer' );
111
-
112
-			$this->load();
113
-		}
114
-
115
-		/**
116
-		 * The customizer load code
117
-		 */
118
-		private function load() {
119
-			global $pagenow, $wp_customize;
120
-
121
-			if ( false === $this->parent->args['customizer'] ) {
122
-				return;
123
-			}
124
-
125
-			// Override the Redux_Core class.
126
-			add_filter( "redux/extension/{$this->parent->args['opt_name']}/customizer", array( $this, 'remove_core_customizer_class' ) );
127
-
128
-			if ( ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) {
129
-				return;
130
-			}
131
-
132
-			self::get_post_values();
133
-
134
-			if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] ) { // phpcs:ignore WordPress.Security.NonceVerification
135
-				$this->parent->args['customizer_only'] = true;
136
-			}
137
-
138
-			if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] && ! empty( $_POST['customized'] ) && ! isset( $_POST['action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
139
-				add_action( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_values' ), 100 );
140
-			}
141
-
142
-			add_action( 'customize_register', array( $this, 'register_customizer_controls' ) ); // Create controls.
143
-			add_action( 'wp_head', array( $this, 'customize_preview_init' ) );
144
-
145
-			add_action( 'customize_save_after', array( &$this, 'customizer_save_after' ) ); // After save.
146
-
147
-			// Add global controls CSS file.
148
-			add_action( 'customize_controls_print_scripts', array( $this, 'enqueue_controls_css' ) );
149
-			add_action( 'customize_controls_init', array( $this, 'enqueue_panel_css' ) );
150
-			add_action( 'wp_enqueue_styles', array( $this, 'custom_css' ), 11 );
151
-
152
-			add_action( 'redux/extension/customizer/control_init', array( $this, 'create_field_classes' ), 1, 2 );
153
-
154
-			add_action( 'wp_ajax_' . $this->parent->args['opt_name'] . '_customizer_save', array( $this, 'customizer' ) );
155
-			add_action( 'customize_controls_print_styles', array( $this, 'add_nonce_html' ) );
156
-		}
157
-
158
-		/**
159
-		 * Add nonce HTML for AJAX.
160
-		 */
161
-		public function add_nonce_html() {
162
-			$nonce = wp_create_nonce( 'redux_customer_nonce' );
163
-
164
-			?>
17
+    /**
18
+     * Main ReduxFramework customizer extension class
19
+     *
20
+     * @since       1.0.0
21
+     */
22
+    class Redux_Extension_Customizer extends Redux_Extension_Abstract {
23
+
24
+        /**
25
+         * Set extension version.
26
+         *
27
+         * @var string
28
+         */
29
+        public static $version = '4.5.1';
30
+
31
+        /**
32
+         * Set the name of the field.  Ideally, this will also be your extension's name.
33
+         * Please use underscores and NOT dashes.
34
+         *
35
+         * @var string
36
+         */
37
+        public string $field_name = 'customizer';
38
+
39
+        /**
40
+         * Set the friendly name of the extension.  This is for display purposes.  No underscores or dashes are required.
41
+         *
42
+         * @var string
43
+         */
44
+        public string $extension_name = 'Customizer';
45
+
46
+        /**
47
+         * Original options.
48
+         *
49
+         * @var array|null
50
+         */
51
+        private ?array $orig_options = array();
52
+
53
+        /**
54
+         * Post values.
55
+         *
56
+         * @var array|null
57
+         */
58
+        private static ?array $post_values = array();
59
+
60
+        /**
61
+         * Options array.
62
+         *
63
+         * @var array|null
64
+         */
65
+        public ?array $options = array();
66
+
67
+        /**
68
+         * Controls array.
69
+         *
70
+         * @var array|null
71
+         */
72
+        public ?array $controls = array();
73
+
74
+        /**
75
+         * Before save array.
76
+         *
77
+         * @var array|null
78
+         */
79
+        public ?array $before_save = array();
80
+
81
+        /**
82
+         * Redux object.
83
+         *
84
+         * @var ReduxFramework|null
85
+         */
86
+        protected ?ReduxFramework $redux;
87
+
88
+        /**
89
+         * Field array.
90
+         *
91
+         * @var array|null
92
+         */
93
+        private ?array $redux_fields = array();
94
+
95
+        /**
96
+         * Redux_Extension_my_extension constructor.
97
+         *
98
+         * @param ReduxFramework $redux ReduxFramework pointer.
99
+         */
100
+        public function __construct( $redux ) {
101
+            global $pagenow;
102
+            global $wp_customize;
103
+
104
+            parent::__construct( $redux, __FILE__ );
105
+
106
+            if ( is_admin() && ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) {
107
+                return;
108
+            }
109
+
110
+            $this->add_field( 'customizer' );
111
+
112
+            $this->load();
113
+        }
114
+
115
+        /**
116
+         * The customizer load code
117
+         */
118
+        private function load() {
119
+            global $pagenow, $wp_customize;
120
+
121
+            if ( false === $this->parent->args['customizer'] ) {
122
+                return;
123
+            }
124
+
125
+            // Override the Redux_Core class.
126
+            add_filter( "redux/extension/{$this->parent->args['opt_name']}/customizer", array( $this, 'remove_core_customizer_class' ) );
127
+
128
+            if ( ! isset( $wp_customize ) && 'customize.php' !== $pagenow && 'admin-ajax.php' !== $pagenow ) {
129
+                return;
130
+            }
131
+
132
+            self::get_post_values();
133
+
134
+            if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] ) { // phpcs:ignore WordPress.Security.NonceVerification
135
+                $this->parent->args['customizer_only'] = true;
136
+            }
137
+
138
+            if ( isset( $_POST['wp_customize'] ) && 'on' === $_POST['wp_customize'] && ! empty( $_POST['customized'] ) && ! isset( $_POST['action'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
139
+                add_action( "redux/options/{$this->parent->args['opt_name']}/options", array( $this, 'override_values' ), 100 );
140
+            }
141
+
142
+            add_action( 'customize_register', array( $this, 'register_customizer_controls' ) ); // Create controls.
143
+            add_action( 'wp_head', array( $this, 'customize_preview_init' ) );
144
+
145
+            add_action( 'customize_save_after', array( &$this, 'customizer_save_after' ) ); // After save.
146
+
147
+            // Add global controls CSS file.
148
+            add_action( 'customize_controls_print_scripts', array( $this, 'enqueue_controls_css' ) );
149
+            add_action( 'customize_controls_init', array( $this, 'enqueue_panel_css' ) );
150
+            add_action( 'wp_enqueue_styles', array( $this, 'custom_css' ), 11 );
151
+
152
+            add_action( 'redux/extension/customizer/control_init', array( $this, 'create_field_classes' ), 1, 2 );
153
+
154
+            add_action( 'wp_ajax_' . $this->parent->args['opt_name'] . '_customizer_save', array( $this, 'customizer' ) );
155
+            add_action( 'customize_controls_print_styles', array( $this, 'add_nonce_html' ) );
156
+        }
157
+
158
+        /**
159
+         * Add nonce HTML for AJAX.
160
+         */
161
+        public function add_nonce_html() {
162
+            $nonce = wp_create_nonce( 'redux_customer_nonce' );
163
+
164
+            ?>
165 165
 			<div class="redux-customizer-nonce" data-nonce="<?php echo esc_attr( $nonce ); ?>"></div>
166 166
 			<?php
167
-		}
168
-
169
-		/**
170
-		 * AJAX callback for customizer save...to make sanitize/validate work.
171
-		 */
172
-		public function customizer() {
173
-			try {
174
-				$return_array = array();
175
-
176
-				if ( isset( $_POST['nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'redux_customer_nonce' ) && isset( $_POST['opt_name'] ) && '' !== $_POST['opt_name'] ) {
177
-					$redux = Redux::instance( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) );
178
-
179
-					$post_data = wp_unslash( $_POST['data'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
180
-
181
-					// New method to avoid input_var nonsense.  Thanks @harunbasic.
182
-					$values = Redux_Functions_Ex::parse_str( $post_data );
183
-
184
-					$all_options = get_option( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) );
185
-
186
-					$values = wp_parse_args( $values, $all_options );
187
-
188
-					$redux->options_class->set( $redux->options_class->validate_options( $values ) );
189
-
190
-					$redux->enqueue_class->get_warnings_and_errors_array();
191
-
192
-					$return_array = array(
193
-						'status'   => 'success',
194
-						'options'  => $redux->options,
195
-						'errors'   => $redux->enqueue_class->localize_data['errors'] ?? null,
196
-						'warnings' => $redux->enqueue_class->localize_data['warnings'] ?? null,
197
-						'sanitize' => $redux->enqueue_class->localize_data['sanitize'] ?? null,
198
-					);
199
-				}
200
-			} catch ( Exception $e ) {
201
-				$return_array = array( 'status' => $e->getMessage() );
202
-			}
203
-
204
-			echo wp_json_encode( $return_array );
205
-
206
-			die;
207
-		}
208
-
209
-		/**
210
-		 * Field classes.
211
-		 *
212
-		 * @param array $option Option.
213
-		 */
214
-		public function create_field_classes( array $option ) {
215
-			if ( empty( $this->redux_fields ) ) {
216
-				$file_paths = glob( Redux_Core::$dir . 'inc/fields/*' );
217
-
218
-				foreach ( $file_paths as $file ) {
219
-					if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) {
220
-						$this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/fields/', '', $file );
221
-					}
222
-				}
223
-
224
-				$file_paths = glob( Redux_Core::$dir . 'inc/extensions/*' );
225
-
226
-				foreach ( $file_paths as $file ) {
227
-					if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) {
228
-						$this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/extensions/', '', $file );
229
-					}
230
-				}
231
-			}
232
-
233
-			$class_name = 'Redux_Customizer_Control_' . $option['type'];
234
-
235
-			if ( ! class_exists( $class_name ) && ( in_array( $option['type'], $this->redux_fields, true ) || ( isset( $option['customizer_enabled'] ) && $option['customizer_enabled'] ) ) ) {
236
-				$upload_dir = Redux_Core::$upload_dir;
237
-
238
-				if ( ! file_exists( $upload_dir . $option['type'] . '.php' ) ) {
239
-					if ( ! is_dir( $upload_dir ) ) {
240
-						Redux_Core::$filesystem->execute( 'mkdir', $upload_dir );
241
-					}
242
-
243
-					$template = str_replace( '{{type}}', $option['type'], '<?php' . PHP_EOL . '   class Redux_Customizer_Control_{{type}} extends Redux_Customizer_Control {' . PHP_EOL . '     public $type = "redux-{{type}}";' . PHP_EOL . '   }' );
244
-
245
-					Redux_Core::$filesystem->execute( 'put_contents', $upload_dir . $option['type'] . '.php', array( 'content' => $template ) );
246
-				}
247
-
248
-				if ( file_exists( $upload_dir . $option['type'] . '.php' ) ) {
249
-					include_once $upload_dir . $option['type'] . '.php';
250
-				}
251
-			}
252
-		}
253
-
254
-		/**
255
-		 * Enqueue extension scripts/styles.
256
-		 */
257
-		public function enqueue_controls_css() {
258
-			$this->parent->enqueue_class->get_warnings_and_errors_array();
259
-			$this->parent->enqueue_class->init();
260
-
261
-			if ( $this->parent->args['dev_mode'] ) {
262
-				wp_enqueue_style(
263
-					'redux-extension-customizer',
264
-					$this->extension_url . 'redux-extension-customizer.css',
265
-					array(),
266
-					self::$version
267
-				);
268
-			}
269
-
270
-			wp_enqueue_script(
271
-				'redux-extension-customizer',
272
-				$this->extension_url . 'redux-extension-customizer' . Redux_Functions::is_min() . '.js',
273
-				array( 'jquery', 'redux-js' ),
274
-				self::$version,
275
-				true
276
-			);
277
-
278
-			wp_localize_script(
279
-				'redux-extension-customizer',
280
-				'redux_customizer',
281
-				array(
282
-					'body_class' => sanitize_html_class( 'admin-color-' . get_user_option( 'admin_color' ), 'fresh' ),
283
-				)
284
-			);
285
-		}
286
-
287
-		/**
288
-		 * Enqueue panel CSS>
289
-		 */
290
-		public function enqueue_panel_css() {}
291
-
292
-		/**
293
-		 * Remove core customizer class.
294
-		 *
295
-		 * @return string
296
-		 */
297
-		public function remove_core_customizer_class(): string {
298
-			return '';
299
-		}
300
-
301
-		/**
302
-		 * Customize preview init.
303
-		 */
304
-		public function customize_preview_init() {
305
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
306
-			do_action( 'redux/customizer/live_preview' );
307
-		}
308
-
309
-		/**
310
-		 * Get post values.
311
-		 */
312
-		protected static function get_post_values() {
313
-			if ( empty( self::$post_values ) && ! empty( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
314
-				$the_data = json_decode( stripslashes_deep( ( wp_unslash( $_POST['customized'] ) ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput
315
-
316
-				foreach ( $the_data as $key => $value ) {
317
-					if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) {
318
-						foreach ( $value as $k => $v ) {
319
-							$decode           = (array) json_decode( rawurldecode( $v['data'] ) );
320
-							$v                = $decode;
321
-							$dumb_array[ $k ] = $v;
322
-							$the_data[ $key ] = $dumb_array;
323
-						}
324
-					}
325
-				}
326
-
327
-				self::$post_values = $the_data;
328
-			}
329
-		}
330
-
331
-		/**
332
-		 * Override customizer values.
333
-		 *
334
-		 * @param array $data Values.
335
-		 *
336
-		 * @return array
337
-		 */
338
-		public function override_values( array $data ): array {
339
-			self::get_post_values();
340
-
341
-			if ( isset( $_POST['customized'] ) && ! empty( self::$post_values ) ) { // phpcs:ignore WordPress.Security.NonceVerification
342
-				if ( is_array( self::$post_values ) ) {
343
-					foreach ( self::$post_values as $key => $value ) {
344
-						if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) {
345
-							$key          = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) );
346
-							$data[ $key ] = $value;
347
-
348
-							$GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value;
349
-							$this->parent->options[ $key ]                             = $value;
350
-						}
351
-					}
352
-				}
353
-			}
354
-
355
-			return $data;
356
-		}
357
-
358
-		/**
359
-		 * Render Redux fields.
360
-		 *
361
-		 * @param object $control .
362
-		 */
363
-		public function render( object $control ) {
364
-			$field_id = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id );
365
-			$field    = $this->options[ $field_id ];
366
-
367
-			if ( ! empty( $field['compiler'] ) ) {
368
-				echo '<tr class="compiler">';
369
-			} else {
370
-				echo '<tr>';
371
-			}
372
-
373
-			echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[ $field['id'] ] ) . '</th>';
374
-			echo '<td>';
375
-
376
-			$field['name'] = $field['id'];
377
-			$this->parent->render_class->field_input( $field );
378
-
379
-			echo '</td>';
380
-			echo '</tr>';
381
-		}
382
-
383
-		// All sections, settings, and controls will be added here.
384
-
385
-		/**
386
-		 * Register customizer controls.
387
-		 *
388
-		 * @param WP_Customize_Manager $wp_customize .
389
-		 *
390
-		 * @throws ReflectionException Exception.
391
-		 */
392
-		public function register_customizer_controls( WP_Customize_Manager $wp_customize ) {
393
-			if ( ! class_exists( 'Redux_Customizer_Section' ) ) {
394
-				require_once __DIR__ . '/inc/class-redux-customizer-section.php';
395
-
396
-				if ( method_exists( $wp_customize, 'register_section_type' ) ) {
397
-					$wp_customize->register_section_type( 'Redux_Customizer_Section' );
398
-				}
399
-			}
400
-
401
-			if ( ! class_exists( 'Redux_Customizer_Panel' ) ) {
402
-				require_once __DIR__ . '/inc/class-redux-customizer-panel.php';
403
-
404
-				if ( method_exists( $wp_customize, 'register_panel_type' ) ) {
405
-					$wp_customize->register_panel_type( 'Redux_Customizer_Panel' );
406
-				}
407
-			}
408
-
409
-			if ( ! class_exists( 'Redux_Customizer_Control' ) ) {
410
-				require_once __DIR__ . '/inc/class-redux-customizer-control.php';
411
-			}
412
-
413
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
414
-			do_action( 'redux/extension/customizer/control/includes' );
415
-
416
-			$order = array(
417
-				'heading' => - 500,
418
-				'option'  => - 500,
419
-			);
420
-
421
-			$panel = '';
422
-
423
-			$this->parent->args['options_api'] = false;
424
-			$this->parent->options_class->register();
425
-
426
-			$parent_section_id = null;
427
-			$new_parent        = true;
428
-
429
-			foreach ( $this->parent->sections as $key => $section ) {
430
-				// Not a type that should go on the customizer.
431
-
432
-				foreach ( $section['fields'] as $field ) {
433
-					if ( 'color_scheme' === $field['type'] || 'divide' === $field['type'] ) {
434
-						continue 2;
435
-					}
436
-				}
437
-
438
-				if ( isset( $section['id'] ) && 'import/export' === $section['id'] ) {
439
-					continue;
440
-				}
441
-
442
-				// If section customizer is set to false.
443
-				if ( isset( $section['customizer'] ) && false === $section['customizer'] ) {
444
-					continue;
445
-				}
446
-
447
-				// if we are in a subsection and parent is set to customizer false !!!
448
-				if ( ( isset( $section['subsection'] ) && $section['subsection'] ) ) {
449
-					if ( $new_parent ) {
450
-						$new_parent        = false;
451
-						$parent_section_id = ( $key - 1 );
452
-					}
453
-				} else { // not a subsection reset.
454
-					$parent_section_id = null;
455
-					$new_parent        = true;
456
-				}
457
-				if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[ $parent_section_id ]['customizer'] ) && false === $this->parent->sections[ $parent_section_id ]['customizer'] ) ) {
458
-					continue;
459
-				}
460
-
461
-				$section['permissions'] = $section['permissions'] ?? 'edit_theme_options';
462
-
463
-				// No errors please.
464
-				if ( ! isset( $section['desc'] ) ) {
465
-					$section['desc'] = '';
466
-				}
467
-
468
-				// Fill the description if there is a subtitle.
469
-				if ( empty( $section['desc'] ) && ! empty( $section['subtitle'] ) ) {
470
-					$section['desc'] = $section['subtitle'];
471
-				}
472
-
473
-				// No title is present, let's show what section is missing a title.
474
-				if ( ! isset( $section['title'] ) ) {
475
-					$section['title'] = '';
476
-				}
477
-
478
-				// Let's make a section ID from the title.
479
-				if ( empty( $section['id'] ) ) {
480
-					$section['id'] = Redux_Core::strtolower( str_replace( ' ', '', $section['title'] ) );
481
-				}
482
-
483
-				// Let's set a default priority.
484
-				if ( empty( $section['priority'] ) ) {
485
-					$section['priority'] = $order['heading'];
486
-					++$order['heading'];
487
-				}
488
-				$section['id'] = $this->parent->args['opt_name'] . '-' . $section['id'];
489
-
490
-				if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) {
491
-					$this->add_panel(
492
-						$this->parent->args['opt_name'] . '-' . $section['id'],
493
-						array(
494
-							'priority'    => $section['priority'],
495
-							'capability'  => $section['permissions'],
496
-							'title'       => $section['title'],
497
-							'section'     => $section,
498
-							'opt_name'    => $this->parent->args['opt_name'],
499
-							'description' => '',
500
-						),
501
-						$wp_customize
502
-					);
503
-
504
-					$panel = $this->parent->args['opt_name'] . '-' . $section['id'];
505
-
506
-					$this->add_section(
507
-						$section['id'],
508
-						array(
509
-							'title'       => $section['title'],
510
-							'priority'    => $section['priority'],
511
-							'description' => $section['desc'],
512
-							'section'     => $section,
513
-							'opt_name'    => $this->parent->args['opt_name'],
514
-							'capability'  => $section['permissions'],
515
-							'panel'       => $panel,
516
-						),
517
-						$wp_customize
518
-					);
519
-				} else {
520
-					if ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) {
521
-						$panel = '';
522
-					}
523
-
524
-					$this->add_section(
525
-						$section['id'],
526
-						array(
527
-							'title'       => $section['title'],
528
-							'priority'    => $section['priority'],
529
-							'description' => $section['desc'],
530
-							'opt_name'    => $this->parent->args['opt_name'],
531
-							'section'     => $section,
532
-							'capability'  => $section['permissions'],
533
-							'panel'       => $panel,
534
-						),
535
-						$wp_customize
536
-					);
537
-				}
538
-
539
-				if ( ( empty( $section['fields'] ) ) ) {
540
-					continue;
541
-				}
542
-
543
-				foreach ( $section['fields'] as $skey => $option ) {
544
-
545
-					if ( isset( $option['customizer'] ) && false === $option['customizer'] ) {
546
-						continue;
547
-					}
548
-
549
-					if ( false === $this->parent->args['customizer'] && ( ! isset( $option['customizer'] ) || true !== $option['customizer'] ) ) {
550
-						continue;
551
-					}
552
-
553
-					$this->options[ $option['id'] ] = $option;
554
-					add_action( 'redux/customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( $this, 'render' ) );
555
-
556
-					$option['permissions'] = $option['permissions'] ?? 'edit_theme_options';
557
-
558
-					// Change the item priority if not set.
559
-					if ( 'heading' !== $option['type'] && ! isset( $option['priority'] ) ) {
560
-						$option['priority'] = $order['option'];
561
-						++$order['option'];
562
-					}
563
-
564
-					if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) {
565
-						$option['default'] = $this->options_defaults['option']['id'];
566
-					}
567
-
568
-					if ( ! isset( $option['default'] ) ) {
569
-						$option['default'] = '';
570
-					}
571
-					if ( ! isset( $option['title'] ) ) {
572
-						$option['title'] = '';
573
-					}
574
-
575
-					$option['id'] = $this->parent->args['opt_name'] . '[' . $option['id'] . ']';
576
-
577
-					if ( 'heading' !== $option['type'] && 'import_export' !== $option['type'] && ! empty( $option['type'] ) ) {
578
-
579
-						$wp_customize->add_setting(
580
-							$option['id'],
581
-							array(
582
-								'default'           => $option['default'],
583
-								'transport'         => 'refresh',
584
-								'opt_name'          => $this->parent->args['opt_name'],
585
-								'sanitize_callback' => array( $this, 'field_validation' ),
586
-							)
587
-						);
588
-					}
589
-
590
-					if ( ! empty( $option['data'] ) && empty( $option['options'] ) ) {
591
-						if ( empty( $option['args'] ) ) {
592
-							$option['args'] = array();
593
-						}
594
-
595
-						if ( 'elusive-icons' === $option['data'] || 'elusive-icon' === $option['data'] || 'elusive' === $option['data'] ) {
596
-							$icons_file = Redux_Core::$dir . 'inc/fields/select/elusive-icons.php';
597
-
598
-							// phpcs:ignore WordPress.NamingConventions.ValidHookName
599
-							$icons_file = apply_filters( 'redux-font-icons-file', $icons_file );
600
-
601
-							if ( file_exists( $icons_file ) ) {
602
-								require_once $icons_file;
603
-							}
604
-						}
605
-						$option['options'] = $this->parent->wordpress_data->get( $option['data'], $option['args'] );
606
-					}
607
-
608
-					$class_name = 'Redux_Customizer_Control_' . $option['type'];
609
-
610
-					// phpcs:ignore WordPress.NamingConventions.ValidHookName
611
-					do_action( 'redux/extension/customizer/control_init', $option );
612
-
613
-					if ( ! class_exists( $class_name ) ) {
614
-						continue;
615
-					}
616
-
617
-					$wp_customize->add_control(
618
-						new $class_name(
619
-							$wp_customize,
620
-							$option['id'],
621
-							array(
622
-								'label'           => $option['title'],
623
-								'section'         => $section['id'],
624
-								'settings'        => $option['id'],
625
-								'type'            => 'redux-' . $option['type'],
626
-								'field'           => $option,
627
-								'ReduxFramework'  => $this->parent,
628
-								'active_callback' => ( isset( $option['required'] ) && class_exists( 'Redux_Customizer_Active_Callback' ) ) ? array(
629
-									'Redux_Customizer_Active_Callback',
630
-									'evaluate',
631
-								) : '__return_true',
632
-								'priority'        => $option['priority'],
633
-							)
634
-						)
635
-					);
636
-
637
-					$section['fields'][ $skey ]['name'] = $option['id'];
638
-					if ( ! isset( $section['fields'][ $skey ]['class'] ) ) { // No errors please.
639
-						$section['fields'][ $skey ]['class'] = '';
640
-					}
641
-
642
-					$this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ];
643
-				}
644
-			}
645
-		}
646
-
647
-		/**
648
-		 * Add customizer section.
649
-		 *
650
-		 * @param string               $id           ID.
651
-		 * @param array                $args         Args.
652
-		 * @param WP_Customize_Manager $wp_customize .
653
-		 */
654
-		public function add_section( string $id, array $args, WP_Customize_Manager $wp_customize ) {
655
-
656
-			if ( is_a( $id, 'WP_Customize_Section' ) ) {
657
-				$section = $id;
658
-			} else {
659
-				$section = new Redux_Customizer_Section( $wp_customize, $id, $args );
660
-			}
661
-
662
-			$wp_customize->add_section( $section, $args );
663
-		}
664
-
665
-		/**
666
-		 * Add a customize panel.
667
-		 *
668
-		 * @param WP_Customize_Panel|string $id           Customize Panel object, or Panel ID.
669
-		 * @param array                     $args         Optional. Panel arguments. Default empty array.
670
-		 * @param WP_Customize_Manager      $wp_customize .
671
-		 *
672
-		 * @since  4.0.0
673
-		 * @access public
674
-		 */
675
-		public function add_panel( $id, array $args, WP_Customize_Manager $wp_customize ) {
676
-			if ( is_a( $id, 'WP_Customize_Panel' ) ) {
677
-				$panel = $id;
678
-			} else {
679
-				$panel = new Redux_Customizer_Panel( $wp_customize, $id, $args );
680
-			}
681
-
682
-			$wp_customize->add_panel( $panel, $args );
683
-		}
684
-
685
-		/**
686
-		 * Actions to take after customizer save.
687
-		 *
688
-		 * @throws ReflectionException Exception.
689
-		 */
690
-		public function customizer_save_after() {
691
-			if ( empty( $this->parent->options ) ) {
692
-				$this->parent->get_options();
693
-			}
694
-
695
-			if ( empty( $this->orig_options ) && ! empty( $this->parent->options ) ) {
696
-				$this->orig_options = $this->parent->options;
697
-			}
698
-
699
-			if ( isset( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
700
-				$options = json_decode( sanitize_text_field( wp_unslash( $_POST['customized'] ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification
701
-
702
-				$compiler = false;
703
-				$changed  = false;
704
-
705
-				foreach ( $options as $key => $value ) {
706
-					if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) {
707
-						$key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) );
708
-
709
-						if ( ! isset( $this->orig_options[ $key ] ) || $value !== $this->orig_options[ $key ] || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) {
710
-							$this->parent->options[ $key ] = $value;
711
-							$changed                       = true;
712
-
713
-							if ( isset( $this->parent->compiler_fields[ $key ] ) ) {
714
-								$compiler = true;
715
-							}
716
-						}
717
-					}
718
-				}
719
-
720
-				if ( $changed ) {
721
-					$this->parent->options_class->set( $this->parent->options );
722
-					if ( $compiler ) {
723
-						// Have to set this to stop the output of the CSS and typography stuff.
724
-						Redux_Core::$no_output = true;
725
-						$this->parent->output_class->enqueue();
726
-
727
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
728
-						do_action( "redux/options/{$this->parent->args['opt_name']}/compiler", $this->parent->options, $this->parent->compilerCSS );
729
-
730
-						// phpcs:ignore WordPress.NamingConventions.ValidHookName
731
-						do_action( "redux/options/{$this->parent->args['opt_name']}/compiler/advanced", $this->parent );
732
-					}
733
-				}
734
-			}
735
-		}
736
-
737
-		/**
738
-		 * Enqueue CSS/JS for the customizer controls
739
-		 *
740
-		 * @since       1.0.0
741
-		 * @access      public
742
-		 * @global      $wp_styles
743
-		 * @return      void
744
-		 */
745
-		public function enqueue() {
746
-			$localize = array(
747
-				'save_pending'   => esc_html__( 'You have changes that are not saved.  Would you like to save them now?', 'redux-framework' ),
748
-				'reset_confirm'  => esc_html__( 'Are you sure?  Resetting will lose all custom values.', 'redux-framework' ),
749
-				'preset_confirm' => esc_html__( 'Your current options will be replaced with the values of this preset.  Would you like to proceed?', 'redux-framework' ),
750
-				'opt_name'       => $this->parent->args['opt_name'],
751
-				'field'          => $this->parent->options,
752
-				'defaults'       => $this->parent->options_defaults,
753
-				'folds'          => Redux_Core::$folds,
754
-			);
755
-
756
-			// Values used by the javascript.
757
-			wp_localize_script( 'redux-js', 'redux_opts', $localize );
758
-
759
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
760
-			do_action( 'redux-enqueue-' . $this->parent->args['opt_name'] );
761
-
762
-			foreach ( $this->parent->sections as $section ) {
763
-				if ( isset( $section['fields'] ) ) {
764
-					foreach ( $section['fields'] as $field ) {
765
-						if ( isset( $field['type'] ) ) {
766
-							$field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] );
767
-
768
-							$field_class = Redux_Functions::class_exists_ex( $field_classes );
769
-
770
-							if ( false === $field_class ) {
771
-
772
-								// phpcs:ignore WordPress.NamingConventions.ValidHookName
773
-								$class_file = apply_filters( 'redux-typeclass-load', $this->path . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field_class );
774
-
775
-								if ( $class_file ) {
776
-									require_once $class_file;
777
-
778
-									$field_class = Redux_Functions::class_exists_ex( $field_classes );
779
-
780
-								}
781
-							}
782
-
783
-							if ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) {
784
-								$enqueue = new $field_class( '', '', $this );
785
-								$enqueue->enqueue();
786
-							}
787
-						}
788
-					}
789
-				}
790
-			}
791
-		}
792
-
793
-		/**
794
-		 * Register Option for use
795
-		 *
796
-		 * @since       1.0.0
797
-		 * @access      public
798
-		 * @return      void
799
-		 */
800
-		public function register_setting() {
801
-		}
802
-
803
-		/**
804
-		 * Validate the options before insertion
805
-		 *
806
-		 * @param array|string $value The options array.
807
-		 *
808
-		 * @return array|string $value
809
-		 * @since       3.0.0
810
-		 * @access      public
811
-		 */
812
-		public function field_validation( $value ) {
813
-			if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) {
814
-				$replace = $value;
815
-				foreach ( $replace as $sub_array ) {
816
-					$cs_array                 = (array) json_decode( rawurldecode( $sub_array['data'] ) );
817
-					$value[ $cs_array['id'] ] = $cs_array;
818
-				}
819
-			}
820
-
821
-			return $value;
822
-		}
823
-	}
824
-
825
-	if ( ! function_exists( 'redux_customizer_custom_validation' ) ) {
826
-		/**
827
-		 * Custom validation.
828
-		 *
829
-		 * @param mixed $field Field.
830
-		 *
831
-		 * @return mixed
832
-		 */
833
-		function redux_customizer_custom_validation( $field ) {
834
-			return $field;
835
-		}
836
-	}
167
+        }
168
+
169
+        /**
170
+         * AJAX callback for customizer save...to make sanitize/validate work.
171
+         */
172
+        public function customizer() {
173
+            try {
174
+                $return_array = array();
175
+
176
+                if ( isset( $_POST['nonce'] ) && wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'redux_customer_nonce' ) && isset( $_POST['opt_name'] ) && '' !== $_POST['opt_name'] ) {
177
+                    $redux = Redux::instance( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) );
178
+
179
+                    $post_data = wp_unslash( $_POST['data'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput
180
+
181
+                    // New method to avoid input_var nonsense.  Thanks @harunbasic.
182
+                    $values = Redux_Functions_Ex::parse_str( $post_data );
183
+
184
+                    $all_options = get_option( sanitize_text_field( wp_unslash( $_POST['opt_name'] ) ) );
185
+
186
+                    $values = wp_parse_args( $values, $all_options );
187
+
188
+                    $redux->options_class->set( $redux->options_class->validate_options( $values ) );
189
+
190
+                    $redux->enqueue_class->get_warnings_and_errors_array();
191
+
192
+                    $return_array = array(
193
+                        'status'   => 'success',
194
+                        'options'  => $redux->options,
195
+                        'errors'   => $redux->enqueue_class->localize_data['errors'] ?? null,
196
+                        'warnings' => $redux->enqueue_class->localize_data['warnings'] ?? null,
197
+                        'sanitize' => $redux->enqueue_class->localize_data['sanitize'] ?? null,
198
+                    );
199
+                }
200
+            } catch ( Exception $e ) {
201
+                $return_array = array( 'status' => $e->getMessage() );
202
+            }
203
+
204
+            echo wp_json_encode( $return_array );
205
+
206
+            die;
207
+        }
208
+
209
+        /**
210
+         * Field classes.
211
+         *
212
+         * @param array $option Option.
213
+         */
214
+        public function create_field_classes( array $option ) {
215
+            if ( empty( $this->redux_fields ) ) {
216
+                $file_paths = glob( Redux_Core::$dir . 'inc/fields/*' );
217
+
218
+                foreach ( $file_paths as $file ) {
219
+                    if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) {
220
+                        $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/fields/', '', $file );
221
+                    }
222
+                }
223
+
224
+                $file_paths = glob( Redux_Core::$dir . 'inc/extensions/*' );
225
+
226
+                foreach ( $file_paths as $file ) {
227
+                    if ( 'section' !== $file && 'divide' !== $file && 'editor' !== $file ) {
228
+                        $this->redux_fields[] = str_replace( Redux_Core::$dir . 'inc/extensions/', '', $file );
229
+                    }
230
+                }
231
+            }
232
+
233
+            $class_name = 'Redux_Customizer_Control_' . $option['type'];
234
+
235
+            if ( ! class_exists( $class_name ) && ( in_array( $option['type'], $this->redux_fields, true ) || ( isset( $option['customizer_enabled'] ) && $option['customizer_enabled'] ) ) ) {
236
+                $upload_dir = Redux_Core::$upload_dir;
237
+
238
+                if ( ! file_exists( $upload_dir . $option['type'] . '.php' ) ) {
239
+                    if ( ! is_dir( $upload_dir ) ) {
240
+                        Redux_Core::$filesystem->execute( 'mkdir', $upload_dir );
241
+                    }
242
+
243
+                    $template = str_replace( '{{type}}', $option['type'], '<?php' . PHP_EOL . '   class Redux_Customizer_Control_{{type}} extends Redux_Customizer_Control {' . PHP_EOL . '     public $type = "redux-{{type}}";' . PHP_EOL . '   }' );
244
+
245
+                    Redux_Core::$filesystem->execute( 'put_contents', $upload_dir . $option['type'] . '.php', array( 'content' => $template ) );
246
+                }
247
+
248
+                if ( file_exists( $upload_dir . $option['type'] . '.php' ) ) {
249
+                    include_once $upload_dir . $option['type'] . '.php';
250
+                }
251
+            }
252
+        }
253
+
254
+        /**
255
+         * Enqueue extension scripts/styles.
256
+         */
257
+        public function enqueue_controls_css() {
258
+            $this->parent->enqueue_class->get_warnings_and_errors_array();
259
+            $this->parent->enqueue_class->init();
260
+
261
+            if ( $this->parent->args['dev_mode'] ) {
262
+                wp_enqueue_style(
263
+                    'redux-extension-customizer',
264
+                    $this->extension_url . 'redux-extension-customizer.css',
265
+                    array(),
266
+                    self::$version
267
+                );
268
+            }
269
+
270
+            wp_enqueue_script(
271
+                'redux-extension-customizer',
272
+                $this->extension_url . 'redux-extension-customizer' . Redux_Functions::is_min() . '.js',
273
+                array( 'jquery', 'redux-js' ),
274
+                self::$version,
275
+                true
276
+            );
277
+
278
+            wp_localize_script(
279
+                'redux-extension-customizer',
280
+                'redux_customizer',
281
+                array(
282
+                    'body_class' => sanitize_html_class( 'admin-color-' . get_user_option( 'admin_color' ), 'fresh' ),
283
+                )
284
+            );
285
+        }
286
+
287
+        /**
288
+         * Enqueue panel CSS>
289
+         */
290
+        public function enqueue_panel_css() {}
291
+
292
+        /**
293
+         * Remove core customizer class.
294
+         *
295
+         * @return string
296
+         */
297
+        public function remove_core_customizer_class(): string {
298
+            return '';
299
+        }
300
+
301
+        /**
302
+         * Customize preview init.
303
+         */
304
+        public function customize_preview_init() {
305
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
306
+            do_action( 'redux/customizer/live_preview' );
307
+        }
308
+
309
+        /**
310
+         * Get post values.
311
+         */
312
+        protected static function get_post_values() {
313
+            if ( empty( self::$post_values ) && ! empty( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
314
+                $the_data = json_decode( stripslashes_deep( ( wp_unslash( $_POST['customized'] ) ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput
315
+
316
+                foreach ( $the_data as $key => $value ) {
317
+                    if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) {
318
+                        foreach ( $value as $k => $v ) {
319
+                            $decode           = (array) json_decode( rawurldecode( $v['data'] ) );
320
+                            $v                = $decode;
321
+                            $dumb_array[ $k ] = $v;
322
+                            $the_data[ $key ] = $dumb_array;
323
+                        }
324
+                    }
325
+                }
326
+
327
+                self::$post_values = $the_data;
328
+            }
329
+        }
330
+
331
+        /**
332
+         * Override customizer values.
333
+         *
334
+         * @param array $data Values.
335
+         *
336
+         * @return array
337
+         */
338
+        public function override_values( array $data ): array {
339
+            self::get_post_values();
340
+
341
+            if ( isset( $_POST['customized'] ) && ! empty( self::$post_values ) ) { // phpcs:ignore WordPress.Security.NonceVerification
342
+                if ( is_array( self::$post_values ) ) {
343
+                    foreach ( self::$post_values as $key => $value ) {
344
+                        if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) {
345
+                            $key          = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) );
346
+                            $data[ $key ] = $value;
347
+
348
+                            $GLOBALS[ $this->parent->args['global_variable'] ][ $key ] = $value;
349
+                            $this->parent->options[ $key ]                             = $value;
350
+                        }
351
+                    }
352
+                }
353
+            }
354
+
355
+            return $data;
356
+        }
357
+
358
+        /**
359
+         * Render Redux fields.
360
+         *
361
+         * @param object $control .
362
+         */
363
+        public function render( object $control ) {
364
+            $field_id = str_replace( $this->parent->args['opt_name'] . '-', '', $control->redux_id );
365
+            $field    = $this->options[ $field_id ];
366
+
367
+            if ( ! empty( $field['compiler'] ) ) {
368
+                echo '<tr class="compiler">';
369
+            } else {
370
+                echo '<tr>';
371
+            }
372
+
373
+            echo '<th scope="row">' . wp_kses_post( $this->parent->field_head[ $field['id'] ] ) . '</th>';
374
+            echo '<td>';
375
+
376
+            $field['name'] = $field['id'];
377
+            $this->parent->render_class->field_input( $field );
378
+
379
+            echo '</td>';
380
+            echo '</tr>';
381
+        }
382
+
383
+        // All sections, settings, and controls will be added here.
384
+
385
+        /**
386
+         * Register customizer controls.
387
+         *
388
+         * @param WP_Customize_Manager $wp_customize .
389
+         *
390
+         * @throws ReflectionException Exception.
391
+         */
392
+        public function register_customizer_controls( WP_Customize_Manager $wp_customize ) {
393
+            if ( ! class_exists( 'Redux_Customizer_Section' ) ) {
394
+                require_once __DIR__ . '/inc/class-redux-customizer-section.php';
395
+
396
+                if ( method_exists( $wp_customize, 'register_section_type' ) ) {
397
+                    $wp_customize->register_section_type( 'Redux_Customizer_Section' );
398
+                }
399
+            }
400
+
401
+            if ( ! class_exists( 'Redux_Customizer_Panel' ) ) {
402
+                require_once __DIR__ . '/inc/class-redux-customizer-panel.php';
403
+
404
+                if ( method_exists( $wp_customize, 'register_panel_type' ) ) {
405
+                    $wp_customize->register_panel_type( 'Redux_Customizer_Panel' );
406
+                }
407
+            }
408
+
409
+            if ( ! class_exists( 'Redux_Customizer_Control' ) ) {
410
+                require_once __DIR__ . '/inc/class-redux-customizer-control.php';
411
+            }
412
+
413
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
414
+            do_action( 'redux/extension/customizer/control/includes' );
415
+
416
+            $order = array(
417
+                'heading' => - 500,
418
+                'option'  => - 500,
419
+            );
420
+
421
+            $panel = '';
422
+
423
+            $this->parent->args['options_api'] = false;
424
+            $this->parent->options_class->register();
425
+
426
+            $parent_section_id = null;
427
+            $new_parent        = true;
428
+
429
+            foreach ( $this->parent->sections as $key => $section ) {
430
+                // Not a type that should go on the customizer.
431
+
432
+                foreach ( $section['fields'] as $field ) {
433
+                    if ( 'color_scheme' === $field['type'] || 'divide' === $field['type'] ) {
434
+                        continue 2;
435
+                    }
436
+                }
437
+
438
+                if ( isset( $section['id'] ) && 'import/export' === $section['id'] ) {
439
+                    continue;
440
+                }
441
+
442
+                // If section customizer is set to false.
443
+                if ( isset( $section['customizer'] ) && false === $section['customizer'] ) {
444
+                    continue;
445
+                }
446
+
447
+                // if we are in a subsection and parent is set to customizer false !!!
448
+                if ( ( isset( $section['subsection'] ) && $section['subsection'] ) ) {
449
+                    if ( $new_parent ) {
450
+                        $new_parent        = false;
451
+                        $parent_section_id = ( $key - 1 );
452
+                    }
453
+                } else { // not a subsection reset.
454
+                    $parent_section_id = null;
455
+                    $new_parent        = true;
456
+                }
457
+                if ( isset( $parent_section_id ) && ( isset( $this->parent->sections[ $parent_section_id ]['customizer'] ) && false === $this->parent->sections[ $parent_section_id ]['customizer'] ) ) {
458
+                    continue;
459
+                }
460
+
461
+                $section['permissions'] = $section['permissions'] ?? 'edit_theme_options';
462
+
463
+                // No errors please.
464
+                if ( ! isset( $section['desc'] ) ) {
465
+                    $section['desc'] = '';
466
+                }
467
+
468
+                // Fill the description if there is a subtitle.
469
+                if ( empty( $section['desc'] ) && ! empty( $section['subtitle'] ) ) {
470
+                    $section['desc'] = $section['subtitle'];
471
+                }
472
+
473
+                // No title is present, let's show what section is missing a title.
474
+                if ( ! isset( $section['title'] ) ) {
475
+                    $section['title'] = '';
476
+                }
477
+
478
+                // Let's make a section ID from the title.
479
+                if ( empty( $section['id'] ) ) {
480
+                    $section['id'] = Redux_Core::strtolower( str_replace( ' ', '', $section['title'] ) );
481
+                }
482
+
483
+                // Let's set a default priority.
484
+                if ( empty( $section['priority'] ) ) {
485
+                    $section['priority'] = $order['heading'];
486
+                    ++$order['heading'];
487
+                }
488
+                $section['id'] = $this->parent->args['opt_name'] . '-' . $section['id'];
489
+
490
+                if ( method_exists( $wp_customize, 'add_panel' ) && ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) && isset( $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) && $this->parent->sections[ ( $key + 1 ) ]['subsection'] ) {
491
+                    $this->add_panel(
492
+                        $this->parent->args['opt_name'] . '-' . $section['id'],
493
+                        array(
494
+                            'priority'    => $section['priority'],
495
+                            'capability'  => $section['permissions'],
496
+                            'title'       => $section['title'],
497
+                            'section'     => $section,
498
+                            'opt_name'    => $this->parent->args['opt_name'],
499
+                            'description' => '',
500
+                        ),
501
+                        $wp_customize
502
+                    );
503
+
504
+                    $panel = $this->parent->args['opt_name'] . '-' . $section['id'];
505
+
506
+                    $this->add_section(
507
+                        $section['id'],
508
+                        array(
509
+                            'title'       => $section['title'],
510
+                            'priority'    => $section['priority'],
511
+                            'description' => $section['desc'],
512
+                            'section'     => $section,
513
+                            'opt_name'    => $this->parent->args['opt_name'],
514
+                            'capability'  => $section['permissions'],
515
+                            'panel'       => $panel,
516
+                        ),
517
+                        $wp_customize
518
+                    );
519
+                } else {
520
+                    if ( ! isset( $section['subsection'] ) || ( true !== $section['subsection'] ) ) {
521
+                        $panel = '';
522
+                    }
523
+
524
+                    $this->add_section(
525
+                        $section['id'],
526
+                        array(
527
+                            'title'       => $section['title'],
528
+                            'priority'    => $section['priority'],
529
+                            'description' => $section['desc'],
530
+                            'opt_name'    => $this->parent->args['opt_name'],
531
+                            'section'     => $section,
532
+                            'capability'  => $section['permissions'],
533
+                            'panel'       => $panel,
534
+                        ),
535
+                        $wp_customize
536
+                    );
537
+                }
538
+
539
+                if ( ( empty( $section['fields'] ) ) ) {
540
+                    continue;
541
+                }
542
+
543
+                foreach ( $section['fields'] as $skey => $option ) {
544
+
545
+                    if ( isset( $option['customizer'] ) && false === $option['customizer'] ) {
546
+                        continue;
547
+                    }
548
+
549
+                    if ( false === $this->parent->args['customizer'] && ( ! isset( $option['customizer'] ) || true !== $option['customizer'] ) ) {
550
+                        continue;
551
+                    }
552
+
553
+                    $this->options[ $option['id'] ] = $option;
554
+                    add_action( 'redux/customizer/control/render/' . $this->parent->args['opt_name'] . '-' . $option['id'], array( $this, 'render' ) );
555
+
556
+                    $option['permissions'] = $option['permissions'] ?? 'edit_theme_options';
557
+
558
+                    // Change the item priority if not set.
559
+                    if ( 'heading' !== $option['type'] && ! isset( $option['priority'] ) ) {
560
+                        $option['priority'] = $order['option'];
561
+                        ++$order['option'];
562
+                    }
563
+
564
+                    if ( ! empty( $this->options_defaults[ $option['id'] ] ) ) {
565
+                        $option['default'] = $this->options_defaults['option']['id'];
566
+                    }
567
+
568
+                    if ( ! isset( $option['default'] ) ) {
569
+                        $option['default'] = '';
570
+                    }
571
+                    if ( ! isset( $option['title'] ) ) {
572
+                        $option['title'] = '';
573
+                    }
574
+
575
+                    $option['id'] = $this->parent->args['opt_name'] . '[' . $option['id'] . ']';
576
+
577
+                    if ( 'heading' !== $option['type'] && 'import_export' !== $option['type'] && ! empty( $option['type'] ) ) {
578
+
579
+                        $wp_customize->add_setting(
580
+                            $option['id'],
581
+                            array(
582
+                                'default'           => $option['default'],
583
+                                'transport'         => 'refresh',
584
+                                'opt_name'          => $this->parent->args['opt_name'],
585
+                                'sanitize_callback' => array( $this, 'field_validation' ),
586
+                            )
587
+                        );
588
+                    }
589
+
590
+                    if ( ! empty( $option['data'] ) && empty( $option['options'] ) ) {
591
+                        if ( empty( $option['args'] ) ) {
592
+                            $option['args'] = array();
593
+                        }
594
+
595
+                        if ( 'elusive-icons' === $option['data'] || 'elusive-icon' === $option['data'] || 'elusive' === $option['data'] ) {
596
+                            $icons_file = Redux_Core::$dir . 'inc/fields/select/elusive-icons.php';
597
+
598
+                            // phpcs:ignore WordPress.NamingConventions.ValidHookName
599
+                            $icons_file = apply_filters( 'redux-font-icons-file', $icons_file );
600
+
601
+                            if ( file_exists( $icons_file ) ) {
602
+                                require_once $icons_file;
603
+                            }
604
+                        }
605
+                        $option['options'] = $this->parent->wordpress_data->get( $option['data'], $option['args'] );
606
+                    }
607
+
608
+                    $class_name = 'Redux_Customizer_Control_' . $option['type'];
609
+
610
+                    // phpcs:ignore WordPress.NamingConventions.ValidHookName
611
+                    do_action( 'redux/extension/customizer/control_init', $option );
612
+
613
+                    if ( ! class_exists( $class_name ) ) {
614
+                        continue;
615
+                    }
616
+
617
+                    $wp_customize->add_control(
618
+                        new $class_name(
619
+                            $wp_customize,
620
+                            $option['id'],
621
+                            array(
622
+                                'label'           => $option['title'],
623
+                                'section'         => $section['id'],
624
+                                'settings'        => $option['id'],
625
+                                'type'            => 'redux-' . $option['type'],
626
+                                'field'           => $option,
627
+                                'ReduxFramework'  => $this->parent,
628
+                                'active_callback' => ( isset( $option['required'] ) && class_exists( 'Redux_Customizer_Active_Callback' ) ) ? array(
629
+                                    'Redux_Customizer_Active_Callback',
630
+                                    'evaluate',
631
+                                ) : '__return_true',
632
+                                'priority'        => $option['priority'],
633
+                            )
634
+                        )
635
+                    );
636
+
637
+                    $section['fields'][ $skey ]['name'] = $option['id'];
638
+                    if ( ! isset( $section['fields'][ $skey ]['class'] ) ) { // No errors please.
639
+                        $section['fields'][ $skey ]['class'] = '';
640
+                    }
641
+
642
+                    $this->controls[ $section['fields'][ $skey ]['id'] ] = $section['fields'][ $skey ];
643
+                }
644
+            }
645
+        }
646
+
647
+        /**
648
+         * Add customizer section.
649
+         *
650
+         * @param string               $id           ID.
651
+         * @param array                $args         Args.
652
+         * @param WP_Customize_Manager $wp_customize .
653
+         */
654
+        public function add_section( string $id, array $args, WP_Customize_Manager $wp_customize ) {
655
+
656
+            if ( is_a( $id, 'WP_Customize_Section' ) ) {
657
+                $section = $id;
658
+            } else {
659
+                $section = new Redux_Customizer_Section( $wp_customize, $id, $args );
660
+            }
661
+
662
+            $wp_customize->add_section( $section, $args );
663
+        }
664
+
665
+        /**
666
+         * Add a customize panel.
667
+         *
668
+         * @param WP_Customize_Panel|string $id           Customize Panel object, or Panel ID.
669
+         * @param array                     $args         Optional. Panel arguments. Default empty array.
670
+         * @param WP_Customize_Manager      $wp_customize .
671
+         *
672
+         * @since  4.0.0
673
+         * @access public
674
+         */
675
+        public function add_panel( $id, array $args, WP_Customize_Manager $wp_customize ) {
676
+            if ( is_a( $id, 'WP_Customize_Panel' ) ) {
677
+                $panel = $id;
678
+            } else {
679
+                $panel = new Redux_Customizer_Panel( $wp_customize, $id, $args );
680
+            }
681
+
682
+            $wp_customize->add_panel( $panel, $args );
683
+        }
684
+
685
+        /**
686
+         * Actions to take after customizer save.
687
+         *
688
+         * @throws ReflectionException Exception.
689
+         */
690
+        public function customizer_save_after() {
691
+            if ( empty( $this->parent->options ) ) {
692
+                $this->parent->get_options();
693
+            }
694
+
695
+            if ( empty( $this->orig_options ) && ! empty( $this->parent->options ) ) {
696
+                $this->orig_options = $this->parent->options;
697
+            }
698
+
699
+            if ( isset( $_POST['customized'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification
700
+                $options = json_decode( sanitize_text_field( wp_unslash( $_POST['customized'] ) ), true ); // phpcs:ignore WordPress.Security.NonceVerification
701
+
702
+                $compiler = false;
703
+                $changed  = false;
704
+
705
+                foreach ( $options as $key => $value ) {
706
+                    if ( strpos( $key, $this->parent->args['opt_name'] ) !== false ) {
707
+                        $key = str_replace( $this->parent->args['opt_name'] . '[', '', rtrim( $key, ']' ) );
708
+
709
+                        if ( ! isset( $this->orig_options[ $key ] ) || $value !== $this->orig_options[ $key ] || ( isset( $this->orig_options[ $key ] ) && ! empty( $this->orig_options[ $key ] ) && empty( $value ) ) ) {
710
+                            $this->parent->options[ $key ] = $value;
711
+                            $changed                       = true;
712
+
713
+                            if ( isset( $this->parent->compiler_fields[ $key ] ) ) {
714
+                                $compiler = true;
715
+                            }
716
+                        }
717
+                    }
718
+                }
719
+
720
+                if ( $changed ) {
721
+                    $this->parent->options_class->set( $this->parent->options );
722
+                    if ( $compiler ) {
723
+                        // Have to set this to stop the output of the CSS and typography stuff.
724
+                        Redux_Core::$no_output = true;
725
+                        $this->parent->output_class->enqueue();
726
+
727
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
728
+                        do_action( "redux/options/{$this->parent->args['opt_name']}/compiler", $this->parent->options, $this->parent->compilerCSS );
729
+
730
+                        // phpcs:ignore WordPress.NamingConventions.ValidHookName
731
+                        do_action( "redux/options/{$this->parent->args['opt_name']}/compiler/advanced", $this->parent );
732
+                    }
733
+                }
734
+            }
735
+        }
736
+
737
+        /**
738
+         * Enqueue CSS/JS for the customizer controls
739
+         *
740
+         * @since       1.0.0
741
+         * @access      public
742
+         * @global      $wp_styles
743
+         * @return      void
744
+         */
745
+        public function enqueue() {
746
+            $localize = array(
747
+                'save_pending'   => esc_html__( 'You have changes that are not saved.  Would you like to save them now?', 'redux-framework' ),
748
+                'reset_confirm'  => esc_html__( 'Are you sure?  Resetting will lose all custom values.', 'redux-framework' ),
749
+                'preset_confirm' => esc_html__( 'Your current options will be replaced with the values of this preset.  Would you like to proceed?', 'redux-framework' ),
750
+                'opt_name'       => $this->parent->args['opt_name'],
751
+                'field'          => $this->parent->options,
752
+                'defaults'       => $this->parent->options_defaults,
753
+                'folds'          => Redux_Core::$folds,
754
+            );
755
+
756
+            // Values used by the javascript.
757
+            wp_localize_script( 'redux-js', 'redux_opts', $localize );
758
+
759
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
760
+            do_action( 'redux-enqueue-' . $this->parent->args['opt_name'] );
761
+
762
+            foreach ( $this->parent->sections as $section ) {
763
+                if ( isset( $section['fields'] ) ) {
764
+                    foreach ( $section['fields'] as $field ) {
765
+                        if ( isset( $field['type'] ) ) {
766
+                            $field_classes = array( 'Redux_' . $field['type'], 'ReduxFramework_' . $field['type'] );
767
+
768
+                            $field_class = Redux_Functions::class_exists_ex( $field_classes );
769
+
770
+                            if ( false === $field_class ) {
771
+
772
+                                // phpcs:ignore WordPress.NamingConventions.ValidHookName
773
+                                $class_file = apply_filters( 'redux-typeclass-load', $this->path . 'inc/fields/' . $field['type'] . '/field_' . $field['type'] . '.php', $field_class );
774
+
775
+                                if ( $class_file ) {
776
+                                    require_once $class_file;
777
+
778
+                                    $field_class = Redux_Functions::class_exists_ex( $field_classes );
779
+
780
+                                }
781
+                            }
782
+
783
+                            if ( class_exists( $field_class ) && method_exists( $field_class, 'enqueue' ) ) {
784
+                                $enqueue = new $field_class( '', '', $this );
785
+                                $enqueue->enqueue();
786
+                            }
787
+                        }
788
+                    }
789
+                }
790
+            }
791
+        }
792
+
793
+        /**
794
+         * Register Option for use
795
+         *
796
+         * @since       1.0.0
797
+         * @access      public
798
+         * @return      void
799
+         */
800
+        public function register_setting() {
801
+        }
802
+
803
+        /**
804
+         * Validate the options before insertion
805
+         *
806
+         * @param array|string $value The options array.
807
+         *
808
+         * @return array|string $value
809
+         * @since       3.0.0
810
+         * @access      public
811
+         */
812
+        public function field_validation( $value ) {
813
+            if ( strpos( wp_json_encode( $value ), 'data' ) > 0 ) {
814
+                $replace = $value;
815
+                foreach ( $replace as $sub_array ) {
816
+                    $cs_array                 = (array) json_decode( rawurldecode( $sub_array['data'] ) );
817
+                    $value[ $cs_array['id'] ] = $cs_array;
818
+                }
819
+            }
820
+
821
+            return $value;
822
+        }
823
+    }
824
+
825
+    if ( ! function_exists( 'redux_customizer_custom_validation' ) ) {
826
+        /**
827
+         * Custom validation.
828
+         *
829
+         * @param mixed $field Field.
830
+         *
831
+         * @return mixed
832
+         */
833
+        function redux_customizer_custom_validation( $field ) {
834
+            return $field;
835
+        }
836
+    }
837 837
 }
838 838
 
839 839
 if ( ! class_exists( 'ReduxFramework_extension_customizer' ) ) {
840
-	class_alias( 'Redux_Extension_Customizer', 'ReduxFramework_extension_customizer' );
840
+    class_alias( 'Redux_Extension_Customizer', 'ReduxFramework_extension_customizer' );
841 841
 }
Please login to merge, or discard this patch.
redux-core/inc/extensions/customizer/inc/class-redux-customizer-control.php 1 patch
Indentation   +61 added lines, -61 removed lines patch added patch discarded remove patch
@@ -10,40 +10,40 @@  discard block
 block discarded – undo
10 10
 
11 11
 if ( ! class_exists( 'Redux_Customizer_Control', false ) ) {
12 12
 
13
-	/**
14
-	 * Class Redux_Customizer_Control
15
-	 */
16
-	class Redux_Customizer_Control extends WP_Customize_Control {
13
+    /**
14
+     * Class Redux_Customizer_Control
15
+     */
16
+    class Redux_Customizer_Control extends WP_Customize_Control {
17 17
 
18
-		/**
19
-		 * Redux ID.
20
-		 *
21
-		 * @var string
22
-		 */
23
-		public string $redux_id = '';
18
+        /**
19
+         * Redux ID.
20
+         *
21
+         * @var string
22
+         */
23
+        public string $redux_id = '';
24 24
 
25
-		/**
26
-		 * Field render.
27
-		 */
28
-		public function render() {
25
+        /**
26
+         * Field render.
27
+         */
28
+        public function render() {
29 29
 
30
-			$this->redux_id = str_replace( 'customize-control-', '', 'customize-control-' . str_replace( '[', '-', str_replace( ']', '', $this->id ) ) );
31
-			$class          = 'customize-control redux-group-tab redux-field customize-control-' . $this->type;
32
-			$opt_name_arr   = explode( '[', $this->id );
33
-			$opt_name       = $opt_name_arr[0];
34
-			$field_id       = str_replace( ']', '', $opt_name_arr[1] );
30
+            $this->redux_id = str_replace( 'customize-control-', '', 'customize-control-' . str_replace( '[', '-', str_replace( ']', '', $this->id ) ) );
31
+            $class          = 'customize-control redux-group-tab redux-field customize-control-' . $this->type;
32
+            $opt_name_arr   = explode( '[', $this->id );
33
+            $opt_name       = $opt_name_arr[0];
34
+            $field_id       = str_replace( ']', '', $opt_name_arr[1] );
35 35
 
36
-			$section = Redux_Helpers::section_from_field_id( $opt_name, $field_id );
36
+            $section = Redux_Helpers::section_from_field_id( $opt_name, $field_id );
37 37
 
38
-			if ( isset( $section['disabled'] ) && true === $section['disabled'] ) {
39
-				$class .= ' disabled';
40
-			}
38
+            if ( isset( $section['disabled'] ) && true === $section['disabled'] ) {
39
+                $class .= ' disabled';
40
+            }
41 41
 
42
-			if ( isset( $section['hidden'] ) && true === $section['hidden'] ) {
43
-				$class .= ' hidden';
44
-			}
42
+            if ( isset( $section['hidden'] ) && true === $section['hidden'] ) {
43
+                $class .= ' hidden';
44
+            }
45 45
 
46
-			?>
46
+            ?>
47 47
 			<li id="<?php echo esc_attr( $this->redux_id ); ?>-li" class="<?php echo esc_attr( $class ); ?>">
48 48
 				<?php if ( 'repeater' !== $this->type ) { ?>
49 49
 					<input
@@ -57,42 +57,42 @@  discard block
 block discarded – undo
57 57
 				<?php $this->render_content(); ?>
58 58
 			</li>
59 59
 			<?php
60
-		}
60
+        }
61 61
 
62
-		/**
63
-		 * Render content hook.
64
-		 */
65
-		public function render_content() {
66
-			// phpcs:ignore WordPress.NamingConventions.ValidHookName
67
-			do_action( 'redux/customizer/control/render/' . $this->redux_id, $this );
68
-		}
62
+        /**
63
+         * Render content hook.
64
+         */
65
+        public function render_content() {
66
+            // phpcs:ignore WordPress.NamingConventions.ValidHookName
67
+            do_action( 'redux/customizer/control/render/' . $this->redux_id, $this );
68
+        }
69 69
 
70
-		/**
71
-		 * Label output.
72
-		 */
73
-		public function label() {
74
-			// The label has already been sanitized in the Fields class, no need to re-sanitize it.
75
-			echo( $this->label ); // phpcs:ignore WordPress.Security.EscapeOutput
76
-		}
70
+        /**
71
+         * Label output.
72
+         */
73
+        public function label() {
74
+            // The label has already been sanitized in the Fields class, no need to re-sanitize it.
75
+            echo( $this->label ); // phpcs:ignore WordPress.Security.EscapeOutput
76
+        }
77 77
 
78
-		/**
79
-		 * Description output.
80
-		 */
81
-		public function description() {
82
-			if ( ! empty( $this->description ) ) {
83
-				// The description has already been sanitized in the Fields class, no need to re-sanitize it.
84
-				echo '<span class="description customize-control-description">' . esc_html( $this->description ) . '</span>';
85
-			}
86
-		}
78
+        /**
79
+         * Description output.
80
+         */
81
+        public function description() {
82
+            if ( ! empty( $this->description ) ) {
83
+                // The description has already been sanitized in the Fields class, no need to re-sanitize it.
84
+                echo '<span class="description customize-control-description">' . esc_html( $this->description ) . '</span>';
85
+            }
86
+        }
87 87
 
88
-		/**
89
-		 * Title output.
90
-		 */
91
-		public function title() {
92
-			echo '<span class="customize-control-title">';
93
-			$this->label();
94
-			$this->description();
95
-			echo '</span>';
96
-		}
97
-	}
88
+        /**
89
+         * Title output.
90
+         */
91
+        public function title() {
92
+            echo '<span class="customize-control-title">';
93
+            $this->label();
94
+            $this->description();
95
+            echo '</span>';
96
+        }
97
+    }
98 98
 }
Please login to merge, or discard this patch.
redux-core/inc/fields/background/class-redux-background.php 1 patch
Indentation   +423 added lines, -423 removed lines patch added patch discarded remove patch
@@ -12,429 +12,429 @@
 block discarded – undo
12 12
 // Don't duplicate me!
13 13
 if ( ! class_exists( 'Redux_Background', false ) ) {
14 14
 
15
-	/**
16
-	 * Main Redux_background class
17
-	 *
18
-	 * @since       3.1.5
19
-	 */
20
-	class Redux_Background extends Redux_Field {
21
-
22
-		/**
23
-		 * Set field and value defaults.
24
-		 */
25
-		public function set_defaults() {
26
-			$defaults = array(
27
-				'background-color'      => true,
28
-				'background-repeat'     => true,
29
-				'background-attachment' => true,
30
-				'background-position'   => true,
31
-				'background-image'      => true,
32
-				'background-gradient'   => false,
33
-				'background-clip'       => false,
34
-				'background-origin'     => false,
35
-				'background-size'       => true,
36
-				'preview_media'         => false,
37
-				'preview'               => true,
38
-				'preview_height'        => '200px',
39
-				'transparent'           => true,
40
-			);
41
-
42
-			$this->field = wp_parse_args( $this->field, $defaults );
43
-
44
-			// No errors please.
45
-			$defaults = array(
46
-				'background-color'      => '',
47
-				'background-repeat'     => '',
48
-				'background-attachment' => '',
49
-				'background-position'   => '',
50
-				'background-image'      => '',
51
-				'background-clip'       => '',
52
-				'background-origin'     => '',
53
-				'background-size'       => '',
54
-				'media'                 => array(),
55
-			);
56
-
57
-			$this->value = wp_parse_args( $this->value, $defaults );
58
-
59
-			$defaults = array(
60
-				'id'        => '',
61
-				'width'     => '',
62
-				'height'    => '',
63
-				'thumbnail' => '',
64
-			);
65
-
66
-			$this->value['media'] = wp_parse_args( $this->value['media'], $defaults );
67
-		}
68
-
69
-		/**
70
-		 * Field Render Function.
71
-		 * Takes the vars and outputs the HTML for the field in the settings
72
-		 *
73
-		 * @since       1.0.0
74
-		 * @access      public
75
-		 * @return      void
76
-		 */
77
-		public function render() {
78
-			$this->select2_config['allowClear'] = true;
79
-
80
-			if ( isset( $this->field['select2'] ) ) {
81
-				$this->field['select2'] = wp_parse_args( $this->field['select2'], $this->select2_config );
82
-			} else {
83
-				$this->field['select2'] = $this->select2_config;
84
-			}
85
-
86
-			$this->field['select2'] = Redux_Functions::sanitize_camel_case_array_keys( $this->field['select2'] );
87
-
88
-			$select2_data = Redux_Functions::create_data_string( $this->field['select2'] );
89
-
90
-			if ( true === $this->field['background-color'] ) {
91
-				if ( isset( $this->value['color'] ) && empty( $this->value['background-color'] ) ) {
92
-					$this->value['background-color'] = $this->value['color'];
93
-				}
94
-
95
-				$def_bg_color = $this->field['default']['background-color'] ?? '';
96
-
97
-				echo '<input ';
98
-				echo 'data-id="' . esc_attr( $this->field['id'] ) . '"';
99
-				echo 'name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-color]"';
100
-				echo 'id="' . esc_attr( $this->field['id'] ) . '-color"';
101
-				echo 'class="color-picker redux-color redux-background-input redux-color-init ' . esc_attr( $this->field['class'] ) . '"';
102
-				echo 'type="text" value="' . esc_attr( $this->value['background-color'] ) . '"';
103
-				echo 'data-default-color="' . esc_attr( $def_bg_color ) . '"';
104
-
105
-				$data = array(
106
-					'field' => $this->field,
107
-					'index' => 'color',
108
-				);
109
-
110
-				echo Redux_Functions_Ex::output_alpha_data( $data ); // phpcs:ignore WordPress.Security.EscapeOutput
111
-
112
-				echo '>';
113
-
114
-				echo '<input type="hidden" class="redux-saved-color" id="' . esc_attr( $this->field['id'] ) . '-saved-color" value="">';
115
-
116
-				if ( ! isset( $this->field['transparent'] ) || false !== $this->field['transparent'] ) {
117
-					$is_checked = '';
118
-					if ( 'transparent' === $this->value['background-color'] ) {
119
-						$is_checked = ' checked="checked"';
120
-					}
121
-					echo '<label for="' . esc_attr( $this->field['id'] ) . '-transparency" class="color-transparency-check"><input type="checkbox" class="checkbox color-transparency redux-background-input ' . esc_attr( $this->field['class'] ) . '" id="' . esc_attr( $this->field['id'] ) . '-transparency" data-id="' . esc_attr( $this->field['id'] ) . '-color" value="1" ' . esc_html( $is_checked ) . '> ' . esc_html__( 'Transparent', 'redux-framework' ) . '</label>';
122
-				}
123
-
124
-				if ( true === $this->field['background-repeat'] || true === $this->field['background-position'] || true === $this->field['background-attachment'] ) {
125
-					echo '<br />';
126
-				}
127
-			}
128
-
129
-			if ( true === $this->field['background-repeat'] ) {
130
-				$array = array(
131
-					'no-repeat' => esc_html__( 'No Repeat', 'redux-framework' ),
132
-					'repeat'    => esc_html__( 'Repeat All', 'redux-framework' ),
133
-					'repeat-x'  => esc_html__( 'Repeat Horizontally', 'redux-framework' ),
134
-					'repeat-y'  => esc_html__( 'Repeat Vertically', 'redux-framework' ),
135
-					'inherit'   => esc_html__( 'Inherit', 'redux-framework' ),
136
-				);
137
-
138
-				echo '<select id="' . esc_attr( $this->field['id'] ) . '-repeat-select" data-placeholder="' . esc_html__( 'Background Repeat', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-repeat]" class="redux-select-item redux-background-input redux-background-repeat ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
139
-				echo '<option></option>';
140
-
141
-				foreach ( $array as $k => $v ) {
142
-					echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-repeat'], $k, false ) . '>' . esc_html( $v ) . '</option>';
143
-				}
144
-
145
-				echo '</select>';
146
-			}
147
-
148
-			if ( true === $this->field['background-clip'] ) {
149
-				$array = array(
150
-					'inherit'     => esc_html__( 'Inherit', 'redux-framework' ),
151
-					'border-box'  => esc_html__( 'Border Box', 'redux-framework' ),
152
-					'content-box' => esc_html__( 'Content Box', 'redux-framework' ),
153
-					'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ),
154
-				);
155
-
156
-				echo '<select id="' . esc_attr( $this->field['id'] ) . '-clip-select" data-placeholder="' . esc_html__( 'Background Clip', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-clip]" class="redux-select-item redux-background-input redux-background-clip ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
157
-				echo '<option></option>';
158
-
159
-				foreach ( $array as $k => $v ) {
160
-					echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-clip'], $k, false ) . '>' . esc_html( $v ) . '</option>';
161
-				}
162
-
163
-				echo '</select>';
164
-			}
165
-
166
-			if ( true === $this->field['background-origin'] ) {
167
-				$array = array(
168
-					'inherit'     => esc_html__( 'Inherit', 'redux-framework' ),
169
-					'border-box'  => esc_html__( 'Border Box', 'redux-framework' ),
170
-					'content-box' => esc_html__( 'Content Box', 'redux-framework' ),
171
-					'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ),
172
-				);
173
-
174
-				echo '<select id="' . esc_attr( $this->field['id'] ) . '-origin-select" data-placeholder="' . esc_html__( 'Background Origin', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-origin]" class="redux-select-item redux-background-input redux-background-origin ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
175
-				echo '<option></option>';
176
-
177
-				foreach ( $array as $k => $v ) {
178
-					echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-origin'], $k, false ) . '>' . esc_html( $v ) . '</option>';
179
-				}
180
-
181
-				echo '</select>';
182
-			}
183
-
184
-			if ( true === $this->field['background-size'] ) {
185
-				$array = array(
186
-					'inherit' => esc_html__( 'Inherit', 'redux-framework' ),
187
-					'cover'   => esc_html__( 'Cover', 'redux-framework' ),
188
-					'contain' => esc_html__( 'Contain', 'redux-framework' ),
189
-				);
190
-
191
-				echo '<select id="' . esc_attr( $this->field['id'] ) . '-size-select" data-placeholder="' . esc_html__( 'Background Size', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-size]" class="redux-select-item redux-background-input redux-background-size ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
192
-				echo '<option></option>';
193
-
194
-				foreach ( $array as $k => $v ) {
195
-					echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-size'], $k, false ) . '>' . esc_html( $v ) . '</option>';
196
-				}
197
-
198
-				echo '</select>';
199
-			}
200
-
201
-			if ( true === $this->field['background-attachment'] ) {
202
-				$array = array(
203
-					'fixed'   => esc_html__( 'Fixed', 'redux-framework' ),
204
-					'scroll'  => esc_html__( 'Scroll', 'redux-framework' ),
205
-					'inherit' => esc_html__( 'Inherit', 'redux-framework' ),
206
-				);
207
-
208
-				echo '<select id="' . esc_attr( $this->field['id'] ) . '-attachment-select" data-placeholder="' . esc_html__( 'Background Attachment', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-attachment]" class="redux-select-item redux-background-input redux-background-attachment ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
209
-				echo '<option></option>';
210
-
211
-				foreach ( $array as $k => $v ) {
212
-					echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-attachment'], $k, false ) . '>' . esc_html( $v ) . '</option>';
213
-				}
214
-
215
-				echo '</select>';
216
-			}
217
-
218
-			if ( true === $this->field['background-position'] ) {
219
-				$array = array(
220
-					'left top'      => esc_html__( 'Left Top', 'redux-framework' ),
221
-					'left center'   => esc_html__( 'Left center', 'redux-framework' ),
222
-					'left bottom'   => esc_html__( 'Left Bottom', 'redux-framework' ),
223
-					'center top'    => esc_html__( 'Center Top', 'redux-framework' ),
224
-					'center center' => esc_html__( 'Center Center', 'redux-framework' ),
225
-					'center bottom' => esc_html__( 'Center Bottom', 'redux-framework' ),
226
-					'right top'     => esc_html__( 'Right Top', 'redux-framework' ),
227
-					'right center'  => esc_html__( 'Right center', 'redux-framework' ),
228
-					'right bottom'  => esc_html__( 'Right Bottom', 'redux-framework' ),
229
-				);
230
-
231
-				echo '<select id="' . esc_attr( $this->field['id'] ) . '-position-select" data-placeholder="' . esc_html__( 'Background Position', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-position]" class="redux-select-item redux-background-input redux-background-position ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
232
-				echo '<option></option>';
233
-
234
-				foreach ( $array as $k => $v ) {
235
-					echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-position'], $k, false ) . '>' . esc_html( $v ) . '</option>';
236
-				}
237
-
238
-				echo '</select>';
239
-			}
240
-
241
-			if ( $this->field['background-image'] ) {
242
-				echo '<br />';
243
-
244
-				if ( empty( $this->value ) && ! empty( $this->field['default'] ) ) {
245
-					if ( is_array( $this->field['default'] ) ) {
246
-						if ( ! empty( $this->field['default']['media']['id'] ) ) {
247
-							$this->value['media']['id'] = $this->field['default']['media']['id'];
248
-						} elseif ( ! empty( $this->field['default']['id'] ) ) {
249
-							$this->value['media']['id'] = $this->field['default']['id'];
250
-						}
251
-
252
-						if ( ! empty( $this->field['default']['url'] ) ) {
253
-							$this->value['background-image'] = $this->field['default']['url'];
254
-						} elseif ( ! empty( $this->field['default']['media']['url'] ) ) {
255
-							$this->value['background-image'] = $this->field['default']['media']['url'];
256
-						} elseif ( ! empty( $this->field['default']['background-image'] ) ) {
257
-							$this->value['background-image'] = $this->field['default']['background-image'];
258
-						}
259
-					} elseif ( is_numeric( $this->field['default'] ) ) {
260
-						// Check if it's an attachment ID.
261
-							$this->value['media']['id'] = $this->field['default'];
262
-					} else { // Must be a URL.
263
-						$this->value['background-image'] = $this->field['default'];
264
-					}
265
-				}
266
-
267
-				if ( empty( $this->value['background-image'] ) && ! empty( $this->value['media']['id'] ) ) {
268
-					$img                             = wp_get_attachment_image_src( $this->value['media']['id'], 'full' );
269
-					$this->value['background-image'] = $img[0];
270
-					$this->value['media']['width']   = $img[1];
271
-					$this->value['media']['height']  = $img[2];
272
-				}
273
-
274
-				$hide = 'hide ';
275
-
276
-				if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) ) {
277
-					$this->field['class'] .= ' noPreview';
278
-				}
279
-
280
-				if ( ( ! empty( $this->field['background-image'] ) && true === $this->field['background-image'] ) || ( isset( $this->field['preview'] ) && false === $this->field['preview'] ) ) {
281
-					$hide = '';
282
-				}
283
-
284
-				$placeholder = $this->field['placeholder'] ?? esc_html__( 'No media selected', 'redux-framework' );
285
-
286
-				echo '<input placeholder="' . esc_html( $placeholder ) . '" type="text" class="redux-background-input ' . esc_attr( $hide ) . 'upload ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-image]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][background-image]" value="' . esc_url( $this->value['background-image'] ) . '" />';
287
-				echo '<input type="hidden" class="upload-id ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][id]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][id]" value="' . esc_attr( $this->value['media']['id'] ) . '" />';
288
-				echo '<input type="hidden" class="upload-height" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][height]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][height]" value="' . esc_attr( $this->value['media']['height'] ) . '" />';
289
-				echo '<input type="hidden" class="upload-width" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][width]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][width]" value="' . esc_attr( $this->value['media']['width'] ) . '" />';
290
-				echo '<input type="hidden" class="upload-thumbnail" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][thumbnail]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][thumbnail]" value="' . esc_url( $this->value['media']['thumbnail'] ) . '" />';
291
-
292
-				// Preview.
293
-				$hide = '';
294
-
295
-				if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) || empty( $this->value['background-image'] ) ) {
296
-					$hide = 'hide ';
297
-				}
298
-
299
-				if ( empty( $this->value['media']['thumbnail'] ) && ! empty( $this->value['background-image'] ) ) { // Just in case.
300
-					if ( ! empty( $this->value['media']['id'] ) ) {
301
-						$image = wp_get_attachment_image_src(
302
-							$this->value['media']['id'],
303
-							array(
304
-								150,
305
-								150,
306
-							)
307
-						);
308
-
309
-						$this->value['media']['thumbnail'] = $image[0];
310
-					} else {
311
-						$this->value['media']['thumbnail'] = $this->value['background-image'];
312
-					}
313
-				}
314
-
315
-				echo '<div class="' . esc_attr( $hide ) . 'screenshot">';
316
-				echo '<a class="of-uploaded-image" href="' . esc_url( $this->value['background-image'] ) . '" target="_blank">';
317
-
318
-				$alt = wp_prepare_attachment_for_js( $this->value['media']['id'] );
319
-				$alt = $alt['alt'] ?? '';
320
-
321
-				echo '<img class="redux-option-image" id="image_' . esc_attr( $this->value['media']['id'] ) . '" src="' . esc_url( $this->value['media']['thumbnail'] ) . '" alt="' . esc_attr( $alt ) . '" target="_blank" rel="external" />';
322
-				echo '</a>';
323
-				echo '</div>';
324
-
325
-				// Upload controls DIV.
326
-				echo '<div class="upload_button_div">';
327
-
328
-				// If the user has WP3.5+ show upload/remove button.
329
-				echo '<span class="button redux-background-upload" id="' . esc_attr( $this->field['id'] ) . '-media">' . esc_html__( 'Upload', 'redux-framework' ) . '</span>';
330
-
331
-				$hide = '';
332
-				if ( empty( $this->value['background-image'] ) || '' === $this->value['background-image'] ) {
333
-					$hide = ' hide';
334
-				}
335
-
336
-				echo '<span class="button removeCSS redux-remove-background' . esc_attr( $hide ) . '" id="reset_' . esc_attr( $this->field['id'] ) . '" rel="' . esc_attr( $this->field['id'] ) . '">' . esc_html__( 'Remove', 'redux-framework' ) . '</span>';
337
-
338
-				echo '</div>';
339
-			}
340
-
341
-			/**
342
-			 * Preview
343
-			 * */
344
-			if ( ! isset( $this->field['preview'] ) || false !== $this->field['preview'] ) {
345
-				$css = $this->css_style( $this->value );
346
-
347
-				$is_bg = strpos( $css, 'background-image' );
348
-
349
-				if ( empty( $css ) || ! $is_bg ) {
350
-					$css = 'display:none;';
351
-				}
352
-
353
-				$css .= 'height: ' . esc_attr( $this->field['preview_height'] ) . ';';
354
-				echo '<p class="clear ' . esc_attr( $this->field['id'] ) . '_previewer background-preview" style="' . esc_attr( $css ) . '">&nbsp;</p>';
355
-			}
356
-		}
357
-
358
-		/**
359
-		 * Enqueue Function.
360
-		 * If this field requires any scripts, or css define this function and register/enqueue the scripts/css
361
-		 *
362
-		 * @since       1.0.0
363
-		 * @access      public
364
-		 * @return      void
365
-		 */
366
-		public function enqueue() {
367
-			if ( function_exists( 'wp_enqueue_media' ) ) {
368
-				wp_enqueue_media();
369
-			} elseif ( ! wp_script_is( 'media-upload' ) ) {
370
-				wp_enqueue_script( 'media-upload' );
371
-			}
372
-
373
-			if ( ! wp_style_is( 'select2-css' ) ) {
374
-				wp_enqueue_style( 'select2-css' );
375
-			}
376
-
377
-			if ( ! wp_style_is( 'wp-color-picker' ) ) {
378
-				wp_enqueue_style( 'wp-color-picker' );
379
-			}
380
-
381
-			$dep_array = array( 'jquery', 'wp-color-picker', 'select2-js', 'redux-js' );
382
-
383
-			wp_enqueue_script(
384
-				'redux-field-background',
385
-				Redux_Core::$url . 'inc/fields/background/redux-background' . Redux_Functions::is_min() . '.js',
386
-				$dep_array,
387
-				$this->timestamp,
388
-				true
389
-			);
390
-
391
-			if ( $this->parent->args['dev_mode'] ) {
392
-				wp_enqueue_style(
393
-					'redux-field-background',
394
-					Redux_Core::$url . 'inc/fields/background/redux-background.css',
395
-					array(),
396
-					$this->timestamp
397
-				);
398
-
399
-				wp_enqueue_style( 'redux-color-picker' );
400
-			}
401
-		}
402
-
403
-		/**
404
-		 * Output CSS styling.
405
-		 *
406
-		 * @param array $data Value array.
407
-		 *
408
-		 * @return string
409
-		 */
410
-		public function css_style( $data = array() ): string {
411
-			$css = '';
412
-
413
-			if ( ! empty( $data ) && is_array( $data ) ) {
414
-				foreach ( $data as $key => $val ) {
415
-					if ( ! empty( $val ) && 'media' !== $key ) {
416
-						if ( 'background-image' === $key ) {
417
-							$css .= $key . ":url('" . esc_url( $val ) . "');";
418
-						} else {
419
-							$css .= $key . ':' . esc_attr( $val ) . ';';
420
-						}
421
-					}
422
-				}
423
-			}
424
-
425
-			return $css;
426
-		}
427
-
428
-		/**
429
-		 * Enable output_variables to be generated.
430
-		 *
431
-		 * @since       4.0.3
432
-		 * @return void
433
-		 */
434
-		public function output_variables() {
435
-			// No code needed, just defining the method is enough.
436
-		}
437
-	}
15
+    /**
16
+     * Main Redux_background class
17
+     *
18
+     * @since       3.1.5
19
+     */
20
+    class Redux_Background extends Redux_Field {
21
+
22
+        /**
23
+         * Set field and value defaults.
24
+         */
25
+        public function set_defaults() {
26
+            $defaults = array(
27
+                'background-color'      => true,
28
+                'background-repeat'     => true,
29
+                'background-attachment' => true,
30
+                'background-position'   => true,
31
+                'background-image'      => true,
32
+                'background-gradient'   => false,
33
+                'background-clip'       => false,
34
+                'background-origin'     => false,
35
+                'background-size'       => true,
36
+                'preview_media'         => false,
37
+                'preview'               => true,
38
+                'preview_height'        => '200px',
39
+                'transparent'           => true,
40
+            );
41
+
42
+            $this->field = wp_parse_args( $this->field, $defaults );
43
+
44
+            // No errors please.
45
+            $defaults = array(
46
+                'background-color'      => '',
47
+                'background-repeat'     => '',
48
+                'background-attachment' => '',
49
+                'background-position'   => '',
50
+                'background-image'      => '',
51
+                'background-clip'       => '',
52
+                'background-origin'     => '',
53
+                'background-size'       => '',
54
+                'media'                 => array(),
55
+            );
56
+
57
+            $this->value = wp_parse_args( $this->value, $defaults );
58
+
59
+            $defaults = array(
60
+                'id'        => '',
61
+                'width'     => '',
62
+                'height'    => '',
63
+                'thumbnail' => '',
64
+            );
65
+
66
+            $this->value['media'] = wp_parse_args( $this->value['media'], $defaults );
67
+        }
68
+
69
+        /**
70
+         * Field Render Function.
71
+         * Takes the vars and outputs the HTML for the field in the settings
72
+         *
73
+         * @since       1.0.0
74
+         * @access      public
75
+         * @return      void
76
+         */
77
+        public function render() {
78
+            $this->select2_config['allowClear'] = true;
79
+
80
+            if ( isset( $this->field['select2'] ) ) {
81
+                $this->field['select2'] = wp_parse_args( $this->field['select2'], $this->select2_config );
82
+            } else {
83
+                $this->field['select2'] = $this->select2_config;
84
+            }
85
+
86
+            $this->field['select2'] = Redux_Functions::sanitize_camel_case_array_keys( $this->field['select2'] );
87
+
88
+            $select2_data = Redux_Functions::create_data_string( $this->field['select2'] );
89
+
90
+            if ( true === $this->field['background-color'] ) {
91
+                if ( isset( $this->value['color'] ) && empty( $this->value['background-color'] ) ) {
92
+                    $this->value['background-color'] = $this->value['color'];
93
+                }
94
+
95
+                $def_bg_color = $this->field['default']['background-color'] ?? '';
96
+
97
+                echo '<input ';
98
+                echo 'data-id="' . esc_attr( $this->field['id'] ) . '"';
99
+                echo 'name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-color]"';
100
+                echo 'id="' . esc_attr( $this->field['id'] ) . '-color"';
101
+                echo 'class="color-picker redux-color redux-background-input redux-color-init ' . esc_attr( $this->field['class'] ) . '"';
102
+                echo 'type="text" value="' . esc_attr( $this->value['background-color'] ) . '"';
103
+                echo 'data-default-color="' . esc_attr( $def_bg_color ) . '"';
104
+
105
+                $data = array(
106
+                    'field' => $this->field,
107
+                    'index' => 'color',
108
+                );
109
+
110
+                echo Redux_Functions_Ex::output_alpha_data( $data ); // phpcs:ignore WordPress.Security.EscapeOutput
111
+
112
+                echo '>';
113
+
114
+                echo '<input type="hidden" class="redux-saved-color" id="' . esc_attr( $this->field['id'] ) . '-saved-color" value="">';
115
+
116
+                if ( ! isset( $this->field['transparent'] ) || false !== $this->field['transparent'] ) {
117
+                    $is_checked = '';
118
+                    if ( 'transparent' === $this->value['background-color'] ) {
119
+                        $is_checked = ' checked="checked"';
120
+                    }
121
+                    echo '<label for="' . esc_attr( $this->field['id'] ) . '-transparency" class="color-transparency-check"><input type="checkbox" class="checkbox color-transparency redux-background-input ' . esc_attr( $this->field['class'] ) . '" id="' . esc_attr( $this->field['id'] ) . '-transparency" data-id="' . esc_attr( $this->field['id'] ) . '-color" value="1" ' . esc_html( $is_checked ) . '> ' . esc_html__( 'Transparent', 'redux-framework' ) . '</label>';
122
+                }
123
+
124
+                if ( true === $this->field['background-repeat'] || true === $this->field['background-position'] || true === $this->field['background-attachment'] ) {
125
+                    echo '<br />';
126
+                }
127
+            }
128
+
129
+            if ( true === $this->field['background-repeat'] ) {
130
+                $array = array(
131
+                    'no-repeat' => esc_html__( 'No Repeat', 'redux-framework' ),
132
+                    'repeat'    => esc_html__( 'Repeat All', 'redux-framework' ),
133
+                    'repeat-x'  => esc_html__( 'Repeat Horizontally', 'redux-framework' ),
134
+                    'repeat-y'  => esc_html__( 'Repeat Vertically', 'redux-framework' ),
135
+                    'inherit'   => esc_html__( 'Inherit', 'redux-framework' ),
136
+                );
137
+
138
+                echo '<select id="' . esc_attr( $this->field['id'] ) . '-repeat-select" data-placeholder="' . esc_html__( 'Background Repeat', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-repeat]" class="redux-select-item redux-background-input redux-background-repeat ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
139
+                echo '<option></option>';
140
+
141
+                foreach ( $array as $k => $v ) {
142
+                    echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-repeat'], $k, false ) . '>' . esc_html( $v ) . '</option>';
143
+                }
144
+
145
+                echo '</select>';
146
+            }
147
+
148
+            if ( true === $this->field['background-clip'] ) {
149
+                $array = array(
150
+                    'inherit'     => esc_html__( 'Inherit', 'redux-framework' ),
151
+                    'border-box'  => esc_html__( 'Border Box', 'redux-framework' ),
152
+                    'content-box' => esc_html__( 'Content Box', 'redux-framework' ),
153
+                    'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ),
154
+                );
155
+
156
+                echo '<select id="' . esc_attr( $this->field['id'] ) . '-clip-select" data-placeholder="' . esc_html__( 'Background Clip', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-clip]" class="redux-select-item redux-background-input redux-background-clip ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
157
+                echo '<option></option>';
158
+
159
+                foreach ( $array as $k => $v ) {
160
+                    echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-clip'], $k, false ) . '>' . esc_html( $v ) . '</option>';
161
+                }
162
+
163
+                echo '</select>';
164
+            }
165
+
166
+            if ( true === $this->field['background-origin'] ) {
167
+                $array = array(
168
+                    'inherit'     => esc_html__( 'Inherit', 'redux-framework' ),
169
+                    'border-box'  => esc_html__( 'Border Box', 'redux-framework' ),
170
+                    'content-box' => esc_html__( 'Content Box', 'redux-framework' ),
171
+                    'padding-box' => esc_html__( 'Padding Box', 'redux-framework' ),
172
+                );
173
+
174
+                echo '<select id="' . esc_attr( $this->field['id'] ) . '-origin-select" data-placeholder="' . esc_html__( 'Background Origin', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-origin]" class="redux-select-item redux-background-input redux-background-origin ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
175
+                echo '<option></option>';
176
+
177
+                foreach ( $array as $k => $v ) {
178
+                    echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-origin'], $k, false ) . '>' . esc_html( $v ) . '</option>';
179
+                }
180
+
181
+                echo '</select>';
182
+            }
183
+
184
+            if ( true === $this->field['background-size'] ) {
185
+                $array = array(
186
+                    'inherit' => esc_html__( 'Inherit', 'redux-framework' ),
187
+                    'cover'   => esc_html__( 'Cover', 'redux-framework' ),
188
+                    'contain' => esc_html__( 'Contain', 'redux-framework' ),
189
+                );
190
+
191
+                echo '<select id="' . esc_attr( $this->field['id'] ) . '-size-select" data-placeholder="' . esc_html__( 'Background Size', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-size]" class="redux-select-item redux-background-input redux-background-size ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
192
+                echo '<option></option>';
193
+
194
+                foreach ( $array as $k => $v ) {
195
+                    echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-size'], $k, false ) . '>' . esc_html( $v ) . '</option>';
196
+                }
197
+
198
+                echo '</select>';
199
+            }
200
+
201
+            if ( true === $this->field['background-attachment'] ) {
202
+                $array = array(
203
+                    'fixed'   => esc_html__( 'Fixed', 'redux-framework' ),
204
+                    'scroll'  => esc_html__( 'Scroll', 'redux-framework' ),
205
+                    'inherit' => esc_html__( 'Inherit', 'redux-framework' ),
206
+                );
207
+
208
+                echo '<select id="' . esc_attr( $this->field['id'] ) . '-attachment-select" data-placeholder="' . esc_html__( 'Background Attachment', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-attachment]" class="redux-select-item redux-background-input redux-background-attachment ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
209
+                echo '<option></option>';
210
+
211
+                foreach ( $array as $k => $v ) {
212
+                    echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-attachment'], $k, false ) . '>' . esc_html( $v ) . '</option>';
213
+                }
214
+
215
+                echo '</select>';
216
+            }
217
+
218
+            if ( true === $this->field['background-position'] ) {
219
+                $array = array(
220
+                    'left top'      => esc_html__( 'Left Top', 'redux-framework' ),
221
+                    'left center'   => esc_html__( 'Left center', 'redux-framework' ),
222
+                    'left bottom'   => esc_html__( 'Left Bottom', 'redux-framework' ),
223
+                    'center top'    => esc_html__( 'Center Top', 'redux-framework' ),
224
+                    'center center' => esc_html__( 'Center Center', 'redux-framework' ),
225
+                    'center bottom' => esc_html__( 'Center Bottom', 'redux-framework' ),
226
+                    'right top'     => esc_html__( 'Right Top', 'redux-framework' ),
227
+                    'right center'  => esc_html__( 'Right center', 'redux-framework' ),
228
+                    'right bottom'  => esc_html__( 'Right Bottom', 'redux-framework' ),
229
+                );
230
+
231
+                echo '<select id="' . esc_attr( $this->field['id'] ) . '-position-select" data-placeholder="' . esc_html__( 'Background Position', 'redux-framework' ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-position]" class="redux-select-item redux-background-input redux-background-position ' . esc_attr( $this->field['class'] ) . '"' . esc_attr( $select2_data ) . '>';
232
+                echo '<option></option>';
233
+
234
+                foreach ( $array as $k => $v ) {
235
+                    echo '<option value="' . esc_attr( $k ) . '" ' . selected( $this->value['background-position'], $k, false ) . '>' . esc_html( $v ) . '</option>';
236
+                }
237
+
238
+                echo '</select>';
239
+            }
240
+
241
+            if ( $this->field['background-image'] ) {
242
+                echo '<br />';
243
+
244
+                if ( empty( $this->value ) && ! empty( $this->field['default'] ) ) {
245
+                    if ( is_array( $this->field['default'] ) ) {
246
+                        if ( ! empty( $this->field['default']['media']['id'] ) ) {
247
+                            $this->value['media']['id'] = $this->field['default']['media']['id'];
248
+                        } elseif ( ! empty( $this->field['default']['id'] ) ) {
249
+                            $this->value['media']['id'] = $this->field['default']['id'];
250
+                        }
251
+
252
+                        if ( ! empty( $this->field['default']['url'] ) ) {
253
+                            $this->value['background-image'] = $this->field['default']['url'];
254
+                        } elseif ( ! empty( $this->field['default']['media']['url'] ) ) {
255
+                            $this->value['background-image'] = $this->field['default']['media']['url'];
256
+                        } elseif ( ! empty( $this->field['default']['background-image'] ) ) {
257
+                            $this->value['background-image'] = $this->field['default']['background-image'];
258
+                        }
259
+                    } elseif ( is_numeric( $this->field['default'] ) ) {
260
+                        // Check if it's an attachment ID.
261
+                            $this->value['media']['id'] = $this->field['default'];
262
+                    } else { // Must be a URL.
263
+                        $this->value['background-image'] = $this->field['default'];
264
+                    }
265
+                }
266
+
267
+                if ( empty( $this->value['background-image'] ) && ! empty( $this->value['media']['id'] ) ) {
268
+                    $img                             = wp_get_attachment_image_src( $this->value['media']['id'], 'full' );
269
+                    $this->value['background-image'] = $img[0];
270
+                    $this->value['media']['width']   = $img[1];
271
+                    $this->value['media']['height']  = $img[2];
272
+                }
273
+
274
+                $hide = 'hide ';
275
+
276
+                if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) ) {
277
+                    $this->field['class'] .= ' noPreview';
278
+                }
279
+
280
+                if ( ( ! empty( $this->field['background-image'] ) && true === $this->field['background-image'] ) || ( isset( $this->field['preview'] ) && false === $this->field['preview'] ) ) {
281
+                    $hide = '';
282
+                }
283
+
284
+                $placeholder = $this->field['placeholder'] ?? esc_html__( 'No media selected', 'redux-framework' );
285
+
286
+                echo '<input placeholder="' . esc_html( $placeholder ) . '" type="text" class="redux-background-input ' . esc_attr( $hide ) . 'upload ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[background-image]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][background-image]" value="' . esc_url( $this->value['background-image'] ) . '" />';
287
+                echo '<input type="hidden" class="upload-id ' . esc_attr( $this->field['class'] ) . '" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][id]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][id]" value="' . esc_attr( $this->value['media']['id'] ) . '" />';
288
+                echo '<input type="hidden" class="upload-height" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][height]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][height]" value="' . esc_attr( $this->value['media']['height'] ) . '" />';
289
+                echo '<input type="hidden" class="upload-width" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][width]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][width]" value="' . esc_attr( $this->value['media']['width'] ) . '" />';
290
+                echo '<input type="hidden" class="upload-thumbnail" name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '[media][thumbnail]" id="' . esc_attr( $this->parent->args['opt_name'] ) . '[' . esc_attr( $this->field['id'] ) . '][media][thumbnail]" value="' . esc_url( $this->value['media']['thumbnail'] ) . '" />';
291
+
292
+                // Preview.
293
+                $hide = '';
294
+
295
+                if ( ( isset( $this->field['preview_media'] ) && false === $this->field['preview_media'] ) || empty( $this->value['background-image'] ) ) {
296
+                    $hide = 'hide ';
297
+                }
298
+
299
+                if ( empty( $this->value['media']['thumbnail'] ) && ! empty( $this->value['background-image'] ) ) { // Just in case.
300
+                    if ( ! empty( $this->value['media']['id'] ) ) {
301
+                        $image = wp_get_attachment_image_src(
302
+                            $this->value['media']['id'],
303
+                            array(
304
+                                150,
305
+                                150,
306
+                            )
307
+                        );
308
+
309
+                        $this->value['media']['thumbnail'] = $image[0];
310
+                    } else {
311
+                        $this->value['media']['thumbnail'] = $this->value['background-image'];
312
+                    }
313
+                }
314
+
315
+                echo '<div class="' . esc_attr( $hide ) . 'screenshot">';
316
+                echo '<a class="of-uploaded-image" href="' . esc_url( $this->value['background-image'] ) . '" target="_blank">';
317
+
318
+                $alt = wp_prepare_attachment_for_js( $this->value['media']['id'] );
319
+                $alt = $alt['alt'] ?? '';
320
+
321
+                echo '<img class="redux-option-image" id="image_' . esc_attr( $this->value['media']['id'] ) . '" src="' . esc_url( $this->value['media']['thumbnail'] ) . '" alt="' . esc_attr( $alt ) . '" target="_blank" rel="external" />';
322
+                echo '</a>';
323
+                echo '</div>';
324
+
325
+                // Upload controls DIV.
326
+                echo '<div class="upload_button_div">';
327
+
328
+                // If the user has WP3.5+ show upload/remove button.
329
+                echo '<span class="button redux-background-upload" id="' . esc_attr( $this->field['id'] ) . '-media">' . esc_html__( 'Upload', 'redux-framework' ) . '</span>';
330
+
331
+                $hide = '';
332
+                if ( empty( $this->value['background-image'] ) || '' === $this->value['background-image'] ) {
333
+                    $hide = ' hide';
334
+                }
335
+
336
+                echo '<span class="button removeCSS redux-remove-background' . esc_attr( $hide ) . '" id="reset_' . esc_attr( $this->field['id'] ) . '" rel="' . esc_attr( $this->field['id'] ) . '">' . esc_html__( 'Remove', 'redux-framework' ) . '</span>';
337
+
338
+                echo '</div>';
339
+            }
340
+
341
+            /**
342
+             * Preview
343
+             * */
344
+            if ( ! isset( $this->field['preview'] ) || false !== $this->field['preview'] ) {
345
+                $css = $this->css_style( $this->value );
346
+
347
+                $is_bg = strpos( $css, 'background-image' );
348
+
349
+                if ( empty( $css ) || ! $is_bg ) {
350
+                    $css = 'display:none;';
351
+                }
352
+
353
+                $css .= 'height: ' . esc_attr( $this->field['preview_height'] ) . ';';
354
+                echo '<p class="clear ' . esc_attr( $this->field['id'] ) . '_previewer background-preview" style="' . esc_attr( $css ) . '">&nbsp;</p>';
355
+            }
356
+        }
357
+
358
+        /**
359
+         * Enqueue Function.
360
+         * If this field requires any scripts, or css define this function and register/enqueue the scripts/css
361
+         *
362
+         * @since       1.0.0
363
+         * @access      public
364
+         * @return      void
365
+         */
366
+        public function enqueue() {
367
+            if ( function_exists( 'wp_enqueue_media' ) ) {
368
+                wp_enqueue_media();
369
+            } elseif ( ! wp_script_is( 'media-upload' ) ) {
370
+                wp_enqueue_script( 'media-upload' );
371
+            }
372
+
373
+            if ( ! wp_style_is( 'select2-css' ) ) {
374
+                wp_enqueue_style( 'select2-css' );
375
+            }
376
+
377
+            if ( ! wp_style_is( 'wp-color-picker' ) ) {
378
+                wp_enqueue_style( 'wp-color-picker' );
379
+            }
380
+
381
+            $dep_array = array( 'jquery', 'wp-color-picker', 'select2-js', 'redux-js' );
382
+
383
+            wp_enqueue_script(
384
+                'redux-field-background',
385
+                Redux_Core::$url . 'inc/fields/background/redux-background' . Redux_Functions::is_min() . '.js',
386
+                $dep_array,
387
+                $this->timestamp,
388
+                true
389
+            );
390
+
391
+            if ( $this->parent->args['dev_mode'] ) {
392
+                wp_enqueue_style(
393
+                    'redux-field-background',
394
+                    Redux_Core::$url . 'inc/fields/background/redux-background.css',
395
+                    array(),
396
+                    $this->timestamp
397
+                );
398
+
399
+                wp_enqueue_style( 'redux-color-picker' );
400
+            }
401
+        }
402
+
403
+        /**
404
+         * Output CSS styling.
405
+         *
406
+         * @param array $data Value array.
407
+         *
408
+         * @return string
409
+         */
410
+        public function css_style( $data = array() ): string {
411
+            $css = '';
412
+
413
+            if ( ! empty( $data ) && is_array( $data ) ) {
414
+                foreach ( $data as $key => $val ) {
415
+                    if ( ! empty( $val ) && 'media' !== $key ) {
416
+                        if ( 'background-image' === $key ) {
417
+                            $css .= $key . ":url('" . esc_url( $val ) . "');";
418
+                        } else {
419
+                            $css .= $key . ':' . esc_attr( $val ) . ';';
420
+                        }
421
+                    }
422
+                }
423
+            }
424
+
425
+            return $css;
426
+        }
427
+
428
+        /**
429
+         * Enable output_variables to be generated.
430
+         *
431
+         * @since       4.0.3
432
+         * @return void
433
+         */
434
+        public function output_variables() {
435
+            // No code needed, just defining the method is enough.
436
+        }
437
+    }
438 438
 }
439 439
 
440 440
 class_alias( 'Redux_Background', 'ReduxFramework_Background' );
Please login to merge, or discard this patch.